53#ifndef __INTREPID2_CELLDATA_DEF_HPP__
54#define __INTREPID2_CELLDATA_DEF_HPP__
58template<
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:
99template<
typename DeviceType>
101typename RefSubcellParametrization<DeviceType>::ConstViewType
103get(
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.");
156template<
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;
274template<
typename DeviceType>
275template <
typename HostViewType>
278set( 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.");
408template<
typename DeviceType>
411isSubcellParametrizationSet_ =
false;
413#define DefineStaticRefParametrization(obj) template<typename DeviceType> \
414 typename RefSubcellParametrization<DeviceType>::ViewType \
415 RefSubcellParametrization<DeviceType>:: \
416 obj = typename RefSubcellParametrization<DeviceType>::ViewType();
418DefineStaticRefParametrization(lineEdgesParam)
419DefineStaticRefParametrization(triEdgesParam)
420DefineStaticRefParametrization(quadEdgesParam)
421DefineStaticRefParametrization(shellTriEdgesParam)
422DefineStaticRefParametrization(shellQuadEdgesParam)
423DefineStaticRefParametrization(tetEdgesParam)
424DefineStaticRefParametrization(hexEdgesParam)
425DefineStaticRefParametrization(pyrEdgesParam)
426DefineStaticRefParametrization(wedgeEdgesParam)
427DefineStaticRefParametrization(shellTriFacesParam)
428DefineStaticRefParametrization(shellQuadFacesParam)
429DefineStaticRefParametrization(tetFacesParam)
430DefineStaticRefParametrization(hexFacesParam)
431DefineStaticRefParametrization(pyrFacesParam)
432DefineStaticRefParametrization(wedgeFacesParam)
435template<
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( [=] {
485 lineNodes = ViewType();
486 line3Nodes = ViewType();
488 triangleNodes = ViewType();
489 triangle4Nodes = ViewType();
490 triangle6Nodes = ViewType();
492 quadrilateralNodes = ViewType();
493 quadrilateral8Nodes = ViewType();
494 quadrilateral9Nodes = ViewType();
496 tetrahedronNodes = ViewType();
497 tetrahedron8Nodes = ViewType();
498 tetrahedron10Nodes = ViewType();
499 tetrahedron11Nodes = ViewType();
501 hexahedronNodes = ViewType();
502 hexahedron20Nodes = ViewType();
503 hexahedron27Nodes = ViewType();
505 pyramidNodes = ViewType();
506 pyramid13Nodes = ViewType();
507 pyramid14Nodes = ViewType();
509 wedgeNodes = ViewType();
510 wedge15Nodes = ViewType();
511 wedge18Nodes = ViewType();
514 isReferenceNodeDataSet_ =
true;
517template<
typename DeviceType>
519typename 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.");
573template<
typename DeviceType>
576isReferenceNodeDataSet_ =
false;
578#define DefineStaticRefNodes(obj) template<typename DeviceType> \
579 typename RefCellNodes<DeviceType>::ViewType \
580 RefCellNodes<DeviceType>:: \
581 obj = typename RefCellNodes<DeviceType>::ViewType();
583DefineStaticRefNodes(lineNodes)
584DefineStaticRefNodes(line3Nodes)
586DefineStaticRefNodes(triangleNodes)
587DefineStaticRefNodes(triangle4Nodes)
588DefineStaticRefNodes(triangle6Nodes)
590DefineStaticRefNodes(quadrilateralNodes)
591DefineStaticRefNodes(quadrilateral8Nodes)
592DefineStaticRefNodes(quadrilateral9Nodes)
594DefineStaticRefNodes(tetrahedronNodes)
595DefineStaticRefNodes(tetrahedron8Nodes)
596DefineStaticRefNodes(tetrahedron10Nodes)
597DefineStaticRefNodes(tetrahedron11Nodes)
599DefineStaticRefNodes(hexahedronNodes)
600DefineStaticRefNodes(hexahedron20Nodes)
601DefineStaticRefNodes(hexahedron27Nodes)
603DefineStaticRefNodes(pyramidNodes)
604DefineStaticRefNodes(pyramid13Nodes)
605DefineStaticRefNodes(pyramid14Nodes)
607DefineStaticRefNodes(wedgeNodes)
608DefineStaticRefNodes(wedge15Nodes)
609DefineStaticRefNodes(wedge18Nodes)
611template<
typename DeviceType>
614refNodeDataStatic_ = {
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}
713template<
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;
765template<
typename DeviceType>
767typename 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.");
821template<
typename DeviceType>
824isReferenceCellCenterDataSet_ =
false;
826#define DefineStaticRefCenter(obj) template<typename DeviceType> \
827 typename RefCellCenter<DeviceType>::ViewType \
828 RefCellCenter<DeviceType>:: \
829 obj = typename RefCellCenter<DeviceType>::ViewType();
831DefineStaticRefCenter(lineCenter)
832DefineStaticRefCenter(triangleCenter)
833DefineStaticRefCenter(quadrilateralCenter)
834DefineStaticRefCenter(tetrahedronCenter)
835DefineStaticRefCenter(hexahedronCenter)
836DefineStaticRefCenter(pyramidCenter)
837DefineStaticRefCenter(wedgeCenter)
839template<
typename DeviceType>
842refCenterDataStatic_ = {
846 { 1.0/3.0, 1.0/3.0, 0.0},
856 { 1.0/3.0, 1.0/3.0, 0.0},
#define INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE(test, x, msg)
This class defines the coordinates of the barycenter of the supported reference cells....
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the center coordinates allocated on DeviceType::memory_space
static void set()
Set center coordinates of reference cell for supported topologies.
static ConstViewType get(const unsigned cellTopoKey)
Retrieves the Cartesian coordinates of a reference cell barycenter.
This class defines the coordinates of the nodes of reference cells according for supported cell topol...
static ConstViewType get(const unsigned cellTopoKey)
Retrieves the Cartesian coordinates of reference cell nodes.
static void set()
Set reference nodes coordinates for supported topologies.
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()
Computes and stores static views containing the parametrizations maps of edges and faces of all refer...
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the parametrization maps, allocated on DeviceType::memory_space
static bool isSupported(const unsigned cellTopoKey)
Checks if a cell topology has a reference parametrization.
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...
Reference node containers for each supported topology.