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
19namespace 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
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.
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...
Kokkos::DynRankView< PointValueType, Kokkos::LayoutStride, DeviceType > PointViewType
View type for input points.
Kokkos::View< ordinal_type *, typename ExecutionSpace::array_layout, Kokkos::HostSpace > OrdinalTypeArray1DHost
View type for 1d host array.