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 
56 namespace Intrepid2 {
57 
58 template<typename DeviceType>
59 inline bool
61 isSupported( 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 
99 template<typename DeviceType>
100 inline
101 typename RefSubcellParametrization<DeviceType>::ConstViewType
103 get( 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 
156 template<typename DeviceType>
157 void
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 
274 template<typename DeviceType>
275 template <typename HostViewType>
276 void
278 set( 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 
408 template<typename DeviceType>
409 bool
411 isSubcellParametrizationSet_ = false;
412 
413 #define DefineStaticRefParametrization(obj) template<typename DeviceType> \
414  typename RefSubcellParametrization<DeviceType>::ViewType \
415  RefSubcellParametrization<DeviceType>:: \
416  obj = typename RefSubcellParametrization<DeviceType>::ViewType();
417 
418 DefineStaticRefParametrization(lineEdgesParam)
419 DefineStaticRefParametrization(triEdgesParam)
420 DefineStaticRefParametrization(quadEdgesParam)
421 DefineStaticRefParametrization(shellTriEdgesParam)
422 DefineStaticRefParametrization(shellQuadEdgesParam)
423 DefineStaticRefParametrization(tetEdgesParam)
424 DefineStaticRefParametrization(hexEdgesParam)
425 DefineStaticRefParametrization(pyrEdgesParam)
426 DefineStaticRefParametrization(wedgeEdgesParam)
427 DefineStaticRefParametrization(shellTriFacesParam)
428 DefineStaticRefParametrization(shellQuadFacesParam)
429 DefineStaticRefParametrization(tetFacesParam)
430 DefineStaticRefParametrization(hexFacesParam)
431 DefineStaticRefParametrization(pyrFacesParam)
432 DefineStaticRefParametrization(wedgeFacesParam)
433 
434 
435 template<typename DeviceType>
436 void
437 RefCellNodes<DeviceType>::set() {
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 
517 template<typename DeviceType>
518 inline
519 typename RefCellNodes<DeviceType>::ConstViewType
520 RefCellNodes<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 
573 template<typename DeviceType>
574 bool
576 isReferenceNodeDataSet_ = false;
577 
578 #define DefineStaticRefNodes(obj) template<typename DeviceType> \
579  typename RefCellNodes<DeviceType>::ViewType \
580  RefCellNodes<DeviceType>:: \
581  obj = typename RefCellNodes<DeviceType>::ViewType();
582 
583 DefineStaticRefNodes(lineNodes)
584 DefineStaticRefNodes(line3Nodes)
585 
586 DefineStaticRefNodes(triangleNodes)
587 DefineStaticRefNodes(triangle4Nodes)
588 DefineStaticRefNodes(triangle6Nodes)
589 
590 DefineStaticRefNodes(quadrilateralNodes)
591 DefineStaticRefNodes(quadrilateral8Nodes)
592 DefineStaticRefNodes(quadrilateral9Nodes)
593 
594 DefineStaticRefNodes(tetrahedronNodes)
595 DefineStaticRefNodes(tetrahedron8Nodes)
596 DefineStaticRefNodes(tetrahedron10Nodes)
597 DefineStaticRefNodes(tetrahedron11Nodes)
598 
599 DefineStaticRefNodes(hexahedronNodes)
600 DefineStaticRefNodes(hexahedron20Nodes)
601 DefineStaticRefNodes(hexahedron27Nodes)
602 
603 DefineStaticRefNodes(pyramidNodes)
604 DefineStaticRefNodes(pyramid13Nodes)
605 DefineStaticRefNodes(pyramid14Nodes)
606 
607 DefineStaticRefNodes(wedgeNodes)
608 DefineStaticRefNodes(wedge15Nodes)
609 DefineStaticRefNodes(wedge18Nodes)
610 
611 template<typename DeviceType>
612 const typename RefCellNodes<DeviceType>::ReferenceNodeDataStatic
613 RefCellNodes<DeviceType>::
614 refNodeDataStatic_ = {
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 
713 template<typename DeviceType>
714 void
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 
765 template<typename DeviceType>
766 inline
767 typename RefCellCenter<DeviceType>::ConstViewType
768 RefCellCenter<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 
821 template<typename DeviceType>
822 bool
824 isReferenceCellCenterDataSet_ = false;
825 
826 #define DefineStaticRefCenter(obj) template<typename DeviceType> \
827  typename RefCellCenter<DeviceType>::ViewType \
828  RefCellCenter<DeviceType>:: \
829  obj = typename RefCellCenter<DeviceType>::ViewType();
830 
831 DefineStaticRefCenter(lineCenter)
832 DefineStaticRefCenter(triangleCenter)
833 DefineStaticRefCenter(quadrilateralCenter)
834 DefineStaticRefCenter(tetrahedronCenter)
835 DefineStaticRefCenter(hexahedronCenter)
836 DefineStaticRefCenter(pyramidCenter)
837 DefineStaticRefCenter(wedgeCenter)
838 
839 template<typename DeviceType>
840 const typename RefCellCenter<DeviceType>::ReferenceCenterDataStatic
841 RefCellCenter<DeviceType>::
842 refCenterDataStatic_ = {
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 
This class defines the coordinates of the barycenter of the supported reference cells. The barycenter coordinates are stored in static views. The class is templated on the Kokkos::Device Type which is used to determine layout and memory space of the views.
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the center coordinates allocated on DeviceType::memory_space ...
static ConstViewType get(const unsigned cellTopoKey)
Retrieves the Cartesian coordinates of reference cell nodes.
#define INTREPID2_TEST_FOR_EXCEPTION_DEVICE_SAFE(test, x, msg)
static ConstViewType get(const ordinal_type subcellDim, const unsigned parentCellKey)
Returns a Kokkos view with the coefficients of the parametrization maps for the edges or faces of a r...
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the parametrization maps, allocated on DeviceType::memory_space ...
This class defines the coordinates of the nodes of reference cells according for supported cell topol...
static bool isSupported(const unsigned cellTopoKey)
Checks if a cell topology has a reference parametrization.
static void set()
Computes and stores static views containing the parametrizations maps of edges and faces of all refer...
static ConstViewType get(const unsigned cellTopoKey)
Retrieves the Cartesian coordinates of a reference cell barycenter.
Kokkos::DynRankView< double, DeviceType > ViewType
static views containing the node coordinates allocated on DeviceType::memory_space ...
This class defines the parametrizations of edges and faces of supported reference cells...
static void set()
Set center coordinates of reference cell for supported topologies.