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"
58 #include "Intrepid_CellTools.hpp"
59 #include <stdexcept>
60 
61 namespace Intrepid {
62 
195  class PointTools {
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.