SCIRun  5.0
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
HexTrilinearLgn.h
Go to the documentation of this file.
1 //
2 // For more information, please see: http://software.sci.utah.edu
3 //
4 // The MIT License
5 //
6 // Copyright (c) 2009 Scientific Computing and Imaging Institute,
7 // University of Utah.
8 //
9 //
10 // Permission is hereby granted, free of charge, to any person obtaining a
11 // copy of this software and associated documentation files (the "Software"),
12 // to deal in the Software without restriction, including without limitation
13 // the rights to use, copy, modify, merge, publish, distribute, sublicense,
14 // and/or sell copies of the Software, and to permit persons to whom the
15 // Software is furnished to do so, subject to the following conditions:
16 //
17 // The above copyright notice and this permission notice shall be included
18 // in all copies or substantial portions of the Software.
19 //
20 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
21 // OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
22 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
23 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
24 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
25 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
26 // DEALINGS IN THE SOFTWARE.
27 //
28 /// @file HexTrilinearLgn.h
29 /// @author Martin Cole, Frank B. Sachse
30 /// @date Dec 04 2004
31 
32 #ifndef CORE_BASIS_HEXTRILINEARLGN_H
33 #define CORE_BASIS_HEXTRILINEARLGN_H 1
34 
35 #include <float.h>
36 
41 
42 #include <Core/Basis/share.h>
43 
44 namespace SCIRun {
45 namespace Core {
46 namespace Basis {
47 
48 /// Class for describing unit geometry of HexTrilinearLgn
50 public:
51  /// Parametric coordinates of vertices of unit edge
52  static double unit_vertices[8][3];
53  /// References to vertices of unit edge
54  static int unit_edges[12][2];
55  /// References to vertices of unit face
56  static int unit_faces[6][4];
57  /// References to normals of unit face
58  static double unit_face_normals[6][3];
59  /// Parametric coordinate used for the center
60  static double unit_center[3];
61 
63  virtual ~HexTrilinearLgnUnitElement();
64 
65  /// return dimension of domain
66  static int domain_dimension()
67  { return 3; }
68 
69  /// return size of the domain
70  static double domain_size()
71  { return 1.0; }
72 
73  /// return number of vertices
74  static int number_of_vertices()
75  { return 8; }
76 
77  /// return number of vertices
79  { return 8; }
80 
81  /// return degrees of freedom
82  static int dofs()
83  { return 8; }
84 
85  /// return number of edges
86  static int number_of_edges()
87  { return 12; }
88 
89  /// return number of vertices per face
90  static int vertices_of_face()
91  { return 4; }
92 
93  /// return number of faces per cell
94  static int faces_of_cell()
95  { return 6; }
96 
97  static inline double length(int edge)
98  {
99  const double *v0 = unit_vertices[unit_edges[edge][0]];
100  const double *v1 = unit_vertices[unit_edges[edge][1]];
101  const double dx = v1[0] - v0[0];
102  const double dy = v1[1] - v0[1];
103  const double dz = v1[2] - v0[2];
104  return sqrt(dx*dx+dy*dy+dz*dz);
105  }
106  static double area(int /*face*/) { return 1.; }
107  static double volume() { return 1.; }
108 };
109 
110 
111 /// Class for creating geometrical approximations of Hex meshes
112 class HexApprox {
113 public:
114 
116  virtual ~HexApprox() {}
117 
118  /// Approximate edge for element by piecewise linear segments
119  /// return: coords gives parametric coordinates of the approximation.
120  /// Use interpolate with coordinates to get the world coordinates.
121 
122  template<class VECTOR>
123  void approx_edge(const unsigned edge,
124  const unsigned div_per_unit,
125  VECTOR &coords) const
126  {
127  typedef typename VECTOR::value_type VECTOR2;
128  coords.resize(div_per_unit + 1);
129 
131  const double *v1 = HexTrilinearLgnUnitElement::unit_vertices[HexTrilinearLgnUnitElement::unit_edges[edge][1]];
132 
133  const double &p1x = v0[0];
134  const double &p1y = v0[1];
135  const double &p1z = v0[2];
136  const double dx = v1[0] - p1x;
137  const double dy = v1[1] - p1y;
138  const double dz = v1[2] - p1z;
139 
140  for(unsigned i = 0; i <= div_per_unit; i++) {
141  typename VECTOR::value_type &tmp = coords[i];
142  tmp.resize(3);
143  const double d = (double)i / (double)div_per_unit;
144  tmp[0] = static_cast<typename VECTOR2::value_type>(p1x + d * dx);
145  tmp[1] = static_cast<typename VECTOR2::value_type>(p1y + d * dy);
146  tmp[2] = static_cast<typename VECTOR2::value_type>(p1z + d * dz);
147  }
148  }
149 
150  /// return number of vertices per face
151  virtual int get_approx_face_elements() const { return 4; }
152 
153 
154  /// Approximate faces for element by piecewise linear elements
155  /// return: coords gives parametric coordinates at the approximation point.
156  /// Use interpolate with coordinates to get the world coordinates.
157  template<class VECTOR>
158  void approx_face(const unsigned face,
159  const unsigned div_per_unit,
160  VECTOR &coords) const
161  {
162  typedef typename VECTOR::value_type VECTOR2;
163  typedef typename VECTOR2::value_type VECTOR3;
164 
166  const double *v1 = HexTrilinearLgnUnitElement::unit_vertices[HexTrilinearLgnUnitElement::unit_faces[face][1]];
167  const double *v3 = HexTrilinearLgnUnitElement::unit_vertices[HexTrilinearLgnUnitElement::unit_faces[face][3]];
168  const double d = 1. / (double)div_per_unit;
169  coords.resize(div_per_unit);
170  typename VECTOR::iterator citer = coords.begin();
171  for(unsigned j = 0; j < div_per_unit; j++)
172  {
173  const double dj = (double)j / (double)div_per_unit;
174  VECTOR2& jvec = *citer++;
175  jvec.resize((div_per_unit + 1) * 2, VECTOR3(3, 0.0));
176  typename VECTOR2::iterator e = jvec.begin();
177  for(unsigned i=0; i <= div_per_unit; i++) {
178  const double di = (double) i / (double)div_per_unit;
179  VECTOR3 &c0 = *e++;
180  typedef typename VECTOR3::value_type VECTOR4;
181  c0[0] = static_cast<VECTOR4>(v0[0] + dj * (v3[0] - v0[0]) + di * (v1[0] - v0[0]));
182  c0[1] = static_cast<VECTOR4>(v0[1] + dj * (v3[1] - v0[1]) + di * (v1[1] - v0[1]));
183  c0[2] = static_cast<VECTOR4>(v0[2] + dj * (v3[2] - v0[2]) + di * (v1[2] - v0[2]));
184  VECTOR3 &c1 = *e++;
185  c1[0] = static_cast<VECTOR4>(v0[0] + (dj + d) * (v3[0] - v0[0]) + di * (v1[0] - v0[0]));
186  c1[1] = static_cast<VECTOR4>(v0[1] + (dj + d) * (v3[1] - v0[1]) + di * (v1[1] - v0[1]));
187  c1[2] = static_cast<VECTOR4>(v0[2] + (dj + d) * (v3[2] - v0[2]) + di * (v1[2] - v0[2]));
188  }
189  }
190  }
191 };
192 
193 
194 /// Class for searching of parametric coordinates related to a
195 /// value in Hex meshes and fields
196 template <class ElemBasis>
197 class HexLocate : public Dim3Locate<ElemBasis> {
198 public:
199  typedef typename ElemBasis::value_type T;
200 
202  virtual ~HexLocate() {}
203 
204  /// find value in interpolation for given value
205  template <class ElemData, class VECTOR>
206  bool get_coords(const ElemBasis *pEB, VECTOR &coords,
207  const T& value, const ElemData &cd) const
208  {
209  initial_guess(pEB, value, cd, coords);
210 
211  if (this->get_iterative(pEB, coords, value, cd))
212  return check_coords(coords);
213  else
214  return false;
215  }
216 
217  template <class VECTOR>
218  inline bool check_coords(const VECTOR &x) const
219  {
226  return true;
227  else
228  return false;
229  }
230 
231 protected:
232  /// find a reasonable initial guess
233  template <class ElemData, class VECTOR>
234  void initial_guess(const ElemBasis *pElem, const T &val, const ElemData &cd,
235  VECTOR & guess) const
236  {
237  double dist = DBL_MAX;
238 
239  VECTOR coord(3);
240  StackVector<T,3> derivs;
241  guess.resize(3);
242 
243  const int end = 3;
244  for (int x = 1; x < end; x++)
245  {
246  coord[0] = x / (double) end;
247  for (int y = 1; y < end; y++)
248  {
249  coord[1] = y / (double) end;
250  for (int z = 1; z < end; z++)
251  {
252  coord[2] = z / (double) end;
253 
254  double cur_d;
255  if (compare_distance(pElem->interpolate(coord, cd), val, cur_d, dist))
256  {
257  pElem->derivate(coord, cd, derivs);
258  if (!check_zero(derivs))
259  {
260  dist = cur_d;
261  guess = coord;
262  }
263  }
264  }
265  }
266  }
267  }
268 };
269 
270 /// Class with weights and coordinates for 1st order Gaussian integration
271 template <class T>
273 {
274 public:
275  static int GaussianNum;
276  static T GaussianPoints[1][3];
277  static T GaussianWeights[1];
278 };
279 
280 #ifdef _WIN32
281 // force the instantiation of TetGaussian2<double>
282 template class HexGaussian1<double>;
283 #endif
284 
285 template <class T>
287 
288 template <class T>
290  {0.5, 0.5, 0.5}};
291 
292 template <class T>
294  {1.0};
295 
296 /// Class with weights and coordinates for 2nd order Gaussian integration
297 template <class T>
299 {
300 public:
301  static int GaussianNum;
302  static T GaussianPoints[8][3];
303  static T GaussianWeights[8];
304 };
305 
306 #ifdef _WIN32
307 // force the instantiation of TetGaussian2<double>
308 template class HexGaussian2<double>;
309 #endif
310 
311 template <class T>
313 
314 template <class T>
316  {0.211324865405, 0.211324865405, 0.211324865405},
317  {0.788675134595, 0.211324865405, 0.211324865405},
318  {0.788675134595, 0.788675134595, 0.211324865405},
319  {0.211324865405, 0.788675134595, 0.211324865405},
320  {0.211324865405, 0.211324865405, 0.788675134595},
321  {0.788675134595, 0.211324865405, 0.788675134595},
322  {0.788675134595, 0.788675134595, 0.788675134595},
323  {0.211324865405, 0.788675134595, 0.788675134595}};
324 
325 template <class T>
326 T HexGaussian2<T>::GaussianWeights[8] =
327  {.125, .125, .125, .125, .125, .125, .125, .125};
328 
329 /// Class with weights and coordinates for 3rd order Gaussian integration
330 template <class T>
332 {
333 public:
334  static int GaussianNum;
335  static T GaussianPoints[27][3];
336  static T GaussianWeights[27];
337 };
338 
339 template <class T>
341 
342 template <class T>
344  {
345  {0.11270166537950, 0.11270166537950, 0.11270166537950}, {0.5, 0.11270166537950, 0.11270166537950}, {0.88729833462050, 0.11270166537950, 0.11270166537950},
346  {0.11270166537950, 0.5, 0.11270166537950}, {0.5, 0.5, 0.11270166537950}, {0.88729833462050, 0.5, 0.11270166537950},
347  {0.11270166537950, 0.88729833462050, 0.11270166537950}, {0.5, 0.88729833462050, 0.11270166537950}, {0.88729833462050, 0.88729833462050, 0.11270166537950},
348 
349  {0.11270166537950, 0.11270166537950, 0.5}, {0.5, 0.11270166537950, 0.5}, {0.88729833462050, 0.11270166537950, 0.5},
350  {0.11270166537950, 0.5, 0.5}, {0.5, 0.5, 0.5}, {0.88729833462050, 0.5, 0.5},
351  {0.11270166537950, 0.88729833462050, 0.5}, {0.5, 0.88729833462050, 0.5}, {0.88729833462050, 0.88729833462050, 0.5},
352 
353  {0.11270166537950, 0.11270166537950, 0.88729833462050}, {0.5, 0.11270166537950, 0.88729833462050}, {0.88729833462050, 0.11270166537950, 0.88729833462050},
354  {0.11270166537950, 0.5, 0.88729833462050}, {0.5, 0.5, 0.88729833462050}, {0.88729833462050, 0.5, 0.88729833462050},
355  {0.11270166537950, 0.88729833462050, 0.88729833462050}, {0.5, 0.88729833462050, 0.88729833462050}, {0.88729833462050, 0.88729833462050, 0.88729833462050}
356  };
357 
358 template <class T>
359 T HexGaussian3<T>::GaussianWeights[27] =
360  {
361  0.03429355278944, 0.05486968447298, 0.03429355278944,
362  0.05486968447298, 0.08779149517257, 0.05486968447298,
363  0.03429355278944, 0.05486968447298, 0.03429355278944,
364 
365  0.03429355278944, 0.05486968447298, 0.03429355278944,
366  0.05486968447298, 0.08779149517257, 0.05486968447298,
367  0.03429355278944, 0.05486968447298, 0.03429355278944,
368 
369  0.03429355278944, 0.05486968447298, 0.03429355278944,
370  0.05486968447298, 0.08779149517257, 0.05486968447298,
371  0.03429355278944, 0.05486968447298, 0.03429355278944
372  };
373 
374 
375 /// Class for handling of element of type hexahedron with
376 /// trilinear lagrangian interpolation
377 template <class T>
378 class HexTrilinearLgn :
379  public BasisSimple<T>,
380  public HexApprox,
381  public HexGaussian2<double>,
382  public HexSamplingSchemes,
383  public HexTrilinearLgnUnitElement,
384  public HexElementWeights
385 {
386 public:
387  typedef T value_type;
388 
389  inline HexTrilinearLgn() {}
390  inline virtual ~HexTrilinearLgn() {}
391 
392  static int polynomial_order() { return 1; }
393 
394  /// get weight factors at parametric coordinate
395  template<class VECTOR>
396  inline void get_weights(const VECTOR& coords, double *w) const
397  { get_linear_weights(coords,w); }
398 
399  template<class VECTOR>
400  inline void get_derivate_weights(const VECTOR& coords, double *w) const
401  { get_linear_derivate_weights(coords,w); }
402 
403  /// get value at parametric coordinate
404  template <class ElemData, class VECTOR>
405  T interpolate(const VECTOR &coords, const ElemData &cd) const
406  {
407  double w[8];
408  get_linear_weights(coords, w);
409 
410  return (T)(
411  w[0] * cd.node0() +
412  w[1] * cd.node1() +
413  w[2] * cd.node2() +
414  w[3] * cd.node3() +
415  w[4] * cd.node4() +
416  w[5] * cd.node5() +
417  w[6] * cd.node6() +
418  w[7] * cd.node7());
419  }
420 
421  /// get first derivative at parametric coordinate
422  template <class ElemData, class VECTOR1, class VECTOR2>
423  void derivate(const VECTOR1 &coords, const ElemData &cd,
424  VECTOR2 &derivs) const
425  {
426  double w[24];
427  get_linear_derivate_weights(coords, w);
428 
429  derivs.resize(3);
430  derivs[0] = static_cast<typename VECTOR2::value_type>(
431  w[0] * cd.node0() +
432  w[1] * cd.node1() +
433  w[2] * cd.node2() +
434  w[3] * cd.node3() +
435  w[4] * cd.node4() +
436  w[5] * cd.node5() +
437  w[6] * cd.node6() +
438  w[7] * cd.node7());
439 
440  derivs[1] = static_cast<typename VECTOR2::value_type>(
441  w[8] * cd.node0() +
442  w[9] * cd.node1() +
443  w[10] * cd.node2() +
444  w[11] * cd.node3() +
445  w[12] * cd.node4() +
446  w[13] * cd.node5() +
447  w[14] * cd.node6() +
448  w[15] * cd.node7());
449 
450  derivs[2] = static_cast<typename VECTOR2::value_type>(
451  w[16] * cd.node0() +
452  w[17] * cd.node1() +
453  w[18] * cd.node2() +
454  w[19] * cd.node3() +
455  w[20] * cd.node4() +
456  w[21] * cd.node5() +
457  w[22] * cd.node6() +
458  w[23] * cd.node7());
459  }
460 
461  /// get parametric coordinate for value within the element
462  template <class ElemData, class VECTOR>
463  bool get_coords(VECTOR &coords, const T& value,
464  const ElemData &cd) const
465  {
467  return CL.get_coords(this, coords, value, cd);
468  }
469 
470  /// get arc length for edge
471  template <class ElemData>
472  double get_arc_length(const unsigned edge, const ElemData &cd) const
473  {
474  return get_arc3d_length<CrvGaussian1<double> >(this, edge, cd);
475  }
476 
477  /// get area
478  template <class ElemData>
479  double get_area(const unsigned face, const ElemData &cd) const
480  {
481  return get_area3<QuadGaussian3<double> >(this, face, cd);
482  }
483 
484  /// get volume
485  template <class ElemData>
486  double get_volume(const ElemData & cd) const
487  {
488  return get_volume3(this, cd);
489  }
490 
491  static const std::string type_name(int n = -1);
492 
493  virtual void io (Piostream& str);
494 
495 };
496 
497 template <class T>
498 const std::string
500 {
501  ASSERT((n >= -1) && n <= 1);
502  if (n == -1)
503  {
504  static const std::string name = TypeNameGenerator::make_template_id(type_name(0), type_name(1));
505  return name;
506  }
507  else if (n == 0)
508  {
509  static const std::string nm("HexTrilinearLgn");
510  return nm;
511  } else {
512  return find_type_name((T *)0);
513  }
514 }
515 
516 }}
518 
519 template <class T>
520 const TypeDescription*
522 {
523  static TypeDescription* td = 0;
524  if(!td){
525  const TypeDescription *sub = get_type_description((T*)0);
527  (*subs)[0] = sub;
528  td = new TypeDescription("HexTrilinearLgn", subs,
529  std::string(__FILE__),
530  "SCIRun",
532  }
533  return td;
534 }
535 
536  template <class T>
537  void
539  {
540  stream.begin_class(get_type_description(this)->get_name(),
542  stream.end_class();
543  }
544 }
545 
546 #endif
static int GaussianNum
Definition: HexTrilinearLgn.h:275
static int dofs()
return degrees of freedom
Definition: HexTrilinearLgn.h:82
void approx_edge(const unsigned edge, const unsigned div_per_unit, VECTOR &coords) const
Definition: HexTrilinearLgn.h:123
static T GaussianPoints[1][3]
Definition: HexTrilinearLgn.h:276
static int unit_edges[12][2]
References to vertices of unit edge.
Definition: HexTrilinearLgn.h:54
double check_zero(const VECTOR &derivs, double epsilon=1e-7)
Definition: Locate.h:709
void approx_face(const unsigned face, const unsigned div_per_unit, VECTOR &coords) const
Definition: HexTrilinearLgn.h:158
T value_type
Definition: HexTrilinearLgn.h:387
static int GaussianNum
Definition: HexTrilinearLgn.h:301
Definition: Persistent.h:89
virtual ~HexLocate()
Definition: HexTrilinearLgn.h:202
void initial_guess(const ElemBasis *pElem, const T &val, const ElemData &cd, VECTOR &guess) const
find a reasonable initial guess
Definition: HexTrilinearLgn.h:234
virtual int get_approx_face_elements() const
return number of vertices per face
Definition: HexTrilinearLgn.h:151
Definition: TypeDescription.h:45
#define SCISHARE
Definition: share.h:39
std::vector< const TypeDescription * > td_vec
Definition: TypeDescription.h:56
static int unit_faces[6][4]
References to vertices of unit face.
Definition: HexTrilinearLgn.h:56
Class for creating geometrical approximations of Hex meshes.
Definition: HexTrilinearLgn.h:112
bool get_coords(VECTOR &coords, const T &value, const ElemData &cd) const
get parametric coordinate for value within the element
Definition: HexTrilinearLgn.h:463
void derivate(const VECTOR1 &coords, const ElemData &cd, VECTOR2 &derivs) const
get first derivative at parametric coordinate
Definition: HexTrilinearLgn.h:423
#define ASSERT(condition)
Definition: Assert.h:110
void get_weights(const VECTOR &coords, double *w) const
get weight factors at parametric coordinate
Definition: HexTrilinearLgn.h:396
virtual int begin_class(const std::string &name, int current_version)
Definition: Persistent.cc:143
static int vertices_of_face()
return number of vertices per face
Definition: HexTrilinearLgn.h:90
const string find_type_name(float *)
Definition: TypeName.cc:63
const int HEX_TRILINEAR_LGN_VERSION
Definition: HexTrilinearLgn.h:517
static int faces_of_cell()
return number of faces per cell
Definition: HexTrilinearLgn.h:94
Class with weights and coordinates for 3rd order Gaussian integration.
Definition: HexTrilinearLgn.h:331
double get_arc_length(const unsigned edge, const ElemData &cd) const
get arc length for edge
Definition: HexTrilinearLgn.h:472
const char * name[]
Definition: BoostGraphExampleTests.cc:87
static double domain_size()
return size of the domain
Definition: HexTrilinearLgn.h:70
static int GaussianNum
Definition: HexTrilinearLgn.h:334
Definition: BasisFwd.h:37
Definition: StackVector.h:50
HexApprox()
Definition: HexTrilinearLgn.h:115
virtual ~HexApprox()
Definition: HexTrilinearLgn.h:116
static double unit_vertices[8][3]
Parametric coordinates of vertices of unit edge.
Definition: HexTrilinearLgn.h:52
ElemBasis::value_type T
Definition: HexTrilinearLgn.h:199
Class with weights and coordinates for 1st order Gaussian integration.
Definition: HexTrilinearLgn.h:272
static const std::string make_template_id(const std::string &templateName, const std::string &templateParam)
Definition: TypeName.h:62
HexLocate()
Definition: HexTrilinearLgn.h:201
bool compare_distance(const T &interp, const T &val, double &cur_d, double dist)
Definition: Locate.h:667
static int polynomial_order()
Definition: HexTrilinearLgn.h:392
virtual void end_class()
Definition: Persistent.cc:178
double get_volume(const ElemData &cd) const
get volume
Definition: HexTrilinearLgn.h:486
virtual ~HexTrilinearLgn()
Definition: HexTrilinearLgn.h:390
static double length(int edge)
Definition: HexTrilinearLgn.h:97
void resize(size_t size, const value_type &val=value_type())
Definition: StackVector.h:61
Definition: Locate.h:547
static int domain_dimension()
return dimension of domain
Definition: HexTrilinearLgn.h:66
double get_area(const unsigned face, const ElemData &cd) const
get area
Definition: HexTrilinearLgn.h:479
Class with weights and coordinates for 2nd order Gaussian integration.
Definition: HexTrilinearLgn.h:298
static double volume()
Definition: HexTrilinearLgn.h:107
static const std::string type_name(int n=-1)
Definition: HexTrilinearLgn.h:499
Definition: HexTrilinearLgn.h:197
int n
Definition: eab.py:9
static int number_of_edges()
return number of edges
Definition: HexTrilinearLgn.h:86
static int number_of_mesh_vertices()
return number of vertices
Definition: HexTrilinearLgn.h:78
void get_derivate_weights(const VECTOR &coords, double *w) const
Definition: HexTrilinearLgn.h:400
bool get_iterative(const ElemBasis *pEB, VECTOR &x, const T &value, const ElemData &cd) const
find value in interpolation for given value
Definition: Locate.h:559
bool get_coords(const ElemBasis *pEB, VECTOR &coords, const T &value, const ElemData &cd) const
find value in interpolation for given value
Definition: HexTrilinearLgn.h:206
static double area(int)
Definition: HexTrilinearLgn.h:106
double get_volume3(const ElemBasis *pEB, const ElemData &cd)
Definition: Locate.h:179
virtual void io(Piostream &str)
Definition: HexTrilinearLgn.h:538
HexTrilinearLgn()
Definition: HexTrilinearLgn.h:389
static int number_of_vertices()
return number of vertices
Definition: HexTrilinearLgn.h:74
bool check_coords(const VECTOR &x) const
Definition: HexTrilinearLgn.h:218
Class for describing unit geometry of HexTrilinearLgn.
Definition: HexTrilinearLgn.h:49
Definition: TypeDescription.h:49
static T GaussianWeights[1]
Definition: HexTrilinearLgn.h:277
const TypeDescription * get_type_description(Core::Basis::ConstantBasis< T > *)
Definition: Constant.h:209
T interpolate(const VECTOR &coords, const ElemData &cd) const
get value at parametric coordinate
Definition: HexTrilinearLgn.h:405