53 #ifndef __INTREPID2_CELLDATA_DEF_HPP__
54 #define __INTREPID2_CELLDATA_DEF_HPP__
58 template<
typename DeviceType>
62 switch ( cellTopoKey ) {
63 case shards::Line<2>::key:
64 case shards::Line<3>::key:
65 case shards::ShellLine<2>::key:
66 case shards::ShellLine<3>::key:
67 case shards::Beam<2>::key:
68 case shards::Beam<3>::key:
69 case shards::Triangle<3>::key:
71 case shards::Triangle<6>::key:
74 case shards::Quadrilateral<4>::key:
75 case shards::Quadrilateral<8>::key:
76 case shards::Quadrilateral<9>::key:
80 case shards::Tetrahedron<4>::key:
82 case shards::Tetrahedron<10>::key:
84 case shards::Hexahedron<8>::key:
85 case shards::Hexahedron<20>::key:
86 case shards::Hexahedron<27>::key:
87 case shards::Pyramid<5>::key:
90 case shards::Wedge<6>::key:
92 case shards::Wedge<18>::key:
99 template<
typename DeviceType>
101 typename RefSubcellParametrization<DeviceType>::ConstViewType
103 get(
const ordinal_type subcellDim,
104 const unsigned parentCellKey ) {
106 if(!isSubcellParametrizationSet_)
111 switch (parentCellKey ) {
112 case shards::Tetrahedron<4>::key:
113 case shards::Tetrahedron<8>::key:
114 case shards::Tetrahedron<10>::key:
115 case shards::Tetrahedron<11>::key: subcellParam = ( subcellDim == 2 ? tetFacesParam : tetEdgesParam );
break;
117 case shards::Hexahedron<8>::key:
118 case shards::Hexahedron<20>::key:
119 case shards::Hexahedron<27>::key: subcellParam = ( subcellDim == 2 ? hexFacesParam : hexEdgesParam );
break;
121 case shards::Pyramid<5>::key:
122 case shards::Pyramid<13>::key:
123 case shards::Pyramid<14>::key: subcellParam = ( subcellDim == 2 ? pyrFacesParam : pyrEdgesParam );
break;
125 case shards::Wedge<6>::key:
126 case shards::Wedge<15>::key:
127 case shards::Wedge<18>::key: subcellParam = ( subcellDim == 2 ? wedgeFacesParam : wedgeEdgesParam );
break;
129 case shards::Triangle<3>::key:
130 case shards::Triangle<4>::key:
131 case shards::Triangle<6>::key: subcellParam = triEdgesParam;
break;
133 case shards::Quadrilateral<4>::key:
134 case shards::Quadrilateral<8>::key:
135 case shards::Quadrilateral<9>::key: subcellParam = quadEdgesParam;
break;
144 case shards::ShellLine<2>::key:
145 case shards::ShellLine<3>::key:
146 case shards::Beam<2>::key:
147 case shards::Beam<3>::key: subcellParam = lineEdgesParam;
break;
149 INTREPID2_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
150 ">>> ERROR (Intrepid2::RefSubcellParametrization::get): invalid cell topology.");
156 template<
typename DeviceType>
160 if(isSubcellParametrizationSet_)
163 ordinal_type subcellDim;
165 const auto tet = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >());
168 tetFacesParam =
ViewType(
"CellTools::SubcellParametrization::tetFaces", tet.getSubcellCount(subcellDim), tet.getDimension(), subcellDim+1);
169 auto subcell2dParamHost = Kokkos::create_mirror_view(tetFacesParam);
170 set( subcell2dParamHost, subcellDim, tet );
171 deep_copy(tetFacesParam,subcell2dParamHost);
174 tetEdgesParam =
ViewType(
"CellTools::SubcellParametrization::tetEdges", tet.getSubcellCount(subcellDim), tet.getDimension(), subcellDim+1);
175 auto subcellParamHost = Kokkos::create_mirror_view(tetEdgesParam);
176 set( subcellParamHost, subcellDim, tet );
177 deep_copy(tetEdgesParam,subcellParamHost);
180 const auto hex = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >());
183 hexFacesParam =
ViewType(
"CellTools::SubcellParametrization::hexFaces", hex.getSubcellCount(subcellDim), hex.getDimension(), subcellDim+1);
184 auto subcell2dParamHost = Kokkos::create_mirror_view(hexFacesParam);
185 set( subcell2dParamHost, subcellDim, hex );
186 deep_copy(hexFacesParam,subcell2dParamHost);
189 hexEdgesParam =
ViewType(
"CellTools::SubcellParametrization::hexEdges", hex.getSubcellCount(subcellDim), hex.getDimension(), subcellDim+1);
190 auto subcellParamHost = Kokkos::create_mirror_view(hexEdgesParam);
191 set( subcellParamHost, subcellDim, hex );
192 deep_copy(hexEdgesParam,subcellParamHost);
195 const auto pyr = shards::CellTopology(shards::getCellTopologyData<shards::Pyramid<5> >());
198 pyrFacesParam =
ViewType(
"CellTools::SubcellParametrization::pyrFaces", pyr.getSubcellCount(subcellDim), pyr.getDimension(), subcellDim+1);
199 auto subcell2dParamHost = Kokkos::create_mirror_view(pyrFacesParam);
200 set( subcell2dParamHost, subcellDim, pyr );
201 deep_copy(pyrFacesParam,subcell2dParamHost);
204 pyrEdgesParam =
ViewType(
"CellTools::SubcellParametrization::pyrEdges", pyr.getSubcellCount(subcellDim), pyr.getDimension(), subcellDim+1);
205 auto subcellParamHost = Kokkos::create_mirror_view(pyrEdgesParam);
206 set( subcellParamHost, subcellDim, pyr );
207 deep_copy(pyrEdgesParam,subcellParamHost);
210 const auto wedge = shards::CellTopology(shards::getCellTopologyData<shards::Wedge<6> >());
213 wedgeFacesParam =
ViewType(
"CellTools::SubcellParametrization::wedgeFaces", wedge.getSubcellCount(subcellDim), wedge.getDimension(), subcellDim+1);
214 auto subcell2dParamHost = Kokkos::create_mirror_view(wedgeFacesParam);
215 set( subcell2dParamHost, subcellDim, wedge );
216 deep_copy(wedgeFacesParam,subcell2dParamHost);
219 wedgeEdgesParam =
ViewType(
"CellTools::SubcellParametrization::wedgeEdges", wedge.getSubcellCount(subcellDim), wedge.getDimension(), subcellDim+1);
220 auto subcellParamHost = Kokkos::create_mirror_view(wedgeEdgesParam);
221 set( subcellParamHost, subcellDim, wedge );
222 deep_copy(wedgeEdgesParam,subcellParamHost);
225 const auto tri = shards::CellTopology(shards::getCellTopologyData<shards::Triangle<3> >());
228 triEdgesParam =
ViewType(
"CellTools::SubcellParametrization::triEdges", tri.getSubcellCount(subcellDim), tri.getDimension(), subcellDim+1);
229 auto subcellParamHost = Kokkos::create_mirror_view(triEdgesParam);
230 set( subcellParamHost, subcellDim, tri );
231 deep_copy(triEdgesParam,subcellParamHost);
234 const auto quad = shards::CellTopology(shards::getCellTopologyData<shards::Quadrilateral<4> >());
237 quadEdgesParam =
ViewType(
"CellTools::SubcellParametrization::quadEdges", quad.getSubcellCount(subcellDim), quad.getDimension(), subcellDim+1);
238 auto subcellParamHost = Kokkos::create_mirror_view(quadEdgesParam);
239 set( subcellParamHost, subcellDim, quad );
240 deep_copy(quadEdgesParam,subcellParamHost);
244 const auto line = shards::CellTopology(shards::getCellTopologyData<shards::ShellLine<2> >());
247 lineEdgesParam =
ViewType(
"CellTools::SubcellParametrization::lineEdges", line.getSubcellCount(subcellDim), line.getDimension(), subcellDim+1);
248 auto subcellParamHost = Kokkos::create_mirror_view(lineEdgesParam);
249 set( subcellParamHost, subcellDim, line );
250 deep_copy(lineEdgesParam,subcellParamHost);
253 Kokkos::push_finalize_hook( [=] {
271 isSubcellParametrizationSet_=
true;
274 template<
typename DeviceType>
275 template <
typename HostViewType>
278 set( HostViewType subcellParam,
279 const ordinal_type subcellDim,
280 const shards::CellTopology parentCell ) {
299 const auto sc = parentCell.getSubcellCount(subcellDim);
300 const auto pcd = parentCell.getDimension();
302 INTREPID2_TEST_FOR_EXCEPTION( subcellDim < 1 || subcellDim > static_cast<ordinal_type>(pcd-1), std::invalid_argument,
303 ">>> ERROR (Intrepid2::RefSubcellParametrization::set): Parametrizations defined in a range between 1 and (dim-1)");
307 if (subcellDim == 1) {
309 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
312 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
313 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
315 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
316 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
319 subcellParam(subcellOrd, 0, 0) = (v0(0) + v1(0))/2.0;
320 subcellParam(subcellOrd, 0, 1) = (v1(0) - v0(0))/2.0;
323 subcellParam(subcellOrd, 1, 0) = (v0(1) + v1(1))/2.0;
324 subcellParam(subcellOrd, 1, 1) = (v1(1) - v0(1))/2.0;
328 subcellParam(subcellOrd, 2, 0) = (v0(2) + v1(2))/2.0;
329 subcellParam(subcellOrd, 2, 1) = (v1(2) - v0(2))/2.0;
333 else if (subcellDim == 2) {
337 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
339 switch (parentCell.getKey(subcellDim,subcellOrd)) {
341 case shards::Triangle<3>::key:
342 case shards::Triangle<4>::key:
343 case shards::Triangle<6>::key: {
344 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
345 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
346 const auto v2ord = parentCell.getNodeMap(subcellDim, subcellOrd, 2);
348 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
349 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
350 const auto v2 = Kokkos::subview(refNodes, v2ord, Kokkos::ALL());
353 subcellParam(subcellOrd, 0, 0) = v0(0);
354 subcellParam(subcellOrd, 0, 1) = v1(0) - v0(0);
355 subcellParam(subcellOrd, 0, 2) = v2(0) - v0(0);
358 subcellParam(subcellOrd, 1, 0) = v0(1);
359 subcellParam(subcellOrd, 1, 1) = v1(1) - v0(1);
360 subcellParam(subcellOrd, 1, 2) = v2(1) - v0(1);
363 subcellParam(subcellOrd, 2, 0) = v0(2);
364 subcellParam(subcellOrd, 2, 1) = v1(2) - v0(2);
365 subcellParam(subcellOrd, 2, 2) = v2(2) - v0(2);
368 case shards::Quadrilateral<4>::key:
369 case shards::Quadrilateral<8>::key:
370 case shards::Quadrilateral<9>::key: {
371 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
372 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
373 const auto v2ord = parentCell.getNodeMap(subcellDim, subcellOrd, 2);
374 const auto v3ord = parentCell.getNodeMap(subcellDim, subcellOrd, 3);
376 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
377 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
378 const auto v2 = Kokkos::subview(refNodes, v2ord, Kokkos::ALL());
379 const auto v3 = Kokkos::subview(refNodes, v3ord, Kokkos::ALL());
382 subcellParam(subcellOrd, 0, 0) = ( v0(0) + v1(0) + v2(0) + v3(0))/4.0;
383 subcellParam(subcellOrd, 0, 1) = (-v0(0) + v1(0) + v2(0) - v3(0))/4.0;
384 subcellParam(subcellOrd, 0, 2) = (-v0(0) - v1(0) + v2(0) + v3(0))/4.0;
387 subcellParam(subcellOrd, 1, 0) = ( v0(1) + v1(1) + v2(1) + v3(1))/4.0;
388 subcellParam(subcellOrd, 1, 1) = (-v0(1) + v1(1) + v2(1) - v3(1))/4.0;
389 subcellParam(subcellOrd, 1, 2) = (-v0(1) - v1(1) + v2(1) + v3(1))/4.0;
392 subcellParam(subcellOrd, 2, 0) = ( v0(2) + v1(2) + v2(2) + v3(2))/4.0;
393 subcellParam(subcellOrd, 2, 1) = (-v0(2) + v1(2) + v2(2) - v3(2))/4.0;
394 subcellParam(subcellOrd, 2, 2) = (-v0(2) - v1(2) + v2(2) + v3(2))/4.0;
398 INTREPID2_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
399 ">>> ERROR (Intrepid2::RefSubcellParametrization::set): parametrization not defined for the specified face topology.");
408 template<
typename DeviceType>
411 isSubcellParametrizationSet_ =
false;
413 #define DefineStaticRefParametrization(obj) template<typename DeviceType> \
414 typename RefSubcellParametrization<DeviceType>::ViewType \
415 RefSubcellParametrization<DeviceType>:: \
416 obj = typename RefSubcellParametrization<DeviceType>::ViewType();
418 DefineStaticRefParametrization(lineEdgesParam)
419 DefineStaticRefParametrization(triEdgesParam)
420 DefineStaticRefParametrization(quadEdgesParam)
421 DefineStaticRefParametrization(shellTriEdgesParam)
422 DefineStaticRefParametrization(shellQuadEdgesParam)
423 DefineStaticRefParametrization(tetEdgesParam)
424 DefineStaticRefParametrization(hexEdgesParam)
425 DefineStaticRefParametrization(pyrEdgesParam)
426 DefineStaticRefParametrization(wedgeEdgesParam)
427 DefineStaticRefParametrization(shellTriFacesParam)
428 DefineStaticRefParametrization(shellQuadFacesParam)
429 DefineStaticRefParametrization(tetFacesParam)
430 DefineStaticRefParametrization(hexFacesParam)
431 DefineStaticRefParametrization(pyrFacesParam)
432 DefineStaticRefParametrization(wedgeFacesParam)
435 template<typename DeviceType>
439 if(isReferenceNodeDataSet_)
442 auto createDataViewFromHostArray = [](
const std::string& view_name,
double const * source_array, ordinal_type dim){
443 ViewType dest_view(view_name, dim, 3);
444 auto host_view = Kokkos::create_mirror_view(dest_view);
445 for(ordinal_type i=0; i<dim; ++i)
446 for(ordinal_type j=0; j<3; ++j)
447 host_view(i,j) = source_array[3*i+j];
448 Kokkos::deep_copy(dest_view,host_view);
454 lineNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::line", &refNodeDataStatic_.line[0][0], 2);
455 line3Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::line_3", &refNodeDataStatic_.line_3[0][0], 3);
457 triangleNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::triangle", &refNodeDataStatic_.triangle[0][0], 3);
458 triangle4Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::triangle_4", &refNodeDataStatic_.triangle_4[0][0], 4);
459 triangle6Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::triangle_6", &refNodeDataStatic_.triangle_6[0][0], 6);
461 quadrilateralNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::quad", &refNodeDataStatic_.quadrilateral[0][0], 4);
462 quadrilateral8Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::quad_8", &refNodeDataStatic_.quadrilateral_8[0][0], 8);
463 quadrilateral9Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::quad_9", &refNodeDataStatic_.quadrilateral_9[0][0], 9);
465 tetrahedronNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet", &refNodeDataStatic_.tetrahedron[0][0], 4);
466 tetrahedron8Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet_8", &refNodeDataStatic_.tetrahedron_8[0][0], 8);
467 tetrahedron10Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet_10", &refNodeDataStatic_.tetrahedron_10[0][0], 10);
468 tetrahedron11Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet_11", &refNodeDataStatic_.tetrahedron_11[0][0], 11);
470 hexahedronNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::hex", &refNodeDataStatic_.hexahedron[0][0], 8);
471 hexahedron20Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::hex_20", &refNodeDataStatic_.hexahedron_20[0][0], 20);
472 hexahedron27Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::hex_27", &refNodeDataStatic_.hexahedron_27[0][0], 27);
474 pyramidNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::pyr", &refNodeDataStatic_.pyramid[0][0], 5);
475 pyramid13Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::pyr_13", &refNodeDataStatic_.pyramid_13[0][0], 13);
476 pyramid14Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::pyr_14", &refNodeDataStatic_.pyramid_14[0][0], 14);
478 wedgeNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::wedge", &refNodeDataStatic_.wedge[0][0], 6);
479 wedge15Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::wedge_15", &refNodeDataStatic_.wedge_15[0][0], 15);
480 wedge18Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::wedge_18", &refNodeDataStatic_.wedge_18[0][0], 18);
483 Kokkos::push_finalize_hook( [=] {
514 isReferenceNodeDataSet_ =
true;
517 template<
typename DeviceType>
519 typename RefCellNodes<DeviceType>::ConstViewType
522 if(!isReferenceNodeDataSet_)
527 switch (cellTopoKey ) {
528 case shards::Line<2>::key:
529 case shards::ShellLine<2>::key:
530 case shards::Beam<2>::key: refNodes = lineNodes;
break;
531 case shards::Line<3>::key:
532 case shards::ShellLine<3>::key:
533 case shards::Beam<3>::key: refNodes = line3Nodes;
break;
535 case shards::Triangle<3>::key:
536 case shards::ShellTriangle<3>::key: refNodes = triangleNodes;
break;
537 case shards::Triangle<4>::key: refNodes = triangle4Nodes;
break;
538 case shards::Triangle<6>::key:
539 case shards::ShellTriangle<6>::key: refNodes = triangle6Nodes;
break;
541 case shards::Quadrilateral<4>::key:
542 case shards::ShellQuadrilateral<4>::key: refNodes = quadrilateralNodes;
break;
543 case shards::Quadrilateral<8>::key:
544 case shards::ShellQuadrilateral<8>::key: refNodes = quadrilateral8Nodes;
break;
545 case shards::Quadrilateral<9>::key:
546 case shards::ShellQuadrilateral<9>::key: refNodes = quadrilateral9Nodes;
break;
548 case shards::Tetrahedron<4>::key: refNodes = tetrahedronNodes;
break;
549 case shards::Tetrahedron<8>::key: refNodes = tetrahedron8Nodes;
break;
550 case shards::Tetrahedron<10>::key: refNodes = tetrahedron10Nodes;
break;
551 case shards::Tetrahedron<11>::key: refNodes = tetrahedron11Nodes;
break;
553 case shards::Hexahedron<8>::key: refNodes = hexahedronNodes;
break;
554 case shards::Hexahedron<20>::key: refNodes = hexahedron20Nodes;
break;
555 case shards::Hexahedron<27>::key: refNodes = hexahedron27Nodes;
break;
557 case shards::Pyramid<5>::key: refNodes = pyramidNodes;
break;
558 case shards::Pyramid<13>::key: refNodes = pyramid13Nodes;
break;
559 case shards::Pyramid<14>::key: refNodes = pyramid14Nodes;
break;
561 case shards::Wedge<6>::key: refNodes = wedgeNodes;
break;
562 case shards::Wedge<15>::key: refNodes = wedge15Nodes;
break;
563 case shards::Wedge<18>::key: refNodes = wedge18Nodes;
break;
567 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): invalid cell topology.");
573 template<
typename DeviceType>
576 isReferenceNodeDataSet_ =
false;
578 #define DefineStaticRefNodes(obj) template<typename DeviceType> \
579 typename RefCellNodes<DeviceType>::ViewType \
580 RefCellNodes<DeviceType>:: \
581 obj = typename RefCellNodes<DeviceType>::ViewType();
583 DefineStaticRefNodes(lineNodes)
584 DefineStaticRefNodes(line3Nodes)
586 DefineStaticRefNodes(triangleNodes)
587 DefineStaticRefNodes(triangle4Nodes)
588 DefineStaticRefNodes(triangle6Nodes)
590 DefineStaticRefNodes(quadrilateralNodes)
591 DefineStaticRefNodes(quadrilateral8Nodes)
592 DefineStaticRefNodes(quadrilateral9Nodes)
594 DefineStaticRefNodes(tetrahedronNodes)
595 DefineStaticRefNodes(tetrahedron8Nodes)
596 DefineStaticRefNodes(tetrahedron10Nodes)
597 DefineStaticRefNodes(tetrahedron11Nodes)
599 DefineStaticRefNodes(hexahedronNodes)
600 DefineStaticRefNodes(hexahedron20Nodes)
601 DefineStaticRefNodes(hexahedron27Nodes)
603 DefineStaticRefNodes(pyramidNodes)
604 DefineStaticRefNodes(pyramid13Nodes)
605 DefineStaticRefNodes(pyramid14Nodes)
607 DefineStaticRefNodes(wedgeNodes)
608 DefineStaticRefNodes(wedge15Nodes)
609 DefineStaticRefNodes(wedge18Nodes)
611 template<typename DeviceType>
612 const typename
RefCellNodes<DeviceType>::ReferenceNodeDataStatic
614 refNodeDataStatic_ = {
617 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}
620 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}
624 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}
627 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 1.0/3.0, 1.0/3.0, 0.0}
630 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0},
631 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}
635 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0}
638 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
639 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0}
642 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
643 { 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}
647 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0}
650 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
651 { 1.0/3.0, 0.0, 1.0/3.0}, { 1.0/3.0, 1.0/3.0, 1.0/3.0}, { 1.0/3.0, 1.0/3.0, 0.0}, { 0.0, 1.0/3.0, 1.0/3.0}
654 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
655 { 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}
658 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
659 { 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}
663 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
664 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0}
667 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
668 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0},
669 { 0.0,-1.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, {-1.0, 0.0,-1.0},
670 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
671 { 0.0,-1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0}, {-1.0, 0.0, 1.0}
674 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
675 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0},
676 { 0.0,-1.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, {-1.0, 0.0,-1.0},
677 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
678 { 0.0,-1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0}, {-1.0, 0.0, 1.0},
680 { 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}
684 {-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}
687 {-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},
688 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0},
689 {-0.5,-0.5, 0.5}, { 0.5,-0.5, 0.5}, { 0.5, 0.5, 0.5}, {-0.5, 0.5, 0.5}
692 {-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},
693 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0},
694 {-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}
698 { 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}
701 { 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},
702 { 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},
703 { 0.5, 0.0, 1.0}, { 0.5, 0.5, 1.0}, { 0.0, 0.5, 1.0}
706 { 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},
707 { 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},
708 { 0.5, 0.0, 1.0}, { 0.5, 0.5, 1.0}, { 0.0, 0.5, 1.0},
709 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}
713 template<
typename DeviceType>
717 if(isReferenceCellCenterDataSet_)
720 auto createDataViewFromHostArray = [](
const std::string& view_name,
double const * source_array){
722 auto host_view = Kokkos::create_mirror_view(dest_view);
723 for(ordinal_type i=0; i<3; ++i) host_view[i] = source_array[i];
724 Kokkos::deep_copy(dest_view, host_view);
730 lineCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::line", &refCenterDataStatic_.line[0]);
732 triangleCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::triangle", &refCenterDataStatic_.triangle[0]);
734 quadrilateralCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::quad", &refCenterDataStatic_.quadrilateral[0]);
736 tetrahedronCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::tet", &refCenterDataStatic_.tetrahedron[0]);
738 hexahedronCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::hex", &refCenterDataStatic_.hexahedron[0]);
740 pyramidCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::pyr", &refCenterDataStatic_.pyramid[0]);
742 wedgeCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::wedge", &refCenterDataStatic_.wedge[0]);
745 Kokkos::push_finalize_hook( [=] {
762 isReferenceCellCenterDataSet_ =
true;
765 template<
typename DeviceType>
767 typename RefCellCenter<DeviceType>::ConstViewType
770 if(!isReferenceCellCenterDataSet_)
775 switch (cellTopoKey ) {
776 case shards::Line<2>::key:
777 case shards::ShellLine<2>::key:
778 case shards::Beam<2>::key:
779 case shards::Line<3>::key:
780 case shards::ShellLine<3>::key:
781 case shards::Beam<3>::key: cellCenter = lineCenter;
break;
783 case shards::Triangle<3>::key:
784 case shards::ShellTriangle<3>::key:
785 case shards::Triangle<4>::key:
786 case shards::Triangle<6>::key:
787 case shards::ShellTriangle<6>::key: cellCenter = triangleCenter;
break;
789 case shards::Quadrilateral<4>::key:
790 case shards::ShellQuadrilateral<4>::key:
791 case shards::Quadrilateral<8>::key:
792 case shards::ShellQuadrilateral<8>::key:
793 case shards::Quadrilateral<9>::key:
794 case shards::ShellQuadrilateral<9>::key: cellCenter = quadrilateralCenter;
break;
796 case shards::Tetrahedron<4>::key:
797 case shards::Tetrahedron<8>::key:
798 case shards::Tetrahedron<10>::key:
799 case shards::Tetrahedron<11>::key: cellCenter = tetrahedronCenter;
break;
801 case shards::Hexahedron<8>::key:
802 case shards::Hexahedron<20>::key:
803 case shards::Hexahedron<27>::key: cellCenter = hexahedronCenter;
break;
805 case shards::Pyramid<5>::key:
806 case shards::Pyramid<13>::key:
807 case shards::Pyramid<14>::key: cellCenter = pyramidCenter;
break;
809 case shards::Wedge<6>::key:
810 case shards::Wedge<15>::key:
811 case shards::Wedge<18>::key: cellCenter = wedgeCenter;
break;
815 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): invalid cell topology.");
821 template<
typename DeviceType>
824 isReferenceCellCenterDataSet_ =
false;
826 #define DefineStaticRefCenter(obj) template<typename DeviceType> \
827 typename RefCellCenter<DeviceType>::ViewType \
828 RefCellCenter<DeviceType>:: \
829 obj = typename RefCellCenter<DeviceType>::ViewType();
831 DefineStaticRefCenter(lineCenter)
832 DefineStaticRefCenter(triangleCenter)
833 DefineStaticRefCenter(quadrilateralCenter)
834 DefineStaticRefCenter(tetrahedronCenter)
835 DefineStaticRefCenter(hexahedronCenter)
836 DefineStaticRefCenter(pyramidCenter)
837 DefineStaticRefCenter(wedgeCenter)
839 template<typename DeviceType>
840 const typename
RefCellCenter<DeviceType>::ReferenceCenterDataStatic
842 refCenterDataStatic_ = {
846 { 1.0/3.0, 1.0/3.0, 0.0},
856 { 1.0/3.0, 1.0/3.0, 0.0},
This class defines the coordinates of the barycenter of the supported reference cells. The barycenter coordinates are stored in static views. The class is templated on the Kokkos::Device Type which is used to determine layout and memory space of the views.
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the center coordinates allocated on DeviceType::memory_space ...
static ConstViewType get(const unsigned cellTopoKey)
Retrieves the Cartesian coordinates of reference cell nodes.
#define INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE(test, x, msg)
static ConstViewType get(const ordinal_type subcellDim, const unsigned parentCellKey)
Returns a Kokkos view with the coefficients of the parametrization maps for the edges or faces of a r...
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the parametrization maps, allocated on DeviceType::memory_space ...
This class defines the coordinates of the nodes of reference cells according for supported cell topol...
static bool isSupported(const unsigned cellTopoKey)
Checks if a cell topology has a reference parametrization.
static void set()
Computes and stores static views containing the parametrizations maps of edges and faces of all refer...
static ConstViewType get(const unsigned cellTopoKey)
Retrieves the Cartesian coordinates of a reference cell barycenter.
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the node coordinates allocated on DeviceType::memory_space ...
This class defines the parametrizations of edges and faces of supported reference cells...
static void set()
Set center coordinates of reference cell for supported topologies.