DNDSR 0.1.0.dev1+gcd065ad
Distributed Numeric Data Structure for CFV
Loading...
Searching...
No Matches
Hex27.hpp
Go to the documentation of this file.
1#pragma once
2// Auto-generated by tools/gen_shape_functions -- DO NOT EDIT
3// Element: Hex27
4// Regenerate: /usr/bin/python3 -m tools.gen_shape_functions.generate
5
6#include "DNDS/Defines.hpp"
7#include "Geom/Geometric.hpp"
8#include "Geom/ElemEnum.hpp"
10
11namespace DNDS::Geom::Elem
12{
13
14 // Forward declaration (primary template is in ElementTraitsBase.hpp)
15 template <ElemType> struct ShapeFuncImpl;
16
17 // <GEN_SHAPE_FUNCS_BEGIN>
18 template <>
20 {
21 template <class TPoint, class TArray>
22 DNDS_DEVICE_CALLABLE static inline void Diff0(const TPoint &p, TArray &&v)
23 {
24 t_real xi = p[0];
25 t_real et = p[1];
26 t_real zt = p[2];
27 const t_real _t0 = xi - 1;
28 const t_real _t1 = et - 1;
29 const t_real _t2 = et*xi;
30 const t_real _t3 = _t1*_t2;
31 const t_real _t4 = zt*(zt - 1);
32 const t_real _t5 = ((0.125))*_t4;
33 const t_real _t6 = _t3*_t5;
34 const t_real _t7 = xi + 1;
35 const t_real _t8 = et + 1;
36 const t_real _t9 = _t2*_t8;
37 const t_real _t10 = _t5*_t9;
38 const t_real _t11 = zt*(zt + 1);
39 const t_real _t12 = ((0.125))*_t11;
40 const t_real _t13 = _t12*_t3;
41 const t_real _t14 = _t12*_t9;
42 const t_real _t15 = ((xi) * (xi)) - 1;
43 const t_real _t16 = _t15*et;
44 const t_real _t17 = _t1*_t16;
45 const t_real _t18 = ((0.25))*_t4;
46 const t_real _t19 = ((et) * (et)) - 1;
47 const t_real _t20 = _t19*xi;
48 const t_real _t21 = _t18*_t20;
49 const t_real _t22 = _t16*_t8;
50 const t_real _t23 = ((0.25))*_t0;
51 const t_real _t24 = ((zt) * (zt)) - 1;
52 const t_real _t25 = _t24*_t3;
53 const t_real _t26 = ((0.25))*_t7;
54 const t_real _t27 = _t24*_t9;
55 const t_real _t28 = ((0.25))*_t11;
56 const t_real _t29 = _t11*_t20;
57 const t_real _t30 = _t15*_t19;
58 const t_real _t31 = ((0.5))*_t30;
59 const t_real _t32 = ((0.5))*_t24;
60 const t_real _t33 = _t20*_t32;
61 v(0, 0) = _t0*_t6;
62 v(0, 1) = _t6*_t7;
63 v(0, 2) = _t10*_t7;
64 v(0, 3) = _t0*_t10;
65 v(0, 4) = _t0*_t13;
66 v(0, 5) = _t13*_t7;
67 v(0, 6) = _t14*_t7;
68 v(0, 7) = _t0*_t14;
69 v(0, 8) = -_t17*_t18;
70 v(0, 9) = -_t21*_t7;
71 v(0, 10) = -_t18*_t22;
72 v(0, 11) = -_t0*_t21;
73 v(0, 12) = -_t23*_t25;
74 v(0, 13) = -_t25*_t26;
75 v(0, 14) = -_t26*_t27;
76 v(0, 15) = -_t23*_t27;
77 v(0, 16) = -_t17*_t28;
78 v(0, 17) = -_t26*_t29;
79 v(0, 18) = -_t22*_t28;
80 v(0, 19) = -_t23*_t29;
81 v(0, 20) = _t31*_t4;
82 v(0, 21) = _t17*_t32;
83 v(0, 22) = _t33*_t7;
84 v(0, 23) = _t22*_t32;
85 v(0, 24) = _t0*_t33;
86 v(0, 25) = _t11*_t31;
87 v(0, 26) = -_t24*_t30;
88 }
89
90 template <class TPoint, class TArray>
91 DNDS_DEVICE_CALLABLE static inline void Diff1(const TPoint &p, TArray &&v)
92 {
93 t_real xi = p[0];
94 t_real et = p[1];
95 t_real zt = p[2];
96 const t_real _t0 = 2*xi;
97 const t_real _t1 = _t0 - 1;
98 const t_real _t2 = et*(et - 1);
99 const t_real _t3 = zt*(zt - 1);
100 const t_real _t4 = ((0.125))*_t3;
101 const t_real _t5 = _t2*_t4;
102 const t_real _t6 = _t0 + 1;
103 const t_real _t7 = et + 1;
104 const t_real _t8 = _t7*et;
105 const t_real _t9 = _t4*_t8;
106 const t_real _t10 = zt*(zt + 1);
107 const t_real _t11 = ((0.125))*_t10;
108 const t_real _t12 = _t11*_t2;
109 const t_real _t13 = _t11*_t8;
110 const t_real _t14 = ((0.5))*xi;
111 const t_real _t15 = _t14*_t3;
112 const t_real _t16 = -(0.25)*_t6;
113 const t_real _t17 = ((et) * (et)) - 1;
114 const t_real _t18 = _t17*_t3;
115 const t_real _t19 = -(0.25)*_t1;
116 const t_real _t20 = ((zt) * (zt)) - 1;
117 const t_real _t21 = _t2*_t20;
118 const t_real _t22 = _t20*_t8;
119 const t_real _t23 = _t10*_t14;
120 const t_real _t24 = _t10*_t17;
121 const t_real _t25 = _t17*xi;
122 const t_real _t26 = _t20*xi;
123 const t_real _t27 = _t17*_t20;
124 const t_real _t28 = ((0.5))*_t27;
125 const t_real _t29 = _t26*et;
126 const t_real _t30 = xi - 1;
127 const t_real _t31 = 2*et;
128 const t_real _t32 = _t31 - 1;
129 const t_real _t33 = _t4*xi;
130 const t_real _t34 = _t32*_t33;
131 const t_real _t35 = xi + 1;
132 const t_real _t36 = _t31 + 1;
133 const t_real _t37 = _t33*_t36;
134 const t_real _t38 = _t11*xi;
135 const t_real _t39 = _t32*_t38;
136 const t_real _t40 = _t36*_t38;
137 const t_real _t41 = -(0.25)*_t32;
138 const t_real _t42 = ((xi) * (xi)) - 1;
139 const t_real _t43 = _t3*_t42;
140 const t_real _t44 = _t15*et;
141 const t_real _t45 = -(0.25)*_t36;
142 const t_real _t46 = _t26*_t41;
143 const t_real _t47 = _t26*_t45;
144 const t_real _t48 = _t10*_t42;
145 const t_real _t49 = _t23*et;
146 const t_real _t50 = _t42*et;
147 const t_real _t51 = _t20*_t42;
148 const t_real _t52 = ((0.5))*_t51;
149 const t_real _t53 = _t2*_t30;
150 const t_real _t54 = 2*zt;
151 const t_real _t55 = _t54 - 1;
152 const t_real _t56 = ((0.125))*xi;
153 const t_real _t57 = _t55*_t56;
154 const t_real _t58 = _t35*_t57;
155 const t_real _t59 = _t30*_t8;
156 const t_real _t60 = _t54 + 1;
157 const t_real _t61 = _t56*_t60;
158 const t_real _t62 = _t35*_t61;
159 const t_real _t63 = _t2*_t42;
160 const t_real _t64 = -(0.25)*_t55;
161 const t_real _t65 = _t25*_t64;
162 const t_real _t66 = _t50*_t7;
163 const t_real _t67 = _t14*zt;
164 const t_real _t68 = _t35*_t67;
165 const t_real _t69 = -(0.25)*_t60;
166 const t_real _t70 = _t25*_t69;
167 const t_real _t71 = _t17*_t42;
168 const t_real _t72 = ((0.5))*_t71;
169 const t_real _t73 = _t25*zt;
170 v(0, 0) = _t1*_t5;
171 v(0, 1) = _t5*_t6;
172 v(0, 2) = _t6*_t9;
173 v(0, 3) = _t1*_t9;
174 v(0, 4) = _t1*_t12;
175 v(0, 5) = _t12*_t6;
176 v(0, 6) = _t13*_t6;
177 v(0, 7) = _t1*_t13;
178 v(0, 8) = -_t15*_t2;
179 v(0, 9) = _t16*_t18;
180 v(0, 10) = -_t15*_t8;
181 v(0, 11) = _t18*_t19;
182 v(0, 12) = _t19*_t21;
183 v(0, 13) = _t16*_t21;
184 v(0, 14) = _t16*_t22;
185 v(0, 15) = _t19*_t22;
186 v(0, 16) = -_t2*_t23;
187 v(0, 17) = _t16*_t24;
188 v(0, 18) = -_t23*_t8;
189 v(0, 19) = _t19*_t24;
190 v(0, 20) = _t25*_t3;
191 v(0, 21) = _t2*_t26;
192 v(0, 22) = _t28*_t6;
193 v(0, 23) = _t29*_t7;
194 v(0, 24) = _t1*_t28;
195 v(0, 25) = _t10*_t25;
196 v(0, 26) = -_t0*_t27;
197 v(1, 0) = _t30*_t34;
198 v(1, 1) = _t34*_t35;
199 v(1, 2) = _t35*_t37;
200 v(1, 3) = _t30*_t37;
201 v(1, 4) = _t30*_t39;
202 v(1, 5) = _t35*_t39;
203 v(1, 6) = _t35*_t40;
204 v(1, 7) = _t30*_t40;
205 v(1, 8) = _t41*_t43;
206 v(1, 9) = -_t35*_t44;
207 v(1, 10) = _t43*_t45;
208 v(1, 11) = -_t30*_t44;
209 v(1, 12) = _t30*_t46;
210 v(1, 13) = _t35*_t46;
211 v(1, 14) = _t35*_t47;
212 v(1, 15) = _t30*_t47;
213 v(1, 16) = _t41*_t48;
214 v(1, 17) = -_t35*_t49;
215 v(1, 18) = _t45*_t48;
216 v(1, 19) = -_t30*_t49;
217 v(1, 20) = _t3*_t50;
218 v(1, 21) = _t32*_t52;
219 v(1, 22) = _t29*_t35;
220 v(1, 23) = _t36*_t52;
221 v(1, 24) = _t29*_t30;
222 v(1, 25) = _t10*_t50;
223 v(1, 26) = -_t31*_t51;
224 v(2, 0) = _t53*_t57;
225 v(2, 1) = _t2*_t58;
226 v(2, 2) = _t58*_t8;
227 v(2, 3) = _t57*_t59;
228 v(2, 4) = _t53*_t61;
229 v(2, 5) = _t2*_t62;
230 v(2, 6) = _t62*_t8;
231 v(2, 7) = _t59*_t61;
232 v(2, 8) = _t63*_t64;
233 v(2, 9) = _t35*_t65;
234 v(2, 10) = _t64*_t66;
235 v(2, 11) = _t30*_t65;
236 v(2, 12) = -_t53*_t67;
237 v(2, 13) = -_t2*_t68;
238 v(2, 14) = -_t68*_t8;
239 v(2, 15) = -_t59*_t67;
240 v(2, 16) = _t63*_t69;
241 v(2, 17) = _t35*_t70;
242 v(2, 18) = _t66*_t69;
243 v(2, 19) = _t30*_t70;
244 v(2, 20) = _t55*_t72;
245 v(2, 21) = _t63*zt;
246 v(2, 22) = _t35*_t73;
247 v(2, 23) = _t66*zt;
248 v(2, 24) = _t30*_t73;
249 v(2, 25) = _t60*_t72;
250 v(2, 26) = -_t54*_t71;
251 }
252
253 template <class TPoint, class TArray>
254 DNDS_DEVICE_CALLABLE static inline void Diff2(const TPoint &p, TArray &&v)
255 {
256 t_real xi = p[0];
257 t_real et = p[1];
258 t_real zt = p[2];
259 const t_real _t0 = et - 1;
260 const t_real _t1 = zt - 1;
261 const t_real _t2 = _t0*_t1;
262 const t_real _t3 = et*zt;
263 const t_real _t4 = ((0.25))*_t3;
264 const t_real _t5 = _t2*_t4;
265 const t_real _t6 = et + 1;
266 const t_real _t7 = _t1*_t6;
267 const t_real _t8 = _t4*_t7;
268 const t_real _t9 = zt + 1;
269 const t_real _t10 = _t0*_t9;
270 const t_real _t11 = _t10*_t4;
271 const t_real _t12 = _t6*_t9;
272 const t_real _t13 = _t12*_t4;
273 const t_real _t14 = ((0.5))*_t3;
274 const t_real _t15 = ((et) * (et)) - 1;
275 const t_real _t16 = _t15*zt;
276 const t_real _t17 = _t1*_t16;
277 const t_real _t18 = -(0.5)*_t17;
278 const t_real _t19 = ((zt) * (zt)) - 1;
279 const t_real _t20 = _t19*et;
280 const t_real _t21 = _t0*_t20;
281 const t_real _t22 = -(0.5)*_t21;
282 const t_real _t23 = _t20*_t6;
283 const t_real _t24 = -(0.5)*_t23;
284 const t_real _t25 = _t16*_t9;
285 const t_real _t26 = -(0.5)*_t25;
286 const t_real _t27 = _t15*_t19;
287 const t_real _t28 = xi - 1;
288 const t_real _t29 = _t1*_t28;
289 const t_real _t30 = xi*zt;
290 const t_real _t31 = ((0.25))*_t30;
291 const t_real _t32 = _t29*_t31;
292 const t_real _t33 = xi + 1;
293 const t_real _t34 = _t1*_t33;
294 const t_real _t35 = _t31*_t34;
295 const t_real _t36 = _t28*_t9;
296 const t_real _t37 = _t31*_t36;
297 const t_real _t38 = _t33*_t9;
298 const t_real _t39 = _t31*_t38;
299 const t_real _t40 = ((xi) * (xi)) - 1;
300 const t_real _t41 = _t40*zt;
301 const t_real _t42 = _t1*_t41;
302 const t_real _t43 = -(0.5)*_t42;
303 const t_real _t44 = ((0.5))*_t30;
304 const t_real _t45 = _t19*xi;
305 const t_real _t46 = _t28*_t45;
306 const t_real _t47 = -(0.5)*_t46;
307 const t_real _t48 = _t33*_t45;
308 const t_real _t49 = -(0.5)*_t48;
309 const t_real _t50 = _t41*_t9;
310 const t_real _t51 = -(0.5)*_t50;
311 const t_real _t52 = _t19*_t40;
312 const t_real _t53 = _t0*_t28;
313 const t_real _t54 = et*xi;
314 const t_real _t55 = ((0.25))*_t54;
315 const t_real _t56 = _t53*_t55;
316 const t_real _t57 = _t0*_t33;
317 const t_real _t58 = _t55*_t57;
318 const t_real _t59 = _t33*_t6;
319 const t_real _t60 = _t55*_t59;
320 const t_real _t61 = _t28*_t6;
321 const t_real _t62 = _t55*_t61;
322 const t_real _t63 = _t40*et;
323 const t_real _t64 = _t0*_t63;
324 const t_real _t65 = -(0.5)*_t64;
325 const t_real _t66 = _t15*xi;
326 const t_real _t67 = _t33*_t66;
327 const t_real _t68 = -(0.5)*_t67;
328 const t_real _t69 = _t6*_t63;
329 const t_real _t70 = -(0.5)*_t69;
330 const t_real _t71 = _t28*_t66;
331 const t_real _t72 = -(0.5)*_t71;
332 const t_real _t73 = ((0.5))*_t54;
333 const t_real _t74 = _t15*_t40;
334 const t_real _t75 = _t28*et;
335 const t_real _t76 = _t0*xi + _t54;
336 const t_real _t77 = _t53 + _t75 + _t76;
337 const t_real _t78 = ((0.125))*zt;
338 const t_real _t79 = _t1*_t78;
339 const t_real _t80 = _t33*et;
340 const t_real _t81 = _t57 + _t76 + _t80;
341 const t_real _t82 = _t54 + _t6*xi;
342 const t_real _t83 = _t59 + _t80 + _t82;
343 const t_real _t84 = _t61 + _t75 + _t82;
344 const t_real _t85 = _t78*_t9;
345 const t_real _t86 = 2*et;
346 const t_real _t87 = _t86 - 1;
347 const t_real _t88 = -_t87;
348 const t_real _t89 = _t1*_t44;
349 const t_real _t90 = 2*xi;
350 const t_real _t91 = _t90 + 1;
351 const t_real _t92 = -_t91;
352 const t_real _t93 = _t1*_t14;
353 const t_real _t94 = _t86 + 1;
354 const t_real _t95 = -_t94;
355 const t_real _t96 = _t90 - 1;
356 const t_real _t97 = -_t96;
357 const t_real _t98 = ((0.25))*_t19;
358 const t_real _t99 = _t44*_t9;
359 const t_real _t100 = _t14*_t9;
360 const t_real _t101 = 2*zt;
361 const t_real _t102 = _t101*_t54;
362 const t_real _t103 = _t0*zt;
363 const t_real _t104 = _t1*et + _t3;
364 const t_real _t105 = _t103 + _t104 + _t2;
365 const t_real _t106 = ((0.125))*xi;
366 const t_real _t107 = _t105*_t106;
367 const t_real _t108 = _t6*zt;
368 const t_real _t109 = _t104 + _t108 + _t7;
369 const t_real _t110 = _t106*_t109;
370 const t_real _t111 = _t3 + _t9*et;
371 const t_real _t112 = _t10 + _t103 + _t111;
372 const t_real _t113 = _t106*_t112;
373 const t_real _t114 = _t108 + _t111 + _t12;
374 const t_real _t115 = _t106*_t114;
375 const t_real _t116 = ((0.25))*_t40;
376 const t_real _t117 = _t101 - 1;
377 const t_real _t118 = -_t117*_t73;
378 const t_real _t119 = _t44*_t88;
379 const t_real _t120 = _t44*_t95;
380 const t_real _t121 = _t101 + 1;
381 const t_real _t122 = -_t121*_t73;
382 const t_real _t123 = _t28*zt;
383 const t_real _t124 = _t1*xi + _t30;
384 const t_real _t125 = _t123 + _t124 + _t29;
385 const t_real _t126 = ((0.125))*et;
386 const t_real _t127 = _t0*_t126;
387 const t_real _t128 = _t33*zt;
388 const t_real _t129 = _t124 + _t128 + _t34;
389 const t_real _t130 = _t126*_t6;
390 const t_real _t131 = _t30 + _t9*xi;
391 const t_real _t132 = _t123 + _t131 + _t36;
392 const t_real _t133 = _t128 + _t131 + _t38;
393 const t_real _t134 = ((0.25))*_t15;
394 const t_real _t135 = _t0*_t14;
395 const t_real _t136 = _t14*_t6;
396 const t_real _t137 = 2*_t54;
397 v(0, 0) = _t5;
398 v(0, 1) = _t5;
399 v(0, 2) = _t8;
400 v(0, 3) = _t8;
401 v(0, 4) = _t11;
402 v(0, 5) = _t11;
403 v(0, 6) = _t13;
404 v(0, 7) = _t13;
405 v(0, 8) = -_t14*_t2;
406 v(0, 9) = _t18;
407 v(0, 10) = -_t14*_t7;
408 v(0, 11) = _t18;
409 v(0, 12) = _t22;
410 v(0, 13) = _t22;
411 v(0, 14) = _t24;
412 v(0, 15) = _t24;
413 v(0, 16) = -_t10*_t14;
414 v(0, 17) = _t26;
415 v(0, 18) = -_t12*_t14;
416 v(0, 19) = _t26;
417 v(0, 20) = _t17;
418 v(0, 21) = _t21;
419 v(0, 22) = _t27;
420 v(0, 23) = _t23;
421 v(0, 24) = _t27;
422 v(0, 25) = _t25;
423 v(0, 26) = -2*_t27;
424 v(1, 0) = _t32;
425 v(1, 1) = _t35;
426 v(1, 2) = _t35;
427 v(1, 3) = _t32;
428 v(1, 4) = _t37;
429 v(1, 5) = _t39;
430 v(1, 6) = _t39;
431 v(1, 7) = _t37;
432 v(1, 8) = _t43;
433 v(1, 9) = -_t34*_t44;
434 v(1, 10) = _t43;
435 v(1, 11) = -_t29*_t44;
436 v(1, 12) = _t47;
437 v(1, 13) = _t49;
438 v(1, 14) = _t49;
439 v(1, 15) = _t47;
440 v(1, 16) = _t51;
441 v(1, 17) = -_t38*_t44;
442 v(1, 18) = _t51;
443 v(1, 19) = -_t36*_t44;
444 v(1, 20) = _t42;
445 v(1, 21) = _t52;
446 v(1, 22) = _t48;
447 v(1, 23) = _t52;
448 v(1, 24) = _t46;
449 v(1, 25) = _t50;
450 v(1, 26) = -2*_t52;
451 v(2, 0) = _t56;
452 v(2, 1) = _t58;
453 v(2, 2) = _t60;
454 v(2, 3) = _t62;
455 v(2, 4) = _t56;
456 v(2, 5) = _t58;
457 v(2, 6) = _t60;
458 v(2, 7) = _t62;
459 v(2, 8) = _t65;
460 v(2, 9) = _t68;
461 v(2, 10) = _t70;
462 v(2, 11) = _t72;
463 v(2, 12) = -_t53*_t73;
464 v(2, 13) = -_t57*_t73;
465 v(2, 14) = -_t59*_t73;
466 v(2, 15) = -_t61*_t73;
467 v(2, 16) = _t65;
468 v(2, 17) = _t68;
469 v(2, 18) = _t70;
470 v(2, 19) = _t72;
471 v(2, 20) = _t74;
472 v(2, 21) = _t64;
473 v(2, 22) = _t67;
474 v(2, 23) = _t69;
475 v(2, 24) = _t71;
476 v(2, 25) = _t74;
477 v(2, 26) = -2*_t74;
478 v(3, 0) = _t77*_t79;
479 v(3, 1) = _t79*_t81;
480 v(3, 2) = _t79*_t83;
481 v(3, 3) = _t79*_t84;
482 v(3, 4) = _t77*_t85;
483 v(3, 5) = _t81*_t85;
484 v(3, 6) = _t83*_t85;
485 v(3, 7) = _t84*_t85;
486 v(3, 8) = _t88*_t89;
487 v(3, 9) = _t92*_t93;
488 v(3, 10) = _t89*_t95;
489 v(3, 11) = _t93*_t97;
490 v(3, 12) = -_t77*_t98;
491 v(3, 13) = -_t81*_t98;
492 v(3, 14) = -_t83*_t98;
493 v(3, 15) = -_t84*_t98;
494 v(3, 16) = _t88*_t99;
495 v(3, 17) = _t100*_t92;
496 v(3, 18) = _t95*_t99;
497 v(3, 19) = _t100*_t97;
498 v(3, 20) = _t1*_t102;
499 v(3, 21) = _t45*_t87;
500 v(3, 22) = _t20*_t91;
501 v(3, 23) = _t45*_t94;
502 v(3, 24) = _t20*_t96;
503 v(3, 25) = _t102*_t9;
504 v(3, 26) = -4*_t19*_t54;
505 v(4, 0) = _t107*_t28;
506 v(4, 1) = _t107*_t33;
507 v(4, 2) = _t110*_t33;
508 v(4, 3) = _t110*_t28;
509 v(4, 4) = _t113*_t28;
510 v(4, 5) = _t113*_t33;
511 v(4, 6) = _t115*_t33;
512 v(4, 7) = _t115*_t28;
513 v(4, 8) = -_t105*_t116;
514 v(4, 9) = _t118*_t33;
515 v(4, 10) = -_t109*_t116;
516 v(4, 11) = _t118*_t28;
517 v(4, 12) = _t119*_t28;
518 v(4, 13) = _t119*_t33;
519 v(4, 14) = _t120*_t33;
520 v(4, 15) = _t120*_t28;
521 v(4, 16) = -_t112*_t116;
522 v(4, 17) = _t122*_t33;
523 v(4, 18) = -_t114*_t116;
524 v(4, 19) = _t122*_t28;
525 v(4, 20) = _t117*_t63;
526 v(4, 21) = _t41*_t87;
527 v(4, 22) = _t102*_t33;
528 v(4, 23) = _t41*_t94;
529 v(4, 24) = _t102*_t28;
530 v(4, 25) = _t121*_t63;
531 v(4, 26) = -4*_t3*_t40;
532 v(5, 0) = _t125*_t127;
533 v(5, 1) = _t127*_t129;
534 v(5, 2) = _t129*_t130;
535 v(5, 3) = _t125*_t130;
536 v(5, 4) = _t127*_t132;
537 v(5, 5) = _t127*_t133;
538 v(5, 6) = _t130*_t133;
539 v(5, 7) = _t130*_t132;
540 v(5, 8) = _t0*_t118;
541 v(5, 9) = -_t129*_t134;
542 v(5, 10) = _t118*_t6;
543 v(5, 11) = -_t125*_t134;
544 v(5, 12) = _t135*_t97;
545 v(5, 13) = _t135*_t92;
546 v(5, 14) = _t136*_t92;
547 v(5, 15) = _t136*_t97;
548 v(5, 16) = _t0*_t122;
549 v(5, 17) = -_t133*_t134;
550 v(5, 18) = _t122*_t6;
551 v(5, 19) = -_t132*_t134;
552 v(5, 20) = _t117*_t66;
553 v(5, 21) = _t103*_t137;
554 v(5, 22) = _t16*_t91;
555 v(5, 23) = _t108*_t137;
556 v(5, 24) = _t16*_t96;
557 v(5, 25) = _t121*_t66;
558 v(5, 26) = -4*_t15*_t30;
559 }
560
561 template <class TPoint, class TArray>
562 DNDS_DEVICE_CALLABLE static inline void Diff3(const TPoint &p, TArray &&v)
563 {
564 t_real xi = p[0];
565 t_real et = p[1];
566 t_real zt = p[2];
567 const t_real _t0 = 2*et;
568 const t_real _t1 = _t0 - 1;
569 const t_real _t2 = zt - 1;
570 const t_real _t3 = ((0.25))*zt;
571 const t_real _t4 = _t2*_t3;
572 const t_real _t5 = _t1*_t4;
573 const t_real _t6 = _t0 + 1;
574 const t_real _t7 = _t4*_t6;
575 const t_real _t8 = zt + 1;
576 const t_real _t9 = _t3*_t8;
577 const t_real _t10 = _t1*_t9;
578 const t_real _t11 = _t6*_t9;
579 const t_real _t12 = -_t1;
580 const t_real _t13 = ((0.5))*zt;
581 const t_real _t14 = _t13*_t2;
582 const t_real _t15 = -_t2;
583 const t_real _t16 = et*zt;
584 const t_real _t17 = _t15*_t16;
585 const t_real _t18 = -_t6;
586 const t_real _t19 = ((zt) * (zt)) - 1;
587 const t_real _t20 = ((0.5))*_t19;
588 const t_real _t21 = _t12*_t20;
589 const t_real _t22 = _t18*_t20;
590 const t_real _t23 = _t13*_t8;
591 const t_real _t24 = -_t16*_t8;
592 const t_real _t25 = _t0*zt;
593 const t_real _t26 = _t0*_t19;
594 const t_real _t27 = -4*_t19;
595 const t_real _t28 = 2*xi;
596 const t_real _t29 = _t28 - 1;
597 const t_real _t30 = _t29*_t4;
598 const t_real _t31 = _t28 + 1;
599 const t_real _t32 = _t31*_t4;
600 const t_real _t33 = _t29*_t9;
601 const t_real _t34 = _t31*_t9;
602 const t_real _t35 = xi*zt;
603 const t_real _t36 = _t15*_t35;
604 const t_real _t37 = -_t31;
605 const t_real _t38 = -_t29;
606 const t_real _t39 = _t20*_t38;
607 const t_real _t40 = _t20*_t37;
608 const t_real _t41 = -_t35*_t8;
609 const t_real _t42 = _t28*zt;
610 const t_real _t43 = _t19*_t28;
611 const t_real _t44 = xi - 1;
612 const t_real _t45 = 2*zt;
613 const t_real _t46 = _t45 - 1;
614 const t_real _t47 = ((0.25))*xi;
615 const t_real _t48 = _t46*_t47;
616 const t_real _t49 = _t44*_t48;
617 const t_real _t50 = xi + 1;
618 const t_real _t51 = _t48*_t50;
619 const t_real _t52 = _t45 + 1;
620 const t_real _t53 = _t47*_t52;
621 const t_real _t54 = _t44*_t53;
622 const t_real _t55 = _t50*_t53;
623 const t_real _t56 = -_t46;
624 const t_real _t57 = ((xi) * (xi)) - 1;
625 const t_real _t58 = ((0.5))*_t57;
626 const t_real _t59 = _t56*_t58;
627 const t_real _t60 = ((0.5))*xi;
628 const t_real _t61 = _t56*_t60;
629 const t_real _t62 = -_t44;
630 const t_real _t63 = _t35*_t62;
631 const t_real _t64 = -_t35*_t50;
632 const t_real _t65 = -_t52;
633 const t_real _t66 = _t58*_t65;
634 const t_real _t67 = _t60*_t65;
635 const t_real _t68 = _t45*_t57;
636 const t_real _t69 = -4*_t57;
637 const t_real _t70 = _t1*_t47;
638 const t_real _t71 = _t44*_t70;
639 const t_real _t72 = _t50*_t70;
640 const t_real _t73 = _t47*_t6;
641 const t_real _t74 = _t50*_t73;
642 const t_real _t75 = _t44*_t73;
643 const t_real _t76 = _t12*_t58;
644 const t_real _t77 = et*xi;
645 const t_real _t78 = -_t50*_t77;
646 const t_real _t79 = _t18*_t58;
647 const t_real _t80 = _t62*_t77;
648 const t_real _t81 = _t12*_t60;
649 const t_real _t82 = _t18*_t60;
650 const t_real _t83 = _t0*_t57;
651 const t_real _t84 = _t0*xi;
652 const t_real _t85 = et - 1;
653 const t_real _t86 = ((0.25))*et;
654 const t_real _t87 = _t85*_t86;
655 const t_real _t88 = _t29*_t87;
656 const t_real _t89 = _t31*_t87;
657 const t_real _t90 = et + 1;
658 const t_real _t91 = _t86*_t90;
659 const t_real _t92 = _t31*_t91;
660 const t_real _t93 = _t29*_t91;
661 const t_real _t94 = -_t85;
662 const t_real _t95 = _t77*_t94;
663 const t_real _t96 = ((et) * (et)) - 1;
664 const t_real _t97 = ((0.5))*_t96;
665 const t_real _t98 = _t37*_t97;
666 const t_real _t99 = -_t77*_t90;
667 const t_real _t100 = _t38*_t97;
668 const t_real _t101 = ((0.5))*et;
669 const t_real _t102 = _t101*_t85;
670 const t_real _t103 = _t101*_t90;
671 const t_real _t104 = _t28*_t96;
672 const t_real _t105 = -4*_t96;
673 const t_real _t106 = _t46*_t87;
674 const t_real _t107 = _t46*_t91;
675 const t_real _t108 = _t52*_t87;
676 const t_real _t109 = _t52*_t91;
677 const t_real _t110 = _t56*_t97;
678 const t_real _t111 = _t16*_t94;
679 const t_real _t112 = -_t16*_t90;
680 const t_real _t113 = _t65*_t97;
681 const t_real _t114 = _t45*_t96;
682 const t_real _t115 = ((0.5))*_t77;
683 const t_real _t116 = -_t115;
684 const t_real _t117 = ((0.5))*_t35;
685 const t_real _t118 = -_t117;
686 const t_real _t119 = _t16*xi;
687 const t_real _t120 = _t116 + _t118 + _t119 + _t47;
688 const t_real _t121 = _t3 + (-0.125);
689 const t_real _t122 = ((0.5))*_t16;
690 const t_real _t123 = -_t122;
691 const t_real _t124 = _t123 + _t86;
692 const t_real _t125 = -_t86;
693 const t_real _t126 = _t122 + _t125;
694 const t_real _t127 = -_t3;
695 const t_real _t128 = _t127 + (0.125);
696 const t_real _t129 = _t119 - _t47;
697 const t_real _t130 = _t116 + _t117 + _t129;
698 const t_real _t131 = _t115 + _t118 + _t129;
699 const t_real _t132 = _t3 + (0.125);
700 const t_real _t133 = _t123 + _t125;
701 const t_real _t134 = _t122 + _t86;
702 const t_real _t135 = _t127 + (-0.125);
703 const t_real _t136 = _t115 + _t117 + _t119 + _t47;
704 const t_real _t137 = -_t0;
705 const t_real _t138 = 4*_t16;
706 const t_real _t139 = _t137 + _t138;
707 const t_real _t140 = -_t45;
708 const t_real _t141 = _t140 + 1;
709 const t_real _t142 = -_t28;
710 const t_real _t143 = 4*_t35;
711 const t_real _t144 = _t142 + _t143;
712 const t_real _t145 = 4*_t77;
713 const t_real _t146 = _t142 + _t145;
714 v(3, 0) = _t5;
715 v(3, 1) = _t5;
716 v(3, 2) = _t7;
717 v(3, 3) = _t7;
718 v(3, 4) = _t10;
719 v(3, 5) = _t10;
720 v(3, 6) = _t11;
721 v(3, 7) = _t11;
722 v(3, 8) = _t12*_t14;
723 v(3, 9) = _t17;
724 v(3, 10) = _t14*_t18;
725 v(3, 11) = _t17;
726 v(3, 12) = _t21;
727 v(3, 13) = _t21;
728 v(3, 14) = _t22;
729 v(3, 15) = _t22;
730 v(3, 16) = _t12*_t23;
731 v(3, 17) = _t24;
732 v(3, 18) = _t18*_t23;
733 v(3, 19) = _t24;
734 v(3, 20) = _t2*_t25;
735 v(3, 21) = _t1*_t19;
736 v(3, 22) = _t26;
737 v(3, 23) = _t19*_t6;
738 v(3, 24) = _t26;
739 v(3, 25) = _t25*_t8;
740 v(3, 26) = _t27*et;
741 v(4, 0) = _t30;
742 v(4, 1) = _t32;
743 v(4, 2) = _t32;
744 v(4, 3) = _t30;
745 v(4, 4) = _t33;
746 v(4, 5) = _t34;
747 v(4, 6) = _t34;
748 v(4, 7) = _t33;
749 v(4, 8) = _t36;
750 v(4, 9) = _t14*_t37;
751 v(4, 10) = _t36;
752 v(4, 11) = _t14*_t38;
753 v(4, 12) = _t39;
754 v(4, 13) = _t40;
755 v(4, 14) = _t40;
756 v(4, 15) = _t39;
757 v(4, 16) = _t41;
758 v(4, 17) = _t23*_t37;
759 v(4, 18) = _t41;
760 v(4, 19) = _t23*_t38;
761 v(4, 20) = _t2*_t42;
762 v(4, 21) = _t43;
763 v(4, 22) = _t19*_t31;
764 v(4, 23) = _t43;
765 v(4, 24) = _t19*_t29;
766 v(4, 25) = _t42*_t8;
767 v(4, 26) = _t27*xi;
768 v(5, 0) = _t49;
769 v(5, 1) = _t51;
770 v(5, 2) = _t51;
771 v(5, 3) = _t49;
772 v(5, 4) = _t54;
773 v(5, 5) = _t55;
774 v(5, 6) = _t55;
775 v(5, 7) = _t54;
776 v(5, 8) = _t59;
777 v(5, 9) = _t50*_t61;
778 v(5, 10) = _t59;
779 v(5, 11) = _t44*_t61;
780 v(5, 12) = _t63;
781 v(5, 13) = _t64;
782 v(5, 14) = _t64;
783 v(5, 15) = _t63;
784 v(5, 16) = _t66;
785 v(5, 17) = _t50*_t67;
786 v(5, 18) = _t66;
787 v(5, 19) = _t44*_t67;
788 v(5, 20) = _t46*_t57;
789 v(5, 21) = _t68;
790 v(5, 22) = _t42*_t50;
791 v(5, 23) = _t68;
792 v(5, 24) = _t42*_t44;
793 v(5, 25) = _t52*_t57;
794 v(5, 26) = _t69*zt;
795 v(6, 0) = _t71;
796 v(6, 1) = _t72;
797 v(6, 2) = _t74;
798 v(6, 3) = _t75;
799 v(6, 4) = _t71;
800 v(6, 5) = _t72;
801 v(6, 6) = _t74;
802 v(6, 7) = _t75;
803 v(6, 8) = _t76;
804 v(6, 9) = _t78;
805 v(6, 10) = _t79;
806 v(6, 11) = _t80;
807 v(6, 12) = _t44*_t81;
808 v(6, 13) = _t50*_t81;
809 v(6, 14) = _t50*_t82;
810 v(6, 15) = _t44*_t82;
811 v(6, 16) = _t76;
812 v(6, 17) = _t78;
813 v(6, 18) = _t79;
814 v(6, 19) = _t80;
815 v(6, 20) = _t83;
816 v(6, 21) = _t1*_t57;
817 v(6, 22) = _t50*_t84;
818 v(6, 23) = _t57*_t6;
819 v(6, 24) = _t44*_t84;
820 v(6, 25) = _t83;
821 v(6, 26) = _t69*et;
822 v(7, 0) = _t88;
823 v(7, 1) = _t89;
824 v(7, 2) = _t92;
825 v(7, 3) = _t93;
826 v(7, 4) = _t88;
827 v(7, 5) = _t89;
828 v(7, 6) = _t92;
829 v(7, 7) = _t93;
830 v(7, 8) = _t95;
831 v(7, 9) = _t98;
832 v(7, 10) = _t99;
833 v(7, 11) = _t100;
834 v(7, 12) = _t102*_t38;
835 v(7, 13) = _t102*_t37;
836 v(7, 14) = _t103*_t37;
837 v(7, 15) = _t103*_t38;
838 v(7, 16) = _t95;
839 v(7, 17) = _t98;
840 v(7, 18) = _t99;
841 v(7, 19) = _t100;
842 v(7, 20) = _t104;
843 v(7, 21) = _t84*_t85;
844 v(7, 22) = _t31*_t96;
845 v(7, 23) = _t84*_t90;
846 v(7, 24) = _t29*_t96;
847 v(7, 25) = _t104;
848 v(7, 26) = _t105*xi;
849 v(8, 0) = _t106;
850 v(8, 1) = _t106;
851 v(8, 2) = _t107;
852 v(8, 3) = _t107;
853 v(8, 4) = _t108;
854 v(8, 5) = _t108;
855 v(8, 6) = _t109;
856 v(8, 7) = _t109;
857 v(8, 8) = _t102*_t56;
858 v(8, 9) = _t110;
859 v(8, 10) = _t103*_t56;
860 v(8, 11) = _t110;
861 v(8, 12) = _t111;
862 v(8, 13) = _t111;
863 v(8, 14) = _t112;
864 v(8, 15) = _t112;
865 v(8, 16) = _t102*_t65;
866 v(8, 17) = _t113;
867 v(8, 18) = _t103*_t65;
868 v(8, 19) = _t113;
869 v(8, 20) = _t46*_t96;
870 v(8, 21) = _t25*_t85;
871 v(8, 22) = _t114;
872 v(8, 23) = _t25*_t90;
873 v(8, 24) = _t114;
874 v(8, 25) = _t52*_t96;
875 v(8, 26) = _t105*zt;
876 v(9, 0) = _t120 + _t121 + _t124;
877 v(9, 1) = _t120 + _t126 + _t128;
878 v(9, 2) = _t121 + _t126 + _t130;
879 v(9, 3) = _t124 + _t128 + _t130;
880 v(9, 4) = _t131 + _t132 + _t133;
881 v(9, 5) = _t131 + _t134 + _t135;
882 v(9, 6) = _t132 + _t134 + _t136;
883 v(9, 7) = _t133 + _t135 + _t136;
884 v(9, 8) = _t60*(-_t139 - _t141);
885 v(9, 9) = _t101*(-_t144 - _t46);
886 v(9, 10) = _t60*(-_t139 - _t46);
887 v(9, 11) = _t101*(-_t141 - _t144);
888 v(9, 12) = _t13*(-_t137 - _t146 - 1);
889 v(9, 13) = _t13*(-_t1 - _t146);
890 v(9, 14) = _t13*(-_t145 - _t28 - _t6);
891 v(9, 15) = _t13*(-_t137 - _t145 - _t29);
892 v(9, 16) = _t60*(-_t1 - _t138 - _t140);
893 v(9, 17) = _t101*(-_t143 - _t31 - _t45);
894 v(9, 18) = _t60*(-_t138 - _t45 - _t6);
895 v(9, 19) = _t101*(-_t140 - _t143 - _t29);
896 v(9, 20) = _t46*_t84;
897 v(9, 21) = _t1*_t42;
898 v(9, 22) = _t25*_t31;
899 v(9, 23) = _t42*_t6;
900 v(9, 24) = _t25*_t29;
901 v(9, 25) = _t52*_t84;
902 v(9, 26) = -8*_t119;
903 }
904 };
905 // <GEN_SHAPE_FUNCS_END>
906
907
908 /**
909 * @brief Element traits for 27-node triquadratic hexahedron (Hex27)
910 *
911 * Hex27 is a high-order 3D hexahedral element with:
912 * - 8 corner nodes (vertices)
913 * - 12 edge mid-nodes
914 * - 6 face center nodes
915 * - 1 body center node
916 *
917 * Used for high-order finite element and spectral element methods.
918 */
919 template <>
921 {
922 // ============================================================
923 // Core Element Identification
924 // ============================================================
925
926 static constexpr ElemType elemType = Hex27;
927 static constexpr int dim = 3;
928 static constexpr int order = 2;
929 static constexpr int numVertices = 8;
930 static constexpr int numNodes = 27;
931 static constexpr int numFaces = 6;
932 static constexpr ParamSpace paramSpace = HexSpace;
933 static constexpr t_real paramSpaceVol = 8.0;
934
935 // ============================================================
936 // Geometry Definition
937 // ============================================================
938
939 /**
940 * @brief Standard coordinates of nodes in parametric space
941 *
942 * Reference cube [-1,1]^3 with nodes:
943 * Nodes 0-7: corners (same as Hex8)
944 * Nodes 8-19: edge midpoints
945 * Nodes 20-25: face centers
946 * Node 26: body center
947 */
948 static constexpr std::array<t_real, 3 * 27> standardCoords = {
949 // Corner nodes (0-7)
950 -1, -1, -1, 1, -1, -1, 1, 1, -1, -1, 1, -1,
951 -1, -1, 1, 1, -1, 1, 1, 1, 1, -1, 1, 1,
952 // Edge midpoints (8-19)
953 0, -1, -1, 1, 0, -1, 0, 1, -1, -1, 0, -1,
954 -1, -1, 0, 1, -1, 0, 1, 1, 0, -1, 1, 0,
955 0, -1, 1, 1, 0, 1, 0, 1, 1, -1, 0, 1,
956 // Face centers (20-25)
957 0, 0, -1, 0, -1, 0, 1, 0, 0, 0, 1, 0,
958 -1, 0, 0, 0, 0, 1,
959 // Body center (26)
960 0, 0, 0};
961
962 // ============================================================
963 // Face/Edge Definitions
964 // ============================================================
965
966 /**
967 * @brief Get the element type of a face
968 * @return Quad9 (all faces are 9-node biquadratic quads)
969 */
970 static constexpr ElemType GetFaceType(t_index /*iFace*/) { return Quad9; }
971
972 /**
973 * @brief Node indices for each face (biquadratic quad)
974 *
975 * Each face has 9 nodes: 4 vertices + 4 edge mids + 1 face center
976 */
977 static constexpr std::array<std::array<t_index, 10>, 6> faceNodes = {{
978 {0, 3, 2, 1, 11, 10, 9, 8, 20}, // Face 0: bottom (z=-1)
979 {0, 1, 5, 4, 8, 13, 16, 12, 21}, // Face 1: back (y=-1)
980 {1, 2, 6, 5, 9, 14, 17, 13, 22}, // Face 2: right (x=+1)
981 {2, 3, 7, 6, 10, 15, 18, 14, 23}, // Face 3: front (y=+1)
982 {0, 4, 7, 3, 12, 19, 15, 11, 24}, // Face 4: left (x=-1)
983 {4, 5, 6, 7, 16, 17, 18, 19, 25}}}; // Face 5: top (z=+1)
984
985 // ============================================================
986 // Order Elevation (P-Refinement)
987 // ============================================================
988
989 /// @brief Element type after order elevation (O2 has no higher elevation defined)
990 static constexpr ElemType elevatedType = UnknownElem;
991
992 /// @brief Number of additional nodes created during elevation (none for O2)
993 static constexpr int numElevNodes = 0;
994
995 // ============================================================
996 // Bisection (Adaptive Refinement)
997 // ============================================================
998
999 /// @brief Number of sub-elements created when bisecting (8 Hex8 elements)
1000 static constexpr int numBisect = 8;
1001
1002 /// @brief Number of bisection variants (only 1 way to uniformly bisect)
1003 static constexpr int numBisectVariants = 1;
1004
1005 /**
1006 * @brief Get the element type of a sub-element after bisection
1007 * @return Hex8 (all sub-elements are trilinear hexes)
1008 */
1009 static constexpr ElemType GetBisectElemType(t_index /*i*/) { return Hex8; }
1010
1011 /**
1012 * @brief Node indices for each sub-element created by bisection
1013 *
1014 * Bisecting creates 8 sub-hexes meeting at the body center node 26.
1015 * Each sub-hex uses corners, edge mids, face centers, and body center.
1016 */
1017 static constexpr std::array<tBisectSub, 8> bisectElements = {{
1018 {0, 8, 20, 11, 12, 21, 26, 24}, // Sub-hex: corner 0 octant
1019 {8, 1, 9, 20, 21, 13, 22, 26}, // Sub-hex: corner 1 octant
1020 {11, 20, 10, 3, 24, 26, 23, 15}, // Sub-hex: corner 3 octant
1021 {20, 9, 2, 10, 26, 22, 14, 23}, // Sub-hex: corner 2 octant
1022 {12, 21, 26, 24, 4, 16, 25, 19}, // Sub-hex: corner 4 octant
1023 {21, 13, 22, 26, 16, 5, 17, 25}, // Sub-hex: corner 5 octant
1024 {24, 26, 23, 15, 19, 25, 18, 7}, // Sub-hex: corner 7 octant
1025 {26, 22, 14, 23, 25, 17, 6, 18}}}; // Sub-hex: corner 6 octant
1026
1027 // ============================================================
1028 // VTK/Visualization Support
1029 // ============================================================
1030
1031 /// @brief VTK cell type identifier (25 = VTK_TRIQUADRATIC_HEXAHEDRON)
1032 static constexpr int vtkCellType = 25;
1033
1034 /**
1035 * @brief VTK node ordering map
1036 *
1037 * VTK has non-trivial node reordering for Hex27:
1038 * VTK nodes 0-7 = corner nodes 0-7
1039 * VTK nodes 8-11 = bottom face edge mids 8-11
1040 * VTK nodes 12-15 = top face edge mids 16-19
1041 * VTK nodes 16-19 = vertical edge mids 12-15
1042 * VTK nodes 20-25 = face centers 21-26 (reordered!)
1043 * Note: Only 20 nodes used by VTK (excludes some face centers)
1044 */
1045 static constexpr std::array<int, 20> vtkNodeOrder = {
1046 0, 1, 2, 3, 4, 5, 6, 7, // Corners
1047 8, 9, 10, 11, // Bottom edges
1048 16, 17, 18, 19, // Top edges (note: reordered)
1049 12, 13, 14, 15}; // Vertical edges
1050 };
1051
1052} // namespace DNDS::Geom::Elem
Core type aliases, constants, and metaprogramming utilities for the DNDS framework.
#define DNDS_DEVICE_CALLABLE
Definition Defines.hpp:76
int32_t t_index
Definition Geometric.hpp:6
double t_real
Definition Geometric.hpp:8
static constexpr ElemType GetBisectElemType(t_index)
Get the element type of a sub-element after bisection.
Definition Hex27.hpp:1009
static constexpr ElemType GetFaceType(t_index)
Get the element type of a face.
Definition Hex27.hpp:970
static DNDS_DEVICE_CALLABLE void Diff1(const TPoint &p, TArray &&v)
Definition Hex27.hpp:91
static DNDS_DEVICE_CALLABLE void Diff2(const TPoint &p, TArray &&v)
Definition Hex27.hpp:254
static DNDS_DEVICE_CALLABLE void Diff0(const TPoint &p, TArray &&v)
Definition Hex27.hpp:22
static DNDS_DEVICE_CALLABLE void Diff3(const TPoint &p, TArray &&v)
Definition Hex27.hpp:562
Eigen::Matrix< real, 5, 1 > v
double order
Definition test_ODE.cpp:257