Intrepid2
Intrepid2_HGRAD_WEDGE_C2_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_WEDGE_C2_FEM_DEF_HPP__
50 #define __INTREPID2_HGRAD_WEDGE_C2_FEM_DEF_HPP__
51 
52 namespace Intrepid2 {
53 
54  // -------------------------------------------------------------------------------------
55  namespace Impl {
56 
57  template<bool serendipity>
58  template<EOperator opType>
59  template<typename OutputViewType,
60  typename inputViewType>
61  KOKKOS_INLINE_FUNCTION
62  void
63  Basis_HGRAD_WEDGE_DEG2_FEM<serendipity>::Serial<opType>::
64  getValues( OutputViewType output,
65  const inputViewType input ) {
66  switch (opType) {
67  case OPERATOR_VALUE: {
68  const auto x = input(0);
69  const auto y = input(1);
70  const auto z = input(2);
71  const auto w = 1.0 - x - y;
72 
73  // output is a rank-1 array with dimensions (basisCardinality_)
74  if constexpr (!serendipity) {
75  output.access(0) = -(w*(-1. + 2.*x + 2.*y)*(-1. + z)*z)/2.;
76  output.access(1) = (x*(-1. + 2.*x)*(-1. + z)*z)/2.;
77  output.access(2) = (y*(-1. + 2.*y)*(-1. + z)*z)/2.;
78  output.access(3) = -(w*(-1. + 2.*x + 2.*y)*z*(1. + z))/2.;
79  output.access(4) = (x*(-1. + 2.*x)*z*(1. + z))/2.;
80  output.access(5) = (y*(-1. + 2.*y)*z*(1. + z))/2.;
81 
82  output.access(6) = 2.*x*w*(-1. + z)*z;
83  output.access(7) = 2.*x*y*(-1. + z)*z;
84  output.access(8) = 2.*y*w*(-1. + z)*z;
85  output.access(9) = (w*(-1. + 2.*x + 2.*y)*(-1. + z)*(1. + z));
86  output.access(10) = -(x*(-1. + 2.*x)*(-1. + z)*(1. + z));
87  output.access(11) = -(y*(-1. + 2.*y)*(-1. + z)*(1. + z));
88  output.access(12) = 2.*x*w*z*(1. + z);
89  output.access(13) = 2.*x*y*z*(1. + z);
90  output.access(14) = 2.*y*w*z*(1. + z);
91 
92  output.access(15) = -4.*x*w*(-1. + z)*(1. + z);
93  output.access(16) = -4.*x*y*(-1. + z)*(1. + z);
94  output.access(17) = -4.*y*w*(-1. + z)*(1. + z);
95  } else {
96  output.access(0) = 0.5 * w *(2.0*w - 2.0 - z)*(1.0 - z);
97  output.access(1) = 0.5 * x *(2.0*x - 2.0 - z)*(1.0 - z);
98  output.access(2) = 0.5 * y *(2.0*y - 2.0 - z)*(1.0 - z);
99  output.access(3) = 0.5 * w *(2.0*w - 2.0 + z)*(1.0 + z);
100  output.access(4) = 0.5 * x *(2.0*x - 2.0 + z)*(1.0 + z);
101  output.access(5) = 0.5 * y *(2.0*y - 2.0 + z)*(1.0 + z);
102 
103  output.access(6) = 2.0 * w * x * (1.0 - z);
104  output.access(7) = 2.0 * x * y * (1.0 - z);
105  output.access(8) = 2.0 * y * w * (1.0 - z);
106  output.access(9) = w * (1.0 - z*z);
107  output.access(10) = x * (1.0 - z*z);
108  output.access(11) = y * (1.0 - z*z);
109  output.access(12) = 2.0 * w * x * (1.0 + z);
110  output.access(13) = 2.0 * x * y * (1.0 + z);
111  output.access(14) = 2.0 * y * w * (1.0 + z);
112  }
113  break;
114  }
115  case OPERATOR_GRAD: {
116  const auto x = input(0);
117  const auto y = input(1);
118  const auto z = input(2);
119 
120  if constexpr (!serendipity) {
121  output.access(0, 0) = ((-3 + 4*x + 4*y)*(-1 + z)*z)/2.;
122  output.access(0, 1) = ((-3 + 4*x + 4*y)*(-1 + z)*z)/2.;
123  output.access(0, 2) = ((-1 + x + y)*(-1 + 2*x + 2*y)*(-1 + 2*z))/2.;
124 
125  output.access(1, 0) = ((-1 + 4*x)*(-1 + z)*z)/2.;
126  output.access(1, 1) = 0.;
127  output.access(1, 2) = (x*(-1 + 2*x)*(-1 + 2*z))/2.;
128 
129  output.access(2, 0) = 0.;
130  output.access(2, 1) = ((-1 + 4*y)*(-1 + z)*z)/2.;
131  output.access(2, 2) = (y*(-1 + 2*y)*(-1 + 2*z))/2.;
132 
133  output.access(3, 0) = ((-3 + 4*x + 4*y)*z*(1 + z))/2.;
134  output.access(3, 1) = ((-3 + 4*x + 4*y)*z*(1 + z))/2.;
135  output.access(3, 2) = ((-1 + x + y)*(-1 + 2*x + 2*y)*(1 + 2*z))/2.;
136 
137  output.access(4, 0) = ((-1 + 4*x)*z*(1 + z))/2.;
138  output.access(4, 1) = 0.;
139  output.access(4, 2) = (x*(-1 + 2*x)*(1 + 2*z))/2.;
140 
141  output.access(5, 0) = 0.;
142  output.access(5, 1) = ((-1 + 4*y)*z*(1 + z))/2.;
143  output.access(5, 2) = (y*(-1 + 2*y)*(1 + 2*z))/2.;
144 
145  output.access(6, 0) = -2*(-1 + 2*x + y)*(-1 + z)*z;
146  output.access(6, 1) = -2*x*(-1 + z)*z;
147  output.access(6, 2) = 2*x*(-1 + x + y)*(1 - 2*z);
148 
149  output.access(7, 0) = 2*y*(-1 + z)*z;
150  output.access(7, 1) = 2*x*(-1 + z)*z;
151  output.access(7, 2) = 2*x*y*(-1 + 2*z);
152 
153  output.access(8, 0) = -2*y*(-1 + z)*z;
154  output.access(8, 1) = -2*(-1 + x + 2*y)*(-1 + z)*z;
155  output.access(8, 2) = 2*y*(-1 + x + y)*(1 - 2*z);
156 
157  output.access(9, 0) = -(-3 + 4*x + 4*y)*(-1 + z*z);
158  output.access(9, 1) = -(-3 + 4*x + 4*y)*(-1 + z*z);
159  output.access(9, 2) = -2*(1 + 2*x*x - 3*y + 2*y*y + x*(-3 + 4*y))*z;
160 
161  output.access(10, 0) = -(-1 + 4*x)*(-1 + z*z);
162  output.access(10, 1) = 0;
163  output.access(10, 2) = 2*(1 - 2*x)*x*z;
164 
165  output.access(11, 0) = 0;
166  output.access(11, 1) = -(-1 + 4*y)*(-1 + z*z);
167  output.access(11, 2) = 2*(1 - 2*y)*y*z;
168 
169  output.access(12, 0) = -2*(-1 + 2*x + y)*z*(1 + z);
170  output.access(12, 1) = -2*x*z*(1 + z);
171  output.access(12, 2) = -2*x*(-1 + x + y)*(1 + 2*z);
172 
173  output.access(13, 0) = 2*y*z*(1 + z);
174  output.access(13, 1) = 2*x*z*(1 + z);
175  output.access(13, 2) = 2*x*y*(1 + 2*z);
176 
177  output.access(14, 0) = -2*y*z*(1 + z);
178  output.access(14, 1) = -2*(-1 + x + 2*y)*z*(1 + z);
179  output.access(14, 2) = -2*y*(-1 + x + y)*(1 + 2*z);
180 
181 
182  output.access(15, 0) = 4*(-1 + 2*x + y)*(-1 + z*z);
183  output.access(15, 1) = 4*x*(-1 + z)*(1 + z);
184  output.access(15, 2) = 8*x*(-1 + x + y)*z;
185 
186  output.access(16, 0) = -4*y*(-1 + z)*(1 + z);
187  output.access(16, 1) = -4*x*(-1 + z)*(1 + z);
188  output.access(16, 2) = -8*x*y*z;
189 
190  output.access(17, 0) = 4*y*(-1 + z)*(1 + z);
191  output.access(17, 1) = 4*(-1 + x + 2*y)*(-1 + z*z);
192  output.access(17, 2) = 8*y*(-1 + x + y)*z;
193  } else {
194  const auto w = 1.0 - x - y;
195 
196  output.access(0, 0) = -(2.0*w - 1.0 - 0.5*z)*(1.0 - z);
197  output.access(0, 1) = -(2.0*w - 1.0 - 0.5*z)*(1.0 - z);
198  output.access(0, 2) = -0.5*w*(2.0*w - 1.0 - 2.0*z);
199 
200  output.access(1, 0) = (2.0*x - 1.0 - 0.5*z)*(1.0 - z);
201  output.access(1, 1) = 0.0;
202  output.access(1, 2) = -0.5*x*(2.0*x - 1.0 - 2.0*z);
203 
204  output.access(2, 0) = 0.0;
205  output.access(2, 1) = (2.0*y - 1.0 - 0.5*z)*(1.0 - z);
206  output.access(2, 2) = -0.5*y*(2.0*y - 1.0 - 2.0*z);
207 
208  output.access(3, 0) = -(2.0*w - 1.0 + 0.5*z)*(1.0 + z);
209  output.access(3, 1) = -(2.0*w - 1.0 + 0.5*z)*(1.0 + z);
210  output.access(3, 2) = 0.5*w*(2.0*w - 1.0 + 2.0*z);
211 
212  output.access(4, 0) = (2.0*x - 1.0 + 0.5*z)*(1.0 + z);
213  output.access(4, 1) = 0.0;
214  output.access(4, 2) = 0.5*x*(2.0*x - 1.0 + 2.0*z);
215 
216  output.access(5, 0) = 0.0;
217  output.access(5, 1) = (2.0*y - 1.0 + 0.5*z)*(1.0 + z);
218  output.access(5, 2) = 0.5*y*(2.0*y - 1.0 + 2.0*z);
219 
220  output.access(6, 0) = 2.0*(w - x)*(1.0 - z);
221  output.access(6, 1) = -2.0*x*(1.0 - z);
222  output.access(6, 2) = -2.0*x*w;
223 
224  output.access(7, 0) = 2.0*y*(1.0 - z);
225  output.access(7, 1) = 2.0*x*(1.0 - z);
226  output.access(7, 2) = -2.0*x*y;
227 
228  output.access(8, 0) = -2.0*y*(1.0 - z);
229  output.access(8, 1) = 2.0*(w - y)*(1.0 - z);
230  output.access(8, 2) = -2.0*w*y;
231 
232  output.access(9, 0) = -(1.0 - z*z);
233  output.access(9, 1) = -(1.0 - z*z);
234  output.access(9, 2) = -2.0*z*w;
235 
236  output.access(10,0) = (1.0 - z*z);
237  output.access(10,1) = 0.0;
238  output.access(10,2) = -2.0*z*x;
239 
240  output.access(11,0) = 0.0;
241  output.access(11,1) = (1.0 - z*z);
242  output.access(11,2) = -2.0*z*y;
243 
244  output.access(12,0) = 2.0*(w - x)*(1.0 + z);
245  output.access(12,1) = -2.0*x*(1.0 + z);
246  output.access(12,2) = 2.0*x*w;
247 
248  output.access(13,0) = 2.0*y*(1.0 + z);
249  output.access(13,1) = 2.0*x*(1.0 + z);
250  output.access(13,2) = 2.0*x*y;
251 
252  output.access(14,0) = -2.0*y*(1.0 + z);
253  output.access(14,1) = 2.0*(w - y)*(1.0 + z);
254  output.access(14,2) = 2.0*w*y;
255  }
256  break;
257  }
258  case OPERATOR_D2: {
259  const auto x = input(0);
260  const auto y = input(1);
261  const auto z = input(2);
262 
263  if constexpr (!serendipity) {
264  output.access(0, 0) = 2.*(-1. + z)*z;
265  output.access(0, 1) = 2.*(-1. + z)*z;
266  output.access(0, 2) = ((-3. + 4.*x + 4.*y)*(-1. + 2.*z))/2.;
267  output.access(0, 3) = 2.*(-1. + z)*z;
268  output.access(0, 4) = ((-3. + 4.*x + 4.*y)*(-1. + 2.*z))/2.;
269  output.access(0, 5) = (-1. + x + y)*(-1. + 2.*x + 2.*y);
270 
271  output.access(1, 0) = 2.*(-1. + z)*z;
272  output.access(1, 1) = 0.;
273  output.access(1, 2) = ((-1. + 4.*x)*(-1. + 2.*z))/2.;
274  output.access(1, 3) = 0.;
275  output.access(1, 4) = 0.;
276  output.access(1, 5) = x*(-1. + 2.*x);
277 
278  output.access(2, 0) = 0.;
279  output.access(2, 1) = 0.;
280  output.access(2, 2) = 0.;
281  output.access(2, 3) = 2.*(-1. + z)*z;
282  output.access(2, 4) = ((-1. + 4.*y)*(-1. + 2.*z))/2.;
283  output.access(2, 5) = y*(-1. + 2.*y);
284 
285  output.access(3, 0) = 2.*z*(1. + z);
286  output.access(3, 1) = 2.*z*(1. + z);
287  output.access(3, 2) = ((-3. + 4.*x + 4.*y)*(1. + 2.*z))/2.;
288  output.access(3, 3) = 2.*z*(1. + z);
289  output.access(3, 4) = ((-3. + 4.*x + 4.*y)*(1. + 2.*z))/2.;
290  output.access(3, 5) = (-1. + x + y)*(-1. + 2.*x + 2.*y);
291 
292  output.access(4, 0) = 2.*z*(1. + z);
293  output.access(4, 1) = 0.;
294  output.access(4, 2) = ((-1. + 4.*x)*(1. + 2.*z))/2.;
295  output.access(4, 3) = 0.;
296  output.access(4, 4) = 0.;
297  output.access(4, 5) = x*(-1. + 2.*x);
298 
299  output.access(5, 0) = 0.;
300  output.access(5, 1) = 0.;
301  output.access(5, 2) = 0.;
302  output.access(5, 3) = 2.*z*(1. + z);
303  output.access(5, 4) = ((-1. + 4.*y)*(1. + 2.*z))/2.;
304  output.access(5, 5) = y*(-1. + 2.*y);
305 
306  output.access(6, 0) = -4.*(-1. + z)*z;
307  output.access(6, 1) = -2.*(-1. + z)*z;
308  output.access(6, 2) = -2.*(-1. + 2.*x + y)*(-1. + 2.*z);
309  output.access(6, 3) = 0.;
310  output.access(6, 4) = x*(2. - 4.*z);
311  output.access(6, 5) = -4.*x*(-1. + x + y);
312 
313  output.access(7, 0) = 0.;
314  output.access(7, 1) = 2.*(-1. + z)*z;
315  output.access(7, 2) = 2.*y*(-1. + 2.*z);
316  output.access(7, 3) = 0.;
317  output.access(7, 4) = 2.*x*(-1. + 2.*z);
318  output.access(7, 5) = 4.*x*y;
319 
320  output.access(8, 0) = 0.;
321  output.access(8, 1) = -2.*(-1. + z)*z;
322  output.access(8, 2) = y*(2. - 4.*z);
323  output.access(8, 3) = -4.*(-1. + z)*z;
324  output.access(8, 4) = -2.*(-1. + x + 2.*y)*(-1. + 2.*z);
325  output.access(8, 5) = -4.*y*(-1. + x + y);
326 
327  output.access(9, 0) = 4. - 4.*z*z;
328  output.access(9, 1) = 4. - 4.*z*z;
329  output.access(9, 2) = -2.*(-3. + 4.*x + 4.*y)*z;
330  output.access(9, 3) = 4. - 4.*z*z;
331  output.access(9, 4) = -2.*(-3. + 4.*x + 4.*y)*z;
332  output.access(9, 5) = -2.*(-1. + x + y)*(-1. + 2.*x + 2.*y);
333 
334  output.access(10, 0) = 4. - 4.*z*z;
335  output.access(10, 1) = 0.;
336  output.access(10, 2) = (2. - 8.*x)*z;
337  output.access(10, 3) = 0.;
338  output.access(10, 4) = 0.;
339  output.access(10, 5) = -2.*x*(-1. + 2.*x);
340 
341  output.access(11, 0) = 0.;
342  output.access(11, 1) = 0.;
343  output.access(11, 2) = 0.;
344  output.access(11, 3) = 4. - 4.*z*z;
345  output.access(11, 4) = (2. - 8.*y)*z;
346  output.access(11, 5) = -2.*y*(-1. + 2.*y);
347 
348  output.access(12, 0) = -4.*z*(1. + z);
349  output.access(12, 1) = -2.*z*(1. + z);
350  output.access(12, 2) = -2.*(-1. + 2.*x + y)*(1. + 2.*z);
351  output.access(12, 3) = 0.;
352  output.access(12, 4) = -2.*(x + 2.*x*z);
353  output.access(12, 5) = -4.*x*(-1. + x + y);
354 
355  output.access(13, 0) = 0.;
356  output.access(13, 1) = 2.*z*(1. + z);
357  output.access(13, 2) = 2.*(y + 2.*y*z);
358  output.access(13, 3) = 0.;
359  output.access(13, 4) = 2.*(x + 2.*x*z);
360  output.access(13, 5) = 4.*x*y;
361 
362  output.access(14, 0) = 0.;
363  output.access(14, 1) = -2.*z*(1. + z);
364  output.access(14, 2) = -2.*(y + 2.*y*z);
365  output.access(14, 3) = -4.*z*(1. + z);
366  output.access(14, 4) = -2.*(-1. + x + 2.*y)*(1. + 2.*z);
367  output.access(14, 5) = -4.*y*(-1. + x + y);
368 
369  output.access(15, 0) = 8.*(-1. + z*z);
370  output.access(15, 1) = 4.*(-1. + z*z);
371  output.access(15, 2) = 8.*(-1. + 2.*x + y)*z;
372  output.access(15, 3) = 0.;
373  output.access(15, 4) = 8.*x*z;
374  output.access(15, 5) = 8.*x*(-1. + x + y);
375 
376  output.access(16, 0) = 0.;
377  output.access(16, 1) = 4. - 4.*z*z;
378  output.access(16, 2) = -8.*y*z;
379  output.access(16, 3) = 0.;
380  output.access(16, 4) = -8.*x*z;
381  output.access(16, 5) = -8.*x*y;
382 
383  output.access(17, 0) = 0.;
384  output.access(17, 1) = 4.*(-1. + z*z);
385  output.access(17, 2) = 8.*y*z;
386  output.access(17, 3) = 8.*(-1. + z*z);
387  output.access(17, 4) = 8.*(-1. + x + 2.*y)*z;
388  output.access(17, 5) = 8.*y*(-1. + x + y);
389 
390  } else { //serendipity element
391 
392  const auto w = 1.0 - x - y;
393  output.access(0, 0) = 2.0*(1.0 - z);
394  output.access(0, 1) = 2.0*(1.0 - z);
395  output.access(0, 2) = 2.0*w - 0.5 - z;
396  output.access(0, 3) = 2.0*(1.0-z);
397  output.access(0, 4) = 2.0*w -0.5 - z;
398  output.access(0, 5) = w;
399 
400  output.access(1, 0) = 2.0*(1.0 - z);
401  output.access(1, 1) = 0.;
402  output.access(1, 2) = -2.0*x + 0.5 + z;
403  output.access(1, 3) = 0.;
404  output.access(1, 4) = 0.;
405  output.access(1, 5) = x;
406 
407  output.access(2, 0) = 0.;
408  output.access(2, 1) = 0.;
409  output.access(2, 2) = 0.;
410  output.access(2, 3) = 2.0*(1.0 - z);
411  output.access(2, 4) = -2.0*y + 0.5 + z;
412  output.access(2, 5) = y;
413 
414  output.access(3, 0) = 2.0*(1.0 + z);
415  output.access(3, 1) = 2.0*(1.0 + z);
416  output.access(3, 2) = -2.0*w + 0.5 - z;
417  output.access(3, 3) = 2.0*(1.0 + z);
418  output.access(3, 4) = -2.0*w + 0.5 - z;
419  output.access(3, 5) = w;
420 
421  output.access(4, 0) = 2.0*(1.0 + z);
422  output.access(4, 1) = 0.;
423  output.access(4, 2) = 2.0*x - 0.5 + z;
424  output.access(4, 3) = 0.;
425  output.access(4, 4) = 0.;
426  output.access(4, 5) = x;
427 
428  output.access(5, 0) = 0.;
429  output.access(5, 1) = 0.;
430  output.access(5, 2) = 0.;
431  output.access(5, 3) = 2.0*(1.0 + z);
432  output.access(5, 4) = 2.0*y - 0.5 + z;
433  output.access(5, 5) = y;
434 
435  output.access(6, 0) = -4.0*(1.0 - z);
436  output.access(6, 1) = -2.0*(1.0 - z);
437  output.access(6, 2) = -2.0*(w - x);
438  output.access(6, 3) = 0.;
439  output.access(6, 4) = 2.0*x;
440  output.access(6, 5) = 0.;
441 
442  output.access(7, 0) = 0.;
443  output.access(7, 1) = 2.0*(1.0 - z);
444  output.access(7, 2) = -2.0*y;
445  output.access(7, 3) = 0.;
446  output.access(7, 4) = -2.0*x;
447  output.access(7, 5) = 0.;
448 
449  output.access(8, 0) = 0.;
450  output.access(8, 1) = -2.0*(1.0 - z);
451  output.access(8, 2) = 2.0*y;
452  output.access(8, 3) = -4.0*(1.0 - z);
453  output.access(8, 4) = -2.0*(w - y);
454  output.access(8, 5) = 0.;
455 
456  output.access(9, 0) = 0.;
457  output.access(9, 1) = 0.;
458  output.access(9, 2) = 2.0*z;
459  output.access(9, 3) = 0.;
460  output.access(9, 4) = 2.0*z;
461  output.access(9, 5) = -2.0*w;
462 
463  output.access(10,0) = 0.;
464  output.access(10,1) = 0.;
465  output.access(10,2) = -2.0*z;
466  output.access(10,3) = 0.;
467  output.access(10,4) = 0.;
468  output.access(10,5) = -2.0*x;
469 
470  output.access(11,0) = 0.;
471  output.access(11,1) = 0.;
472  output.access(11,2) = 0.;
473  output.access(11,3) = 0.;
474  output.access(11,4) = -2.0*z;
475  output.access(11,5) = -2.0*y;
476 
477  output.access(12,0) = -4.0*(1.0 + z);
478  output.access(12,1) = -2.0*(1.0 + z);
479  output.access(12,2) = 2.0*(w - x);
480  output.access(12,3) = 0.;
481  output.access(12,4) = -2.0*x;
482  output.access(12,5) = 0.;
483 
484  output.access(13,0) = 0.;
485  output.access(13,1) = 2.0*(1.0 + z);
486  output.access(13,2) = 2.0*y;
487  output.access(13,3) = 0.;
488  output.access(13,4) = 2.0*x;
489  output.access(13,5) = 0.;
490 
491  output.access(14,0) = 0.;
492  output.access(14,1) = -2.0*(1.0 + z);
493  output.access(14,2) = -2.0*y;
494  output.access(14,3) = -4.0*(1.0 + z);
495  output.access(14,4) = 2.0*(w - y);
496  output.access(14,5) = 0.;
497  }
498  break;
499  }
500  case OPERATOR_D3: {
501  if constexpr (!serendipity) {
502  const auto x = input(0);
503  const auto y = input(1);
504  const auto z = input(2);
505 
506  output.access(0, 0) = 0.;
507  output.access(0, 1) = 0.;
508  output.access(0, 2) = -2. + 4.*z;
509  output.access(0, 3) = 0.;
510  output.access(0, 4) = -2. + 4.*z;
511  output.access(0, 5) = -3. + 4.*x + 4.*y;
512  output.access(0, 6) = 0.;
513  output.access(0, 7) = -2. + 4.*z;
514  output.access(0, 8) = -3. + 4.*x + 4.*y;
515  output.access(0, 9) = 0.;
516 
517  output.access(1, 0) = 0.;
518  output.access(1, 1) = 0.;
519  output.access(1, 2) = -2. + 4.*z;
520  output.access(1, 3) = 0.;
521  output.access(1, 4) = 0.;
522  output.access(1, 5) = -1 + 4.*x;
523  output.access(1, 6) = 0.;
524  output.access(1, 7) = 0.;
525  output.access(1, 8) = 0.;
526  output.access(1, 9) = 0.;
527 
528  output.access(2, 0) = 0.;
529  output.access(2, 1) = 0.;
530  output.access(2, 2) = 0.;
531  output.access(2, 3) = 0.;
532  output.access(2, 4) = 0.;
533  output.access(2, 5) = 0.;
534  output.access(2, 6) = 0.;
535  output.access(2, 7) = -2. + 4.*z;
536  output.access(2, 8) = -1 + 4.*y;
537  output.access(2, 9) = 0.;
538 
539  output.access(3, 0) = 0.;
540  output.access(3, 1) = 0.;
541  output.access(3, 2) = 2. + 4.*z;
542  output.access(3, 3) = 0.;
543  output.access(3, 4) = 2. + 4.*z;
544  output.access(3, 5) = -3. + 4.*x + 4.*y;
545  output.access(3, 6) = 0.;
546  output.access(3, 7) = 2. + 4.*z;
547  output.access(3, 8) = -3. + 4.*x + 4.*y;
548  output.access(3, 9) = 0.;
549 
550  output.access(4, 0) = 0.;
551  output.access(4, 1) = 0.;
552  output.access(4, 2) = 2. + 4.*z;
553  output.access(4, 3) = 0.;
554  output.access(4, 4) = 0.;
555  output.access(4, 5) = -1 + 4.*x;
556  output.access(4, 6) = 0.;
557  output.access(4, 7) = 0.;
558  output.access(4, 8) = 0.;
559  output.access(4, 9) = 0.;
560 
561  output.access(5, 0) = 0.;
562  output.access(5, 1) = 0.;
563  output.access(5, 2) = 0.;
564  output.access(5, 3) = 0.;
565  output.access(5, 4) = 0.;
566  output.access(5, 5) = 0.;
567  output.access(5, 6) = 0.;
568  output.access(5, 7) = 2. + 4.*z;
569  output.access(5, 8) = -1 + 4.*y;
570  output.access(5, 9) = 0.;
571 
572  output.access(6, 0) = 0.;
573  output.access(6, 1) = 0.;
574  output.access(6, 2) = 4. - 8.*z;
575  output.access(6, 3) = 0.;
576  output.access(6, 4) = 2. - 4.*z;
577  output.access(6, 5) = -4.*(-1 + 2*x + y);
578  output.access(6, 6) = 0.;
579  output.access(6, 7) = 0.;
580  output.access(6, 8) = -4.*x;
581  output.access(6, 9) = 0.;
582 
583  output.access(7, 0) = 0.;
584  output.access(7, 1) = 0.;
585  output.access(7, 2) = 0.;
586  output.access(7, 3) = 0.;
587  output.access(7, 4) = -2. + 4.*z;
588  output.access(7, 5) = 4.*y;
589  output.access(7, 6) = 0.;
590  output.access(7, 7) = 0.;
591  output.access(7, 8) = 4.*x;
592  output.access(7, 9) = 0.;
593 
594  output.access(8, 0) = 0.;
595  output.access(8, 1) = 0.;
596  output.access(8, 2) = 0.;
597  output.access(8, 3) = 0.;
598  output.access(8, 4) = 2. - 4.*z;
599  output.access(8, 5) = -4.*y;
600  output.access(8, 6) = 0.;
601  output.access(8, 7) = 4. - 8.*z;
602  output.access(8, 8) = -4.*(-1 + x + 2*y);
603  output.access(8, 9) = 0.;
604 
605  output.access(9, 0) = 0.;
606  output.access(9, 1) = 0.;
607  output.access(9, 2) = -8.*z;
608  output.access(9, 3) = 0.;
609  output.access(9, 4) = -8.*z;
610  output.access(9, 5) = 6. - 8.*x - 8.*y;
611  output.access(9, 6) = 0.;
612  output.access(9, 7) = -8.*z;
613  output.access(9, 8) = 6. - 8.*x - 8.*y;
614  output.access(9, 9) = 0.;
615 
616  output.access(10, 0) = 0.;
617  output.access(10, 1) = 0.;
618  output.access(10, 2) = -8.*z;
619  output.access(10, 3) = 0.;
620  output.access(10, 4) = 0.;
621  output.access(10, 5) = 2. - 8.*x;
622  output.access(10, 6) = 0.;
623  output.access(10, 7) = 0.;
624  output.access(10, 8) = 0.;
625  output.access(10, 9) = 0.;
626 
627  output.access(11, 0) = 0.;
628  output.access(11, 1) = 0.;
629  output.access(11, 2) = 0.;
630  output.access(11, 3) = 0.;
631  output.access(11, 4) = 0.;
632  output.access(11, 5) = 0.;
633  output.access(11, 6) = 0.;
634  output.access(11, 7) = -8.*z;
635  output.access(11, 8) = 2. - 8.*y;
636  output.access(11, 9) = 0.;
637 
638  output.access(12, 0) = 0.;
639  output.access(12, 1) = 0.;
640  output.access(12, 2) = -4. - 8.*z;
641  output.access(12, 3) = 0.;
642  output.access(12, 4) = -2. - 4.*z;
643  output.access(12, 5) = -4.*(-1 + 2*x + y);
644  output.access(12, 6) = 0.;
645  output.access(12, 7) = 0.;
646  output.access(12, 8) = -4.*x;
647  output.access(12, 9) = 0.;
648 
649  output.access(13, 0) = 0.;
650  output.access(13, 1) = 0.;
651  output.access(13, 2) = 0.;
652  output.access(13, 3) = 0.;
653  output.access(13, 4) = 2. + 4.*z;
654  output.access(13, 5) = 4.*y;
655  output.access(13, 6) = 0.;
656  output.access(13, 7) = 0.;
657  output.access(13, 8) = 4.*x;
658  output.access(13, 9) = 0.;
659 
660  output.access(14, 0) = 0.;
661  output.access(14, 1) = 0.;
662  output.access(14, 2) = 0.;
663  output.access(14, 3) = 0.;
664  output.access(14, 4) = -2. - 4.*z;
665  output.access(14, 5) = -4.*y;
666  output.access(14, 6) = 0.;
667  output.access(14, 7) = -4. - 8.*z;
668  output.access(14, 8) = -4.*(-1 + x + 2*y);
669  output.access(14, 9) = 0.;
670 
671  output.access(15, 0) = 0.;
672  output.access(15, 1) = 0.;
673  output.access(15, 2) = 16.*z;
674  output.access(15, 3) = 0.;
675  output.access(15, 4) = 8.*z;
676  output.access(15, 5) = 8.*(-1 + 2*x + y);
677  output.access(15, 6) = 0.;
678  output.access(15, 7) = 0.;
679  output.access(15, 8) = 8.*x;
680  output.access(15, 9) = 0.;
681 
682  output.access(16, 0) = 0.;
683  output.access(16, 1) = 0.;
684  output.access(16, 2) = 0.;
685  output.access(16, 3) = 0.;
686  output.access(16, 4) = -8.*z;
687  output.access(16, 5) = -8.*y;
688  output.access(16, 6) = 0.;
689  output.access(16, 7) = 0.;
690  output.access(16, 8) = -8.*x;
691  output.access(16, 9) = 0.;
692 
693  output.access(17, 0) = 0.;
694  output.access(17, 1) = 0.;
695  output.access(17, 2) = 0.;
696  output.access(17, 3) = 0.;
697  output.access(17, 4) = 8.*z;
698  output.access(17, 5) = 8.*y;
699  output.access(17, 6) = 0.;
700  output.access(17, 7) = 16.*z;
701  output.access(17, 8) = 8.*(-1 + x + 2*y);
702  output.access(17, 9) = 0.;
703 
704  } else { //serendipity
705 
706  output.access(0, 0) = 0.0;
707  output.access(0, 1) = 0.0;
708  output.access(0, 2) = -2.0;
709  output.access(0, 3) = 0.0;
710  output.access(0, 4) = -2.0;
711  output.access(0, 5) = -1.0;
712  output.access(0, 6) = 0.0;
713  output.access(0, 7) = -2.0;
714  output.access(0, 8) = -1.0;
715  output.access(0, 9) = 0.0;
716 
717  output.access(1, 0) = 0.0;
718  output.access(1, 1) = 0.0;
719  output.access(1, 2) = -2.0;
720  output.access(1, 3) = 0.0;
721  output.access(1, 4) = 0.0;
722  output.access(1, 5) = -1.0;
723  output.access(1, 6) = 0.0;
724  output.access(1, 7) = 0.0;
725  output.access(1, 8) = 0.0;
726  output.access(1, 9) = 0.0;
727 
728  output.access(2, 0) = 0.0;
729  output.access(2, 1) = 0.0;
730  output.access(2, 2) = 0.0;
731  output.access(2, 3) = 0.0;
732  output.access(2, 4) = 0.0;
733  output.access(2, 5) = 0.0;
734  output.access(2, 6) = 0.0;
735  output.access(2, 7) = -2.0;
736  output.access(2, 8) = -1.0;
737  output.access(2, 9) = 0.0;
738 
739  output.access(3, 0) = 0.0;
740  output.access(3, 1) = 0.0;
741  output.access(3, 2) = 2.0;
742  output.access(3, 3) = 0.0;
743  output.access(3, 4) = 2.0;
744  output.access(3, 5) = -1.0;
745  output.access(3, 6) = 0.0;
746  output.access(3, 7) = 2.0;
747  output.access(3, 8) = -1.0;
748  output.access(3, 9) = 0.0;
749 
750  output.access(4, 0) = 0.0;
751  output.access(4, 1) = 0.0;
752  output.access(4, 2) = 2.0;
753  output.access(4, 3) = 0.0;
754  output.access(4, 4) = 0.0;
755  output.access(4, 5) = 1.0;
756  output.access(4, 6) = 0.0;
757  output.access(4, 7) = 0.0;
758  output.access(4, 8) = 0.0;
759  output.access(4, 9) = 0.0;
760 
761  output.access(5, 0) = 0.0;
762  output.access(5, 1) = 0.0;
763  output.access(5, 2) = 0.0;
764  output.access(5, 3) = 0.0;
765  output.access(5, 4) = 0.0;
766  output.access(5, 5) = 0.0;
767  output.access(5, 6) = 0.0;
768  output.access(5, 7) = 2.0;
769  output.access(5, 8) = 1.0;
770  output.access(5, 9) = 0.0;
771 
772  output.access(6, 0) = 0.0;
773  output.access(6, 1) = 0.0;
774  output.access(6, 2) = 4.0;
775  output.access(6, 3) = 0.0;
776  output.access(6, 4) = 2.0;
777  output.access(6, 5) = 0.0;
778  output.access(6, 6) = 0.0;
779  output.access(6, 7) = 0.0;
780  output.access(6, 8) = 0.0;
781  output.access(6, 9) = 0.0;
782 
783  output.access(7, 0) = 0.0;
784  output.access(7, 1) = 0.0;
785  output.access(7, 2) = 0.0;
786  output.access(7, 3) = 0.0;
787  output.access(7, 4) = -2.0;
788  output.access(7, 5) = 0.0;
789  output.access(7, 6) = 0.0;
790  output.access(7, 7) = 0.0;
791  output.access(7, 8) = 0.0;
792  output.access(7, 9) = 0.0;
793 
794  output.access(8, 0) = 0.0;
795  output.access(8, 1) = 0.0;
796  output.access(8, 2) = 0.0;
797  output.access(8, 3) = 0.0;
798  output.access(8, 4) = 2.0;
799  output.access(8, 5) = 0.0;
800  output.access(8, 6) = 0.0;
801  output.access(8, 7) = 4.0;
802  output.access(8, 8) = 0.0;
803  output.access(8, 9) = 0.0;
804 
805  output.access(9, 0) = 0.0;
806  output.access(9, 1) = 0.0;
807  output.access(9, 2) = 0.0;
808  output.access(9, 3) = 0.0;
809  output.access(9, 4) = 0.0;
810  output.access(9, 5) = 2.0;
811  output.access(9, 6) = 0.0;
812  output.access(9, 7) = 0.0;
813  output.access(9, 8) = 2.0;
814  output.access(9, 9) = 0.0;
815 
816  output.access(10,0) = 0.0;
817  output.access(10,1) = 0.0;
818  output.access(10,2) = 0.0;
819  output.access(10,3) = 0.0;
820  output.access(10,4) = 0.0;
821  output.access(10,5) = -2.0;
822  output.access(10,6) = 0.0;
823  output.access(10,7) = 0.0;
824  output.access(10,8) = 0.0;
825  output.access(10,9) = 0.0;
826 
827  output.access(11,0) = 0.0;
828  output.access(11,1) = 0.0;
829  output.access(11,2) = 0.0;
830  output.access(11,3) = 0.0;
831  output.access(11,4) = 0.0;
832  output.access(11,5) = 0.0;
833  output.access(11,6) = 0.0;
834  output.access(11,7) = 0.0;
835  output.access(11,8) = -2.0;
836  output.access(11,9) = 0.0;
837 
838  output.access(12,0) = 0.0;
839  output.access(12,1) = 0.0;
840  output.access(12,2) = -4.0;
841  output.access(12,3) = 0.0;
842  output.access(12,4) = -2.0;
843  output.access(12,5) = 0.0;
844  output.access(12,6) = 0.0;
845  output.access(12,7) = 0.0;
846  output.access(12,8) = 0.0;
847  output.access(12,9) = 0.0;
848 
849  output.access(13,0) = 0.0;
850  output.access(13,1) = 0.0;
851  output.access(13,2) = 0.0;
852  output.access(13,3) = 0.0;
853  output.access(13,4) = 2.0;
854  output.access(13,5) = 0.0;
855  output.access(13,6) = 0.0;
856  output.access(13,7) = 0.0;
857  output.access(13,8) = 0.0;
858  output.access(13,9) = 0.0;
859 
860  output.access(14,0) = 0.0;
861  output.access(14,1) = 0.0;
862  output.access(14,2) = 0.0;
863  output.access(14,3) = 0.0;
864  output.access(14,4) = -2.0;
865  output.access(14,5) = 0.0;
866  output.access(14,6) = 0.0;
867  output.access(14,7) = -4.0;
868  output.access(14,8) = 0.0;
869  output.access(14,9) = 0.0;
870  }
871  break;
872  }
873  case OPERATOR_D4: {
874  const ordinal_type jend = output.extent(1);
875  const ordinal_type iend = output.extent(0);
876 
877  for (ordinal_type j=0;j<jend;++j)
878  for (ordinal_type i=0;i<iend;++i)
879  output.access(i, j) = 0.0;
880 
881  if constexpr (!serendipity) {
882 
883  output.access(0, 5) = 4.;
884  output.access(0, 8) = 4.;
885  output.access(0,12) = 4.;
886 
887  output.access(1, 5) = 4.;
888 
889  output.access(2,12) = 4.;
890 
891  output.access(3, 5) = 4.;
892  output.access(3, 8) = 4.;
893  output.access(3,12) = 4.;
894 
895  output.access(4, 5) = 4.0;
896 
897  output.access(5,12) = 4.0;
898 
899  output.access(6, 5) =-8.;
900  output.access(6, 8) =-4.;
901 
902  output.access(7, 8) = 4.;
903 
904  output.access(8, 8) =-4.;
905  output.access(8,12) =-8.;
906 
907  output.access(9, 5) =-8.;
908  output.access(9, 8) =-8.;
909  output.access(9,12) =-8.;
910 
911  output.access(10, 5) =-8.;
912 
913  output.access(11,12) =-8.;
914 
915  output.access(12, 5) =-8.;
916  output.access(12, 8) =-4.;
917 
918  output.access(13, 8) = 4.;
919 
920  output.access(14, 8) =-4;
921  output.access(14,12) =-8.;
922 
923  output.access(15, 5) =16.;
924  output.access(15, 8) = 8.;
925 
926  output.access(16, 8) =-8.;
927 
928  output.access(17, 8) = 8.;
929  output.access(17,12) =16.;
930  }
931  break;
932  }
933  case OPERATOR_MAX : {
934  const ordinal_type jend = output.extent(1);
935  const ordinal_type iend = output.extent(0);
936 
937  for (ordinal_type j=0;j<jend;++j)
938  for (ordinal_type i=0;i<iend;++i)
939  output.access(i, j) = 0.0;
940  break;
941  }
942 
943  default: {
944  INTREPID2_TEST_FOR_ABORT( opType != OPERATOR_VALUE &&
945  opType != OPERATOR_GRAD &&
946  opType != OPERATOR_D2 &&
947  opType != OPERATOR_D3 &&
948  opType != OPERATOR_D4 &&
949  opType != OPERATOR_MAX,
950  ">>> ERROR: (Intrepid2::Basis_HGRAD_WEDGE_DEG2_FEM::Serial::getValues) operator is not supported");
951  }
952  }
953  }
954 
955  template<bool serendipity>
956  template<typename DT,
957  typename outputValueValueType, class ...outputValueProperties,
958  typename inputPointValueType, class ...inputPointProperties>
959  void
960  Basis_HGRAD_WEDGE_DEG2_FEM<serendipity>::
961  getValues( Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValues,
962  const Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPoints,
963  const EOperator operatorType ) {
964  typedef Kokkos::DynRankView<outputValueValueType,outputValueProperties...> outputValueViewType;
965  typedef Kokkos::DynRankView<inputPointValueType, inputPointProperties...> inputPointViewType;
966  typedef typename ExecSpace<typename inputPointViewType::execution_space,typename DT::execution_space>::ExecSpaceType ExecSpaceType;
967 
968  // Number of evaluation points = dim 0 of inputPoints
969  const auto loopSize = inputPoints.extent(0);
970  Kokkos::RangePolicy<ExecSpaceType,Kokkos::Schedule<Kokkos::Static> > policy(0, loopSize);
971 
972  switch (operatorType) {
973 
974  case OPERATOR_VALUE: {
975  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_VALUE> FunctorType;
976  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
977  break;
978  }
979  case OPERATOR_GRAD:
980  case OPERATOR_D1: {
981  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_GRAD> FunctorType;
982  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
983  break;
984  }
985  case OPERATOR_CURL: {
986  INTREPID2_TEST_FOR_EXCEPTION( operatorType == OPERATOR_CURL, std::invalid_argument,
987  ">>> ERROR (Basis_HGRAD_WEDGE_DEG2_FEM): CURL is invalid operator for rank-0 (scalar) functions in 3D");
988  break;
989  }
990  case OPERATOR_DIV: {
991  INTREPID2_TEST_FOR_EXCEPTION( (operatorType == OPERATOR_DIV), std::invalid_argument,
992  ">>> ERROR (Basis_HGRAD_WEDGE_DEG2_FEM): DIV is invalid operator for rank-0 (scalar) functions in 3D");
993  break;
994  }
995  case OPERATOR_D2: {
996  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D2> FunctorType;
997  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
998  break;
999  }
1000  case OPERATOR_D3: {
1001  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D3> FunctorType;
1002  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1003  break;
1004  }
1005  case OPERATOR_D4: {
1006  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D4> FunctorType;
1007  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1008  break;
1009  }
1010  case OPERATOR_D5:
1011  case OPERATOR_D6:
1012  case OPERATOR_D7:
1013  case OPERATOR_D8:
1014  case OPERATOR_D9:
1015  case OPERATOR_D10: {
1016  typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_MAX> FunctorType;
1017  Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1018  break;
1019  }
1020  default: {
1021  INTREPID2_TEST_FOR_EXCEPTION( !( Intrepid2::isValidOperator(operatorType) ), std::invalid_argument,
1022  ">>> ERROR (Basis_HGRAD_WEDGE_DEG2_FEM): Invalid operator type");
1023  }
1024  }
1025  }
1026 
1027  }
1028 
1029  // -------------------------------------------------------------------------------------
1030 
1031  template<bool serendipity, typename DT, typename OT, typename PT>
1034  this->basisCardinality_ = serendipity ? 15 : 18;
1035  this->basisDegree_ = 2;
1036  this->basisCellTopology_ = shards::CellTopology(shards::getCellTopologyData<shards::Wedge<6> >() );
1037  this->basisType_ = BASIS_FEM_DEFAULT;
1038  this->basisCoordinates_ = COORDINATES_CARTESIAN;
1039  this->functionSpace_ = FUNCTION_SPACE_HGRAD;
1040 
1041  // initialize tags
1042  {
1043  // Basis-dependent intializations
1044  const ordinal_type tagSize = 4; // size of DoF tag
1045  const ordinal_type posScDim = 0; // position in the tag, counting from 0, of the subcell dim
1046  const ordinal_type posScOrd = 1; // position in the tag, counting from 0, of the subcell ordinal
1047  const ordinal_type posDfOrd = 2; // position in the tag, counting from 0, of DoF ordinal relative to the subcell
1048 
1049  // An array with local DoF tags assigned to basis functions, in the order of their local enumeration
1050  ordinal_type tags[72] = { 0, 0, 0, 1,
1051  0, 1, 0, 1,
1052  0, 2, 0, 1,
1053  0, 3, 0, 1,
1054  0, 4, 0, 1,
1055  0, 5, 0, 1,
1056  1, 0, 0, 1,
1057  1, 1, 0, 1,
1058  1, 2, 0, 1,
1059  1, 6, 0, 1,
1060  1, 7, 0, 1,
1061  1, 8, 0, 1,
1062  1, 3, 0, 1,
1063  1, 4, 0, 1,
1064  1, 5, 0, 1,
1065  // following entries not used for serendipity elements
1066  2, 0, 0, 1,
1067  2, 1, 0, 1,
1068  2, 2, 0, 1
1069  };
1070 
1071  // host tags
1072  OrdinalTypeArray1DHost tagView(&tags[0], serendipity ? 60 : 72);
1073 
1074  // Basis-independent function sets tag and enum data in tagToOrdinal_ and ordinalToTag_ arrays:
1075  this->setOrdinalTagData(this->tagToOrdinal_,
1076  this->ordinalToTag_,
1077  tagView,
1078  this->basisCardinality_,
1079  tagSize,
1080  posScDim,
1081  posScOrd,
1082  posDfOrd);
1083  }
1084 
1085  // dofCoords on host and create its mirror view to device
1086  Kokkos::DynRankView<typename ScalarViewType::value_type,typename DT::execution_space::array_layout,Kokkos::HostSpace>
1087  dofCoords("dofCoordsHost", this->basisCardinality_,this->basisCellTopology_.getDimension());
1088 
1089  dofCoords(0,0) = 0.0; dofCoords(0,1) = 0.0; dofCoords(0,2) = -1.0;
1090  dofCoords(1,0) = 1.0; dofCoords(1,1) = 0.0; dofCoords(1,2) = -1.0;
1091  dofCoords(2,0) = 0.0; dofCoords(2,1) = 1.0; dofCoords(2,2) = -1.0;
1092  dofCoords(3,0) = 0.0; dofCoords(3,1) = 0.0; dofCoords(3,2) = 1.0;
1093  dofCoords(4,0) = 1.0; dofCoords(4,1) = 0.0; dofCoords(4,2) = 1.0;
1094  dofCoords(5,0) = 0.0; dofCoords(5,1) = 1.0; dofCoords(5,2) = 1.0;
1095 
1096  dofCoords(6,0) = 0.5; dofCoords(6,1) = 0.0; dofCoords(6,2) = -1.0;
1097  dofCoords(7,0) = 0.5; dofCoords(7,1) = 0.5; dofCoords(7,2) = -1.0;
1098  dofCoords(8,0) = 0.0; dofCoords(8,1) = 0.5; dofCoords(8,2) = -1.0;
1099  dofCoords(9,0) = 0.0; dofCoords(9,1) = 0.0; dofCoords(9,2) = 0.0;
1100  dofCoords(10,0)= 1.0; dofCoords(10,1)= 0.0; dofCoords(10,2)= 0.0;
1101  dofCoords(11,0)= 0.0; dofCoords(11,1)= 1.0; dofCoords(11,2)= 0.0;
1102 
1103  dofCoords(12,0)= 0.5; dofCoords(12,1)= 0.0; dofCoords(12,2)= 1.0;
1104  dofCoords(13,0)= 0.5; dofCoords(13,1)= 0.5; dofCoords(13,2)= 1.0;
1105  dofCoords(14,0)= 0.0; dofCoords(14,1)= 0.5; dofCoords(14,2)= 1.0;
1106 
1107  if constexpr (!serendipity) {
1108  dofCoords(15,0)= 0.5; dofCoords(15,1)= 0.0; dofCoords(15,2)= 0.0;
1109  dofCoords(16,0)= 0.5; dofCoords(16,1)= 0.5; dofCoords(16,2)= 0.0;
1110  dofCoords(17,0)= 0.0; dofCoords(17,1)= 0.5; dofCoords(17,2)= 0.0;
1111  }
1112 
1113  this->dofCoords_ = Kokkos::create_mirror_view(typename DT::memory_space(), dofCoords);
1114  Kokkos::deep_copy(this->dofCoords_, dofCoords);
1115  }
1116 
1117 }// namespace Intrepid2
1118 #endif