Intrepid2
Intrepid2_CellDataDef.hpp
Go to the documentation of this file.
1// @HEADER
2// *****************************************************************************
3// Intrepid2 Package
4//
5// Copyright 2007 NTESS and the Intrepid2 contributors.
6// SPDX-License-Identifier: BSD-3-Clause
7// *****************************************************************************
8// @HEADER
9
19#ifndef __INTREPID2_CELLDATA_DEF_HPP__
20#define __INTREPID2_CELLDATA_DEF_HPP__
21
22namespace Intrepid2 {
23
24template<typename DeviceType>
25inline bool
27isSupported( const unsigned cellTopoKey ) {
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:
36 //case shards::Triangle<4>::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:
47 //case shards::Tetrahedron<8>::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:
55 //case shards::Pyramid<14>::key:
56 case shards::Wedge<6>::key:
57 case shards::Wedge<15>::key:
58 case shards::Wedge<18>::key:
59 return true;
60 default:
61 return false;
62 }
63}
64
65template<typename DeviceType>
66inline
67typename RefSubcellParametrization<DeviceType>::ConstViewType
69get( const ordinal_type subcellDim,
70 const unsigned parentCellKey ) {
71
72 if(!isSubcellParametrizationSet_)
73 set();
74
75 ViewType subcellParam;
76
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;
82
83 case shards::Hexahedron<8>::key:
84 case shards::Hexahedron<20>::key:
85 case shards::Hexahedron<27>::key: subcellParam = ( subcellDim == 2 ? hexFacesParam : hexEdgesParam ); break;
86
87 case shards::Pyramid<5>::key:
88 case shards::Pyramid<13>::key:
89 case shards::Pyramid<14>::key: subcellParam = ( subcellDim == 2 ? pyrFacesParam : pyrEdgesParam ); break;
90
91 case shards::Wedge<6>::key:
92 case shards::Wedge<15>::key:
93 case shards::Wedge<18>::key: subcellParam = ( subcellDim == 2 ? wedgeFacesParam : wedgeEdgesParam ); break;
94
95 case shards::Triangle<3>::key:
96 case shards::Triangle<4>::key:
97 case shards::Triangle<6>::key: subcellParam = triEdgesParam; break;
98
99 case shards::Quadrilateral<4>::key:
100 case shards::Quadrilateral<8>::key:
101 case shards::Quadrilateral<9>::key: subcellParam = quadEdgesParam; break;
102
103 case shards::ShellTriangle<3>::key:
104 case shards::ShellTriangle<6>::key: subcellParam = ( subcellDim == 2 ? shellTriFacesParam : shellTriEdgesParam ); break;
105
106 case shards::ShellQuadrilateral<4>::key:
107 case shards::ShellQuadrilateral<8>::key:
108 case shards::ShellQuadrilateral<9>::key: subcellParam = ( subcellDim == 2 ? shellQuadFacesParam : shellQuadEdgesParam ); break;
109
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;
114 default: {
115 INTREPID2_TEST_FOR_EXCEPTION( true, std::invalid_argument,
116 ">>> ERROR (Intrepid2::RefSubcellParametrization::get): invalid cell topology.");
117 }
118 }
119 return subcellParam;
120}
121
122template<typename DeviceType>
123void
125
126 if(isSubcellParametrizationSet_)
127 return;
128
129 ordinal_type subcellDim;
130 {
131 const auto tet = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >());
132
133 subcellDim = 2;
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);
138
139 subcellDim = 1;
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);
144 }
145 {
146 const auto hex = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >());
147
148 subcellDim = 2;
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);
153
154 subcellDim = 1;
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);
159 }
160 {
161 const auto pyr = shards::CellTopology(shards::getCellTopologyData<shards::Pyramid<5> >());
162
163 subcellDim = 2;
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);
168
169 subcellDim = 1;
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);
174 }
175 {
176 const auto wedge = shards::CellTopology(shards::getCellTopologyData<shards::Wedge<6> >());
177
178 subcellDim = 2;
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);
183
184 subcellDim = 1;
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);
189 }
190 {
191 const auto tri = shards::CellTopology(shards::getCellTopologyData<shards::Triangle<3> >());
192 subcellDim = 1;
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);
197 }
198 {
199 const auto shellTri = shards::CellTopology(shards::getCellTopologyData<shards::ShellTriangle<3> >());
200
201 subcellDim = 2;
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);
206
207
208 subcellDim = 1;
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);
213 }
214 {
215 const auto quad = shards::CellTopology(shards::getCellTopologyData<shards::Quadrilateral<4> >());
216
217 subcellDim = 1;
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);
222
223 }
224 {
225 const auto shellQuad = shards::CellTopology(shards::getCellTopologyData<shards::ShellQuadrilateral<4> >());
226
227 subcellDim = 2;
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);
232
233 subcellDim = 1;
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);
238 }
239 {
240 const auto beam = shards::CellTopology(shards::getCellTopologyData<shards::Beam<2> >());
241
242 subcellDim = 1;
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);
247 }
248 {
249 const auto shellLine = shards::CellTopology(shards::getCellTopologyData<shards::ShellLine<2> >());
250
251 subcellDim = 1;
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);
256 }
257
258 Kokkos::push_finalize_hook( [=] {
259 beamEdgeParam = ViewType();
260 shellLineEdgesParam = ViewType();
261 triEdgesParam = ViewType();
262 quadEdgesParam = ViewType();
263 shellTriEdgesParam = ViewType();
264 shellQuadEdgesParam = ViewType();
265 tetEdgesParam = ViewType();
266 hexEdgesParam = ViewType();
267 pyrEdgesParam = ViewType();
268 wedgeEdgesParam = ViewType();
269 shellTriFacesParam = ViewType();
270 shellQuadFacesParam = ViewType();
271 tetFacesParam = ViewType();
272 hexFacesParam = ViewType();
273 pyrFacesParam = ViewType();
274 wedgeFacesParam = ViewType();
275 });
276
277 isSubcellParametrizationSet_= true;
278}
279
280template<typename DeviceType>
281template <typename HostViewType>
282void
284set( HostViewType subcellParam,
285 const ordinal_type subcellDim,
286 const shards::CellTopology parentCell ) {
287 // subcellParametrization is rank-3 FieldContainer with dimensions (SC, PCD, COEF) where:
288 // - SC is the subcell count of subcells with the specified dimension in the parent cell
289 // - PCD is Parent Cell Dimension, which gives the number of coordinate functions in the map
290 // PCD = 2 for standard 2D cells and non-standard 2D cells: shell line and beam
291 // PCD = 3 for standard 3D cells and non-standard 3D cells: shell Tri and Quad
292 // - COEF is number of coefficients needed to specify a coordinate function:
293 // COEFF = 2 for edge parametrizations
294 // COEFF = 3 for both Quad and Tri face parametrizations. Because all Quad reference faces
295 // are affine, the coefficient of the bilinear term u*v is zero and is not stored, i.e.,
296 // 3 coefficients are sufficient to store Quad face parameterization maps.
297 //
298 // Edge parametrization maps [-1,1] to edge defined by (v0, v1)
299 // Face parametrization maps [-1,1]^2 to quadrilateral face (v0, v1, v2, v3), or
300 // standard 2-simplex {(0,0),(1,0),(0,1)} to traingle face (v0, v1, v2).
301 // This defines orientation-preserving parametrizations with respect to reference edge and
302 // face orientations induced by their vertex order.
303
304 // get subcellParametrization dimensions: (sc, pcd, coeff)
305 const auto sc = parentCell.getSubcellCount(subcellDim);
306 const auto pcd = parentCell.getDimension();
307
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)");
310
311 const auto refNodes = RefCellNodes<Kokkos::HostSpace>::get(parentCell.getKey());
312
313 if (subcellDim == 1) {
314 // Edge parametrizations of 2D and 3D cells (shell lines and beams are 2D cells with edges)
315 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
316 // vertexK[0] = x_k; vertexK[1] = y_k; vertexK[2] = z_k; z_k = 0 for 2D cells
317 // Note that ShellLine and Beam are 2D cells!
318 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
319 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
320
321 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
322 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
323
324 // x(t) = (x0 + x1)/2 + t*(x1 - x0)/2
325 subcellParam(subcellOrd, 0, 0) = (v0(0) + v1(0))/2.0;
326 subcellParam(subcellOrd, 0, 1) = (v1(0) - v0(0))/2.0;
327
328 // y(t) = (y0 + y1)/2 + t*(y1 - y0)/2
329 subcellParam(subcellOrd, 1, 0) = (v0(1) + v1(1))/2.0;
330 subcellParam(subcellOrd, 1, 1) = (v1(1) - v0(1))/2.0;
331
332 if( pcd == 3 ) {
333 // z(t) = (z0 + z1)/2 + t*(z1 - z0)/2
334 subcellParam(subcellOrd, 2, 0) = (v0(2) + v1(2))/2.0;
335 subcellParam(subcellOrd, 2, 1) = (v1(2) - v0(2))/2.0;
336 }
337 }
338 }
339 else if (subcellDim == 2) {
340 // Face parametrizations of 3D cells: (shell Tri and Quad are 3D cells with faces)
341 // A 3D cell can have both Tri and Quad faces, but because they are affine images of the
342 // parametrization domain, 3 coefficients are enough to store them in both cases.
343 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
344
345 switch (parentCell.getKey(subcellDim,subcellOrd)) {
346
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);
353
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());
357
358 // x(u,v) = x0 + (x1 - x0)*u + (x2 - x0)*v
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);
362
363 // y(u,v) = y0 + (y1 - y0)*u + (y2 - y0)*v
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);
367
368 // z(u,v) = z0 + (z1 - z0)*u + (z2 - z0)*v
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);
372 break;
373 }
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);
381
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());
386
387 // x(u,v) = (x0+x1+x2+x3)/4+u*(-x0+x1+x2-x3)/4+v*(-x0-x1+x2+x3)/4+uv*(0=x0-x1+x2-x3)/4
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;
391
392 // y(u,v) = (y0+y1+y2+y3)/4+u*(-y0+y1+y2-y3)/4+v*(-y0-y1+y2+y3)/4+uv*(0=y0-y1+y2-y3)/4
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;
396
397 // z(u,v) = (z0+z1+z2+z3)/4+u*(-z0+z1+z2-z3)/4+v*(-z0-z1+z2+z3)/4+uv*(0=z0-z1+z2-z3)/4
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;
401 break;
402 }
403 default: {
404 INTREPID2_TEST_FOR_EXCEPTION( true, std::invalid_argument,
405 ">>> ERROR (Intrepid2::RefSubcellParametrization::set): parametrization not defined for the specified face topology.");
406 }
407 }
408 }
409 }
410}
411
412
413
414template<typename DeviceType>
415bool
417isSubcellParametrizationSet_ = false;
418
419#define DefineStaticRefParametrization(obj) template<typename DeviceType> \
420 typename RefSubcellParametrization<DeviceType>::ViewType \
421 RefSubcellParametrization<DeviceType>:: \
422 obj = typename RefSubcellParametrization<DeviceType>::ViewType();
423
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)
440
441
442template<typename DeviceType>
443void
445
446 if(isReferenceNodeDataSet_)
447 return;
448
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);
456 return dest_view;
457 };
458
459 {
460 // create memory on devices
461 lineNodes = createDataViewFromHostArray("CellTools::ReferenceNodeData::line", &refNodeDataStatic_.line[0][0], 2);
462 line3Nodes = createDataViewFromHostArray("CellTools::ReferenceNodeData::line_3", &refNodeDataStatic_.line_3[0][0], 3);
463
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);
467
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);
471
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);
476
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);
480
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);
484
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);
488 }
489
490 Kokkos::push_finalize_hook( [=] {
491
492 lineNodes = ViewType();
493 line3Nodes = ViewType();
494
495 triangleNodes = ViewType();
496 triangle4Nodes = ViewType();
497 triangle6Nodes = ViewType();
498
499 quadrilateralNodes = ViewType();
500 quadrilateral8Nodes = ViewType();
501 quadrilateral9Nodes = ViewType();
502
503 tetrahedronNodes = ViewType();
504 tetrahedron8Nodes = ViewType();
505 tetrahedron10Nodes = ViewType();
506 tetrahedron11Nodes = ViewType();
507
508 hexahedronNodes = ViewType();
509 hexahedron20Nodes = ViewType();
510 hexahedron27Nodes = ViewType();
511
512 pyramidNodes = ViewType();
513 pyramid13Nodes = ViewType();
514 pyramid14Nodes = ViewType();
515
516 wedgeNodes = ViewType();
517 wedge15Nodes = ViewType();
518 wedge18Nodes = ViewType();
519 } );
520
521 isReferenceNodeDataSet_ = true;
522}
523
524template<typename DeviceType>
525inline
526typename RefCellNodes<DeviceType>::ConstViewType
527RefCellNodes<DeviceType>::get(const unsigned cellTopoKey){
528
529 if(!isReferenceNodeDataSet_)
530 set();
531
532 ViewType refNodes;
533
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;
541
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;
547
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;
554
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;
559
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;
563
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;
567
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;
571
572 default: {
573 INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE( true, std::invalid_argument,
574 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): invalid cell topology.");
575 }
576 }
577 return refNodes;
578}
579
580template<typename DeviceType>
581bool
583isReferenceNodeDataSet_ = false;
584
585#define DefineStaticRefNodes(obj) template<typename DeviceType> \
586 typename RefCellNodes<DeviceType>::ViewType \
587 RefCellNodes<DeviceType>:: \
588 obj = typename RefCellNodes<DeviceType>::ViewType();
589
590DefineStaticRefNodes(lineNodes)
591DefineStaticRefNodes(line3Nodes)
592
593DefineStaticRefNodes(triangleNodes)
594DefineStaticRefNodes(triangle4Nodes)
595DefineStaticRefNodes(triangle6Nodes)
596
597DefineStaticRefNodes(quadrilateralNodes)
598DefineStaticRefNodes(quadrilateral8Nodes)
599DefineStaticRefNodes(quadrilateral9Nodes)
600
601DefineStaticRefNodes(tetrahedronNodes)
602DefineStaticRefNodes(tetrahedron8Nodes)
603DefineStaticRefNodes(tetrahedron10Nodes)
604DefineStaticRefNodes(tetrahedron11Nodes)
605
606DefineStaticRefNodes(hexahedronNodes)
607DefineStaticRefNodes(hexahedron20Nodes)
608DefineStaticRefNodes(hexahedron27Nodes)
609
610DefineStaticRefNodes(pyramidNodes)
611DefineStaticRefNodes(pyramid13Nodes)
612DefineStaticRefNodes(pyramid14Nodes)
613
614DefineStaticRefNodes(wedgeNodes)
615DefineStaticRefNodes(wedge15Nodes)
616DefineStaticRefNodes(wedge18Nodes)
617
618template<typename DeviceType>
621refNodeDataStatic_ = {
622 // line
623 { // 2
624 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}
625 },
626 { // 3
627 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}
628 },
629 // triangle
630 { // 3
631 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}
632 },
633 { // 4
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}
635 },
636 { // 6
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}
639 },
640 // quad
641 { // 4
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 },
644 { // 8
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}
647 },
648 { // 9
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}
651 },
652 // tet
653 { // 4
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 },
656 { // 8
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}
659 },
660 { // 10
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}
663 },
664 { // 11
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}
667 },
668 // hex
669 { // 8
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}
672 },
673 { // 20
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}
679 },
680 { // 27
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},
686 { 0.0, 0.0, 0.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}
688 },
689 // pyramid
690 { // 5
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}
692 },
693 { // 13
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}
697 },
698 { // 14
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}
702 },
703 // wedge
704 { // 6
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}
706 },
707 { // 15
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}
711 },
712 { // 18
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}
717 }
718};
719
720template<typename DeviceType>
721void
723
724 if(isReferenceCellCenterDataSet_)
725 return;
726
727 auto createDataViewFromHostArray = [](const std::string& view_name, double const * source_array){
728 ViewType dest_view(view_name, 3);
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);
732 return dest_view;
733 };
734
735 {
736 // create memory on devices
737 lineCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::line", &refCenterDataStatic_.line[0]);
738
739 triangleCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::triangle", &refCenterDataStatic_.triangle[0]);
740
741 quadrilateralCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::quad", &refCenterDataStatic_.quadrilateral[0]);
742
743 tetrahedronCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::tet", &refCenterDataStatic_.tetrahedron[0]);
744
745 hexahedronCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::hex", &refCenterDataStatic_.hexahedron[0]);
746
747 pyramidCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::pyr", &refCenterDataStatic_.pyramid[0]);
748
749 wedgeCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::wedge", &refCenterDataStatic_.wedge[0]);
750 }
751
752 Kokkos::push_finalize_hook( [=] {
753
754 lineCenter = ViewType();
755
756 triangleCenter = ViewType();
757
758 quadrilateralCenter = ViewType();
759
760 tetrahedronCenter = ViewType();
761
762 hexahedronCenter = ViewType();
763
764 pyramidCenter = ViewType();
765
766 wedgeCenter = ViewType();
767 } );
768
769 isReferenceCellCenterDataSet_ = true;
770}
771
772template<typename DeviceType>
773inline
774typename RefCellCenter<DeviceType>::ConstViewType
775RefCellCenter<DeviceType>::get(const unsigned cellTopoKey){
776
777 if(!isReferenceCellCenterDataSet_)
778 set();
779
780 ViewType cellCenter;
781
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;
789
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;
795
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;
802
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;
807
808 case shards::Hexahedron<8>::key:
809 case shards::Hexahedron<20>::key:
810 case shards::Hexahedron<27>::key: cellCenter = hexahedronCenter; break;
811
812 case shards::Pyramid<5>::key:
813 case shards::Pyramid<13>::key:
814 case shards::Pyramid<14>::key: cellCenter = pyramidCenter; break;
815
816 case shards::Wedge<6>::key:
817 case shards::Wedge<15>::key:
818 case shards::Wedge<18>::key: cellCenter = wedgeCenter; break;
819
820 default: {
821 INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE( true, std::invalid_argument,
822 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): invalid cell topology.");
823 }
824 }
825 return cellCenter;
826}
827
828template<typename DeviceType>
829bool
831isReferenceCellCenterDataSet_ = false;
832
833#define DefineStaticRefCenter(obj) template<typename DeviceType> \
834 typename RefCellCenter<DeviceType>::ViewType \
835 RefCellCenter<DeviceType>:: \
836 obj = typename RefCellCenter<DeviceType>::ViewType();
837
838DefineStaticRefCenter(lineCenter)
839DefineStaticRefCenter(triangleCenter)
840DefineStaticRefCenter(quadrilateralCenter)
841DefineStaticRefCenter(tetrahedronCenter)
842DefineStaticRefCenter(hexahedronCenter)
843DefineStaticRefCenter(pyramidCenter)
844DefineStaticRefCenter(wedgeCenter)
845
846template<typename DeviceType>
849refCenterDataStatic_ = {
850 // line
851 {0.0, 0.0, 0.0},
852 // triangle
853 { 1.0/3.0, 1.0/3.0, 0.0},
854 // quad
855 {0.0, 0.0, 0.0},
856 // tet
857 { 0.25, 0.25, 0.25},
858 // hex
859 { 0.0, 0.0, 0.0},
860 // pyramid
861 { 0.0, 0.0, 0.25},
862 // wedge
863 { 1.0/3.0, 1.0/3.0, 0.0},
864};
865
866
867// ParametricDistance
868
869 template<typename PointViewType>
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;
875 const scalar_type p0 = get_scalar_value(point(0));
876 return Util<scalar_type>::max(-p0, p0);
877 }
878
879 template<typename PointViewType>
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);
885 }
886
887 template<typename PointViewType>
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);
893 }
894
895 template<typename PointViewType>
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);
902 const scalar_type& p0 = get_scalar_value(point(0));
903 const scalar_type& p1 = get_scalar_value(point(1));
904 return Util<scalar_type>::max(one-three*p0, three*(p0+p1)-two, one-three*p1);
905 }
906
907 template<typename PointViewType>
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);
913 }
914
915 template<typename PointViewType>
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;
921 const scalar_type& p0 = get_scalar_value(point(0));
922 const scalar_type& p1 = get_scalar_value(point(1));
923 return Util<scalar_type>::max(-p1, p0, p1, -p0);
924 }
925
926 template<typename PointViewType>
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);
932 }
933
934 template<typename PointViewType>
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);
941 const scalar_type& p0 = get_scalar_value(point(0));
942 const scalar_type& p1 = get_scalar_value(point(1));
943 const scalar_type& p2 = get_scalar_value(point(2));
944 return Util<scalar_type>::max(one-four*p1, four*(p0+p1+p2)-three, one-four*p0, one-four*p2);
945 }
946
947 template<typename PointViewType>
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;
953 const scalar_type& p0 = get_scalar_value(point(0));
954 const scalar_type& p1 = get_scalar_value(point(1));
955 const scalar_type& p2 = get_scalar_value(point(2));
956 return Util<scalar_type>::max(-p1, p0, p1, -p0, -p2, p2);
957 }
958
959 template<typename PointViewType>
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);
966 const scalar_type& p0 = get_scalar_value(point(0));
967 const scalar_type& p1 = get_scalar_value(point(1));
968 const scalar_type& p2 = get_scalar_value(point(2));
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);
970 }
971
972 template<typename PointViewType>
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);
979 const scalar_type& p0 = get_scalar_value(point(0));
980 const scalar_type& p1 = get_scalar_value(point(1));
981 const scalar_type& p2 = get_scalar_value(point(2));
982 return Util<scalar_type>::max(one-three*p0, three*(p0+p1)-two, one-three*p1, -p2, p2);
983 }
984
985} // Intrepid2 namespace
986
987#endif
988
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.