Intrepid2
Intrepid2_CellDataDef.hpp
Go to the documentation of this file.
1// @HEADER
2// ************************************************************************
3//
4// Intrepid2 Package
5// Copyright (2007) Sandia Corporation
6//
7// Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
8// license for use of this work by or on behalf of the U.S. Government.
9//
10// Redistribution and use in source and binary forms, with or without
11// modification, are permitted provided that the following conditions are
12// met:
13//
14// 1. Redistributions of source code must retain the above copyright
15// notice, this list of conditions and the following disclaimer.
16//
17// 2. Redistributions in binary form must reproduce the above copyright
18// notice, this list of conditions and the following disclaimer in the
19// documentation and/or other materials provided with the distribution.
20//
21// 3. Neither the name of the Corporation nor the names of the
22// contributors may be used to endorse or promote products derived from
23// this software without specific prior written permission.
24//
25// THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
26// EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
27// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
28// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
29// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
30// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
31// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
32// PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
33// LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
34// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
35// SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
36//
37// Questions? Contact Kyungjoo Kim (kyukim@sandia.gov), or
38// Mauro Perego (mperego@sandia.gov), or
39// Nathan Roberts (nvrober@sandia.gov)
40//
41// ************************************************************************
42// @HEADER
43
53#ifndef __INTREPID2_CELLDATA_DEF_HPP__
54#define __INTREPID2_CELLDATA_DEF_HPP__
55
56namespace Intrepid2 {
57
58template<typename DeviceType>
59inline bool
61isSupported( const unsigned cellTopoKey ) {
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:
70 // case shards::Triangle<4>::key:
71 case shards::Triangle<6>::key:
72 // case shards::ShellTriangle<3>::key:
73 // case shards::ShellTriangle<6>::key:
74 case shards::Quadrilateral<4>::key:
75 case shards::Quadrilateral<8>::key:
76 case shards::Quadrilateral<9>::key:
77 // case shards::ShellQuadrilateral<4>::key:
78 // case shards::ShellQuadrilateral<8>::key:
79 // case shards::ShellQuadrilateral<9>::key:
80 case shards::Tetrahedron<4>::key:
81 // case shards::Tetrahedron<8>::key:
82 case shards::Tetrahedron<10>::key:
83 // case shards::Tetrahedron<11>::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:
88 // case shards::Pyramid<13>::key:
89 // case shards::Pyramid<14>::key:
90 case shards::Wedge<6>::key:
91 // case shards::Wedge<15>::key:
92 case shards::Wedge<18>::key:
93 return true;
94 default:
95 return false;
96 }
97}
98
99template<typename DeviceType>
100inline
101typename RefSubcellParametrization<DeviceType>::ConstViewType
103get( const ordinal_type subcellDim,
104 const unsigned parentCellKey ) {
105
106 if(!isSubcellParametrizationSet_)
107 set();
108
109 ViewType subcellParam;
110
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;
116
117 case shards::Hexahedron<8>::key:
118 case shards::Hexahedron<20>::key:
119 case shards::Hexahedron<27>::key: subcellParam = ( subcellDim == 2 ? hexFacesParam : hexEdgesParam ); break;
120
121 case shards::Pyramid<5>::key:
122 case shards::Pyramid<13>::key:
123 case shards::Pyramid<14>::key: subcellParam = ( subcellDim == 2 ? pyrFacesParam : pyrEdgesParam ); break;
124
125 case shards::Wedge<6>::key:
126 case shards::Wedge<15>::key:
127 case shards::Wedge<18>::key: subcellParam = ( subcellDim == 2 ? wedgeFacesParam : wedgeEdgesParam ); break;
128
129 case shards::Triangle<3>::key:
130 case shards::Triangle<4>::key:
131 case shards::Triangle<6>::key: subcellParam = triEdgesParam; break;
132
133 case shards::Quadrilateral<4>::key:
134 case shards::Quadrilateral<8>::key:
135 case shards::Quadrilateral<9>::key: subcellParam = quadEdgesParam; break;
136
137 // case shards::ShellTriangle<3>::key:
138 // case shards::ShellTriangle<6>::key: subcellParam = ( subcellDim == 2 ? shellTriFacesParam : shellTriEdgesParam ); break;
139
140 // case shards::ShellQuadrilateral<4>::key:
141 // case shards::ShellQuadrilateral<8>::key:
142 // case shards::ShellQuadrilateral<9>::key: subcellParam = ( subcellDim == 2 ? shellQuadFacesParam : shellQuadEdgesParam ); break;
143
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;
148 default: {
149 INTREPID2_TEST_FOR_EXCEPTION( true, std::invalid_argument,
150 ">>> ERROR (Intrepid2::RefSubcellParametrization::get): invalid cell topology.");
151 }
152 }
153 return subcellParam;
154}
155
156template<typename DeviceType>
157void
159
160 if(isSubcellParametrizationSet_)
161 return;
162
163 ordinal_type subcellDim;
164 {
165 const auto tet = shards::CellTopology(shards::getCellTopologyData<shards::Tetrahedron<4> >());
166
167 subcellDim = 2;
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);
172
173 subcellDim = 1;
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);
178 }
179 {
180 const auto hex = shards::CellTopology(shards::getCellTopologyData<shards::Hexahedron<8> >());
181
182 subcellDim = 2;
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);
187
188 subcellDim = 1;
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);
193 }
194 {
195 const auto pyr = shards::CellTopology(shards::getCellTopologyData<shards::Pyramid<5> >());
196
197 subcellDim = 2;
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);
202
203 subcellDim = 1;
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);
208 }
209 {
210 const auto wedge = shards::CellTopology(shards::getCellTopologyData<shards::Wedge<6> >());
211
212 subcellDim = 2;
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);
217
218 subcellDim = 1;
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);
223 }
224 {
225 const auto tri = shards::CellTopology(shards::getCellTopologyData<shards::Triangle<3> >());
226
227 subcellDim = 1;
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);
232 }
233 {
234 const auto quad = shards::CellTopology(shards::getCellTopologyData<shards::Quadrilateral<4> >());
235
236 subcellDim = 1;
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);
241
242 }
243 {
244 const auto line = shards::CellTopology(shards::getCellTopologyData<shards::ShellLine<2> >());
245
246 subcellDim = 1;
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);
251 }
252
253 Kokkos::push_finalize_hook( [=] {
254 lineEdgesParam = ViewType();
255 triEdgesParam = ViewType();
256 quadEdgesParam = ViewType();
257 shellTriEdgesParam = ViewType();
258 shellQuadEdgesParam = ViewType();
259 tetEdgesParam = ViewType();
260 hexEdgesParam = ViewType();
261 pyrEdgesParam = ViewType();
262 wedgeEdgesParam = ViewType();
263 shellTriFacesParam = ViewType();
264 shellQuadFacesParam = ViewType();
265 tetFacesParam = ViewType();
266 hexFacesParam = ViewType();
267 pyrFacesParam = ViewType();
268 wedgeFacesParam = ViewType();
269 });
270
271 isSubcellParametrizationSet_= true;
272}
273
274template<typename DeviceType>
275template <typename HostViewType>
276void
278set( HostViewType subcellParam,
279 const ordinal_type subcellDim,
280 const shards::CellTopology parentCell ) {
281 // subcellParametrization is rank-3 FieldContainer with dimensions (SC, PCD, COEF) where:
282 // - SC is the subcell count of subcells with the specified dimension in the parent cell
283 // - PCD is Parent Cell Dimension, which gives the number of coordinate functions in the map
284 // PCD = 2 for standard 2D cells and non-standard 2D cells: shell line and beam
285 // PCD = 3 for standard 3D cells and non-standard 3D cells: shell Tri and Quad
286 // - COEF is number of coefficients needed to specify a coordinate function:
287 // COEFF = 2 for edge parametrizations
288 // COEFF = 3 for both Quad and Tri face parametrizations. Because all Quad reference faces
289 // are affine, the coefficient of the bilinear term u*v is zero and is not stored, i.e.,
290 // 3 coefficients are sufficient to store Quad face parameterization maps.
291 //
292 // Edge parametrization maps [-1,1] to edge defined by (v0, v1)
293 // Face parametrization maps [-1,1]^2 to quadrilateral face (v0, v1, v2, v3), or
294 // standard 2-simplex {(0,0),(1,0),(0,1)} to traingle face (v0, v1, v2).
295 // This defines orientation-preserving parametrizations with respect to reference edge and
296 // face orientations induced by their vertex order.
297
298 // get subcellParametrization dimensions: (sc, pcd, coeff)
299 const auto sc = parentCell.getSubcellCount(subcellDim);
300 const auto pcd = parentCell.getDimension();
301
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)");
304
305 const auto refNodes = RefCellNodes<Kokkos::HostSpace>::get(parentCell.getKey());
306
307 if (subcellDim == 1) {
308 // Edge parametrizations of 2D and 3D cells (shell lines and beams are 2D cells with edges)
309 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
310 // vertexK[0] = x_k; vertexK[1] = y_k; vertexK[2] = z_k; z_k = 0 for 2D cells
311 // Note that ShellLine and Beam are 2D cells!
312 const auto v0ord = parentCell.getNodeMap(subcellDim, subcellOrd, 0);
313 const auto v1ord = parentCell.getNodeMap(subcellDim, subcellOrd, 1);
314
315 const auto v0 = Kokkos::subview(refNodes, v0ord, Kokkos::ALL());
316 const auto v1 = Kokkos::subview(refNodes, v1ord, Kokkos::ALL());
317
318 // x(t) = (x0 + x1)/2 + t*(x1 - x0)/2
319 subcellParam(subcellOrd, 0, 0) = (v0(0) + v1(0))/2.0;
320 subcellParam(subcellOrd, 0, 1) = (v1(0) - v0(0))/2.0;
321
322 // y(t) = (y0 + y1)/2 + t*(y1 - y0)/2
323 subcellParam(subcellOrd, 1, 0) = (v0(1) + v1(1))/2.0;
324 subcellParam(subcellOrd, 1, 1) = (v1(1) - v0(1))/2.0;
325
326 if( pcd == 3 ) {
327 // z(t) = (z0 + z1)/2 + t*(z1 - z0)/2
328 subcellParam(subcellOrd, 2, 0) = (v0(2) + v1(2))/2.0;
329 subcellParam(subcellOrd, 2, 1) = (v1(2) - v0(2))/2.0;
330 }
331 }
332 }
333 else if (subcellDim == 2) {
334 // Face parametrizations of 3D cells: (shell Tri and Quad are 3D cells with faces)
335 // A 3D cell can have both Tri and Quad faces, but because they are affine images of the
336 // parametrization domain, 3 coefficients are enough to store them in both cases.
337 for (size_type subcellOrd=0;subcellOrd<sc;++subcellOrd) {
338
339 switch (parentCell.getKey(subcellDim,subcellOrd)) {
340
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);
347
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());
351
352 // x(u,v) = x0 + (x1 - x0)*u + (x2 - x0)*v
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);
356
357 // y(u,v) = y0 + (y1 - y0)*u + (y2 - y0)*v
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);
361
362 // z(u,v) = z0 + (z1 - z0)*u + (z2 - z0)*v
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);
366 break;
367 }
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);
375
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());
380
381 // 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
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;
385
386 // 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
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;
390
391 // 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
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;
395 break;
396 }
397 default: {
398 INTREPID2_TEST_FOR_EXCEPTION( true, std::invalid_argument,
399 ">>> ERROR (Intrepid2::RefSubcellParametrization::set): parametrization not defined for the specified face topology.");
400 }
401 }
402 }
403 }
404}
405
406
407
408template<typename DeviceType>
409bool
411isSubcellParametrizationSet_ = false;
412
413#define DefineStaticRefParametrization(obj) template<typename DeviceType> \
414 typename RefSubcellParametrization<DeviceType>::ViewType \
415 RefSubcellParametrization<DeviceType>:: \
416 obj = typename RefSubcellParametrization<DeviceType>::ViewType();
417
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)
433
434
435template<typename DeviceType>
436void
438
439 if(isReferenceNodeDataSet_)
440 return;
441
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);
449 return dest_view;
450 };
451
452 {
453 // create memory on devices
454 lineNodes = createDataViewFromHostArray("CellTools::ReferenceNodeData::line", &refNodeDataStatic_.line[0][0], 2);
455 line3Nodes = createDataViewFromHostArray("CellTools::ReferenceNodeData::line_3", &refNodeDataStatic_.line_3[0][0], 3);
456
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);
460
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);
464
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);
469
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);
473
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);
477
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);
481 }
482
483 Kokkos::push_finalize_hook( [=] {
484
485 lineNodes = ViewType();
486 line3Nodes = ViewType();
487
488 triangleNodes = ViewType();
489 triangle4Nodes = ViewType();
490 triangle6Nodes = ViewType();
491
492 quadrilateralNodes = ViewType();
493 quadrilateral8Nodes = ViewType();
494 quadrilateral9Nodes = ViewType();
495
496 tetrahedronNodes = ViewType();
497 tetrahedron8Nodes = ViewType();
498 tetrahedron10Nodes = ViewType();
499 tetrahedron11Nodes = ViewType();
500
501 hexahedronNodes = ViewType();
502 hexahedron20Nodes = ViewType();
503 hexahedron27Nodes = ViewType();
504
505 pyramidNodes = ViewType();
506 pyramid13Nodes = ViewType();
507 pyramid14Nodes = ViewType();
508
509 wedgeNodes = ViewType();
510 wedge15Nodes = ViewType();
511 wedge18Nodes = ViewType();
512 } );
513
514 isReferenceNodeDataSet_ = true;
515}
516
517template<typename DeviceType>
518inline
519typename RefCellNodes<DeviceType>::ConstViewType
520RefCellNodes<DeviceType>::get(const unsigned cellTopoKey){
521
522 if(!isReferenceNodeDataSet_)
523 set();
524
525 ViewType refNodes;
526
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;
534
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;
540
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;
547
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;
552
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;
556
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;
560
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;
564
565 default: {
566 INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE( true, std::invalid_argument,
567 ">>> ERROR (Intrepid2::CellTools::getReferenceNode): invalid cell topology.");
568 }
569 }
570 return refNodes;
571}
572
573template<typename DeviceType>
574bool
576isReferenceNodeDataSet_ = false;
577
578#define DefineStaticRefNodes(obj) template<typename DeviceType> \
579 typename RefCellNodes<DeviceType>::ViewType \
580 RefCellNodes<DeviceType>:: \
581 obj = typename RefCellNodes<DeviceType>::ViewType();
582
583DefineStaticRefNodes(lineNodes)
584DefineStaticRefNodes(line3Nodes)
585
586DefineStaticRefNodes(triangleNodes)
587DefineStaticRefNodes(triangle4Nodes)
588DefineStaticRefNodes(triangle6Nodes)
589
590DefineStaticRefNodes(quadrilateralNodes)
591DefineStaticRefNodes(quadrilateral8Nodes)
592DefineStaticRefNodes(quadrilateral9Nodes)
593
594DefineStaticRefNodes(tetrahedronNodes)
595DefineStaticRefNodes(tetrahedron8Nodes)
596DefineStaticRefNodes(tetrahedron10Nodes)
597DefineStaticRefNodes(tetrahedron11Nodes)
598
599DefineStaticRefNodes(hexahedronNodes)
600DefineStaticRefNodes(hexahedron20Nodes)
601DefineStaticRefNodes(hexahedron27Nodes)
602
603DefineStaticRefNodes(pyramidNodes)
604DefineStaticRefNodes(pyramid13Nodes)
605DefineStaticRefNodes(pyramid14Nodes)
606
607DefineStaticRefNodes(wedgeNodes)
608DefineStaticRefNodes(wedge15Nodes)
609DefineStaticRefNodes(wedge18Nodes)
610
611template<typename DeviceType>
614refNodeDataStatic_ = {
615 // line
616 { // 2
617 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}
618 },
619 { // 3
620 {-1.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 0.0, 0.0}
621 },
622 // triangle
623 { // 3
624 { 0.0, 0.0, 0.0}, { 1.0, 0.0, 0.0}, { 0.0, 1.0, 0.0}
625 },
626 { // 4
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}
628 },
629 { // 6
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}
632 },
633 // quad
634 { // 4
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}
636 },
637 { // 8
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}
640 },
641 { // 9
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}
644 },
645 // tet
646 { // 4
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}
648 },
649 { // 8
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}
652 },
653 { // 10
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}
656 },
657 { // 11
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}
660 },
661 // hex
662 { // 8
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}
665 },
666 { // 20
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}
672 },
673 { // 27
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 { 0.0, 0.0, 0.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}
681 },
682 // pyramid
683 { // 5
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}
685 },
686 { // 13
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}
690 },
691 { // 14
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}
695 },
696 // wedge
697 { // 6
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}
699 },
700 { // 15
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}
704 },
705 { // 18
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}
710 }
711};
712
713template<typename DeviceType>
714void
716
717 if(isReferenceCellCenterDataSet_)
718 return;
719
720 auto createDataViewFromHostArray = [](const std::string& view_name, double const * source_array){
721 ViewType dest_view(view_name, 3);
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);
725 return dest_view;
726 };
727
728 {
729 // create memory on devices
730 lineCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::line", &refCenterDataStatic_.line[0]);
731
732 triangleCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::triangle", &refCenterDataStatic_.triangle[0]);
733
734 quadrilateralCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::quad", &refCenterDataStatic_.quadrilateral[0]);
735
736 tetrahedronCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::tet", &refCenterDataStatic_.tetrahedron[0]);
737
738 hexahedronCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::hex", &refCenterDataStatic_.hexahedron[0]);
739
740 pyramidCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::pyr", &refCenterDataStatic_.pyramid[0]);
741
742 wedgeCenter = createDataViewFromHostArray("CellTools::ReferenceCenterData::wedge", &refCenterDataStatic_.wedge[0]);
743 }
744
745 Kokkos::push_finalize_hook( [=] {
746
747 lineCenter = ViewType();
748
749 triangleCenter = ViewType();
750
751 quadrilateralCenter = ViewType();
752
753 tetrahedronCenter = ViewType();
754
755 hexahedronCenter = ViewType();
756
757 pyramidCenter = ViewType();
758
759 wedgeCenter = ViewType();
760 } );
761
762 isReferenceCellCenterDataSet_ = true;
763}
764
765template<typename DeviceType>
766inline
767typename RefCellCenter<DeviceType>::ConstViewType
768RefCellCenter<DeviceType>::get(const unsigned cellTopoKey){
769
770 if(!isReferenceCellCenterDataSet_)
771 set();
772
773 ViewType cellCenter;
774
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;
782
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;
788
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;
795
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;
800
801 case shards::Hexahedron<8>::key:
802 case shards::Hexahedron<20>::key:
803 case shards::Hexahedron<27>::key: cellCenter = hexahedronCenter; break;
804
805 case shards::Pyramid<5>::key:
806 case shards::Pyramid<13>::key:
807 case shards::Pyramid<14>::key: cellCenter = pyramidCenter; break;
808
809 case shards::Wedge<6>::key:
810 case shards::Wedge<15>::key:
811 case shards::Wedge<18>::key: cellCenter = wedgeCenter; break;
812
813 default: {
814 INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE( true, std::invalid_argument,
815 ">>> ERROR (Intrepid2::CellTools::getReferenceCellCenter): invalid cell topology.");
816 }
817 }
818 return cellCenter;
819}
820
821template<typename DeviceType>
822bool
824isReferenceCellCenterDataSet_ = false;
825
826#define DefineStaticRefCenter(obj) template<typename DeviceType> \
827 typename RefCellCenter<DeviceType>::ViewType \
828 RefCellCenter<DeviceType>:: \
829 obj = typename RefCellCenter<DeviceType>::ViewType();
830
831DefineStaticRefCenter(lineCenter)
832DefineStaticRefCenter(triangleCenter)
833DefineStaticRefCenter(quadrilateralCenter)
834DefineStaticRefCenter(tetrahedronCenter)
835DefineStaticRefCenter(hexahedronCenter)
836DefineStaticRefCenter(pyramidCenter)
837DefineStaticRefCenter(wedgeCenter)
838
839template<typename DeviceType>
842refCenterDataStatic_ = {
843 // line
844 {0.0, 0.0, 0.0},
845 // triangle
846 { 1.0/3.0, 1.0/3.0, 0.0},
847 // quad
848 {0.0, 0.0, 0.0},
849 // tet
850 { 0.25, 0.25, 0.25},
851 // hex
852 { 0.0, 0.0, 0.0},
853 // pyramid
854 { 0.0, 0.0, 0.25},
855 // wedge
856 { 1.0/3.0, 1.0/3.0, 0.0},
857};
858}
859
860#endif
861
#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.