Nalu
Nalu: a generalized unstructured massively parallel low Mach flow code designed to support a variety of energy applications of interest (most notably Wind ECP) built on the Sierra Toolkit and Trilinos solver Tpetra/Epetra stack. The open source BSD, clause 3 license model has been chosen for the code base. See LICENSE for more information. http://NaluCFD.org
Hex27CVFEM.h
Go to the documentation of this file.
1 /*------------------------------------------------------------------------*/
2 /* Copyright 2014 Sandia Corporation. */
3 /* This software is released under the license detailed */
4 /* in the file, LICENSE, which is located in the top-level Nalu */
5 /* directory structure */
6 /*------------------------------------------------------------------------*/
7 
8 #ifndef Hex27CVFEM_h
9 #define Hex27CVFEM_h
10 
14 
15 #include <SimdInterface.h>
16 #include <Kokkos_Core.hpp>
17 #include <AlgTraits.h>
18 
19 #include <stk_util/environment/ReportHandler.hpp>
20 
21 #include <vector>
22 #include <cstdlib>
23 #include <stdexcept>
24 #include <string>
25 #include <array>
26 #include <type_traits>
27 
28 namespace sierra{
29 namespace nalu{
30 
32 {
33 public:
35 
37  virtual ~HexahedralP2Element() {}
38 
39  void shape_fcn(double *shpfc);
40  void shifted_shape_fcn(double *shpfc);
41 
42 
43  template <typename ViewType>
44  ViewType copy_interpolation_weights_to_view(const std::vector<double>& interps)
45  {
46  ViewType interpWeights{"interpolation_weights"};
47 
48  int shape_index = 0;
49  for (unsigned ip = 0; ip < interpWeights.extent(0); ++ip) {
50  for (unsigned n = 0; n < 27; ++n) {
51  interpWeights(ip, n) = interps[shape_index];
52  ++shape_index;
53  }
54  }
55  return interpWeights;
56  }
57 
58  template <typename ViewType>
59  ViewType copy_deriv_weights_to_view(const std::vector<double>& derivs)
60  {
61  ViewType referenceGradWeights{"reference_gradient_weights"};
62 
63  int deriv_index = 0;
64  for (unsigned ip = 0; ip < referenceGradWeights.extent(0); ++ip) {
65  for (unsigned n = 0; n < 27; ++n) {
66  for (unsigned d = 0; d < 3; ++d) {
67  referenceGradWeights(ip,n,d) = derivs[deriv_index];
68  ++deriv_index;
69  }
70  }
71  }
72  return referenceGradWeights;
73  }
74 
75  template <typename ViewType>
77  {
78  ViewType interpWeights{"interpolation_weights"};
79 
80  int shape_index = 0;
81  for (unsigned ip = 0; ip < interpWeights.extent(0); ++ip) {
82  for (unsigned n = 0; n < 27; ++n) {
83  interpWeights(ip, n) = shapeFunctions_[shape_index];
84  ++shape_index;
85  }
86  }
87  return interpWeights;
88  }
89 
90  template <typename ViewType>
92  {
93  ViewType referenceGradWeights{"reference_gradient_weights"};
94 
95  int deriv_index = 0;
96  for (unsigned ip = 0; ip < referenceGradWeights.extent(0); ++ip) {
97  for (unsigned n = 0; n < 27; ++n) {
98  for (unsigned d = 0; d < 3; ++d) {
99  referenceGradWeights(ip,n,d) = shapeDerivs_[deriv_index];
100  ++deriv_index;
101  }
102  }
103  }
104  return referenceGradWeights;
105  }
106 
107 
108 protected:
109  struct ContourData {
111  double weight;
112  };
113 
114  int tensor_product_node_map(int i, int j, int k) const;
115 
116  double gauss_point_location(
117  int nodeOrdinal,
118  int gaussPointOrdinal) const;
119 
121  int nodeOrdinal,
122  int gaussPointOrdinal) const;
123 
124  double tensor_product_weight(
125  int s1Node, int s2Node, int s3Node,
126  int s1Ip, int s2Ip, int s3Ip) const;
127 
128  double tensor_product_weight(
129  int s1Node, int s2Node,
130  int s1Ip, int s2Ip) const;
131 
132  virtual void eval_shape_functions_at_ips();
134 
135  virtual void eval_shape_derivs_at_ips();
136  virtual void eval_shape_derivs_at_shifted_ips();
137 
139 
140  void set_quadrature_rule();
142 
143  void hex27_shape_deriv(
144  int npts,
145  const double *par_coord,
146  double* shape_fcn
147  ) const;
148 
149  double parametric_distance(const std::array<double, 3>& x);
150 
151  virtual void interpolatePoint(
152  const int &nComp,
153  const double *isoParCoord,
154  const double *field,
155  double *result);
156 
157  virtual double isInElement(
158  const double *elemNodalCoord,
159  const double *pointCoord,
160  double *isoParCoord);
161 
162  const double scsDist_;
163  const int nodes1D_;
164  const int numQuad_;
165 
166  // quadrature info
167  std::vector<double> gaussAbscissae1D_;
168  std::vector<double> gaussAbscissae_;
169  std::vector<double> gaussAbscissaeShift_;
170  std::vector<double> gaussWeight_;
171  std::vector<double> scsEndLoc_;
172 
173  std::vector<int> stkNodeMap_;
174 
175  std::vector<double> shapeFunctions_;
176  std::vector<double> shapeFunctionsShift_;
177  std::vector<double> shapeDerivs_;
178  std::vector<double> shapeDerivsShift_;
179  std::vector<double> expFaceShapeDerivs_;
180 private:
181  void hex27_shape_fcn(
182  int npts,
183  const double *par_coord,
184  double* shape_fcn
185  ) const;
186 };
187 
188 // 3D Quad 27 subcontrol volume
190 {
191  using InterpWeightType = Kokkos::View<DoubleType[AlgTraits::numScvIp_][AlgTraits::nodesPerElement_]>;
192  using GradWeightType = Kokkos::View<DoubleType[AlgTraits::numScvIp_][AlgTraits::nodesPerElement_][AlgTraits::nDim_]>;
193 
194 public:
195  Hex27SCV();
196  virtual ~Hex27SCV() {}
197 
198  const int * ipNodeMap(int ordinal = 0);
199 
200  void shape_fcn(SharedMemView<DoubleType**> &shpfc) final;
203 
204  void determinant(
205  const int nelem,
206  const double *coords,
207  double *areav,
208  double * error );
209 
211  { return interpWeights_; }
212 
214  { return referenceGradWeights_; }
215 
216 
217  template <typename GradViewType, typename CoordViewType, typename OutputViewType>
218  void weighted_volumes(GradViewType referenceGradWeights, CoordViewType coords, OutputViewType volume)
219  {
220  generic_determinant_3d<AlgTraits>(referenceGradWeights, coords, volume);
221  for (int ip = 0 ; ip < AlgTraits::numScvIp_; ++ip) {
222  volume(ip) *= ipWeight_[ip];
223  }
224  }
225 
226 
227 private:
228  void set_interior_info();
229 
230  double jacobian_determinant(
231  const double *POINTER_RESTRICT elemNodalCoords,
232  const double *POINTER_RESTRICT shapeDerivs ) const;
233 
236 
239 
240  std::vector<double> ipWeight_;
241 };
242 
243 // 3D Hex 27 subcontrol surface
245 {
246  using InterpWeightType = Kokkos::View<DoubleType[AlgTraits::numScsIp_][AlgTraits::nodesPerElement_]>;
247  using GradWeightType = Kokkos::View<DoubleType[AlgTraits::numScsIp_][AlgTraits::nodesPerElement_][AlgTraits::nDim_]>;
248 
249 public:
250  Hex27SCS();
251  virtual ~Hex27SCS() {}
252 
255 
256  void grad_op(
260 
261  void shifted_grad_op(
265 
267 
268  void gij(
273 
274  void determinant(
275  const int nelem,
276  const double *coords,
277  double *areav,
278  double * error );
279 
280  void grad_op(
281  const int nelem,
282  const double *coords,
283  double *gradop,
284  double *deriv,
285  double *det_j,
286  double * error );
287 
288  void shifted_grad_op(
289  const int nelem,
290  const double *coords,
291  double *gradop,
292  double *deriv,
293  double *det_j,
294  double * error );
295 
296  void face_grad_op(
297  const int nelem,
298  const int face_ordinal,
299  const double *coords,
300  double *gradop,
301  double *det_j,
302  double * error );
303 
304  void gij(
305  const double *coords,
306  double *gupperij,
307  double *glowerij,
308  double *deriv);
309 
311  const int face_ordinal,
312  const double *isoParCoord,
313  const double *coords,
314  double *gradop,
315  double *det_j,
316  double * error );
317 
319  const int & side_ordinal,
320  const int & npoints,
321  const double *side_pcoords,
322  double *elem_pcoords);
323 
324  const int * adjacentNodes();
325 
326  const int * ipNodeMap(int ordinal = 0);
327 
328  int opposingNodes(
329  const int ordinal, const int node);
330 
331  int opposingFace(
332  const int ordinal, const int node);
333 
334  const int* side_node_ordinals(int sideOrdinal) final;
335 
337  { return interpWeights_; }
338 
340  { return referenceGradWeights_; }
341 
342  template <typename GradViewType, typename CoordViewType, typename OutputViewType>
343  void weighted_area_vectors(GradViewType referenceGradWeights, CoordViewType coords, OutputViewType areav)
344  {
345  using ftype = typename CoordViewType::value_type;
346 
347  static_assert(std::is_same<ftype, typename OutputViewType::value_type>::value, "Incompatiable value type for views");
348  static_assert(CoordViewType::Rank == 2, "Coordinate view assumed to be 2D");
349  static_assert(OutputViewType::Rank == 2, "area_vector view assumed to be 2D");
350 
351  static_assert (AlgTraits::numScsIp_ % AlgTraits::nDim_ == 0, "Number of ips incorrect");
352  constexpr int ipsPerDirection = AlgTraits::numScsIp_ / AlgTraits::nDim_;
353  constexpr int t_start = 1*ipsPerDirection;
354  constexpr int s_start = 2*ipsPerDirection;
355 
356  // this relies on the ips being laid out direction-by-direction,
357  // specifically in the U->T->S order
358  for (int ip = 0; ip < t_start; ++ip) {
359  ThrowAssert(ipInfo_[ip].direction == Jacobian::U_DIRECTION);
360  area_vector<Jacobian::U_DIRECTION>(ip, referenceGradWeights, coords, areav);
361  }
362 
363  for (int ip = t_start; ip < s_start; ++ip) {
364  ThrowAssert(ipInfo_[ip].direction == Jacobian::T_DIRECTION);
365  area_vector<Jacobian::T_DIRECTION>(ip, referenceGradWeights, coords, areav);
366  }
367 
368  for (int ip = s_start; ip < AlgTraits::numScsIp_; ++ip) {
369  ThrowAssert(ipInfo_[ip].direction == Jacobian::S_DIRECTION);
370  area_vector<Jacobian::S_DIRECTION>(ip, referenceGradWeights, coords, areav);
371  }
372 
373  for (int ip = 0; ip < 216; ++ip) {
374  const ftype weight = ipInfo_[ip].weight;
375  areav(ip, 0) *= weight;
376  areav(ip, 1) *= weight;
377  areav(ip, 2) *= weight;
378  }
379  }
380 
381 protected:
382  std::vector<ContourData> ipInfo_;
383 
384 private:
385  void set_interior_info();
386  void set_boundary_info();
387 
388  template <Jacobian::Direction dir>
389  void area_vector(const double *POINTER_RESTRICT elemNodalCoords,
390  double *POINTER_RESTRICT shapeDeriv,
391  double *POINTER_RESTRICT areaVector ) const;
392 
393  void gradient(
394  const double *POINTER_RESTRICT elemNodalCoords,
395  const double *POINTER_RESTRICT shapeDeriv,
396  double *POINTER_RESTRICT grad,
397  double *POINTER_RESTRICT det_j ) const;
398 
399  template <int direction, typename GradViewType, typename CoordViewType, typename OutputViewType>
400  void area_vector(int ip, GradViewType referenceGradWeights, CoordViewType coords, OutputViewType areav)
401  {
402  constexpr int s1Component = (direction == Jacobian::T_DIRECTION) ? Jacobian::S_DIRECTION : Jacobian::T_DIRECTION;
403  constexpr int s2Component = (direction == Jacobian::U_DIRECTION) ? Jacobian::S_DIRECTION : Jacobian::U_DIRECTION;
404 
405  using ftype = typename CoordViewType::value_type;
406 
407  static_assert(std::is_same<ftype, typename OutputViewType::value_type>::value,
408  "Incompatiable value type for views");
409 
410  static_assert(CoordViewType::Rank == 2, "Coordinate view assumed to be 2D");
411  static_assert(OutputViewType::Rank == 2, "areav view assumed to be 2D");
412 
413  ftype sjac[3][2] = { {0.0, 0.0}, {0.0, 0.0}, {0.0, 0.0} };
414  for (int n = 0; n < AlgTraits::nodesPerElement_; ++n) {
415  const ftype dn_ds1 = referenceGradWeights(ip, n, s1Component);
416  const ftype dn_ds2 = referenceGradWeights(ip, n, s2Component);
417 
418  sjac[0][0] += dn_ds1 * coords(n,0);
419  sjac[0][1] += dn_ds2 * coords(n,0);
420 
421  sjac[1][0] += dn_ds1 * coords(n,1);
422  sjac[1][1] += dn_ds2 * coords(n,1);
423 
424  sjac[2][0] += dn_ds1 * coords(n,2);
425  sjac[2][1] += dn_ds2 * coords(n,2);
426  }
427  areav(ip, 0) = sjac[1][0] * sjac[2][1] - sjac[2][0] * sjac[1][1];
428  areav(ip, 1) = sjac[2][0] * sjac[0][1] - sjac[0][0] * sjac[2][1];
429  areav(ip, 2) = sjac[0][0] * sjac[1][1] - sjac[1][0] * sjac[0][1];
430  }
431 
434 
437 
439 };
440 
441 // 3D Quad 9
443 {
444 public:
445  Quad93DSCS();
446  virtual ~Quad93DSCS() {}
447 
448  const int * ipNodeMap(int ordinal = 0);
449 
450  void determinant(
451  const int nelem,
452  const double *coords,
453  double *areav,
454  double * error );
455 
456  double isInElement(
457  const double *elemNodalCoord,
458  const double *pointCoord,
459  double *isoParCoord);
460 
461  void interpolatePoint(
462  const int &nComp,
463  const double *isoParCoord,
464  const double *field,
465  double *result);
466 
467  void general_shape_fcn(
468  const int numIp,
469  const double *isoParCoord,
470  double *shpfc);
471 
472  void general_normal(
473  const double *isoParCoord,
474  const double *coords,
475  double *normal);
476 
477 private:
478  void set_interior_info();
479  void eval_shape_functions_at_ips() final;
480  void eval_shape_derivs_at_ips() final;
481 
484 
485  void area_vector(
486  const double *POINTER_RESTRICT coords,
487  const double *POINTER_RESTRICT shapeDerivs,
488  double *POINTER_RESTRICT areaVector) const;
489 
490  void quad9_shape_fcn(
491  int npts,
492  const double *par_coord,
493  double* shape_fcn
494  ) const;
495 
496  void quad9_shape_deriv(
497  int npts,
498  const double *par_coord,
499  double* shape_fcn
500  ) const;
501 
502  void non_unit_face_normal(
503  const double *isoParCoord,
504  const double *elemNodalCoord,
505  double *normalVector);
506 
507  double parametric_distance(const std::vector<double> &x);
508 
509  std::vector<double> ipWeight_;
510  const int surfaceDimension_;
511 };
512 
513 
514 } // namespace nalu
515 } // namespace Sierra
516 
517 #endif
int ipsPerFace_
Definition: Hex27CVFEM.h:438
Definition: Hex27CVFEM.h:244
virtual void eval_shape_derivs_at_ips()
Definition: Hex27CVFEM.C:302
virtual ~HexahedralP2Element()
Definition: Hex27CVFEM.h:37
Definition: ABLForcingAlgorithm.C:26
virtual void face_grad_op(const int nelem, const int face_ordinal, const double *coords, double *gradop, double *det_j, double *error)
Definition: MasterElement.h:152
std::vector< double > gaussAbscissae1D_
Definition: Hex27CVFEM.h:167
Definition: MasterElement.h:53
std::vector< double > expFaceShapeDerivs_
Definition: Hex27CVFEM.h:179
virtual const int * side_node_ordinals(int sideOrdinal)
Definition: MasterElement.h:237
double weight
Definition: Hex27CVFEM.h:111
GradWeightType referenceGradWeights_
Definition: Hex27CVFEM.h:433
virtual void eval_shape_functions_at_shifted_ips()
Definition: Hex27CVFEM.C:312
std::vector< double > scsEndLoc_
Definition: Hex27CVFEM.h:171
Kokkos::View< DoubleType[AlgTraits::numScsIp_][AlgTraits::nodesPerElement_]> InterpWeightType
Definition: Hex27CVFEM.h:246
virtual void eval_shape_derivs_at_shifted_ips()
Definition: Hex27CVFEM.C:322
virtual int opposingNodes(const int ordinal, const int node)
Definition: MasterElement.h:186
static constexpr int nodesPerElement_
Definition: AlgTraits.h:29
GradWeightType shiftedReferenceGradWeights_
Definition: Hex27CVFEM.h:238
virtual void general_shape_fcn(const int numIp, const double *isoParCoord, double *shpfc)
Definition: MasterElement.h:209
Definition: AlgTraits.h:27
virtual double isInElement(const double *elemNodalCoord, const double *pointCoord, double *isoParCoord)
Definition: Hex27CVFEM.C:119
const double scsDist_
Definition: Hex27CVFEM.h:162
const InterpWeightType & shape_function_values()
Definition: Hex27CVFEM.h:336
void weighted_area_vectors(GradViewType referenceGradWeights, CoordViewType coords, OutputViewType areav)
Definition: Hex27CVFEM.h:343
virtual const int * adjacentNodes()
Definition: MasterElement.h:170
Definition: MasterElement.h:42
virtual int opposingFace(const int ordinal, const int node)
Definition: MasterElement.h:190
std::vector< double > gaussAbscissae_
Definition: Hex27CVFEM.h:168
Jacobian::Direction direction
Definition: Hex27CVFEM.h:110
Kokkos::View< DoubleType[AlgTraits::numScsIp_][AlgTraits::nodesPerElement_][AlgTraits::nDim_]> GradWeightType
Definition: Hex27CVFEM.h:247
const GradWeightType & shape_function_derivatives()
Definition: Hex27CVFEM.h:339
GradWeightType shiftedReferenceGradWeights_
Definition: Hex27CVFEM.h:436
STK SIMD Interface.
virtual void determinant(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType ** > &areav)
Definition: MasterElement.h:94
virtual ~Quad93DSCS()
Definition: Hex27CVFEM.h:446
std::vector< double > shapeDerivsShift_
Definition: Hex27CVFEM.h:178
void set_quadrature_rule()
Definition: Hex27CVFEM.C:67
#define POINTER_RESTRICT
Definition: MasterElement.h:29
std::vector< double > gaussAbscissaeShift_
Definition: Hex27CVFEM.h:169
void shifted_shape_fcn(double *shpfc)
Definition: Hex27CVFEM.C:280
const GradWeightType & shape_function_derivatives()
Definition: Hex27CVFEM.h:213
std::vector< double > shapeFunctions_
Definition: Hex27CVFEM.h:175
GradWeightType referenceGradWeights_
Definition: Hex27CVFEM.h:235
Definition: MasterElement.h:44
ViewType copy_interpolation_weights_to_view()
Definition: Hex27CVFEM.h:76
Definition: MasterElement.h:43
std::vector< double > gaussWeight_
Definition: Hex27CVFEM.h:170
ViewType copy_deriv_weights_to_view(const std::vector< double > &derivs)
Definition: Hex27CVFEM.h:59
void eval_shape_derivs_at_face_ips()
Definition: Hex27CVFEM.C:332
std::vector< int > stkNodeMap_
Definition: Hex27CVFEM.h:173
static constexpr int numScvIp_
Definition: AlgTraits.h:31
ViewType copy_deriv_weights_to_view()
Definition: Hex27CVFEM.h:91
void hex27_shape_fcn(int npts, const double *par_coord, double *shape_fcn) const
Definition: Hex27CVFEM.C:346
virtual void sidePcoords_to_elemPcoords(const int &side_ordinal, const int &npoints, const double *side_pcoords, double *elem_pcoords)
Definition: MasterElement.h:230
double tensor_product_weight(int s1Node, int s2Node, int s3Node, int s1Ip, int s2Ip, int s3Ip) const
Definition: Hex27CVFEM.C:231
virtual ~Hex27SCV()
Definition: Hex27CVFEM.h:196
void weighted_volumes(GradViewType referenceGradWeights, CoordViewType coords, OutputViewType volume)
Definition: Hex27CVFEM.h:218
const InterpWeightType & shape_function_values()
Definition: Hex27CVFEM.h:210
static constexpr int nDim_
Definition: AlgTraits.h:28
const int surfaceDimension_
Definition: Hex27CVFEM.h:510
void hex27_shape_deriv(int npts, const double *par_coord, double *shape_fcn) const
Definition: Hex27CVFEM.C:414
double gauss_point_location(int nodeOrdinal, int gaussPointOrdinal) const
Definition: Hex27CVFEM.C:206
HexahedralP2Element()
Definition: Hex27CVFEM.C:28
virtual void eval_shape_functions_at_ips()
Definition: Hex27CVFEM.C:292
virtual ~Hex27SCS()
Definition: Hex27CVFEM.h:251
std::vector< double > shapeFunctionsShift_
Definition: Hex27CVFEM.h:176
virtual void general_normal(const double *isoParCoord, const double *coords, double *normal)
Definition: MasterElement.h:224
std::vector< double > ipWeight_
Definition: Hex27CVFEM.h:240
virtual void grad_op(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType *** > &gradop, SharedMemView< DoubleType *** > &deriv)
Definition: MasterElement.h:68
Definition: Hex27CVFEM.h:189
Direction
Definition: MasterElement.h:40
Kokkos::View< DoubleType[AlgTraits::numScvIp_][AlgTraits::nodesPerElement_][AlgTraits::nDim_]> GradWeightType
Definition: Hex27CVFEM.h:192
InterpWeightType shiftedInterpWeights_
Definition: Hex27CVFEM.h:237
Kokkos::View< T, Kokkos::LayoutRight, DeviceShmem, Kokkos::MemoryUnmanaged > SharedMemView
Definition: KokkosInterface.h:25
std::vector< double > ipWeight_
Definition: Hex27CVFEM.h:509
ViewType copy_interpolation_weights_to_view(const std::vector< double > &interps)
Definition: Hex27CVFEM.h:44
Definition: Hex27CVFEM.h:442
virtual const int * ipNodeMap(int ordinal=0)
Definition: MasterElement.h:174
const int nodes1D_
Definition: Hex27CVFEM.h:163
InterpWeightType interpWeights_
Definition: Hex27CVFEM.h:234
void area_vector(int ip, GradViewType referenceGradWeights, CoordViewType coords, OutputViewType areav)
Definition: Hex27CVFEM.h:400
virtual void gij(SharedMemView< DoubleType ** > coords, SharedMemView< DoubleType *** > gupper, SharedMemView< DoubleType *** > glower, SharedMemView< DoubleType *** > deriv)
Definition: MasterElement.h:99
int tensor_product_node_map(int i, int j, int k) const
Definition: Hex27CVFEM.C:197
std::vector< ContourData > ipInfo_
Definition: Hex27CVFEM.h:382
InterpWeightType shiftedInterpWeights_
Definition: Hex27CVFEM.h:435
double parametric_distance(const std::array< double, 3 > &x)
Definition: Hex27CVFEM.C:80
Kokkos::View< DoubleType[AlgTraits::numScvIp_][AlgTraits::nodesPerElement_]> InterpWeightType
Definition: Hex27CVFEM.h:191
virtual void interpolatePoint(const int &nComp, const double *isoParCoord, const double *field, double *result)
Definition: Hex27CVFEM.C:100
virtual void shifted_grad_op(SharedMemView< DoubleType ** > &coords, SharedMemView< DoubleType *** > &gradop, SharedMemView< DoubleType *** > &deriv)
Definition: MasterElement.h:74
std::vector< double > shapeDerivs_
Definition: Hex27CVFEM.h:177
virtual void general_face_grad_op(const int face_ordinal, const double *isoParCoord, const double *coords, double *gradop, double *det_j, double *error)
Definition: MasterElement.h:215
Definition: Hex27CVFEM.h:31
InterpWeightType interpWeights_
Definition: Hex27CVFEM.h:432
double shifted_gauss_point_location(int nodeOrdinal, int gaussPointOrdinal) const
Definition: Hex27CVFEM.C:219
const int numQuad_
Definition: Hex27CVFEM.h:164
static constexpr int numScsIp_
Definition: AlgTraits.h:30
void shape_fcn(double *shpfc)
Definition: Hex27CVFEM.C:270