Intrepid
Intrepid_PointTools.hpp
Go to the documentation of this file.
1// @HEADER
2// ************************************************************************
3//
4// Intrepid Package
5// Copyright (2007) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Pavel Bochev (pbboche@sandia.gov)
38// Denis Ridzal (dridzal@sandia.gov), or
39// Kara Peterson (kjpeter@sandia.gov)
40//
41// ************************************************************************
42// @HEADER
43
51#ifndef INTREPID_POINTTOOLS_HPP
52#define INTREPID_POINTTOOLS_HPP
53
54#include "Shards_CellTopology.hpp"
55#include "Teuchos_Assert.hpp"
56#include "Intrepid_Polylib.hpp"
59#include <stdexcept>
60
61namespace Intrepid {
62
196 public:
214 static inline int getLatticeSize( const shards::CellTopology& cellType ,
215 const int order ,
216 const int offset = 0 )
217 {
218 switch( cellType.getKey() ) {
219 case shards::Tetrahedron<4>::key:
220 case shards::Tetrahedron<8>::key:
221 case shards::Tetrahedron<10>::key:
222 {
223 const int effectiveOrder = order - 4 * offset;
224 if (effectiveOrder < 0) return 0;
225 else return (effectiveOrder+1)*(effectiveOrder+2)*(effectiveOrder+3)/6;
226 }
227 break;
228 case shards::Triangle<3>::key:
229 case shards::Triangle<4>::key:
230 case shards::Triangle<6>::key:
231 {
232 const int effectiveOrder = order - 3 * offset;
233 if (effectiveOrder < 0) return 0;
234 else return (effectiveOrder+1)*(effectiveOrder+2)/2;
235 }
236 break;
237 case shards::Line<2>::key:
238 case shards::Line<3>::key:
239 {
240 const int effectiveOrder = order - 2 * offset;
241 if (effectiveOrder < 0) return 0;
242 else return (effectiveOrder+1);
243 }
244 break;
245 default:
246 TEUCHOS_TEST_FOR_EXCEPTION( true , std::invalid_argument ,
247 ">>> ERROR (Intrepid::PointTools::getLatticeSize): Illegal cell type" );
248 }
249 }
250
251
268 template<class Scalar, class ArrayType>
269 static void getLattice( ArrayType &pts ,
270 const shards::CellTopology& cellType ,
271 const int order ,
272 const int offset = 0 ,
273 const EPointType pointType = POINTTYPE_EQUISPACED );
274
281 template<class Scalar, class ArrayType>
282 static void getGaussPoints( ArrayType &pts ,
283 const int order );
284
285
286 private:
302 template<class Scalar, class ArrayTypeOut, class ArrayTypeIn1, class ArrayTypeIn2>
303 static void cartToBaryTriangle( ArrayTypeOut & baryValues ,
304 const ArrayTypeIn1 & cartValues ,
305 const ArrayTypeIn2 & vertices );
306
307
324 template<class Scalar, class ArrayTypeOut, class ArrayTypeIn1, class ArrayTypeIn2>
325 static void baryToCartTriangle( ArrayTypeOut & cartValues ,
326 const ArrayTypeIn1 & baryValues ,
327 const ArrayTypeIn2 & vertices );
328
329
346 template<class Scalar, class ArrayTypeOut, class ArrayTypeIn1, class ArrayTypeIn2>
347 static void cartToBaryTetrahedron( ArrayTypeOut & baryValues ,
348 const ArrayTypeIn1 & cartValues ,
349 const ArrayTypeIn2 & vertices );
350
367 template<class Scalar, class ArrayTypeOut, class ArrayTypeIn1, class ArrayTypeIn2>
368 static void baryToCartTetrahedron( ArrayTypeOut & cartValues ,
369 const ArrayTypeIn1 & baryValues ,
370 const ArrayTypeIn2 & vertices );
371
372
388 template<class Scalar, class ArrayType>
389 static void getEquispacedLattice( const shards::CellTopology& cellType ,
390 ArrayType &points ,
391 const int order ,
392 const int offset = 0 );
393
394
410 template<class Scalar, class ArrayType>
411 static void getWarpBlendLattice( const shards::CellTopology& cellType ,
412 ArrayType &points ,
413 const int order ,
414 const int offset = 0);
415
416
431 template<class Scalar, class ArrayType>
432 static void getEquispacedLatticeLine( ArrayType &points ,
433 const int order ,
434 const int offset = 0 );
435
450 template<class Scalar, class ArrayType>
451 static void getEquispacedLatticeTriangle( ArrayType &points ,
452 const int order ,
453 const int offset = 0 );
454
469 template<class Scalar, class ArrayType>
470 static void getEquispacedLatticeTetrahedron( ArrayType &points ,
471 const int order ,
472 const int offset = 0 );
473
488 template<class Scalar, class ArrayType>
489 static void getWarpBlendLatticeLine( ArrayType &points ,
490 const int order ,
491 const int offset = 0 );
492
499 template<class Scalar, class ArrayType>
500 static void warpFactor( const int order ,
501 const ArrayType &xnodes ,
502 const ArrayType &xout ,
503 ArrayType &warp );
504
519 template<class Scalar, class ArrayType>
520 static void getWarpBlendLatticeTriangle(ArrayType &points ,
521 const int order ,
522 const int offset = 0 );
523
537 template<class Scalar, class ArrayType>
538 static void getWarpBlendLatticeTetrahedron( ArrayType &points ,
539 const int order ,
540 const int offset = 0 );
541
542
553 template<class Scalar, class ArrayType>
554 static void warpShiftFace3D( const int order ,
555 const Scalar pval ,
556 const ArrayType &L1,
557 const ArrayType &L2,
558 const ArrayType &L3,
559 const ArrayType &L4,
560 ArrayType &dxy);
561
571 template<class Scalar, class ArrayType>
572 static void evalshift( const int order ,
573 const Scalar pval ,
574 const ArrayType &L1 ,
575 const ArrayType &L2 ,
576 const ArrayType &L3 ,
577 ArrayType &dxy );
578
585 template<class Scalar, class ArrayType>
586 static void evalwarp( ArrayType &warp ,
587 const int order ,
588 const ArrayType &xnodes ,
589 const ArrayType &xout );
590
591
592 }; // end class PointTools
593
594} // end namespace Intrepid
595
596// include templated definitions
598
599#endif
Header file for the Intrepid::CellTools class.
Header file for utility class to provide multidimensional containers.
Definition file for utilities for barycentric coordinates and lattices.
Header file for a set of functions providing orthogonal polynomial polynomial calculus and interpolat...
Utility class that provides methods for calculating distributions of points on different cells.
static void cartToBaryTriangle(ArrayTypeOut &baryValues, const ArrayTypeIn1 &cartValues, const ArrayTypeIn2 &vertices)
Converts Cartesian coordinates to barycentric coordinates on a batch of triangles....
static void getWarpBlendLatticeTetrahedron(ArrayType &points, const int order, const int offset=0)
Returns Warburton's warp-blend points of a given order on the reference tetrahedron....
static void warpFactor(const int order, const ArrayType &xnodes, const ArrayType &xout, ArrayType &warp)
interpolates Warburton's warp function on the line
static void getLattice(ArrayType &pts, const shards::CellTopology &cellType, const int order, const int offset=0, const EPointType pointType=POINTTYPE_EQUISPACED)
Computes a lattice of points of a given order on a reference simplex (currently disabled for other ce...
static void getWarpBlendLatticeTriangle(ArrayType &points, const int order, const int offset=0)
Returns Warburton's warp-blend points of a given order on the reference triangle. The output array is...
static void getGaussPoints(ArrayType &pts, const int order)
static void getEquispacedLatticeTriangle(ArrayType &points, const int order, const int offset=0)
Computes an equispaced lattice of a given order on the reference triangle. The output array is (P,...
static void baryToCartTriangle(ArrayTypeOut &cartValues, const ArrayTypeIn1 &baryValues, const ArrayTypeIn2 &vertices)
Converts barycentric coordinates to Cartesian coordinates on a batch of triangles....
static void getEquispacedLattice(const shards::CellTopology &cellType, ArrayType &points, const int order, const int offset=0)
Computes an equispaced lattice of a given order on a reference simplex (currently disabled for other ...
static void baryToCartTetrahedron(ArrayTypeOut &cartValues, const ArrayTypeIn1 &baryValues, const ArrayTypeIn2 &vertices)
Converts barycentric coordinates to Cartesian coordinates on a batch of tetrahedra....
static void evalshift(const int order, const Scalar pval, const ArrayType &L1, const ArrayType &L2, const ArrayType &L3, ArrayType &dxy)
Used internally to evaluate the point shift for warp-blend points on faces of tets.
static void evalwarp(ArrayType &warp, const int order, const ArrayType &xnodes, const ArrayType &xout)
Used internally to compute the warp on edges of a triangle in warp-blend points.
static void getWarpBlendLatticeLine(ArrayType &points, const int order, const int offset=0)
Returns the Gauss-Lobatto points of a given order on the reference line [-1,1]. The output array is (...
static void getWarpBlendLattice(const shards::CellTopology &cellType, ArrayType &points, const int order, const int offset=0)
Computes a warped lattice (ala Warburton's warp-blend points of a given order on a reference simplex ...
static void getEquispacedLatticeLine(ArrayType &points, const int order, const int offset=0)
Computes an equispaced lattice of a given order on the reference line [-1,1]. The output array is (P,...
static void getEquispacedLatticeTetrahedron(ArrayType &points, const int order, const int offset=0)
Computes an equispaced lattice of a given order on the reference tetrahedron. The output array is (P,...
static void cartToBaryTetrahedron(ArrayTypeOut &baryValues, const ArrayTypeIn1 &cartValues, const ArrayTypeIn2 &vertices)
Converts Cartesian coordinates to barycentric coordinates on a batch of tetrahedra....
static int getLatticeSize(const shards::CellTopology &cellType, const int order, const int offset=0)
Computes the number of points in a lattice of a given order on a simplex (currently disabled for othe...
static void warpShiftFace3D(const int order, const Scalar pval, const ArrayType &L1, const ArrayType &L2, const ArrayType &L3, const ArrayType &L4, ArrayType &dxy)
This is used internally to compute the tetrahedral warp-blend points one each face.