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