Intrepid2
Intrepid2_HGRAD_HEX_C1_FEMDef.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 
16 #ifndef __INTREPID2_HGRAD_HEX_C1_FEM_DEF_HPP__
17 #define __INTREPID2_HGRAD_HEX_C1_FEM_DEF_HPP__
18 
19 namespace Intrepid2 {
20 
21  // -------------------------------------------------------------------------------------
22  namespace Impl {
23 
24  template<EOperator opType>
25  template<typename OutputViewType,
26  typename inputViewType>
27  KOKKOS_INLINE_FUNCTION
28  void
29  Basis_HGRAD_HEX_C1_FEM::Serial<opType>::
30  getValues( OutputViewType output,
31  const inputViewType input ) {
32  switch (opType) {
33  case OPERATOR_VALUE : {
34  const auto x = input(0);
35  const auto y = input(1);
36  const auto z = input(2);
37 
38  // output is a rank-1 array with dimensions (basisCardinality_)
39  output.access(0) = (1.0 - x)*(1.0 - y)*(1.0 - z)/8.0;
40  output.access(1) = (1.0 + x)*(1.0 - y)*(1.0 - z)/8.0;
41  output.access(2) = (1.0 + x)*(1.0 + y)*(1.0 - z)/8.0;
42  output.access(3) = (1.0 - x)*(1.0 + y)*(1.0 - z)/8.0;
43 
44  output.access(4) = (1.0 - x)*(1.0 - y)*(1.0 + z)/8.0;
45  output.access(5) = (1.0 + x)*(1.0 - y)*(1.0 + z)/8.0;
46  output.access(6) = (1.0 + x)*(1.0 + y)*(1.0 + z)/8.0;
47  output.access(7) = (1.0 - x)*(1.0 + y)*(1.0 + z)/8.0;
48  break;
49  }
50  case OPERATOR_GRAD : {
51  const auto x = input(0);
52  const auto y = input(1);
53  const auto z = input(2);
54 
55  // output is a rank-2 array with dimensions (basisCardinality_, spaceDim)
56  output.access(0, 0) = -(1.0 - y)*(1.0 - z)/8.0;
57  output.access(0, 1) = -(1.0 - x)*(1.0 - z)/8.0;
58  output.access(0, 2) = -(1.0 - x)*(1.0 - y)/8.0;
59 
60  output.access(1, 0) = (1.0 - y)*(1.0 - z)/8.0;
61  output.access(1, 1) = -(1.0 + x)*(1.0 - z)/8.0;
62  output.access(1, 2) = -(1.0 + x)*(1.0 - y)/8.0;
63 
64  output.access(2, 0) = (1.0 + y)*(1.0 - z)/8.0;
65  output.access(2, 1) = (1.0 + x)*(1.0 - z)/8.0;
66  output.access(2, 2) = -(1.0 + x)*(1.0 + y)/8.0;
67 
68  output.access(3, 0) = -(1.0 + y)*(1.0 - z)/8.0;
69  output.access(3, 1) = (1.0 - x)*(1.0 - z)/8.0;
70  output.access(3, 2) = -(1.0 - x)*(1.0 + y)/8.0;
71 
72  output.access(4, 0) = -(1.0 - y)*(1.0 + z)/8.0;
73  output.access(4, 1) = -(1.0 - x)*(1.0 + z)/8.0;
74  output.access(4, 2) = (1.0 - x)*(1.0 - y)/8.0;
75 
76  output.access(5, 0) = (1.0 - y)*(1.0 + z)/8.0;
77  output.access(5, 1) = -(1.0 + x)*(1.0 + z)/8.0;
78  output.access(5, 2) = (1.0 + x)*(1.0 - y)/8.0;
79 
80  output.access(6, 0) = (1.0 + y)*(1.0 + z)/8.0;
81  output.access(6, 1) = (1.0 + x)*(1.0 + z)/8.0;
82  output.access(6, 2) = (1.0 + x)*(1.0 + y)/8.0;
83 
84  output.access(7, 0) = -(1.0 + y)*(1.0 + z)/8.0;
85  output.access(7, 1) = (1.0 - x)*(1.0 + z)/8.0;
86  output.access(7, 2) = (1.0 - x)*(1.0 + y)/8.0;
87  break;
88  }
89  case OPERATOR_D2 : {
90  const auto x = input(0);
91  const auto y = input(1);
92  const auto z = input(2);
93 
94  // output is a rank-2 array with dimensions (basisCardinality_, D2Cardinality = 6)
95  output.access(0, 0) = 0.0; // {2, 0, 0}
96  output.access(0, 1) = (1.0 - z)/8.0; // {1, 1, 0}
97  output.access(0, 2) = (1.0 - y)/8.0; // {1, 0, 1}
98  output.access(0, 3) = 0.0; // {0, 2, 0}
99  output.access(0, 4) = (1.0 - x)/8.0; // {0, 1, 1}
100  output.access(0, 5) = 0.0; // {0, 0, 2}
101 
102  output.access(1, 0) = 0.0; // {2, 0, 0}
103  output.access(1, 1) = -(1.0 - z)/8.0; // {1, 1, 0}
104  output.access(1, 2) = -(1.0 - y)/8.0; // {1, 0, 1}
105  output.access(1, 3) = 0.0; // {0, 2, 0}
106  output.access(1, 4) = (1.0 + x)/8.0; // {0, 1, 1}
107  output.access(1, 5) = 0.0; // {0, 0, 2}
108 
109  output.access(2, 0) = 0.0; // {2, 0, 0}
110  output.access(2, 1) = (1.0 - z)/8.0; // {1, 1, 0}
111  output.access(2, 2) = -(1.0 + y)/8.0; // {1, 0, 1}
112  output.access(2, 3) = 0.0; // {0, 2, 0}
113  output.access(2, 4) = -(1.0 + x)/8.0; // {0, 1, 1}
114  output.access(2, 5) = 0.0; // {0, 0, 2}
115 
116  output.access(3, 0) = 0.0; // {2, 0, 0}
117  output.access(3, 1) = -(1.0 - z)/8.0; // {1, 1, 0}
118  output.access(3, 2) = (1.0 + y)/8.0; // {1, 0, 1}
119  output.access(3, 3) = 0.0; // {0, 2, 0}
120  output.access(3, 4) = -(1.0 - x)/8.0; // {0, 1, 1}
121  output.access(3, 5) = 0.0; // {0, 0, 2}
122 
123 
124  output.access(4, 0) = 0.0; // {2, 0, 0}
125  output.access(4, 1) = (1.0 + z)/8.0; // {1, 1, 0}
126  output.access(4, 2) = -(1.0 - y)/8.0; // {1, 0, 1}
127  output.access(4, 3) = 0.0; // {0, 2, 0}
128  output.access(4, 4) = -(1.0 - x)/8.0; // {0, 1, 1}
129  output.access(4, 5) = 0.0; // {0, 0, 2}
130 
131  output.access(5, 0) = 0.0; // {2, 0, 0}
132  output.access(5, 1) = -(1.0 + z)/8.0; // {1, 1, 0}
133  output.access(5, 2) = (1.0 - y)/8.0; // {1, 0, 1}
134  output.access(5, 3) = 0.0; // {0, 2, 0}
135  output.access(5, 4) = -(1.0 + x)/8.0; // {0, 1, 1}
136  output.access(5, 5) = 0.0; // {0, 0, 2}
137 
138  output.access(6, 0) = 0.0; // {2, 0, 0}
139  output.access(6, 1) = (1.0 + z)/8.0; // {1, 1, 0}
140  output.access(6, 2) = (1.0 + y)/8.0; // {1, 0, 1}
141  output.access(6, 3) = 0.0; // {0, 2, 0}
142  output.access(6, 4) = (1.0 + x)/8.0; // {0, 1, 1}
143  output.access(6, 5) = 0.0; // {0, 0, 2}
144 
145  output.access(7, 0) = 0.0; // {2, 0, 0}
146  output.access(7, 1) = -(1.0 + z)/8.0; // {1, 1, 0}
147  output.access(7, 2) = -(1.0 + y)/8.0; // {1, 0, 1}
148  output.access(7, 3) = 0.0; // {0, 2, 0}
149  output.access(7, 4) = (1.0 - x)/8.0; // {0, 1, 1}
150  output.access(7, 5) = 0.0; // {0, 0, 2}
151  break;
152  }
153  case OPERATOR_D3:
154  {
155  // output is a rank-2 array with dimensions (basisCardinality_, D3Cardinality = 10)
156  // (1.0 - x)*(1.0 - y)*(1.0 - z)/8.0;
157  output.access(0, 0) = 0.0; // {3, 0, 0}
158  output.access(0, 1) = 0.0; // {2, 1, 0}
159  output.access(0, 2) = 0.0; // {2, 0, 1}
160  output.access(0, 3) = 0.0; // {1, 2, 0}
161  output.access(0, 4) = -1.0/8.0; // {1, 1, 1}
162  output.access(0, 5) = 0.0; // {1, 0, 2}
163  output.access(0, 6) = 0.0; // {0, 3, 0}
164  output.access(0, 7) = 0.0; // {0, 2, 1}
165  output.access(0, 8) = 0.0; // {0, 1, 2}
166  output.access(0, 9) = 0.0; // {0, 0, 3}
167 
168  // (1.0 + x)*(1.0 - y)*(1.0 - z)/8.0;
169  output.access(1, 0) = 0.0; // {3, 0, 0}
170  output.access(1, 1) = 0.0; // {2, 1, 0}
171  output.access(1, 2) = 0.0; // {2, 0, 1}
172  output.access(1, 3) = 0.0; // {1, 2, 0}
173  output.access(1, 4) = 1.0/8.0; // {1, 1, 1}
174  output.access(1, 5) = 0.0; // {1, 0, 2}
175  output.access(1, 6) = 0.0; // {0, 3, 0}
176  output.access(1, 7) = 0.0; // {0, 2, 1}
177  output.access(1, 8) = 0.0; // {0, 1, 2}
178  output.access(1, 9) = 0.0; // {0, 0, 3}
179 
180  // (1.0 + x)*(1.0 + y)*(1.0 - z)/8.0;
181  output.access(2, 0) = 0.0; // {3, 0, 0}
182  output.access(2, 1) = 0.0; // {2, 1, 0}
183  output.access(2, 2) = 0.0; // {2, 0, 1}
184  output.access(2, 3) = 0.0; // {1, 2, 0}
185  output.access(2, 4) = -1.0/8.0; // {1, 1, 1}
186  output.access(2, 5) = 0.0; // {1, 0, 2}
187  output.access(2, 6) = 0.0; // {0, 3, 0}
188  output.access(2, 7) = 0.0; // {0, 2, 1}
189  output.access(2, 8) = 0.0; // {0, 1, 2}
190  output.access(2, 9) = 0.0; // {0, 0, 3}
191 
192  // (1.0 - x)*(1.0 + y)*(1.0 - z)/8.0;
193  output.access(3, 0) = 0.0; // {3, 0, 0}
194  output.access(3, 1) = 0.0; // {2, 1, 0}
195  output.access(3, 2) = 0.0; // {2, 0, 1}
196  output.access(3, 3) = 0.0; // {1, 2, 0}
197  output.access(3, 4) = 1.0/8.0; // {1, 1, 1}
198  output.access(3, 5) = 0.0; // {1, 0, 2}
199  output.access(3, 6) = 0.0; // {0, 3, 0}
200  output.access(3, 7) = 0.0; // {0, 2, 1}
201  output.access(3, 8) = 0.0; // {0, 1, 2}
202  output.access(3, 9) = 0.0; // {0, 0, 3}
203 
204  // (1.0 - x)*(1.0 - y)*(1.0 + z)/8.0;
205  output.access(4, 0) = 0.0; // {3, 0, 0}
206  output.access(4, 1) = 0.0; // {2, 1, 0}
207  output.access(4, 2) = 0.0; // {2, 0, 1}
208  output.access(4, 3) = 0.0; // {1, 2, 0}
209  output.access(4, 4) = 1.0/8.0; // {1, 1, 1}
210  output.access(4, 5) = 0.0; // {1, 0, 2}
211  output.access(4, 6) = 0.0; // {0, 3, 0}
212  output.access(4, 7) = 0.0; // {0, 2, 1}
213  output.access(4, 8) = 0.0; // {0, 1, 2}
214  output.access(4, 9) = 0.0; // {0, 0, 3}
215 
216  // (1.0 + x)*(1.0 - y)*(1.0 + z)/8.0;
217  output.access(5, 0) = 0.0; // {3, 0, 0}
218  output.access(5, 1) = 0.0; // {2, 1, 0}
219  output.access(5, 2) = 0.0; // {2, 0, 1}
220  output.access(5, 3) = 0.0; // {1, 2, 0}
221  output.access(5, 4) = -1.0/8.0; // {1, 1, 1}
222  output.access(5, 5) = 0.0; // {1, 0, 2}
223  output.access(5, 6) = 0.0; // {0, 3, 0}
224  output.access(5, 7) = 0.0; // {0, 2, 1}
225  output.access(5, 8) = 0.0; // {0, 1, 2}
226  output.access(5, 9) = 0.0; // {0, 0, 3}
227 
228  // (1.0 + x)*(1.0 + y)*(1.0 + z)/8.0;
229  output.access(6, 0) = 0.0; // {3, 0, 0}
230  output.access(6, 1) = 0.0; // {2, 1, 0}
231  output.access(6, 2) = 0.0; // {2, 0, 1}
232  output.access(6, 3) = 0.0; // {1, 2, 0}
233  output.access(6, 4) = 1.0/8.0; // {1, 1, 1}
234  output.access(6, 5) = 0.0; // {1, 0, 2}
235  output.access(6, 6) = 0.0; // {0, 3, 0}
236  output.access(6, 7) = 0.0; // {0, 2, 1}
237  output.access(6, 8) = 0.0; // {0, 1, 2}
238  output.access(6, 9) = 0.0; // {0, 0, 3}
239 
240  // (1.0 - x)*(1.0 + y)*(1.0 + z)/8.0;
241  output.access(7, 0) = 0.0; // {3, 0, 0}
242  output.access(7, 1) = 0.0; // {2, 1, 0}
243  output.access(7, 2) = 0.0; // {2, 0, 1}
244  output.access(7, 3) = 0.0; // {1, 2, 0}
245  output.access(7, 4) = -1.0/8.0; // {1, 1, 1}
246  output.access(7, 5) = 0.0; // {1, 0, 2}
247  output.access(7, 6) = 0.0; // {0, 3, 0}
248  output.access(7, 7) = 0.0; // {0, 2, 1}
249  output.access(7, 8) = 0.0; // {0, 1, 2}
250  output.access(7, 9) = 0.0; // {0, 0, 3}
251 
252  break;
253  }
254  case OPERATOR_MAX : {
255  const ordinal_type jend = output.extent(1);
256  const ordinal_type iend = output.extent(0);
257 
258  for (ordinal_type j=0;j<jend;++j)
259  for (ordinal_type i=0;i<iend;++i)
260  output.access(i, j) = 0.0;
261  break;
262  }
263  default: {
264  INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
265  opType != OPERATOR_GRAD &&
266  opType != OPERATOR_CURL &&
267  opType != OPERATOR_D2 &&
268  opType != OPERATOR_MAX,
269  ">>> ERROR: (Intrepid2::Basis_HGRAD_HEX_C1_FEM::Serial::getValues) operator is not supported");
270 
271  }
272  }
273  }
274 
275  template<typename DT,
276  typename outputValueValueType, class ...outputValueProperties,
277  typename inputPointValueType, class ...inputPointProperties>
278  void
279  Basis_HGRAD_HEX_C1_FEM::
280  getValues( const typename DT::execution_space& space,
281  Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
282  const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
283  const EOperator operatorType ) {
284  typedef Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValueViewType;
285  typedef Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPointViewType;
286  typedef typename ExecSpace<typename inputPointViewType::execution_space,typename DT::execution_space>::ExecSpaceType ExecSpaceType;
287 
288  // Number of evaluation points = dim 0 of inputPoints
289  const auto loopSize = inputPoints.extent(0);
290  Kokkos::RangePolicy<ExecSpaceType,Kokkos::Schedule<Kokkos::Static> > policy(space, 0, loopSize);
291 
292  switch (operatorType) {
293 
294  case OPERATOR_VALUE: {
295  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_VALUE> FunctorType;
296  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
297  break;
298  }
299  case OPERATOR_GRAD:
300  case OPERATOR_D1: {
301  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_GRAD> FunctorType;
302  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
303  break;
304  }
305  case OPERATOR_CURL: {
306  INTREPID2_TEST_FOR_EXCEPTION( operatorType == OPERATOR_CURL, std::invalid_argument,
307  ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): CURL is invalid operator for rank-0 (scalar) functions in 3D");
308  break;
309  }
310 
311  case OPERATOR_DIV: {
312  INTREPID2_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
313  ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): DIV is invalid operator for rank-0 (scalar) functions in 3D");
314  break;
315  }
316 
317  case OPERATOR_D2: {
318  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D2> FunctorType;
319  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
320  break;
321  }
322  case OPERATOR_D3:{
323  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D3> FunctorType;
324  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
325  break;
326  }
327  case OPERATOR_D4:
328  case OPERATOR_D5:
329  case OPERATOR_D6:
330  case OPERATOR_D7:
331  case OPERATOR_D8:
332  case OPERATOR_D9:
333  case OPERATOR_D10: {
334  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_MAX> FunctorType;
335  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
336  break;
337  }
338  default: {
339  INTREPID2_TEST_FOR_EXCEPTION( !( Intrepid2::isValidOperator(operatorType) ), std::invalid_argument,
340  ">>> ERROR (Basis_HGRAD_HEX_C1_FEM): Invalid operator type");
341  }
342  }
343  }
344  }
345 
346  // -------------------------------------------------------------------------------------
347 
348  template<typename DT, typename OT, typename PT>
351  constexpr ordinal_type spaceDim = 3;
352  this->basisCardinality_ = 8;
353  this->basisDegree_ = 1;
354  this->basisCellTopologyKey_ = shards::Hexahedron<8>::key;
355  this->basisType_ = BASIS_FEM_DEFAULT;
356  this->basisCoordinates_ = COORDINATES_CARTESIAN;
357  this->functionSpace_ = FUNCTION_SPACE_HGRAD;
358 
359  // initialize tags
360  {
361  // Basis-dependent intializations
362  const ordinal_type tagSize = 4; // size of DoF tag, i.e., number of fields in the tag
363  const ordinal_type posScDim = 0; // position in the tag, counting from 0, of the subcell dim
364  const ordinal_type posScOrd = 1; // position in the tag, counting from 0, of the subcell ordinal
365  const ordinal_type posDfOrd = 2; // position in the tag, counting from 0, of DoF ordinal relative to the subcell
366 
367  // An array with local DoF tags assigned to basis functions, in the order of their local enumeration
368  ordinal_type tags[32] = { 0, 0, 0, 1,
369  0, 1, 0, 1,
370  0, 2, 0, 1,
371  0, 3, 0, 1,
372  0, 4, 0, 1,
373  0, 5, 0, 1,
374  0, 6, 0, 1,
375  0, 7, 0, 1 };
376 
377  // host tags
378  OrdinalTypeArray1DHost tagView(&tags[0], 32);
379 
380  // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
381  //OrdinalTypeArray2DHost ordinalToTag;
382  //OrdinalTypeArray3DHost tagToOrdinal;
383  this->setOrdinalTagData(this->tagToOrdinal_,
384  this->ordinalToTag_,
385  tagView,
386  this->basisCardinality_,
387  tagSize,
388  posScDim,
389  posScOrd,
390  posDfOrd);
391 
392  //this->tagToOrdinal_ = Kokkos::create_mirror_view(typename DT::memory_space(), tagToOrdinal);
393  //Kokkos::deep_copy(this->tagToOrdinal_, tagToOrdinal);
394 
395  //this->ordinalToTag_ = Kokkos::create_mirror_view(typename DT::memory_space(), ordinalToTag);
396  //Kokkos::deep_copy(this->ordinalToTag_, ordinalToTag);
397  }
398 
399  // dofCoords on host and create its mirror view to device
400  Kokkos::DynRankView<typename ScalarViewType::value_type,typename DT::execution_space::array_layout,Kokkos::HostSpace>
401  dofCoords("dofCoordsHost", this->basisCardinality_,spaceDim);
402 
403  dofCoords(0,0) = -1.0; dofCoords(0,1) = -1.0; dofCoords(0,2) = -1.0;
404  dofCoords(1,0) = 1.0; dofCoords(1,1) = -1.0; dofCoords(1,2) = -1.0;
405  dofCoords(2,0) = 1.0; dofCoords(2,1) = 1.0; dofCoords(2,2) = -1.0;
406  dofCoords(3,0) = -1.0; dofCoords(3,1) = 1.0; dofCoords(3,2) = -1.0;
407  dofCoords(4,0) = -1.0; dofCoords(4,1) = -1.0; dofCoords(4,2) = 1.0;
408  dofCoords(5,0) = 1.0; dofCoords(5,1) = -1.0; dofCoords(5,2) = 1.0;
409  dofCoords(6,0) = 1.0; dofCoords(6,1) = 1.0; dofCoords(6,2) = 1.0;
410  dofCoords(7,0) = -1.0; dofCoords(7,1) = 1.0; dofCoords(7,2) = 1.0;
411 
412  this->dofCoords_ = Kokkos::create_mirror_view(typename DT::memory_space(), dofCoords);
413  Kokkos::deep_copy(this->dofCoords_, dofCoords);
414  }
415 
416  template<typename DT, typename OT, typename PT>
417  void
419  ordinal_type& perTeamSpaceSize,
420  ordinal_type& perThreadSpaceSize,
421  const PointViewType inputPoints,
422  const EOperator operatorType) const {
423  perTeamSpaceSize = 0;
424  perThreadSpaceSize = 0;
425  }
426 
427  template<typename DT, typename OT, typename PT>
428  KOKKOS_INLINE_FUNCTION
429  void
431  OutputViewType outputValues,
432  const PointViewType inputPoints,
433  const EOperator operatorType,
434  const typename Kokkos::TeamPolicy<typename DT::execution_space>::member_type& team_member,
435  const typename DT::execution_space::scratch_memory_space & scratchStorage,
436  const ordinal_type subcellDim,
437  const ordinal_type subcellOrdinal) const {
438 
439  INTREPID2_TEST_FOR_ABORT( !((subcellDim <= 0) && (subcellOrdinal == -1)),
440  ">>> ERROR: (Intrepid2::Basis_HGRAD_HEX_C1_FEM::getValues), The capability of selecting subsets of basis functions has not been implemented yet.");
441 
442  (void) scratchStorage; //avoid unused variable warning
443 
444  const int numPoints = inputPoints.extent(0);
445 
446  switch(operatorType) {
447  case OPERATOR_VALUE:
448  Kokkos::parallel_for (Kokkos::TeamThreadRange (team_member, numPoints), [=] (ordinal_type& pt) {
449  auto output = Kokkos::subview( outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
450  const auto input = Kokkos::subview( inputPoints, pt, Kokkos::ALL() );
452  });
453  break;
454  case OPERATOR_GRAD:
455  Kokkos::parallel_for (Kokkos::TeamThreadRange (team_member, numPoints), [=] (ordinal_type& pt) {
456  auto output = Kokkos::subview( outputValues, Kokkos::ALL(), pt, Kokkos::ALL() );
457  const auto input = Kokkos::subview( inputPoints, pt, Kokkos::ALL() );
458  Impl::Basis_HGRAD_HEX_C1_FEM::Serial<OPERATOR_GRAD>::getValues( output, input);
459  });
460  break;
461  default: {}
462  }
463  }
464 
465 }// namespace Intrepid2
466 
467 #endif
468 
Kokkos::View< ordinal_type *, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
virtual void getScratchSpaceSize(ordinal_type &perTeamSpaceSize, ordinal_type &perThreadSpaceSize, const PointViewType inputPointsconst, const EOperator operatorType=OPERATOR_VALUE) const override
Return the size of the scratch space, in bytes, needed for using the team-level implementation of get...
virtual void getValues(const ExecutionSpace &space, OutputViewType outputValues, const PointViewType inputPoints, const EOperator operatorType=OPERATOR_VALUE) const override
Evaluation of a FEM basis on a reference cell.