49 #ifndef __INTREPID2_CELLTOOLS_DEF_NODE_INFO_HPP__
50 #define __INTREPID2_CELLTOOLS_DEF_NODE_INFO_HPP__
53 #if defined (__clang__) && !defined (__INTEL_COMPILER)
54 #pragma clang system_header
65 template<
typename SpT>
72 refNodeData_.line = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::line", 2, 3);
73 refNodeData_.line_3 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::line_3", 3, 3);
75 refNodeData_.triangle = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::triangle", 3, 3);
76 refNodeData_.triangle_4 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::triangle_4", 4, 3);
77 refNodeData_.triangle_6 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::triangle_6", 6, 3);
79 refNodeData_.quadrilateral = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::quad", 4, 3);
80 refNodeData_.quadrilateral_8 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::quad_8", 8, 3);
81 refNodeData_.quadrilateral_9 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::quad_9", 9, 3);
83 refNodeData_.tetrahedron = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::tet", 4, 3);
84 refNodeData_.tetrahedron_8 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::tet_8", 8, 3);
85 refNodeData_.tetrahedron_10 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::tet_10", 10, 3);
86 refNodeData_.tetrahedron_11 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::tet_11", 11, 3);
88 refNodeData_.hexahedron = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::hex", 8, 3);
89 refNodeData_.hexahedron_20 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::hex_20", 20, 3);
90 refNodeData_.hexahedron_27 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::hex_27", 27, 3);
92 refNodeData_.pyramid = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::pyr", 5, 3);
93 refNodeData_.pyramid_13 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::pyr_13", 13, 3);
94 refNodeData_.pyramid_14 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::pyr_14", 14, 3);
96 refNodeData_.wedge = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::wedge", 6, 3);
97 refNodeData_.wedge_15 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::wedge_15", 15, 3);
98 refNodeData_.wedge_18 = referenceNodeDataViewType(
"CellTools::ReferenceNodeData::wedge_18", 18, 3);
103 Kokkos::deep_copy(refNodeData_.line, referenceNodeDataViewHostType(&refNodeDataStatic_.line[0][0], 2, 3));
104 Kokkos::deep_copy(refNodeData_.line_3, referenceNodeDataViewHostType(&refNodeDataStatic_.line_3[0][0], 3, 3));
106 Kokkos::deep_copy(refNodeData_.triangle, referenceNodeDataViewHostType(&refNodeDataStatic_.triangle[0][0], 3, 3));
107 Kokkos::deep_copy(refNodeData_.triangle_4, referenceNodeDataViewHostType(&refNodeDataStatic_.triangle_4[0][0], 4, 3));
108 Kokkos::deep_copy(refNodeData_.triangle_6, referenceNodeDataViewHostType(&refNodeDataStatic_.triangle_6[0][0], 6, 3));
110 Kokkos::deep_copy(refNodeData_.quadrilateral, referenceNodeDataViewHostType(&refNodeDataStatic_.quadrilateral[0][0], 4, 3));
111 Kokkos::deep_copy(refNodeData_.quadrilateral_8, referenceNodeDataViewHostType(&refNodeDataStatic_.quadrilateral_8[0][0], 8, 3));
112 Kokkos::deep_copy(refNodeData_.quadrilateral_9, referenceNodeDataViewHostType(&refNodeDataStatic_.quadrilateral_9[0][0], 9, 3));
114 Kokkos::deep_copy(refNodeData_.tetrahedron, referenceNodeDataViewHostType(&refNodeDataStatic_.tetrahedron[0][0], 4, 3));
115 Kokkos::deep_copy(refNodeData_.tetrahedron_8, referenceNodeDataViewHostType(&refNodeDataStatic_.tetrahedron_8[0][0], 8, 3));
116 Kokkos::deep_copy(refNodeData_.tetrahedron_10, referenceNodeDataViewHostType(&refNodeDataStatic_.tetrahedron_10[0][0], 10, 3));
117 Kokkos::deep_copy(refNodeData_.tetrahedron_11, referenceNodeDataViewHostType(&refNodeDataStatic_.tetrahedron_11[0][0], 11, 3));
119 Kokkos::deep_copy(refNodeData_.hexahedron, referenceNodeDataViewHostType(&refNodeDataStatic_.hexahedron[0][0], 8, 3));
120 Kokkos::deep_copy(refNodeData_.hexahedron_20, referenceNodeDataViewHostType(&refNodeDataStatic_.hexahedron_20[0][0], 20, 3));
121 Kokkos::deep_copy(refNodeData_.hexahedron_27, referenceNodeDataViewHostType(&refNodeDataStatic_.hexahedron_27[0][0], 27, 3));
123 Kokkos::deep_copy(refNodeData_.pyramid, referenceNodeDataViewHostType(&refNodeDataStatic_.pyramid[0][0], 5, 3));
124 Kokkos::deep_copy(refNodeData_.pyramid_13, referenceNodeDataViewHostType(&refNodeDataStatic_.pyramid_13[0][0], 13, 3));
125 Kokkos::deep_copy(refNodeData_.pyramid_14, referenceNodeDataViewHostType(&refNodeDataStatic_.pyramid_14[0][0], 14, 3));
127 Kokkos::deep_copy(refNodeData_.wedge, referenceNodeDataViewHostType(&refNodeDataStatic_.wedge[0][0], 6, 3));
128 Kokkos::deep_copy(refNodeData_.wedge_15, referenceNodeDataViewHostType(&refNodeDataStatic_.wedge_15[0][0], 15, 3));
129 Kokkos::deep_copy(refNodeData_.wedge_18, referenceNodeDataViewHostType(&refNodeDataStatic_.wedge_18[0][0], 18, 3));
132 Kokkos::push_finalize_hook( [=] {
133 refNodeData_.line = referenceNodeDataViewType();
134 refNodeData_.line_3 = referenceNodeDataViewType();
136 refNodeData_.triangle = referenceNodeDataViewType();
137 refNodeData_.triangle_4 = referenceNodeDataViewType();
138 refNodeData_.triangle_6 = referenceNodeDataViewType();
140 refNodeData_.quadrilateral = referenceNodeDataViewType();
141 refNodeData_.quadrilateral_8 = referenceNodeDataViewType();
142 refNodeData_.quadrilateral_9 = referenceNodeDataViewType();
144 refNodeData_.tetrahedron = referenceNodeDataViewType();
145 refNodeData_.tetrahedron_8 = referenceNodeDataViewType();
146 refNodeData_.tetrahedron_10 = referenceNodeDataViewType();
147 refNodeData_.tetrahedron_11 = referenceNodeDataViewType();
149 refNodeData_.hexahedron = referenceNodeDataViewType();
150 refNodeData_.hexahedron_20 = referenceNodeDataViewType();
151 refNodeData_.hexahedron_27 = referenceNodeDataViewType();
153 refNodeData_.pyramid = referenceNodeDataViewType();
154 refNodeData_.pyramid_13 = referenceNodeDataViewType();
155 refNodeData_.pyramid_14 = referenceNodeDataViewType();
157 refNodeData_.wedge = referenceNodeDataViewType();
158 refNodeData_.wedge_15 = referenceNodeDataViewType();
159 refNodeData_.wedge_18 = referenceNodeDataViewType();
162 isReferenceNodeDataSet_ =
true;
165 template<
typename SpT>
166 template<
typename cellCenterValueType,
class ...cellCenterProperties,
167 typename cellVertexValueType,
class ...cellVertexProperties>
171 Kokkos::DynRankView<cellVertexValueType,cellVertexProperties...> cellVertex,
172 const shards::CellTopology cell ) {
173 #ifdef HAVE_INTREPID2_DEBUG
174 INTREPID2_TEST_FOR_EXCEPTION( !hasReferenceCell(cell), std::invalid_argument,
175 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): the specified cell topology does not have a reference cell." );
177 INTREPID2_TEST_FOR_EXCEPTION( cellCenter.rank() != 1, std::invalid_argument,
178 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): cellCenter must have rank 1." );
180 INTREPID2_TEST_FOR_EXCEPTION( cellCenter.extent(0) < cell.getDimension(), std::invalid_argument,
181 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): cellCenter must have dimension bigger than Parameters::MaxDimension." );
183 INTREPID2_TEST_FOR_EXCEPTION( cellVertex.rank() != 1, std::invalid_argument,
184 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): cellVertex must have rank 1." );
186 INTREPID2_TEST_FOR_EXCEPTION( cellVertex.extent(0) < cell.getDimension(), std::invalid_argument,
187 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): cellVertex must have dimension bigger than Parameters::MaxDimension." );
189 const ordinal_type vertexCount = cell.getVertexCount();
190 const ordinal_type dim = cell.getDimension();
192 for (ordinal_type i=0;i<dim;++i) {
194 for (ordinal_type vertOrd=0;vertOrd<vertexCount;++vertOrd) {
195 getReferenceVertex(cellVertex, cell, vertOrd);
196 cellCenter(i) += cellVertex(i);
198 cellCenter(i) /= vertexCount;
203 template<
typename SpT>
204 template<
typename cellVertexValueType,
class ...cellVertexProperties>
208 const shards::CellTopology cell,
209 const ordinal_type vertexOrd ) {
210 #ifdef HAVE_INTREPID2_DEBUG
211 INTREPID2_TEST_FOR_EXCEPTION( !hasReferenceCell(cell), std::invalid_argument,
212 ">>> ERROR (Intrepid2::CellTools::getReferenceVertex): the specified cell topology does not have a reference cell." );
214 INTREPID2_TEST_FOR_EXCEPTION( (vertexOrd < 0) || vertexOrd > static_cast<ordinal_type>(cell.getVertexCount()), std::invalid_argument,
215 ">>> ERROR (Intrepid2::CellTools::getReferenceVertex): invalid node ordinal for the specified cell topology." );
217 INTREPID2_TEST_FOR_EXCEPTION( cellVertex.rank() != 1, std::invalid_argument,
218 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): cellNodes must have rank 1." );
220 INTREPID2_TEST_FOR_EXCEPTION( cellVertex.extent(0) < cell.getDimension(), std::invalid_argument,
221 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): cellNodes must have dimension bigger than Parameters::MaxDimension." );
223 getReferenceNode(cellVertex,
229 template<
typename SpT>
230 template<
typename subcellVertexValueType,
class ...subcellVertexProperties>
234 const ordinal_type subcellDim,
235 const ordinal_type subcellOrd,
236 const shards::CellTopology parentCell ) {
237 #ifdef HAVE_INTREPID2_DEBUG
238 INTREPID2_TEST_FOR_EXCEPTION( !hasReferenceCell(parentCell), std::invalid_argument,
239 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellVertices): the specified cell topology does not have a reference cell." );
241 INTREPID2_TEST_FOR_EXCEPTION( subcellDim > static_cast<ordinal_type>(parentCell.getDimension()), std::invalid_argument,
242 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellVertices): subcell dimension cannot exceed cell dimension." );
244 INTREPID2_TEST_FOR_EXCEPTION( subcellOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(subcellDim)), std::invalid_argument,
245 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellVertices): subcell ordinal cannot exceed subcell count." );
248 INTREPID2_TEST_FOR_EXCEPTION( subcellVertices.rank() != 2, std::invalid_argument,
249 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellVertices): subcellVertieces must have rank 2." );
252 INTREPID2_TEST_FOR_EXCEPTION( subcellVertices.extent(0) != parentCell.getNodeCount(subcellDim, subcellOrd), std::invalid_argument,
253 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellVertices): subcellVertieces dimension(0) must match to parent cell vertex count." );
255 INTREPID2_TEST_FOR_EXCEPTION( subcellVertices.extent(1) != parentCell.getDimension(), std::invalid_argument,
256 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellVertices): subcellVertieces dimension(1) must match to parent cell dimension." );
258 getReferenceSubcellNodes(subcellVertices,
265 template<
typename SpT>
266 template<
typename cellNodeValueType,
class ...cellNodeProperties>
270 const shards::CellTopology cell,
271 const ordinal_type nodeOrd ) {
272 #ifdef HAVE_INTREPID2_DEBUG
273 INTREPID2_TEST_FOR_EXCEPTION( !hasReferenceCell(cell), std::invalid_argument,
274 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): the specified cell topology does not have a reference cell." );
276 INTREPID2_TEST_FOR_EXCEPTION( nodeOrd >= static_cast<ordinal_type>(cell.getNodeCount()), std::invalid_argument,
277 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): invalid node ordinal for the specified cell topology." );
279 INTREPID2_TEST_FOR_EXCEPTION( cellNode.rank() != 1, std::invalid_argument,
280 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): cellNode must have rank 1." );
282 INTREPID2_TEST_FOR_EXCEPTION( cellNode.extent(0) < cell.getDimension(), std::invalid_argument,
283 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): cellNode must have dimension bigger than Parameters::MaxDimension." );
286 if (!isReferenceNodeDataSet_)
287 setReferenceNodeData();
289 referenceNodeDataViewType ref;
291 switch (cell.getKey() ) {
292 case shards::Line<2>::key:
293 case shards::ShellLine<2>::key:
294 case shards::Beam<2>::key: ref = refNodeData_.line;
break;
295 case shards::Line<3>::key:
296 case shards::ShellLine<3>::key:
297 case shards::Beam<3>::key: ref = refNodeData_.line_3;
break;
299 case shards::Triangle<3>::key:
300 case shards::ShellTriangle<3>::key: ref = refNodeData_.triangle;
break;
301 case shards::Triangle<4>::key: ref = refNodeData_.triangle_4;
break;
302 case shards::Triangle<6>::key:
303 case shards::ShellTriangle<6>::key: ref = refNodeData_.triangle_6;
break;
305 case shards::Quadrilateral<4>::key:
306 case shards::ShellQuadrilateral<4>::key: ref = refNodeData_.quadrilateral;
break;
307 case shards::Quadrilateral<8>::key:
308 case shards::ShellQuadrilateral<8>::key: ref = refNodeData_.quadrilateral_8;
break;
309 case shards::Quadrilateral<9>::key:
310 case shards::ShellQuadrilateral<9>::key: ref = refNodeData_.quadrilateral_9;
break;
312 case shards::Tetrahedron<4>::key: ref = refNodeData_.tetrahedron;
break;
313 case shards::Tetrahedron<8>::key: ref = refNodeData_.tetrahedron_8;
break;
314 case shards::Tetrahedron<10>::key: ref = refNodeData_.tetrahedron_10;
break;
315 case shards::Tetrahedron<11>::key: ref = refNodeData_.tetrahedron_11;
break;
317 case shards::Hexahedron<8>::key: ref = refNodeData_.hexahedron;
break;
318 case shards::Hexahedron<20>::key: ref = refNodeData_.hexahedron_20;
break;
319 case shards::Hexahedron<27>::key: ref = refNodeData_.hexahedron_27;
break;
321 case shards::Pyramid<5>::key: ref = refNodeData_.pyramid;
break;
322 case shards::Pyramid<13>::key: ref = refNodeData_.pyramid_13;
break;
323 case shards::Pyramid<14>::key: ref = refNodeData_.pyramid_14;
break;
325 case shards::Wedge<6>::key: ref = refNodeData_.wedge;
break;
326 case shards::Wedge<15>::key: ref = refNodeData_.wedge_15;
break;
327 case shards::Wedge<18>::key: ref = refNodeData_.wedge_18;
break;
330 INTREPID2_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
331 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): invalid cell topology.");
339 const ordinal_type dim = cell.getDimension();
341 for (ordinal_type i=0;i<dim;++i)
342 cellNode(i) = ref(nodeOrd, i);
345 template<
typename SpT>
346 template<
typename subcellNodeValueType,
class ...subcellNodeProperties>
350 const ordinal_type subcellDim,
351 const ordinal_type subcellOrd,
352 const shards::CellTopology parentCell ) {
353 #ifdef HAVE_INTREPID2_DEBUG
354 INTREPID2_TEST_FOR_EXCEPTION( !hasReferenceCell(parentCell), std::invalid_argument,
355 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellNodes): the specified cell topology does not have a reference cell.");
357 INTREPID2_TEST_FOR_EXCEPTION( subcellDim > static_cast<ordinal_type>(parentCell.getDimension()), std::invalid_argument,
358 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellNodes): subcell dimension out of range.");
360 INTREPID2_TEST_FOR_EXCEPTION( subcellOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(subcellDim)), std::invalid_argument,
361 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellNodes): subcell ordinal out of range.");
364 INTREPID2_TEST_FOR_EXCEPTION( subcellNodes.rank() != 2, std::invalid_argument,
365 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellNodes): subcellNodes must have rank 2.");
367 INTREPID2_TEST_FOR_EXCEPTION( subcellNodes.extent(0) != parentCell.getNodeCount(subcellDim, subcellOrd), std::invalid_argument,
368 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellNodes): subcellNodes dimension (0) must match to node count in cell.");
370 INTREPID2_TEST_FOR_EXCEPTION( subcellNodes.extent(1) != parentCell.getDimension(), std::invalid_argument,
371 ">>> ERROR (Intrepid2::CellTools::getReferenceSubcellNodes): subcellNodes dimension (1) must match to cell dimension.");
375 const auto subcNodeCount = parentCell.getNodeCount(subcellDim, subcellOrd);
378 for (size_type subcNodeOrd=0;subcNodeOrd<subcNodeCount;++subcNodeOrd) {
380 const auto cellNodeOrd = parentCell.getNodeMap(subcellDim, subcellOrd, subcNodeOrd);
382 auto dst = Kokkos::subdynrankview(subcellNodes, subcNodeOrd, Kokkos::ALL());
383 getReferenceNode(dst, parentCell, cellNodeOrd);
387 template<
typename SpT>
388 template<
typename refEdgeTangentValueType,
class ...refEdgeTangentProperties>
392 const ordinal_type edgeOrd,
393 const shards::CellTopology parentCell ) {
394 #ifdef HAVE_INTREPID2_DEBUG
395 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 2 &&
396 parentCell.getDimension() != 3, std::invalid_argument,
397 ">>> ERROR (Intrepid2::CellTools::getReferenceEdgeTangent): two or three-dimensional parent cell required");
399 INTREPID2_TEST_FOR_EXCEPTION( refEdgeTangent.rank() != 1, std::invalid_argument,
400 ">>> ERROR (Intrepid2::CellTools::getReferenceEdgeTangent): rank = 1 required for output arrays");
402 INTREPID2_TEST_FOR_EXCEPTION( refEdgeTangent.extent(0) != parentCell.getDimension(), std::invalid_argument,
403 ">>> ERROR (Intrepid2::CellTools::getReferenceEdgeTangent): output array size is required to match space dimension");
405 INTREPID2_TEST_FOR_EXCEPTION( edgeOrd < 0 ||
406 edgeOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(1)), std::invalid_argument,
407 ">>> ERROR (Intrepid2::CellTools::getReferenceEdgeTangent): edge ordinal out of bounds");
412 subcellParamViewType edgeMap;
413 getSubcellParametrization(edgeMap, 1, parentCell);
417 const ordinal_type dim = parentCell.getDimension();
418 for (ordinal_type i=0;i<dim;++i)
419 refEdgeTangent(i) = edgeMap(edgeOrd, i, 1);
423 template<
typename SpT>
424 template<
typename refFaceTanUValueType,
class ...refFaceTanUProperties,
425 typename refFaceTanVValueType,
class ...refFaceTanVProperties>
429 Kokkos::DynRankView<refFaceTanVValueType,refFaceTanVProperties...> refFaceTanV,
430 const ordinal_type faceOrd,
431 const shards::CellTopology parentCell ) {
432 #ifdef HAVE_INTREPID2_DEBUG
433 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 3, std::invalid_argument,
434 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceTangents): three-dimensional parent cell required");
436 INTREPID2_TEST_FOR_EXCEPTION( faceOrd < 0 || faceOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(2)), std::invalid_argument,
437 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceTangents): face ordinal out of bounds");
439 INTREPID2_TEST_FOR_EXCEPTION( refFaceTanU.rank() != 1 || refFaceTanV.rank() != 1, std::invalid_argument,
440 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceTangents): rank = 1 required for output arrays");
442 INTREPID2_TEST_FOR_EXCEPTION( refFaceTanU.extent(0) != parentCell.getDimension(), std::invalid_argument,
443 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceTangents): dim0 (spatial dim) must match that of parent cell");
445 INTREPID2_TEST_FOR_EXCEPTION( refFaceTanV.extent(0) != parentCell.getDimension(), std::invalid_argument,
446 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceTangents): dim0 (spatial dim) must match that of parent cell");
451 subcellParamViewType faceMap;
452 getSubcellParametrization(faceMap, 2, parentCell);
460 const ordinal_type dim = parentCell.getDimension();
461 for (ordinal_type i=0;i<dim;++i) {
462 refFaceTanU(i) = faceMap(faceOrd, i, 1);
463 refFaceTanV(i) = faceMap(faceOrd, i, 2);
467 template<
typename SpT>
468 template<
typename refSideNormalValueType,
class ...refSideNormalProperties>
472 const ordinal_type sideOrd,
473 const shards::CellTopology parentCell ) {
474 #ifdef HAVE_INTREPID2_DEBUG
475 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 2 &&
476 parentCell.getDimension() != 3, std::invalid_argument,
477 ">>> ERROR (Intrepid2::CellTools::getReferenceSideNormal): two or three-dimensional parent cell required");
480 INTREPID2_TEST_FOR_EXCEPTION( sideOrd < 0 || sideOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(parentCell.getDimension() - 1)), std::invalid_argument,
481 ">>> ERROR (Intrepid2::CellTools::getReferenceSideNormal): side ordinal out of bounds");
484 const auto dim = parentCell.getDimension();
487 getReferenceEdgeTangent(refSideNormal, sideOrd, parentCell);
490 refSideNormalValueType tmp = refSideNormal(0);
491 refSideNormal(0) = refSideNormal(1);
492 refSideNormal(1) = -tmp;
495 getReferenceFaceNormal(refSideNormal, sideOrd, parentCell);
500 template<
typename SpT>
501 template<
typename refFaceNormalValueType,
class ...refFaceNormalProperties>
505 const ordinal_type faceOrd,
506 const shards::CellTopology parentCell ) {
507 #ifdef HAVE_INTREPID2_DEBUG
508 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 3, std::invalid_argument,
509 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceNormal): three-dimensional parent cell required");
511 INTREPID2_TEST_FOR_EXCEPTION( faceOrd < 0 || faceOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(2)), std::invalid_argument,
512 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceNormal): face ordinal out of bounds");
514 INTREPID2_TEST_FOR_EXCEPTION( refFaceNormal.rank() != 1, std::invalid_argument,
515 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceNormal): rank = 1 required for output array");
517 INTREPID2_TEST_FOR_EXCEPTION( refFaceNormal.extent(0) != parentCell.getDimension(), std::invalid_argument,
518 ">>> ERROR (Intrepid2::CellTools::getReferenceFaceNormal): dim0 (spatial dim) must match that of parent cell");
522 const auto dim = parentCell.getDimension();
523 auto vcprop = Kokkos::common_view_alloc_prop(refFaceNormal);
524 using common_value_type =
typename decltype(vcprop)::value_type;
525 Kokkos::DynRankView< common_value_type, SpT > refFaceTanU ( Kokkos::view_alloc(
"CellTools::getReferenceFaceNormal::refFaceTanU", vcprop), dim );
526 Kokkos::DynRankView< common_value_type, SpT > refFaceTanV ( Kokkos::view_alloc(
"CellTools::getReferenceFaceNormal::refFaceTanV", vcprop), dim );
527 getReferenceFaceTangents(refFaceTanU, refFaceTanV, faceOrd, parentCell);
532 template<
typename SpT>
533 template<
typename edgeTangentValueType,
class ...edgeTangentProperties,
534 typename worksetJacobianValueType,
class ...worksetJacobianProperties>
538 const Kokkos::DynRankView<worksetJacobianValueType,worksetJacobianProperties...> worksetJacobians,
539 const ordinal_type worksetEdgeOrd,
540 const shards::CellTopology parentCell ) {
541 #ifdef HAVE_INTREPID2_DEBUG
542 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 3 &&
543 parentCell.getDimension() != 2, std::invalid_argument,
544 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): 2D or 3D parent cell required." );
547 INTREPID2_TEST_FOR_EXCEPTION( edgeTangents.rank() != 3, std::invalid_argument,
548 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): edgeTangents requires rank 3." );
549 INTREPID2_TEST_FOR_EXCEPTION( edgeTangents.extent(2) != 2 &&
550 edgeTangents.extent(2) != 3, std::invalid_argument,
551 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): edgeTangents dimension(2) must be 2 or 3." );
554 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.rank() != 4, std::invalid_argument,
555 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): worksetJacobians requires rank 4." );
556 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.extent(2) != 2 &&
557 worksetJacobians.extent(2) != 3, std::invalid_argument,
558 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): worksetJacobians dimension(2) must be 2 or 3." );
559 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.extent(2) != worksetJacobians.extent(3), std::invalid_argument,
560 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): worksetJacobians dimension(2) and (3) must match each other." );
563 for (
auto i=0;i<3;++i) {
564 INTREPID2_TEST_FOR_EXCEPTION( edgeTangents.extent(i) != worksetJacobians.extent(i), std::invalid_argument,
565 ">>> ERROR (Intrepid2::CellTools::getPhysicalEdgeTangents): edgeTangents dimension (i) does not match to worksetJacobians dimension(i)." );
570 const auto dim = parentCell.getDimension();
571 auto vcprop = Kokkos::common_view_alloc_prop(edgeTangents);
572 using common_value_type =
typename decltype(vcprop)::value_type;
573 Kokkos::DynRankView< common_value_type, SpT > refEdgeTan ( Kokkos::view_alloc(
"CellTools::getPhysicalEdgeTangents::refEdgeTan", vcprop), dim);
574 getReferenceEdgeTangent(refEdgeTan, worksetEdgeOrd, parentCell);
580 template<
typename SpT>
581 template<
typename faceTanUValueType,
class ...faceTanUProperties,
582 typename faceTanVValueType,
class ...faceTanVProperties,
583 typename worksetJacobianValueType,
class ...worksetJacobianProperties>
587 Kokkos::DynRankView<faceTanVValueType,faceTanVProperties...> faceTanV,
588 const Kokkos::DynRankView<worksetJacobianValueType,worksetJacobianProperties...> worksetJacobians,
589 const ordinal_type worksetFaceOrd,
590 const shards::CellTopology parentCell ) {
591 #ifdef HAVE_INTREPID2_DEBUG
592 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 3, std::invalid_argument,
593 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): three-dimensional parent cell required");
596 INTREPID2_TEST_FOR_EXCEPTION( faceTanU.rank() != 3 ||
597 faceTanV.rank() != 3, std::invalid_argument,
598 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): faceTan U,V must have rank 3." );
600 INTREPID2_TEST_FOR_EXCEPTION( faceTanU.extent(2) != 3 ||
601 faceTanV.extent(2) != 3, std::invalid_argument,
602 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): faceTan U,V dimension (2) must be 3." );
604 for (
auto i=0;i<3;++i) {
605 INTREPID2_TEST_FOR_EXCEPTION( faceTanU.extent(i) != faceTanV.extent(i), std::invalid_argument,
606 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): faceTan U,V dimension (i) must match each other." );
610 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.rank() != 4, std::invalid_argument,
611 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): worksetJacobians must have rank 4." );
613 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.extent(2) != 3, std::invalid_argument,
614 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): worksetJacobians dimension(2) must be 3." );
616 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.extent(2) != worksetJacobians.extent(3), std::invalid_argument,
617 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): worksetJacobians dimension(2) and dimension(3) must match." );
620 for (
auto i=0;i<3;++i) {
621 INTREPID2_TEST_FOR_EXCEPTION( faceTanU.extent(i) != worksetJacobians.extent(i), std::invalid_argument,
622 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceTangents): worksetJacobians dimension(i) and faceTan dimension (i) must match." );
627 const auto dim = parentCell.getDimension();
629 auto vcpropU = Kokkos::common_view_alloc_prop(faceTanU);
630 using common_value_typeU =
typename decltype(vcpropU)::value_type;
631 Kokkos::DynRankView< common_value_typeU, SpT > refFaceTanU ( Kokkos::view_alloc(
"CellTools::getPhysicalFaceTangents::refFaceTanU", vcpropU), dim);
633 auto vcpropV = Kokkos::common_view_alloc_prop(faceTanV);
634 using common_value_typeV =
typename decltype(vcpropV)::value_type;
635 Kokkos::DynRankView< common_value_typeV, SpT > refFaceTanV ( Kokkos::view_alloc(
"CellTools::getPhysicalFaceTangents::refFaceTanV", vcpropV), dim);
637 getReferenceFaceTangents(refFaceTanU, refFaceTanV, worksetFaceOrd, parentCell);
644 template<
typename SpT>
645 template<
typename sideNormalValueType,
class ...sideNormalProperties,
646 typename worksetJacobianValueType,
class ...worksetJacobianProperties>
650 const Kokkos::DynRankView<worksetJacobianValueType,worksetJacobianProperties...> worksetJacobians,
651 const ordinal_type worksetSideOrd,
652 const shards::CellTopology parentCell ) {
653 #ifdef HAVE_INTREPID2_DEBUG
654 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 2 &&
655 parentCell.getDimension() != 3, std::invalid_argument,
656 ">>> ERROR (Intrepid2::CellTools::getPhysicalSideNormals): two or three-dimensional parent cell required");
659 INTREPID2_TEST_FOR_EXCEPTION( worksetSideOrd < 0 ||
660 worksetSideOrd >= static_cast<ordinal_type>(parentCell.getSubcellCount(parentCell.getDimension() - 1)), std::invalid_argument,
661 ">>> ERROR (Intrepid2::CellTools::getPhysicalSideNormals): side ordinal out of bounds");
663 const auto dim = parentCell.getDimension();
667 auto vcprop = Kokkos::common_view_alloc_prop(sideNormals);
668 using common_value_type =
typename decltype(vcprop)::value_type;
669 Kokkos::DynRankView< common_value_type, SpT > edgeTangents ( Kokkos::view_alloc(
"CellTools::getPhysicalSideNormals::edgeTan", vcprop),
670 sideNormals.extent(0),
671 sideNormals.extent(1),
672 sideNormals.extent(2));
673 getPhysicalEdgeTangents(edgeTangents, worksetJacobians, worksetSideOrd, parentCell);
675 Kokkos::DynRankView< common_value_type, SpT > rotation ( Kokkos::view_alloc(
"CellTools::getPhysicalSideNormals::rotation", vcprop), dim, dim);
676 rotation(0,0) = 0; rotation(0,1) = 1;
677 rotation(1,0) = -1; rotation(1,1) = 0;
681 getPhysicalFaceNormals(sideNormals, worksetJacobians, worksetSideOrd, parentCell);
686 template<
typename SpT>
687 template<
typename faceNormalValueType,
class ...faceNormalProperties,
688 typename worksetJacobianValueType,
class ...worksetJacobianProperties>
692 const Kokkos::DynRankView<worksetJacobianValueType,worksetJacobianProperties...> worksetJacobians,
693 const ordinal_type worksetFaceOrd,
694 const shards::CellTopology parentCell ) {
695 #ifdef HAVE_INTREPID2_DEBUG
696 INTREPID2_TEST_FOR_EXCEPTION( parentCell.getDimension() != 3, std::invalid_argument,
697 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): three-dimensional parent cell required." );
700 INTREPID2_TEST_FOR_EXCEPTION( faceNormals.rank() != 3, std::invalid_argument,
701 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): faceNormals must have a rank 3." );
702 INTREPID2_TEST_FOR_EXCEPTION( faceNormals.extent(2) != 3, std::invalid_argument,
703 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): faceNormals dimension (2) must be 3." );
706 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.rank() != 4, std::invalid_argument,
707 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): worksetJacobians must have a rank 4." );
708 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.extent(2) != 3, std::invalid_argument,
709 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): worksetJacobians dimension (2) must be 3." );
710 INTREPID2_TEST_FOR_EXCEPTION( worksetJacobians.extent(2) != worksetJacobians.extent(3), std::invalid_argument,
711 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): worksetJacobians dimension (2) must match to dimension (3)." );
714 for (
auto i=0;i<3;++i) {
715 INTREPID2_TEST_FOR_EXCEPTION( faceNormals.extent(i) != worksetJacobians.extent(i), std::invalid_argument,
716 ">>> ERROR (Intrepid2::CellTools::getPhysicalFaceNormals): faceNormals dimension (i) must match to worksetJacobians dimension (i)." );
722 const auto worksetSize = worksetJacobians.extent(0);
723 const auto facePtCount = worksetJacobians.extent(1);
724 const auto dim = parentCell.getDimension();
726 auto vcprop = Kokkos::common_view_alloc_prop(faceNormals);
727 using common_value_type =
typename decltype(vcprop)::value_type;
728 Kokkos::DynRankView< common_value_type, SpT > faceTanU ( Kokkos::view_alloc(
"CellTools::getPhysicalFaceNormals::faceTanU", vcprop), worksetSize, facePtCount, dim);
729 Kokkos::DynRankView< common_value_type, SpT > faceTanV ( Kokkos::view_alloc(
"CellTools::getPhysicalFaceNormals::faceTanV", vcprop), worksetSize, facePtCount, dim);
731 getPhysicalFaceTangents(faceTanU, faceTanV,
740 template<
typename SpT>
743 isReferenceNodeDataSet_ =
false;
745 template<
typename SpT>
750 template<
typename SpT>
753 refNodeDataStatic_ = {
756 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}
759 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}
763 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}
766 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 1/3, 1/3, 0.0}
769 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0},
770 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}
774 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0}
777 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
778 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0}
781 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
782 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}
786 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0}
789 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
790 { 1/3, 0.0, 1/3}, { 1/3, 1/3, 1/3}, { 1/3, 1/3, 0.0}, { 0.0, 1/3, 1/3}
793 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
794 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}, { 0.0, 0.0, 0.5}, { 0.5, 0.0, 0.5}, { 0.0, 0.5, 0.5}
797 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
798 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}, { 0.0, 0.0, 0.5}, { 0.5, 0.0, 0.5}, { 0.0, 0.5, 0.5}
802 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
803 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}
806 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
807 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0},
808 { 0.0,-1.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, {-1.0, 0.0,-1.0},
809 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
810 { 0.0,-1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0}, {-1.0, 0.0, 1.0}
813 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
814 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0},
815 { 0.0,-1.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, {-1.0, 0.0,-1.0},
816 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
817 { 0.0,-1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0}, {-1.0, 0.0, 1.0},
819 { 0.0, 0.0,-1.0}, { 0.0, 0.0, 1.0}, {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, {0.0,-1.0, 0.0}, {0.0, 1.0, 0.0}
823 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0}, { 0.0, 0.0, 1.0}
826 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
827 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0},
828 {-0.5,-0.5, 0.5}, { 0.5,-0.5, 0.5}, { 0.5, 0.5, 0.5}, {-0.5, 0.5, 0.5}
831 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
832 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0},
833 {-0.5,-0.5, 0.5}, { 0.5,-0.5, 0.5}, { 0.5, 0.5, 0.5}, {-0.5, 0.5, 0.5}, { 0.0, 0.0, 0.0}
837 { 0.0, 0.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, { 0.0, 0.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0}
840 { 0.0, 0.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, { 0.0, 0.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0},
841 { 0.5, 0.0,-1.0}, { 0.5, 0.5,-1.0}, { 0.0, 0.5,-1.0}, { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0},
842 { 0.5, 0.0, 1.0}, { 0.5, 0.5, 1.0}, { 0.0, 0.5, 1.0}
845 { 0.0, 0.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, { 0.0, 0.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0},
846 { 0.5, 0.0,-1.0}, { 0.5, 0.5,-1.0}, { 0.0, 0.5,-1.0}, { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0},
847 { 0.5, 0.0, 1.0}, { 0.5, 0.5, 1.0}, { 0.0, 0.5, 1.0},
848 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}