19#ifndef __INTREPID2_CELLDATA_DEF_HPP__
20#define __INTREPID2_CELLDATA_DEF_HPP__
24template<
typename DeviceType>
28 switch ( cellTopoKey ) {
29 case shards::Line<2>::key:
30 case shards::Line<3>::key:
31 case shards::ShellLine<2>::key:
32 case shards::ShellLine<3>::key:
33 case shards::Beam<2>::key:
34 case shards::Beam<3>::key:
35 case shards::Triangle<3>::key:
37 case shards::Triangle<6>::key:
38 case shards::ShellTriangle<3>::key:
39 case shards::ShellTriangle<6>::key:
40 case shards::Quadrilateral<4>::key:
41 case shards::Quadrilateral<8>::key:
42 case shards::Quadrilateral<9>::key:
43 case shards::ShellQuadrilateral<4>::key:
44 case shards::ShellQuadrilateral<8>::key:
45 case shards::ShellQuadrilateral<9>::key:
46 case shards::Tetrahedron<4>::key:
48 case shards::Tetrahedron<10>::key:
49 case shards::Tetrahedron<11>::key:
50 case shards::Hexahedron<8>::key:
51 case shards::Hexahedron<20>::key:
52 case shards::Hexahedron<27>::key:
53 case shards::Pyramid<5>::key:
54 case shards::Pyramid<13>::key:
56 case shards::Wedge<6>::key:
57 case shards::Wedge<15>::key:
58 case shards::Wedge<18>::key:
65template<
typename DeviceType>
67typename RefSubcellParametrization<DeviceType>::ConstViewType
69get(
const ordinal_type subcellDim,
70 const unsigned parentCellKey ) {
72 if(!isSubcellParametrizationSet_)
77 switch (parentCellKey ) {
78 case shards::Tetrahedron<4>::key:
79 case shards::Tetrahedron<8>::key:
80 case shards::Tetrahedron<10>::key:
81 case shards::Tetrahedron<11>::key: subcellParam = ( subcellDim == 2 ? tetFacesParam : tetEdgesParam );
break;
83 case shards::Hexahedron<8>::key:
84 case shards::Hexahedron<20>::key:
85 case shards::Hexahedron<27>::key: subcellParam = ( subcellDim == 2 ? hexFacesParam : hexEdgesParam );
break;
87 case shards::Pyramid<5>::key:
88 case shards::Pyramid<13>::key:
89 case shards::Pyramid<14>::key: subcellParam = ( subcellDim == 2 ? pyrFacesParam : pyrEdgesParam );
break;
91 case shards::Wedge<6>::key:
92 case shards::Wedge<15>::key:
93 case shards::Wedge<18>::key: subcellParam = ( subcellDim == 2 ? wedgeFacesParam : wedgeEdgesParam );
break;
95 case shards::Triangle<3>::key:
96 case shards::Triangle<4>::key:
97 case shards::Triangle<6>::key: subcellParam = triEdgesParam;
break;
99 case shards::Quadrilateral<4>::key:
100 case shards::Quadrilateral<8>::key:
101 case shards::Quadrilateral<9>::key: subcellParam = quadEdgesParam;
break;
103 case shards::ShellTriangle<3>::key:
104 case shards::ShellTriangle<6>::key: subcellParam = ( subcellDim == 2 ? shellTriFacesParam : shellTriEdgesParam );
break;
106 case shards::ShellQuadrilateral<4>::key:
107 case shards::ShellQuadrilateral<8>::key:
108 case shards::ShellQuadrilateral<9>::key: subcellParam = ( subcellDim == 2 ? shellQuadFacesParam : shellQuadEdgesParam );
break;
110 case shards::ShellLine<2>::key:
111 case shards::ShellLine<3>::key: subcellParam = shellLineEdgesParam;
break;
112 case shards::Beam<2>::key:
113 case shards::Beam<3>::key: subcellParam = beamEdgeParam;
break;
115 INTREPID2_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
116 ">>> ERROR (Intrepid2::RefSubcellParametrization::get): invalid cell topology.");
122template<
typename DeviceType>
126 if(isSubcellParametrizationSet_)
129 ordinal_type subcellDim;
131 const auto tet = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >());
134 tetFacesParam =
ViewType(
"CellTools::SubcellParametrization::tetFaces", tet.getSubcellCount(subcellDim), tet.getDimension(), subcellDim+1);
135 auto subcell2dParamHost = Kokkos::create_mirror_view(tetFacesParam);
136 set( subcell2dParamHost, subcellDim, tet );
137 deep_copy(tetFacesParam,subcell2dParamHost);
140 tetEdgesParam =
ViewType(
"CellTools::SubcellParametrization::tetEdges", tet.getSubcellCount(subcellDim), tet.getDimension(), subcellDim+1);
141 auto subcellParamHost = Kokkos::create_mirror_view(tetEdgesParam);
142 set( subcellParamHost, subcellDim, tet );
143 deep_copy(tetEdgesParam,subcellParamHost);
146 const auto hex = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >());
149 hexFacesParam =
ViewType(
"CellTools::SubcellParametrization::hexFaces", hex.getSubcellCount(subcellDim), hex.getDimension(), subcellDim+1);
150 auto subcell2dParamHost = Kokkos::create_mirror_view(hexFacesParam);
151 set( subcell2dParamHost, subcellDim, hex );
152 deep_copy(hexFacesParam,subcell2dParamHost);
155 hexEdgesParam =
ViewType(
"CellTools::SubcellParametrization::hexEdges", hex.getSubcellCount(subcellDim), hex.getDimension(), subcellDim+1);
156 auto subcellParamHost = Kokkos::create_mirror_view(hexEdgesParam);
157 set( subcellParamHost, subcellDim, hex );
158 deep_copy(hexEdgesParam,subcellParamHost);
161 const auto pyr = shards::CellTopology(shards::getCellTopologyData<shards::Pyramid<5> >());
164 pyrFacesParam =
ViewType(
"CellTools::SubcellParametrization::pyrFaces", pyr.getSubcellCount(subcellDim), pyr.getDimension(), subcellDim+1);
165 auto subcell2dParamHost = Kokkos::create_mirror_view(pyrFacesParam);
166 set( subcell2dParamHost, subcellDim, pyr );
167 deep_copy(pyrFacesParam,subcell2dParamHost);
170 pyrEdgesParam =
ViewType(
"CellTools::SubcellParametrization::pyrEdges", pyr.getSubcellCount(subcellDim), pyr.getDimension(), subcellDim+1);
171 auto subcellParamHost = Kokkos::create_mirror_view(pyrEdgesParam);
172 set( subcellParamHost, subcellDim, pyr );
173 deep_copy(pyrEdgesParam,subcellParamHost);
176 const auto wedge = shards::CellTopology(shards::getCellTopologyData<shards::Wedge<6> >());
179 wedgeFacesParam =
ViewType(
"CellTools::SubcellParametrization::wedgeFaces", wedge.getSubcellCount(subcellDim), wedge.getDimension(), subcellDim+1);
180 auto subcell2dParamHost = Kokkos::create_mirror_view(wedgeFacesParam);
181 set( subcell2dParamHost, subcellDim, wedge );
182 deep_copy(wedgeFacesParam,subcell2dParamHost);
185 wedgeEdgesParam =
ViewType(
"CellTools::SubcellParametrization::wedgeEdges", wedge.getSubcellCount(subcellDim), wedge.getDimension(), subcellDim+1);
186 auto subcellParamHost = Kokkos::create_mirror_view(wedgeEdgesParam);
187 set( subcellParamHost, subcellDim, wedge );
188 deep_copy(wedgeEdgesParam,subcellParamHost);
191 const auto tri = shards::CellTopology(shards::getCellTopologyData<shards::Triangle<3> >());
193 triEdgesParam =
ViewType(
"CellTools::SubcellParametrization::triEdges", tri.getSubcellCount(subcellDim), tri.getDimension(), subcellDim+1);
194 auto subcellParamHost = Kokkos::create_mirror_view(triEdgesParam);
195 set( subcellParamHost, subcellDim, tri );
196 deep_copy(triEdgesParam,subcellParamHost);
199 const auto shellTri = shards::CellTopology(shards::getCellTopologyData<shards::ShellTriangle<3> >());
202 shellTriFacesParam =
ViewType(
"CellTools::SubcellParametrization::shellTriFaces", shellTri.getSubcellCount(subcellDim), shellTri.getDimension(), subcellDim+1);
203 auto subcell2dParamHost = Kokkos::create_mirror_view(shellTriFacesParam);
204 set( subcell2dParamHost, subcellDim, shellTri );
205 deep_copy(shellTriFacesParam,subcell2dParamHost);
209 shellTriEdgesParam =
ViewType(
"CellTools::SubcellParametrization::shellTriEdges", shellTri.getSubcellCount(subcellDim), shellTri.getDimension(), subcellDim+1);
210 auto subcellParamHost = Kokkos::create_mirror_view(shellTriEdgesParam);
211 set( subcellParamHost, subcellDim, shellTri );
212 deep_copy(shellTriEdgesParam,subcellParamHost);
215 const auto quad = shards::CellTopology(shards::getCellTopologyData<shards::Quadrilateral<4> >());
218 quadEdgesParam =
ViewType(
"CellTools::SubcellParametrization::quadEdges", quad.getSubcellCount(subcellDim), quad.getDimension(), subcellDim+1);
219 auto subcellParamHost = Kokkos::create_mirror_view(quadEdgesParam);
220 set( subcellParamHost, subcellDim, quad );
221 deep_copy(quadEdgesParam,subcellParamHost);
225 const auto shellQuad = shards::CellTopology(shards::getCellTopologyData<shards::ShellQuadrilateral<4> >());
228 shellQuadFacesParam =
ViewType(
"CellTools::SubcellParametrization::shellQuadFaces", shellQuad.getSubcellCount(subcellDim), shellQuad.getDimension(), subcellDim+1);
229 auto subcell2dParamHost = Kokkos::create_mirror_view(shellQuadFacesParam);
230 set( subcell2dParamHost, subcellDim, shellQuad );
231 deep_copy(shellQuadFacesParam,subcell2dParamHost);
234 shellQuadEdgesParam =
ViewType(
"CellTools::SubcellParametrization::shellQuadEdges", shellQuad.getSubcellCount(subcellDim), shellQuad.getDimension(), subcellDim+1);
235 auto subcellParamHost = Kokkos::create_mirror_view(shellQuadEdgesParam);
236 set( subcellParamHost, subcellDim, shellQuad );
237 deep_copy(shellQuadEdgesParam,subcellParamHost);
240 const auto beam = shards::CellTopology(shards::getCellTopologyData<shards::Beam<2> >());
243 beamEdgeParam =
ViewType(
"CellTools::SubcellParametrization::beamEdge", beam.getSubcellCount(subcellDim), beam.getDimension(), subcellDim+1);
244 auto subcellParamHost = Kokkos::create_mirror_view(beamEdgeParam);
245 set( subcellParamHost, subcellDim, beam );
246 deep_copy(beamEdgeParam,subcellParamHost);
249 const auto shellLine = shards::CellTopology(shards::getCellTopologyData<shards::ShellLine<2> >());
252 shellLineEdgesParam =
ViewType(
"CellTools::SubcellParametrization::shellLineEdges", shellLine.getSubcellCount(subcellDim), shellLine.getDimension(), subcellDim+1);
253 auto subcellParamHost = Kokkos::create_mirror_view(shellLineEdgesParam);
254 set( subcellParamHost, subcellDim, shellLine );
255 deep_copy(shellLineEdgesParam,subcellParamHost);
258 Kokkos::push_finalize_hook( [=] {
277 isSubcellParametrizationSet_=
true;
280template<
typename DeviceType>
281template <
typename HostViewType>
284set( HostViewType subcellParam,
285 const ordinal_type subcellDim,
286 const shards::CellTopology parentCell ) {
305 const auto sc = parentCell.getSubcellCount(subcellDim);
306 const auto pcd = parentCell.getDimension();
308 INTREPID2_TEST_FOR_EXCEPTION( subcellDim < 1 || subcellDim >
static_cast<ordinal_type
>(pcd-1), std::invalid_argument,
309 ">>> ERROR (Intrepid2::RefSubcellParametrization::set): Parametrizations defined in a range between 1 and (dim-1)");
313 if (subcellDim == 1) {
315 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
318 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
319 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
321 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
322 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
325 subcellParam(subcellOrd, 0, 0) = (v0(0) + v1(0))/2.0;
326 subcellParam(subcellOrd, 0, 1) = (v1(0) - v0(0))/2.0;
329 subcellParam(subcellOrd, 1, 0) = (v0(1) + v1(1))/2.0;
330 subcellParam(subcellOrd, 1, 1) = (v1(1) - v0(1))/2.0;
334 subcellParam(subcellOrd, 2, 0) = (v0(2) + v1(2))/2.0;
335 subcellParam(subcellOrd, 2, 1) = (v1(2) - v0(2))/2.0;
339 else if (subcellDim == 2) {
343 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
345 switch (parentCell.getKey(subcellDim,subcellOrd)) {
347 case shards::Triangle<3>::key:
348 case shards::Triangle<4>::key:
349 case shards::Triangle<6>::key: {
350 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
351 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
352 const auto v2ord = parentCell.getNodeMap(subcellDim, subcellOrd, 2);
354 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
355 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
356 const auto v2 = Kokkos::subview(refNodes, v2ord, Kokkos::ALL());
359 subcellParam(subcellOrd, 0, 0) = v0(0);
360 subcellParam(subcellOrd, 0, 1) = v1(0) - v0(0);
361 subcellParam(subcellOrd, 0, 2) = v2(0) - v0(0);
364 subcellParam(subcellOrd, 1, 0) = v0(1);
365 subcellParam(subcellOrd, 1, 1) = v1(1) - v0(1);
366 subcellParam(subcellOrd, 1, 2) = v2(1) - v0(1);
369 subcellParam(subcellOrd, 2, 0) = v0(2);
370 subcellParam(subcellOrd, 2, 1) = v1(2) - v0(2);
371 subcellParam(subcellOrd, 2, 2) = v2(2) - v0(2);
374 case shards::Quadrilateral<4>::key:
375 case shards::Quadrilateral<8>::key:
376 case shards::Quadrilateral<9>::key: {
377 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
378 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
379 const auto v2ord = parentCell.getNodeMap(subcellDim, subcellOrd, 2);
380 const auto v3ord = parentCell.getNodeMap(subcellDim, subcellOrd, 3);
382 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
383 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
384 const auto v2 = Kokkos::subview(refNodes, v2ord, Kokkos::ALL());
385 const auto v3 = Kokkos::subview(refNodes, v3ord, Kokkos::ALL());
388 subcellParam(subcellOrd, 0, 0) = ( v0(0) + v1(0) + v2(0) + v3(0))/4.0;
389 subcellParam(subcellOrd, 0, 1) = (-v0(0) + v1(0) + v2(0) - v3(0))/4.0;
390 subcellParam(subcellOrd, 0, 2) = (-v0(0) - v1(0) + v2(0) + v3(0))/4.0;
393 subcellParam(subcellOrd, 1, 0) = ( v0(1) + v1(1) + v2(1) + v3(1))/4.0;
394 subcellParam(subcellOrd, 1, 1) = (-v0(1) + v1(1) + v2(1) - v3(1))/4.0;
395 subcellParam(subcellOrd, 1, 2) = (-v0(1) - v1(1) + v2(1) + v3(1))/4.0;
398 subcellParam(subcellOrd, 2, 0) = ( v0(2) + v1(2) + v2(2) + v3(2))/4.0;
399 subcellParam(subcellOrd, 2, 1) = (-v0(2) + v1(2) + v2(2) - v3(2))/4.0;
400 subcellParam(subcellOrd, 2, 2) = (-v0(2) - v1(2) + v2(2) + v3(2))/4.0;
404 INTREPID2_TEST_FOR_EXCEPTION(
true, std::invalid_argument,
405 ">>> ERROR (Intrepid2::RefSubcellParametrization::set): parametrization not defined for the specified face topology.");
414template<
typename DeviceType>
417isSubcellParametrizationSet_ =
false;
419#define DefineStaticRefParametrization(obj) template<typename DeviceType> \
420 typename RefSubcellParametrization<DeviceType>::ViewType \
421 RefSubcellParametrization<DeviceType>:: \
422 obj = typename RefSubcellParametrization<DeviceType>::ViewType();
424DefineStaticRefParametrization(beamEdgeParam)
425DefineStaticRefParametrization(shellLineEdgesParam)
426DefineStaticRefParametrization(triEdgesParam)
427DefineStaticRefParametrization(quadEdgesParam)
428DefineStaticRefParametrization(shellTriEdgesParam)
429DefineStaticRefParametrization(shellQuadEdgesParam)
430DefineStaticRefParametrization(tetEdgesParam)
431DefineStaticRefParametrization(hexEdgesParam)
432DefineStaticRefParametrization(pyrEdgesParam)
433DefineStaticRefParametrization(wedgeEdgesParam)
434DefineStaticRefParametrization(shellTriFacesParam)
435DefineStaticRefParametrization(shellQuadFacesParam)
436DefineStaticRefParametrization(tetFacesParam)
437DefineStaticRefParametrization(hexFacesParam)
438DefineStaticRefParametrization(pyrFacesParam)
439DefineStaticRefParametrization(wedgeFacesParam)
442template<
typename DeviceType>
446 if(isReferenceNodeDataSet_)
449 auto createDataViewFromHostArray = [](
const std::string& view_name,
double const * source_array, ordinal_type dim){
450 ViewType dest_view(view_name, dim, 3);
451 auto host_view = Kokkos::create_mirror_view(dest_view);
452 for(ordinal_type i=0; i<dim; ++i)
453 for(ordinal_type j=0; j<3; ++j)
454 host_view(i,j) = source_array[3*i+j];
455 Kokkos::deep_copy(dest_view,host_view);
461 lineNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::line", &refNodeDataStatic_.line[0][0], 2);
462 line3Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::line_3", &refNodeDataStatic_.line_3[0][0], 3);
464 triangleNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::triangle", &refNodeDataStatic_.triangle[0][0], 3);
465 triangle4Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::triangle_4", &refNodeDataStatic_.triangle_4[0][0], 4);
466 triangle6Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::triangle_6", &refNodeDataStatic_.triangle_6[0][0], 6);
468 quadrilateralNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::quad", &refNodeDataStatic_.quadrilateral[0][0], 4);
469 quadrilateral8Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::quad_8", &refNodeDataStatic_.quadrilateral_8[0][0], 8);
470 quadrilateral9Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::quad_9", &refNodeDataStatic_.quadrilateral_9[0][0], 9);
472 tetrahedronNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet", &refNodeDataStatic_.tetrahedron[0][0], 4);
473 tetrahedron8Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet_8", &refNodeDataStatic_.tetrahedron_8[0][0], 8);
474 tetrahedron10Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet_10", &refNodeDataStatic_.tetrahedron_10[0][0], 10);
475 tetrahedron11Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::tet_11", &refNodeDataStatic_.tetrahedron_11[0][0], 11);
477 hexahedronNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::hex", &refNodeDataStatic_.hexahedron[0][0], 8);
478 hexahedron20Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::hex_20", &refNodeDataStatic_.hexahedron_20[0][0], 20);
479 hexahedron27Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::hex_27", &refNodeDataStatic_.hexahedron_27[0][0], 27);
481 pyramidNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::pyr", &refNodeDataStatic_.pyramid[0][0], 5);
482 pyramid13Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::pyr_13", &refNodeDataStatic_.pyramid_13[0][0], 13);
483 pyramid14Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::pyr_14", &refNodeDataStatic_.pyramid_14[0][0], 14);
485 wedgeNodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::wedge", &refNodeDataStatic_.wedge[0][0], 6);
486 wedge15Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::wedge_15", &refNodeDataStatic_.wedge_15[0][0], 15);
487 wedge18Nodes = createDataViewFromHostArray(
"CellTools::ReferenceNodeData::wedge_18", &refNodeDataStatic_.wedge_18[0][0], 18);
490 Kokkos::push_finalize_hook( [=] {
492 lineNodes = ViewType();
493 line3Nodes = ViewType();
495 triangleNodes = ViewType();
496 triangle4Nodes = ViewType();
497 triangle6Nodes = ViewType();
499 quadrilateralNodes = ViewType();
500 quadrilateral8Nodes = ViewType();
501 quadrilateral9Nodes = ViewType();
503 tetrahedronNodes = ViewType();
504 tetrahedron8Nodes = ViewType();
505 tetrahedron10Nodes = ViewType();
506 tetrahedron11Nodes = ViewType();
508 hexahedronNodes = ViewType();
509 hexahedron20Nodes = ViewType();
510 hexahedron27Nodes = ViewType();
512 pyramidNodes = ViewType();
513 pyramid13Nodes = ViewType();
514 pyramid14Nodes = ViewType();
516 wedgeNodes = ViewType();
517 wedge15Nodes = ViewType();
518 wedge18Nodes = ViewType();
521 isReferenceNodeDataSet_ =
true;
524template<
typename DeviceType>
526typename RefCellNodes<DeviceType>::ConstViewType
529 if(!isReferenceNodeDataSet_)
534 switch (cellTopoKey ) {
535 case shards::Line<2>::key:
536 case shards::ShellLine<2>::key:
537 case shards::Beam<2>::key: refNodes = lineNodes;
break;
538 case shards::Line<3>::key:
539 case shards::ShellLine<3>::key:
540 case shards::Beam<3>::key: refNodes = line3Nodes;
break;
542 case shards::Triangle<3>::key:
543 case shards::ShellTriangle<3>::key: refNodes = triangleNodes;
break;
544 case shards::Triangle<4>::key: refNodes = triangle4Nodes;
break;
545 case shards::Triangle<6>::key:
546 case shards::ShellTriangle<6>::key: refNodes = triangle6Nodes;
break;
548 case shards::Quadrilateral<4>::key:
549 case shards::ShellQuadrilateral<4>::key: refNodes = quadrilateralNodes;
break;
550 case shards::Quadrilateral<8>::key:
551 case shards::ShellQuadrilateral<8>::key: refNodes = quadrilateral8Nodes;
break;
552 case shards::Quadrilateral<9>::key:
553 case shards::ShellQuadrilateral<9>::key: refNodes = quadrilateral9Nodes;
break;
555 case shards::Tetrahedron<4>::key: refNodes = tetrahedronNodes;
break;
556 case shards::Tetrahedron<8>::key: refNodes = tetrahedron8Nodes;
break;
557 case shards::Tetrahedron<10>::key: refNodes = tetrahedron10Nodes;
break;
558 case shards::Tetrahedron<11>::key: refNodes = tetrahedron11Nodes;
break;
560 case shards::Hexahedron<8>::key: refNodes = hexahedronNodes;
break;
561 case shards::Hexahedron<20>::key: refNodes = hexahedron20Nodes;
break;
562 case shards::Hexahedron<27>::key: refNodes = hexahedron27Nodes;
break;
564 case shards::Pyramid<5>::key: refNodes = pyramidNodes;
break;
565 case shards::Pyramid<13>::key: refNodes = pyramid13Nodes;
break;
566 case shards::Pyramid<14>::key: refNodes = pyramid14Nodes;
break;
568 case shards::Wedge<6>::key: refNodes = wedgeNodes;
break;
569 case shards::Wedge<15>::key: refNodes = wedge15Nodes;
break;
570 case shards::Wedge<18>::key: refNodes = wedge18Nodes;
break;
574 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): invalid cell topology.");
580template<
typename DeviceType>
583isReferenceNodeDataSet_ =
false;
585#define DefineStaticRefNodes(obj) template<typename DeviceType> \
586 typename RefCellNodes<DeviceType>::ViewType \
587 RefCellNodes<DeviceType>:: \
588 obj = typename RefCellNodes<DeviceType>::ViewType();
590DefineStaticRefNodes(lineNodes)
591DefineStaticRefNodes(line3Nodes)
593DefineStaticRefNodes(triangleNodes)
594DefineStaticRefNodes(triangle4Nodes)
595DefineStaticRefNodes(triangle6Nodes)
597DefineStaticRefNodes(quadrilateralNodes)
598DefineStaticRefNodes(quadrilateral8Nodes)
599DefineStaticRefNodes(quadrilateral9Nodes)
601DefineStaticRefNodes(tetrahedronNodes)
602DefineStaticRefNodes(tetrahedron8Nodes)
603DefineStaticRefNodes(tetrahedron10Nodes)
604DefineStaticRefNodes(tetrahedron11Nodes)
606DefineStaticRefNodes(hexahedronNodes)
607DefineStaticRefNodes(hexahedron20Nodes)
608DefineStaticRefNodes(hexahedron27Nodes)
610DefineStaticRefNodes(pyramidNodes)
611DefineStaticRefNodes(pyramid13Nodes)
612DefineStaticRefNodes(pyramid14Nodes)
614DefineStaticRefNodes(wedgeNodes)
615DefineStaticRefNodes(wedge15Nodes)
616DefineStaticRefNodes(wedge18Nodes)
618template<
typename DeviceType>
621refNodeDataStatic_ = {
624 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}
627 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}
631 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}
634 { 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}
637 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0},
638 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 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}
645 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
646 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0}
649 {-1.0,-1.0, 0.0}, { 1.0,-1.0, 0.0}, { 1.0, 1.0, 0.0}, {-1.0, 1.0, 0.0},
650 { 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}
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}
657 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
658 { 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}
661 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
662 { 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}
665 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, { 0.0, 0.0, 1.0},
666 { 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}
670 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
671 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.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}
681 {-1.0,-1.0,-1.0}, { 1.0,-1.0,-1.0}, { 1.0, 1.0,-1.0}, {-1.0, 1.0,-1.0},
682 {-1.0,-1.0, 1.0}, { 1.0,-1.0, 1.0}, { 1.0, 1.0, 1.0}, {-1.0, 1.0, 1.0},
683 { 0.0,-1.0,-1.0}, { 1.0, 0.0,-1.0}, { 0.0, 1.0,-1.0}, {-1.0, 0.0,-1.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},
685 { 0.0,-1.0, 1.0}, { 1.0, 0.0, 1.0}, { 0.0, 1.0, 1.0}, {-1.0, 0.0, 1.0},
687 { 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}
691 {-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}
694 {-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},
695 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0},
696 {-0.5,-0.5, 0.5}, { 0.5,-0.5, 0.5}, { 0.5, 0.5, 0.5}, {-0.5, 0.5, 0.5}
699 {-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},
700 { 0.0,-1.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}, {-1.0, 0.0, 0.0},
701 {-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}
705 { 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}
708 { 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},
709 { 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},
710 { 0.5, 0.0, 1.0}, { 0.5, 0.5, 1.0}, { 0.0, 0.5, 1.0}
713 { 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},
714 { 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},
715 { 0.5, 0.0, 1.0}, { 0.5, 0.5, 1.0}, { 0.0, 0.5, 1.0},
716 { 0.5, 0.0, 0.0}, { 0.5, 0.5, 0.0}, { 0.0, 0.5, 0.0}
720template<
typename DeviceType>
724 if(isReferenceCellCenterDataSet_)
727 auto createDataViewFromHostArray = [](
const std::string& view_name,
double const * source_array){
729 auto host_view = Kokkos::create_mirror_view(dest_view);
730 for(ordinal_type i=0; i<3; ++i) host_view[i] = source_array[i];
731 Kokkos::deep_copy(dest_view, host_view);
737 lineCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::line", &refCenterDataStatic_.line[0]);
739 triangleCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::triangle", &refCenterDataStatic_.triangle[0]);
741 quadrilateralCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::quad", &refCenterDataStatic_.quadrilateral[0]);
743 tetrahedronCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::tet", &refCenterDataStatic_.tetrahedron[0]);
745 hexahedronCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::hex", &refCenterDataStatic_.hexahedron[0]);
747 pyramidCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::pyr", &refCenterDataStatic_.pyramid[0]);
749 wedgeCenter = createDataViewFromHostArray(
"CellTools::ReferenceCenterData::wedge", &refCenterDataStatic_.wedge[0]);
752 Kokkos::push_finalize_hook( [=] {
769 isReferenceCellCenterDataSet_ =
true;
772template<
typename DeviceType>
774typename RefCellCenter<DeviceType>::ConstViewType
777 if(!isReferenceCellCenterDataSet_)
782 switch (cellTopoKey ) {
783 case shards::Line<2>::key:
784 case shards::ShellLine<2>::key:
785 case shards::Beam<2>::key:
786 case shards::Line<3>::key:
787 case shards::ShellLine<3>::key:
788 case shards::Beam<3>::key: cellCenter = lineCenter;
break;
790 case shards::Triangle<3>::key:
791 case shards::ShellTriangle<3>::key:
792 case shards::Triangle<4>::key:
793 case shards::Triangle<6>::key:
794 case shards::ShellTriangle<6>::key: cellCenter = triangleCenter;
break;
796 case shards::Quadrilateral<4>::key:
797 case shards::ShellQuadrilateral<4>::key:
798 case shards::Quadrilateral<8>::key:
799 case shards::ShellQuadrilateral<8>::key:
800 case shards::Quadrilateral<9>::key:
801 case shards::ShellQuadrilateral<9>::key: cellCenter = quadrilateralCenter;
break;
803 case shards::Tetrahedron<4>::key:
804 case shards::Tetrahedron<8>::key:
805 case shards::Tetrahedron<10>::key:
806 case shards::Tetrahedron<11>::key: cellCenter = tetrahedronCenter;
break;
808 case shards::Hexahedron<8>::key:
809 case shards::Hexahedron<20>::key:
810 case shards::Hexahedron<27>::key: cellCenter = hexahedronCenter;
break;
812 case shards::Pyramid<5>::key:
813 case shards::Pyramid<13>::key:
814 case shards::Pyramid<14>::key: cellCenter = pyramidCenter;
break;
816 case shards::Wedge<6>::key:
817 case shards::Wedge<15>::key:
818 case shards::Wedge<18>::key: cellCenter = wedgeCenter;
break;
822 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): invalid cell topology.");
828template<
typename DeviceType>
831isReferenceCellCenterDataSet_ =
false;
833#define DefineStaticRefCenter(obj) template<typename DeviceType> \
834 typename RefCellCenter<DeviceType>::ViewType \
835 RefCellCenter<DeviceType>:: \
836 obj = typename RefCellCenter<DeviceType>::ViewType();
838DefineStaticRefCenter(lineCenter)
839DefineStaticRefCenter(triangleCenter)
840DefineStaticRefCenter(quadrilateralCenter)
841DefineStaticRefCenter(tetrahedronCenter)
842DefineStaticRefCenter(hexahedronCenter)
843DefineStaticRefCenter(pyramidCenter)
844DefineStaticRefCenter(wedgeCenter)
846template<
typename DeviceType>
849refCenterDataStatic_ = {
853 { 1.0/3.0, 1.0/3.0, 0.0},
863 { 1.0/3.0, 1.0/3.0, 0.0},
869 template<
typename Po
intViewType>
870 KOKKOS_INLINE_FUNCTION
871 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
872 ParametricDistance<shards::Line<>::key>::
873 distance(
const PointViewType &point) {
874 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
876 return Util<scalar_type>::max(-p0, p0);
879 template<
typename Po
intViewType>
880 KOKKOS_INLINE_FUNCTION
881 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
882 ParametricDistance<shards::Beam<>::key>::
883 distance(
const PointViewType &point) {
884 return ParametricDistance<shards::Quadrilateral<>::key>::distance(point);
887 template<
typename Po
intViewType>
888 KOKKOS_INLINE_FUNCTION
889 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
890 ParametricDistance<shards::ShellLine<>::key>::
891 distance(
const PointViewType &point) {
892 return ParametricDistance<shards::Quadrilateral<>::key>::distance(point);
895 template<
typename Po
intViewType>
896 KOKKOS_INLINE_FUNCTION
897 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
898 ParametricDistance<shards::Triangle<>::key>::
899 distance(
const PointViewType &point) {
900 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
901 constexpr scalar_type one(1), two(2), three(3);
904 return Util<scalar_type>::max(one-three*p0, three*(p0+p1)-two, one-three*p1);
907 template<
typename Po
intViewType>
908 KOKKOS_INLINE_FUNCTION
909 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
910 ParametricDistance<shards::ShellTriangle<>::key>::
911 distance(
const PointViewType &point) {
912 return ParametricDistance<shards::Wedge<>::key>::distance(point);
915 template<
typename Po
intViewType>
916 KOKKOS_INLINE_FUNCTION
917 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
918 ParametricDistance<shards::Quadrilateral<>::key>::
919 distance(
const PointViewType &point) {
920 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
923 return Util<scalar_type>::max(-p1, p0, p1, -p0);
926 template<
typename Po
intViewType>
927 KOKKOS_INLINE_FUNCTION
928 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
929 ParametricDistance<shards::ShellQuadrilateral<>::key>::
930 distance(
const PointViewType &point) {
931 return ParametricDistance<shards::Hexahedron<>::key>::distance(point);
934 template<
typename Po
intViewType>
935 KOKKOS_INLINE_FUNCTION
936 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
937 ParametricDistance<shards::Tetrahedron<>::key>::
938 distance(
const PointViewType &point) {
939 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
940 constexpr scalar_type one(1), three(3), four(4);
944 return Util<scalar_type>::max(one-four*p1, four*(p0+p1+p2)-three, one-four*p0, one-four*p2);
947 template<
typename Po
intViewType>
948 KOKKOS_INLINE_FUNCTION
949 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
950 ParametricDistance<shards::Hexahedron<>::key>::
951 distance(
const PointViewType &point) {
952 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
956 return Util<scalar_type>::max(-p1, p0, p1, -p0, -p2, p2);
959 template<
typename Po
intViewType>
960 KOKKOS_INLINE_FUNCTION
961 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
962 ParametricDistance<shards::Pyramid<>::key>::
963 distance(
const PointViewType &point) {
964 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
965 constexpr scalar_type one(1), four(4), onethird(1.0/3.0), fourthirds(4.0/3.0);
969 return Util<scalar_type>::max(fourthirds*(p2-p1)-onethird, fourthirds*(p2+p0)-onethird, fourthirds*(p2+p1)-onethird, fourthirds*(p2-p0)-onethird, one-four*p2);
972 template<
typename Po
intViewType>
973 KOKKOS_INLINE_FUNCTION
974 typename ScalarTraits<typename PointViewType::value_type>::scalar_type
975 ParametricDistance<shards::Wedge<>::key>::
976 distance(
const PointViewType &point) {
977 using scalar_type =
typename ScalarTraits<typename PointViewType::value_type>::scalar_type;
978 constexpr scalar_type one(1), two(2), three(3);
982 return Util<scalar_type>::max(one-three*p0, three*(p0+p1)-two, one-three*p1, -p2, p2);
KOKKOS_FORCEINLINE_FUNCTION constexpr std::enable_if<!(std::is_standard_layout< T >::value &&std::is_trivial< T >::value), typenameScalarTraits< T >::scalar_type >::type get_scalar_value(const T &obj)
functions returning the scalar value. for pod types, they return the input object itself....
#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.