49 #ifndef __INTREPID2_HGRAD_WEDGE_C2_FEM_DEF_HPP__
50 #define __INTREPID2_HGRAD_WEDGE_C2_FEM_DEF_HPP__
57 template<
bool serendipity>
58 template<EOperator opType>
59 template<
typename OutputViewType,
60 typename inputViewType>
61 KOKKOS_INLINE_FUNCTION
63 Basis_HGRAD_WEDGE_DEG2_FEM<serendipity>::Serial<opType>::
64 getValues( OutputViewType output,
65 const inputViewType input ) {
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;
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.;
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);
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);
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);
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);
115 case OPERATOR_GRAD: {
116 const auto x = input(0);
117 const auto y = input(1);
118 const auto z = input(2);
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.;
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.;
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.;
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.;
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.;
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.;
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);
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);
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);
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;
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;
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;
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);
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);
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);
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;
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;
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;
194 const auto w = 1.0 - x - y;
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);
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);
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);
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);
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);
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);
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;
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;
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;
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;
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;
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;
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;
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;
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;
259 const auto x = input(0);
260 const auto y = input(1);
261 const auto z = input(2);
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);
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);
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);
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);
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);
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);
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);
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;
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);
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);
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);
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);
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);
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;
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);
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);
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;
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);
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;
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;
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;
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;
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;
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;
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.;
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.;
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.;
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;
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;
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;
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.;
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.;
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.;
501 if constexpr (!serendipity) {
502 const auto x = input(0);
503 const auto y = input(1);
504 const auto z = input(2);
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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.;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
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;
874 const ordinal_type jend = output.extent(1);
875 const ordinal_type iend = output.extent(0);
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;
881 if constexpr (!serendipity) {
883 output.access(0, 5) = 4.;
884 output.access(0, 8) = 4.;
885 output.access(0,12) = 4.;
887 output.access(1, 5) = 4.;
889 output.access(2,12) = 4.;
891 output.access(3, 5) = 4.;
892 output.access(3, 8) = 4.;
893 output.access(3,12) = 4.;
895 output.access(4, 5) = 4.0;
897 output.access(5,12) = 4.0;
899 output.access(6, 5) =-8.;
900 output.access(6, 8) =-4.;
902 output.access(7, 8) = 4.;
904 output.access(8, 8) =-4.;
905 output.access(8,12) =-8.;
907 output.access(9, 5) =-8.;
908 output.access(9, 8) =-8.;
909 output.access(9,12) =-8.;
911 output.access(10, 5) =-8.;
913 output.access(11,12) =-8.;
915 output.access(12, 5) =-8.;
916 output.access(12, 8) =-4.;
918 output.access(13, 8) = 4.;
920 output.access(14, 8) =-4;
921 output.access(14,12) =-8.;
923 output.access(15, 5) =16.;
924 output.access(15, 8) = 8.;
926 output.access(16, 8) =-8.;
928 output.access(17, 8) = 8.;
929 output.access(17,12) =16.;
933 case OPERATOR_MAX : {
934 const ordinal_type jend = output.extent(1);
935 const ordinal_type iend = output.extent(0);
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;
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");
955 template<
bool serendipity>
956 template<
typename DT,
957 typename outputValueValueType,
class ...outputValueProperties,
958 typename inputPointValueType,
class ...inputPointProperties>
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;
969 const auto loopSize = inputPoints.extent(0);
970 Kokkos::RangePolicy<ExecSpaceType,Kokkos::Schedule<Kokkos::Static> > policy(0, loopSize);
972 switch (operatorType) {
974 case OPERATOR_VALUE: {
975 typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_VALUE> FunctorType;
976 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
981 typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_GRAD> FunctorType;
982 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
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");
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");
996 typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D2> FunctorType;
997 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1001 typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D3> FunctorType;
1002 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1006 typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_D4> FunctorType;
1007 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1015 case OPERATOR_D10: {
1016 typedef Functor<outputValueViewType,inputPointViewType,OPERATOR_MAX> FunctorType;
1017 Kokkos::parallel_for( policy, FunctorType(outputValues, inputPoints) );
1021 INTREPID2_TEST_FOR_EXCEPTION( !( Intrepid2::isValidOperator(operatorType) ), std::invalid_argument,
1022 ">>> ERROR (Basis_HGRAD_WEDGE_DEG2_FEM): Invalid operator type");
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;
1044 const ordinal_type tagSize = 4;
1045 const ordinal_type posScDim = 0;
1046 const ordinal_type posScOrd = 1;
1047 const ordinal_type posDfOrd = 2;
1050 ordinal_type tags[72] = { 0, 0, 0, 1,
1072 OrdinalTypeArray1DHost tagView(&tags[0], serendipity ? 60 : 72);
1075 this->setOrdinalTagData(this->tagToOrdinal_,
1076 this->ordinalToTag_,
1078 this->basisCardinality_,
1086 Kokkos::DynRankView<typename ScalarViewType::value_type,typename DT::execution_space::array_layout,Kokkos::HostSpace>
1087 dofCoords(
"dofCoordsHost", this->basisCardinality_,this->basisCellTopology_.getDimension());
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;
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;
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;
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;
1113 this->dofCoords_ = Kokkos::create_mirror_view(
typename DT::memory_space(), dofCoords);
1114 Kokkos::deep_copy(this->dofCoords_, dofCoords);
Basis_HGRAD_WEDGE_DEG2_FEM()
Constructor.