FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
details.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// This file defines detail implementations as templated functions.
9// This is mainly done due to avoid code duplication for the voxel assembly.
10// \author Maximilian Esser, Peter Zajac
11
13#include <kernel/shape.hpp>
14
15namespace FEAT
16{
17 namespace Space
18 {
19 namespace Lagrange2
20 {
22 namespace Intern
23 {
24 // p0, p1 and p2 are the 1D basis functions on the reference interval [-1,+1].
25 // These are used for the tensor-product approach in the Hypercube evaluators.
26
27 // basis function for left vertex
28 template<typename T_>
29 CUDA_HOST_DEVICE inline T_ p0(T_ x)
30 {
31 return T_(0.5) * x * (x - T_(1));
32 }
33
34 // basis function for right vertex
35 template<typename T_>
36 CUDA_HOST_DEVICE inline T_ p1(T_ x)
37 {
38 return T_(0.5) * x * (x + T_(1));
39 }
40
41 // basis function for edge midpoint
42 template<typename T_>
43 CUDA_HOST_DEVICE inline T_ p2(T_ x)
44 {
45 return (T_(1) - x) * (T_(1) + x);
46 }
47
48 // first order derivatives
49
50 template<typename T_>
51 CUDA_HOST_DEVICE inline T_ d1p0(T_ x)
52 {
53 return x - T_(0.5);
54 }
55
56 template<typename T_>
57 CUDA_HOST_DEVICE inline T_ d1p1(T_ x)
58 {
59 return x + T_(0.5);
60 }
61
62 template<typename T_>
63 CUDA_HOST_DEVICE inline T_ d1p2(T_ x)
64 {
65 return -T_(2) * x;
66 }
67
68 // second order derivatives
69
70 template<typename T_>
71 CUDA_HOST_DEVICE inline T_ d2p0(T_)
72 {
73 return T_(1);
74 }
75
76 template<typename T_>
77 CUDA_HOST_DEVICE inline T_ d2p1(T_)
78 {
79 return T_(1);
80 }
81
82 template<typename T_>
83 CUDA_HOST_DEVICE inline T_ d2p2(T_)
84 {
85 return -T_(2);
86 }
87 } // namespace Intern
89
92 template<typename PointType_, typename DataType_, typename Shape_>
93 struct EvalHelper;
94
95 template<typename PointType_, typename DataType_>
96 struct EvalHelper<PointType_, DataType_, Shape::Simplex<2>>
97 {
98 typedef DataType_ DataType;
99
100 CUDA_HOST_DEVICE static constexpr int get_num_local_dofs()
101 {
102 return 6;
103 }
104
105 template<typename EvalData_>
106 CUDA_HOST_DEVICE static inline void eval_ref_values(EvalData_& data, const PointType_& point)
107 {
108 // vertex dofs
109 data.phi[0].ref_value = DataType(2) * (point[0] + point[1] - DataType(0.5)) * (point[0] + point[1] - DataType(1));
110 data.phi[1].ref_value = DataType(2) * point[0] * (point[0] - DataType(0.5));
111 data.phi[2].ref_value = DataType(2) * point[1] * (point[1] - DataType(0.5));
112 // edge dofs
113 data.phi[3].ref_value = DataType(4) * point[0] * point[1];
114 data.phi[4].ref_value = DataType(4) * point[1] * (DataType(1) - point[0] - point[1]);
115 data.phi[5].ref_value = DataType(4) * point[0] * (DataType(1) - point[0] - point[1]);
116 }
117
118 template<typename EvalData_>
119 CUDA_HOST_DEVICE static inline void eval_ref_gradients(
120 EvalData_& data,
121 const PointType_& point)
122 {
123 // vertex dofs
124 data.phi[0].ref_grad[0] = DataType(4) * (point[0] + point[1]) - DataType(3);
125 data.phi[0].ref_grad[1] = DataType(4) * (point[0] + point[1]) - DataType(3);
126 data.phi[1].ref_grad[0] = DataType(4) * point[0] - DataType(1);
127 data.phi[1].ref_grad[1] = DataType(0);
128 data.phi[2].ref_grad[0] = DataType(0);
129 data.phi[2].ref_grad[1] = DataType(4) * point[1] - DataType(1);
130 // edge dofs
131 data.phi[3].ref_grad[0] = DataType(4) * point[1];
132 data.phi[3].ref_grad[1] = DataType(4) * point[0];
133 data.phi[4].ref_grad[0] = -DataType(4) * point[1];
134 data.phi[4].ref_grad[1] = -DataType(4) * (DataType(2)*point[1] + point[0] - DataType(1));
135 data.phi[5].ref_grad[0] = -DataType(4) * (DataType(2)*point[0] + point[1] - DataType(1));
136 data.phi[5].ref_grad[1] = -DataType(4) * point[0];
137 }
138
139 template<typename EvalData_>
140 CUDA_HOST_DEVICE static inline void eval_ref_hessians(
141 EvalData_& data,
142 const PointType_& DOXY(point))
143 {
144 // vertex dofs
145 data.phi[0].ref_hess[0][0] = data.phi[0].ref_hess[1][1] =
146 data.phi[0].ref_hess[0][1] = data.phi[0].ref_hess[1][0] = DataType(4);
147 data.phi[1].ref_hess[0][0] = DataType(4);
148 data.phi[1].ref_hess[1][1] = data.phi[1].ref_hess[0][1] = data.phi[1].ref_hess[1][0] = DataType(0);
149 data.phi[2].ref_hess[1][1] = DataType(4);
150 data.phi[2].ref_hess[0][0] = data.phi[2].ref_hess[0][1] = data.phi[2].ref_hess[1][0] = DataType(0);
151 // edge dofs
152 data.phi[3].ref_hess[0][0] = data.phi[3].ref_hess[1][1] = DataType(0);
153 data.phi[3].ref_hess[0][1] = data.phi[3].ref_hess[1][0] = DataType(4);
154 data.phi[4].ref_hess[0][0] = DataType(0);
155 data.phi[4].ref_hess[1][1] = -DataType(8);
156 data.phi[4].ref_hess[0][1] = data.phi[4].ref_hess[1][0] = -DataType(4);
157 data.phi[5].ref_hess[0][0] = -DataType(8);
158 data.phi[5].ref_hess[1][1] = DataType(0);
159 data.phi[5].ref_hess[0][1] = data.phi[5].ref_hess[1][0] = -DataType(4);
160 }
161 };
162
163 template<typename PointType_, typename DataType_>
164 struct EvalHelper<PointType_, DataType_, Shape::Simplex<3>>
165 {
166 typedef DataType_ DataType;
167
168 CUDA_HOST_DEVICE static constexpr int get_num_local_dofs()
169 {
170 return 10;
171 }
172
173 template<typename EvalData_>
174 CUDA_HOST_DEVICE static inline void eval_ref_values(EvalData_& data, const PointType_& point)
175 {
176 // vertex dofs
177 data.phi[0].ref_value = DataType(2) * (point[0] + point[1] + point[2] - DataType(0.5)) * (point[0] + point[1] + point[2] - DataType(1));
178 data.phi[1].ref_value = DataType(2) * point[0] * (point[0] - DataType(0.5));
179 data.phi[2].ref_value = DataType(2) * point[1] * (point[1] - DataType(0.5));
180 data.phi[3].ref_value = DataType(2) * point[2] * (point[2] - DataType(0.5));
181 // edge dofs
182 data.phi[4].ref_value = DataType(4) * point[0] * (DataType(1) - point[0] - point[1] - point[2]);
183 data.phi[5].ref_value = DataType(4) * point[1] * (DataType(1) - point[0] - point[1] - point[2]);
184 data.phi[6].ref_value = DataType(4) * point[2] * (DataType(1) - point[0] - point[1] - point[2]);
185 data.phi[7].ref_value = DataType(4) * point[0] * point[1];
186 data.phi[8].ref_value = DataType(4) * point[0] * point[2];
187 data.phi[9].ref_value = DataType(4) * point[1] * point[2];
188 }
189
190 template<typename EvalData_>
191 CUDA_HOST_DEVICE static inline void eval_ref_gradients(
192 EvalData_& data,
193 const PointType_& point)
194 {
195 // vertex dofs
196 data.phi[0].ref_grad[0] = DataType(4) * (point[0] + point[1] + point[2]) - DataType(3);
197 data.phi[0].ref_grad[1] = DataType(4) * (point[0] + point[1] + point[2]) - DataType(3);
198 data.phi[0].ref_grad[2] = DataType(4) * (point[0] + point[1] + point[2]) - DataType(3);
199 data.phi[1].ref_grad[0] = DataType(4) * point[0] - DataType(1);
200 data.phi[1].ref_grad[1] = DataType(0);
201 data.phi[1].ref_grad[2] = DataType(0);
202 data.phi[2].ref_grad[0] = DataType(0);
203 data.phi[2].ref_grad[1] = DataType(4) * point[1] - DataType(1);
204 data.phi[2].ref_grad[2] = DataType(0);
205 data.phi[3].ref_grad[0] = DataType(0);
206 data.phi[3].ref_grad[1] = DataType(0);
207 data.phi[3].ref_grad[2] = DataType(4) * point[2] - DataType(1);
208 // edge dofs
209 data.phi[4].ref_grad[0] = -DataType(4) * (DataType(2)*point[0] + point[1] + point[2] - DataType(1));
210 data.phi[4].ref_grad[1] = -DataType(4) * point[0];
211 data.phi[4].ref_grad[2] = -DataType(4) * point[0];
212 data.phi[5].ref_grad[0] = -DataType(4) * point[1];
213 data.phi[5].ref_grad[1] = -DataType(4) * (DataType(2)*point[1] + point[0] + point[2] - DataType(1));
214 data.phi[5].ref_grad[2] = -DataType(4) * point[1];
215 data.phi[6].ref_grad[0] = -DataType(4) * point[2];
216 data.phi[6].ref_grad[1] = -DataType(4) * point[2];
217 data.phi[6].ref_grad[2] = -DataType(4) * (DataType(2)*point[2] + point[0] + point[1] - DataType(1));
218 data.phi[7].ref_grad[0] = DataType(4) * point[1];
219 data.phi[7].ref_grad[1] = DataType(4) * point[0];
220 data.phi[7].ref_grad[2] = DataType(0);
221 data.phi[8].ref_grad[0] = DataType(4) * point[2];
222 data.phi[8].ref_grad[1] = DataType(0);
223 data.phi[8].ref_grad[2] = DataType(4) * point[0];
224 data.phi[9].ref_grad[0] = DataType(0);
225 data.phi[9].ref_grad[1] = DataType(4) * point[2];
226 data.phi[9].ref_grad[2] = DataType(4) * point[1];
227 }
228
229 template<typename EvalData_>
230 CUDA_HOST_DEVICE static inline void eval_ref_hessians(
231 EvalData_& data,
232 const PointType_& DOXY(point))
233 {
234 // vertex dofs
235 data.phi[0].ref_hess[0][0] = DataType(4);
236 data.phi[0].ref_hess[1][1] = DataType(4);
237 data.phi[0].ref_hess[2][2] = DataType(4);
238 data.phi[0].ref_hess[0][1] = data.phi[0].ref_hess[1][0] = DataType(4);
239 data.phi[0].ref_hess[0][2] = data.phi[0].ref_hess[2][0] = DataType(4);
240 data.phi[0].ref_hess[1][2] = data.phi[0].ref_hess[2][1] = DataType(4);
241
242 data.phi[1].ref_hess[0][0] = DataType(4);
243 data.phi[1].ref_hess[1][1] = DataType(0);
244 data.phi[1].ref_hess[2][2] = DataType(0);
245 data.phi[1].ref_hess[0][1] = data.phi[1].ref_hess[1][0] = DataType(0);
246 data.phi[1].ref_hess[0][2] = data.phi[1].ref_hess[2][0] = DataType(0);
247 data.phi[1].ref_hess[1][2] = data.phi[1].ref_hess[2][1] = DataType(0);
248
249 data.phi[2].ref_hess[0][0] = DataType(0);
250 data.phi[2].ref_hess[1][1] = DataType(4);
251 data.phi[2].ref_hess[2][2] = DataType(0);
252 data.phi[2].ref_hess[0][1] = data.phi[2].ref_hess[1][0] = DataType(0);
253 data.phi[2].ref_hess[0][2] = data.phi[2].ref_hess[2][0] = DataType(0);
254 data.phi[2].ref_hess[1][2] = data.phi[2].ref_hess[2][1] = DataType(0);
255
256 data.phi[3].ref_hess[0][0] = DataType(0);
257 data.phi[3].ref_hess[1][1] = DataType(0);
258 data.phi[3].ref_hess[2][2] = DataType(4);
259 data.phi[3].ref_hess[0][1] = data.phi[3].ref_hess[1][0] = DataType(0);
260 data.phi[3].ref_hess[0][2] = data.phi[3].ref_hess[2][0] = DataType(0);
261 data.phi[3].ref_hess[1][2] = data.phi[3].ref_hess[2][1] = DataType(0);
262
263 // edge dofs
264 data.phi[4].ref_hess[0][0] = -DataType(8);
265 data.phi[4].ref_hess[1][1] = DataType(0);
266 data.phi[4].ref_hess[2][2] = DataType(0);
267 data.phi[4].ref_hess[0][1] = data.phi[4].ref_hess[1][0] = -DataType(4);
268 data.phi[4].ref_hess[0][2] = data.phi[4].ref_hess[2][0] = -DataType(4);
269 data.phi[4].ref_hess[1][2] = data.phi[4].ref_hess[2][1] = DataType(0);
270
271 data.phi[5].ref_hess[0][0] = DataType(0);
272 data.phi[5].ref_hess[1][1] = -DataType(8);
273 data.phi[5].ref_hess[2][2] = DataType(0);
274 data.phi[5].ref_hess[0][1] = data.phi[5].ref_hess[1][0] = -DataType(4);
275 data.phi[5].ref_hess[0][2] = data.phi[5].ref_hess[2][0] = DataType(0);
276 data.phi[5].ref_hess[1][2] = data.phi[5].ref_hess[2][1] = -DataType(4);
277
278 data.phi[6].ref_hess[0][0] = DataType(0);
279 data.phi[6].ref_hess[1][1] = DataType(0);
280 data.phi[6].ref_hess[2][2] = -DataType(8);
281 data.phi[6].ref_hess[0][1] = data.phi[6].ref_hess[1][0] = DataType(0);
282 data.phi[6].ref_hess[0][2] = data.phi[6].ref_hess[2][0] = -DataType(4);
283 data.phi[6].ref_hess[1][2] = data.phi[6].ref_hess[2][1] = -DataType(4);
284
285 data.phi[7].ref_hess[0][0] = DataType(0);
286 data.phi[7].ref_hess[1][1] = DataType(0);
287 data.phi[7].ref_hess[2][2] = DataType(0);
288 data.phi[7].ref_hess[0][1] = data.phi[7].ref_hess[1][0] = DataType(4);
289 data.phi[7].ref_hess[0][2] = data.phi[7].ref_hess[2][0] = DataType(0);
290 data.phi[7].ref_hess[1][2] = data.phi[7].ref_hess[2][1] = DataType(0);
291
292 data.phi[8].ref_hess[0][0] = DataType(0);
293 data.phi[8].ref_hess[1][1] = DataType(0);
294 data.phi[8].ref_hess[2][2] = DataType(0);
295 data.phi[8].ref_hess[0][1] = data.phi[8].ref_hess[1][0] = DataType(0);
296 data.phi[8].ref_hess[0][2] = data.phi[8].ref_hess[2][0] = DataType(4);
297 data.phi[8].ref_hess[1][2] = data.phi[8].ref_hess[2][1] = DataType(0);
298
299 data.phi[9].ref_hess[0][0] = DataType(0);
300 data.phi[9].ref_hess[1][1] = DataType(0);
301 data.phi[9].ref_hess[2][2] = DataType(0);
302 data.phi[9].ref_hess[0][1] = data.phi[9].ref_hess[1][0] = DataType(0);
303 data.phi[9].ref_hess[0][2] = data.phi[9].ref_hess[2][0] = DataType(0);
304 data.phi[9].ref_hess[1][2] = data.phi[9].ref_hess[2][1] = DataType(4);
305 }
306 };
307
308 template<typename PointType_, typename DataType_>
309 struct EvalHelper<PointType_, DataType_, Shape::Hypercube<1>>
310 {
311 typedef DataType_ DataType;
312
313 CUDA_HOST_DEVICE static constexpr int get_num_local_dofs()
314 {
315 return 3;
316 }
317
318 template<typename EvalData_>
319 CUDA_HOST_DEVICE static inline void eval_ref_values(EvalData_& data, const PointType_& point)
320 {
321 data.phi[0].ref_value = Intern::p0(point[0]);
322 data.phi[1].ref_value = Intern::p1(point[0]);
323 data.phi[2].ref_value = Intern::p2(point[0]);
324 }
325
326 template<typename EvalData_>
327 CUDA_HOST_DEVICE static inline void eval_ref_gradients(
328 EvalData_& data,
329 const PointType_& point)
330 {
331 data.phi[0].ref_grad[0] = Intern::d1p0(point[0]);
332 data.phi[1].ref_grad[0] = Intern::d1p1(point[0]);
333 data.phi[2].ref_grad[0] = Intern::d1p2(point[0]);
334 }
335
336 template<typename EvalData_>
337 CUDA_HOST_DEVICE static inline void eval_ref_hessians(
338 EvalData_& data,
339 const PointType_& point)
340 {
341 data.phi[0].ref_hess[0][0] = Intern::d2p0(point[0]);
342 data.phi[1].ref_hess[0][0] = Intern::d2p1(point[0]);
343 data.phi[2].ref_hess[0][0] = Intern::d2p2(point[0]);
344 }
345 };
346
347 template<typename PointType_, typename DataType_>
348 struct EvalHelper<PointType_, DataType_, Shape::Hypercube<2>>
349 {
350 typedef DataType_ DataType;
351
352 CUDA_HOST_DEVICE static constexpr int get_num_local_dofs()
353 {
354 return 9;
355 }
356
357 template<typename EvalData_>
358 CUDA_HOST_DEVICE static inline void eval_ref_values(EvalData_& data, const PointType_& point)
359 {
360 using namespace Lagrange2::Intern;
361
362 // vertex dofs
363 data.phi[0].ref_value = p0(point[0]) * p0(point[1]);
364 data.phi[1].ref_value = p1(point[0]) * p0(point[1]);
365 data.phi[2].ref_value = p0(point[0]) * p1(point[1]);
366 data.phi[3].ref_value = p1(point[0]) * p1(point[1]);
367 // edge dofs
368 data.phi[4].ref_value = p2(point[0]) * p0(point[1]);
369 data.phi[5].ref_value = p2(point[0]) * p1(point[1]);
370 data.phi[6].ref_value = p0(point[0]) * p2(point[1]);
371 data.phi[7].ref_value = p1(point[0]) * p2(point[1]);
372 // center dof
373 data.phi[8].ref_value = p2(point[0]) * p2(point[1]);
374 }
375
376 template<typename EvalData_>
377 CUDA_HOST_DEVICE static inline void eval_ref_gradients(
378 EvalData_& data,
379 const PointType_& point)
380 {
381 using namespace Lagrange2::Intern;
382
383 // vertex dofs
384 data.phi[0].ref_grad[0] = d1p0(point[0]) * p0(point[1]);
385 data.phi[0].ref_grad[1] = p0(point[0]) * d1p0(point[1]);
386 data.phi[1].ref_grad[0] = d1p1(point[0]) * p0(point[1]);
387 data.phi[1].ref_grad[1] = p1(point[0]) * d1p0(point[1]);
388 data.phi[2].ref_grad[0] = d1p0(point[0]) * p1(point[1]);
389 data.phi[2].ref_grad[1] = p0(point[0]) * d1p1(point[1]);
390 data.phi[3].ref_grad[0] = d1p1(point[0]) * p1(point[1]);
391 data.phi[3].ref_grad[1] = p1(point[0]) * d1p1(point[1]);
392 // edge dofs
393 data.phi[4].ref_grad[0] = d1p2(point[0]) * p0(point[1]);
394 data.phi[4].ref_grad[1] = p2(point[0]) * d1p0(point[1]);
395 data.phi[5].ref_grad[0] = d1p2(point[0]) * p1(point[1]);
396 data.phi[5].ref_grad[1] = p2(point[0]) * d1p1(point[1]);
397 data.phi[6].ref_grad[0] = d1p0(point[0]) * p2(point[1]);
398 data.phi[6].ref_grad[1] = p0(point[0]) * d1p2(point[1]);
399 data.phi[7].ref_grad[0] = d1p1(point[0]) * p2(point[1]);
400 data.phi[7].ref_grad[1] = p1(point[0]) * d1p2(point[1]);
401 // center dof
402 data.phi[8].ref_grad[0] = d1p2(point[0]) * p2(point[1]);
403 data.phi[8].ref_grad[1] = p2(point[0]) * d1p2(point[1]);
404 }
405
406 template<typename EvalData_>
407 CUDA_HOST_DEVICE static inline void eval_ref_hessians(
408 EvalData_& data,
409 const PointType_& point)
410 {
411 using namespace Lagrange2::Intern;
412
413 // vertex dofs
414 data.phi[0].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]);
415 data.phi[0].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]);
416 data.phi[0].ref_hess[1][0] =
417 data.phi[0].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]);
418 data.phi[1].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]);
419 data.phi[1].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]);
420 data.phi[1].ref_hess[1][0] =
421 data.phi[1].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]);
422 data.phi[2].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]);
423 data.phi[2].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]);
424 data.phi[2].ref_hess[1][0] =
425 data.phi[2].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]);
426 data.phi[3].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]);
427 data.phi[3].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]);
428 data.phi[3].ref_hess[1][0] =
429 data.phi[3].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]);
430 // edge dofs
431 data.phi[4].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]);
432 data.phi[4].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]);
433 data.phi[4].ref_hess[1][0] =
434 data.phi[4].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]);
435 data.phi[5].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]);
436 data.phi[5].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]);
437 data.phi[5].ref_hess[1][0] =
438 data.phi[5].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]);
439 data.phi[6].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]);
440 data.phi[6].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]);
441 data.phi[6].ref_hess[1][0] =
442 data.phi[6].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]);
443 data.phi[7].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]);
444 data.phi[7].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]);
445 data.phi[7].ref_hess[1][0] =
446 data.phi[7].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]);
447 // center dof
448 data.phi[8].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]);
449 data.phi[8].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]);
450 data.phi[8].ref_hess[1][0] =
451 data.phi[8].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]);
452 }
453 };
454
455 template<typename PointType_, typename DataType_>
456 struct EvalHelper<PointType_, DataType_, Shape::Hypercube<3>>
457 {
458 typedef DataType_ DataType;
459
460 CUDA_HOST_DEVICE static constexpr int get_num_local_dofs()
461 {
462 return 27;
463 }
464
465 template<typename EvalData_>
466 CUDA_HOST_DEVICE static inline void eval_ref_values(EvalData_& data, const PointType_& point)
467 {
468 using namespace Lagrange2::Intern;
469
470 // vertex dofs
471 data.phi[0].ref_value = p0(point[0]) * p0(point[1]) * p0(point[2]);
472 data.phi[1].ref_value = p1(point[0]) * p0(point[1]) * p0(point[2]);
473 data.phi[2].ref_value = p0(point[0]) * p1(point[1]) * p0(point[2]);
474 data.phi[3].ref_value = p1(point[0]) * p1(point[1]) * p0(point[2]);
475 data.phi[4].ref_value = p0(point[0]) * p0(point[1]) * p1(point[2]);
476 data.phi[5].ref_value = p1(point[0]) * p0(point[1]) * p1(point[2]);
477 data.phi[6].ref_value = p0(point[0]) * p1(point[1]) * p1(point[2]);
478 data.phi[7].ref_value = p1(point[0]) * p1(point[1]) * p1(point[2]);
479 // edge dofs
480 data.phi[ 8].ref_value = p2(point[0]) * p0(point[1]) * p0(point[2]);
481 data.phi[ 9].ref_value = p2(point[0]) * p1(point[1]) * p0(point[2]);
482 data.phi[10].ref_value = p2(point[0]) * p0(point[1]) * p1(point[2]);
483 data.phi[11].ref_value = p2(point[0]) * p1(point[1]) * p1(point[2]);
484 data.phi[12].ref_value = p0(point[0]) * p2(point[1]) * p0(point[2]);
485 data.phi[13].ref_value = p1(point[0]) * p2(point[1]) * p0(point[2]);
486 data.phi[14].ref_value = p0(point[0]) * p2(point[1]) * p1(point[2]);
487 data.phi[15].ref_value = p1(point[0]) * p2(point[1]) * p1(point[2]);
488 data.phi[16].ref_value = p0(point[0]) * p0(point[1]) * p2(point[2]);
489 data.phi[17].ref_value = p1(point[0]) * p0(point[1]) * p2(point[2]);
490 data.phi[18].ref_value = p0(point[0]) * p1(point[1]) * p2(point[2]);
491 data.phi[19].ref_value = p1(point[0]) * p1(point[1]) * p2(point[2]);
492 // face dofs
493 data.phi[20].ref_value = p2(point[0]) * p2(point[1]) * p0(point[2]);
494 data.phi[21].ref_value = p2(point[0]) * p2(point[1]) * p1(point[2]);
495 data.phi[22].ref_value = p2(point[0]) * p0(point[1]) * p2(point[2]);
496 data.phi[23].ref_value = p2(point[0]) * p1(point[1]) * p2(point[2]);
497 data.phi[24].ref_value = p0(point[0]) * p2(point[1]) * p2(point[2]);
498 data.phi[25].ref_value = p1(point[0]) * p2(point[1]) * p2(point[2]);
499 // center dof
500 data.phi[26].ref_value = p2(point[0]) * p2(point[1]) * p2(point[2]);
501 }
502
503 template<typename EvalData_>
504 CUDA_HOST_DEVICE static inline void eval_ref_gradients(
505 EvalData_& data,
506 const PointType_& point)
507 {
508 using namespace Lagrange2::Intern;
509 // vertex dofs
510 data.phi[0].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p0(point[2]);
511 data.phi[0].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p0(point[2]);
512 data.phi[0].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p0(point[2]);
513 data.phi[1].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p0(point[2]);
514 data.phi[1].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p0(point[2]);
515 data.phi[1].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p0(point[2]);
516 data.phi[2].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p0(point[2]);
517 data.phi[2].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p0(point[2]);
518 data.phi[2].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p0(point[2]);
519 data.phi[3].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p0(point[2]);
520 data.phi[3].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p0(point[2]);
521 data.phi[3].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p0(point[2]);
522 data.phi[4].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p1(point[2]);
523 data.phi[4].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p1(point[2]);
524 data.phi[4].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p1(point[2]);
525 data.phi[5].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p1(point[2]);
526 data.phi[5].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p1(point[2]);
527 data.phi[5].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p1(point[2]);
528 data.phi[6].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p1(point[2]);
529 data.phi[6].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p1(point[2]);
530 data.phi[6].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p1(point[2]);
531 data.phi[7].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p1(point[2]);
532 data.phi[7].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p1(point[2]);
533 data.phi[7].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p1(point[2]);
534 // edge dofs
535 data.phi[ 8].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p0(point[2]);
536 data.phi[ 8].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p0(point[2]);
537 data.phi[ 8].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p0(point[2]);
538 data.phi[ 9].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p0(point[2]);
539 data.phi[ 9].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p0(point[2]);
540 data.phi[ 9].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p0(point[2]);
541 data.phi[10].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p1(point[2]);
542 data.phi[10].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p1(point[2]);
543 data.phi[10].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p1(point[2]);
544 data.phi[11].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p1(point[2]);
545 data.phi[11].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p1(point[2]);
546 data.phi[11].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p1(point[2]);
547 data.phi[12].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p0(point[2]);
548 data.phi[12].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p0(point[2]);
549 data.phi[12].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p0(point[2]);
550 data.phi[13].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p0(point[2]);
551 data.phi[13].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p0(point[2]);
552 data.phi[13].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p0(point[2]);
553 data.phi[14].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p1(point[2]);
554 data.phi[14].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p1(point[2]);
555 data.phi[14].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p1(point[2]);
556 data.phi[15].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p1(point[2]);
557 data.phi[15].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p1(point[2]);
558 data.phi[15].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p1(point[2]);
559 data.phi[16].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p2(point[2]);
560 data.phi[16].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p2(point[2]);
561 data.phi[16].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p2(point[2]);
562 data.phi[17].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p2(point[2]);
563 data.phi[17].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p2(point[2]);
564 data.phi[17].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p2(point[2]);
565 data.phi[18].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p2(point[2]);
566 data.phi[18].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p2(point[2]);
567 data.phi[18].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p2(point[2]);
568 data.phi[19].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p2(point[2]);
569 data.phi[19].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p2(point[2]);
570 data.phi[19].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p2(point[2]);
571 // face dofs
572 data.phi[20].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p0(point[2]);
573 data.phi[20].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p0(point[2]);
574 data.phi[20].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p0(point[2]);
575 data.phi[21].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p1(point[2]);
576 data.phi[21].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p1(point[2]);
577 data.phi[21].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p1(point[2]);
578 data.phi[22].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p2(point[2]);
579 data.phi[22].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p2(point[2]);
580 data.phi[22].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p2(point[2]);
581 data.phi[23].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p2(point[2]);
582 data.phi[23].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p2(point[2]);
583 data.phi[23].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p2(point[2]);
584 data.phi[24].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p2(point[2]);
585 data.phi[24].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p2(point[2]);
586 data.phi[24].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p2(point[2]);
587 data.phi[25].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p2(point[2]);
588 data.phi[25].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p2(point[2]);
589 data.phi[25].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p2(point[2]);
590 // center dof
591 data.phi[26].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p2(point[2]);
592 data.phi[26].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p2(point[2]);
593 data.phi[26].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p2(point[2]);
594 }
595
596 template<typename EvalData_>
597 CUDA_HOST_DEVICE static inline void eval_ref_hessians(
598 EvalData_& data,
599 const PointType_& point)
600 {
601 using namespace Lagrange2::Intern;
602 // vertex dofs
603 data.phi[ 0].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p0(point[2]);
604 data.phi[ 0].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p0(point[2]);
605 data.phi[ 0].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p0(point[2]);
606 data.phi[ 0].ref_hess[1][0] =
607 data.phi[ 0].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]) * p0(point[2]);
608 data.phi[ 0].ref_hess[2][0] =
609 data.phi[ 0].ref_hess[0][2] = d1p0(point[0]) * p0(point[1]) * d1p0(point[2]);
610 data.phi[ 0].ref_hess[2][1] =
611 data.phi[ 0].ref_hess[1][2] = p0(point[0]) * d1p0(point[1]) * d1p0(point[2]);
612 data.phi[ 1].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p0(point[2]);
613 data.phi[ 1].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p0(point[2]);
614 data.phi[ 1].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p0(point[2]);
615 data.phi[ 1].ref_hess[1][0] =
616 data.phi[ 1].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]) * p0(point[2]);
617 data.phi[ 1].ref_hess[2][0] =
618 data.phi[ 1].ref_hess[0][2] = d1p1(point[0]) * p0(point[1]) * d1p0(point[2]);
619 data.phi[ 1].ref_hess[2][1] =
620 data.phi[ 1].ref_hess[1][2] = p1(point[0]) * d1p0(point[1]) * d1p0(point[2]);
621 data.phi[ 2].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p0(point[2]);
622 data.phi[ 2].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p0(point[2]);
623 data.phi[ 2].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p0(point[2]);
624 data.phi[ 2].ref_hess[1][0] =
625 data.phi[ 2].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]) * p0(point[2]);
626 data.phi[ 2].ref_hess[2][0] =
627 data.phi[ 2].ref_hess[0][2] = d1p0(point[0]) * p1(point[1]) * d1p0(point[2]);
628 data.phi[ 2].ref_hess[2][1] =
629 data.phi[ 2].ref_hess[1][2] = p0(point[0]) * d1p1(point[1]) * d1p0(point[2]);
630 data.phi[ 3].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p0(point[2]);
631 data.phi[ 3].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p0(point[2]);
632 data.phi[ 3].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p0(point[2]);
633 data.phi[ 3].ref_hess[1][0] =
634 data.phi[ 3].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]) * p0(point[2]);
635 data.phi[ 3].ref_hess[2][0] =
636 data.phi[ 3].ref_hess[0][2] = d1p1(point[0]) * p1(point[1]) * d1p0(point[2]);
637 data.phi[ 3].ref_hess[2][1] =
638 data.phi[ 3].ref_hess[1][2] = p1(point[0]) * d1p1(point[1]) * d1p0(point[2]);
639 data.phi[ 4].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p1(point[2]);
640 data.phi[ 4].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p1(point[2]);
641 data.phi[ 4].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p1(point[2]);
642 data.phi[ 4].ref_hess[1][0] =
643 data.phi[ 4].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]) * p1(point[2]);
644 data.phi[ 4].ref_hess[2][0] =
645 data.phi[ 4].ref_hess[0][2] = d1p0(point[0]) * p0(point[1]) * d1p1(point[2]);
646 data.phi[ 4].ref_hess[2][1] =
647 data.phi[ 4].ref_hess[1][2] = p0(point[0]) * d1p0(point[1]) * d1p1(point[2]);
648 data.phi[ 5].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p1(point[2]);
649 data.phi[ 5].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p1(point[2]);
650 data.phi[ 5].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p1(point[2]);
651 data.phi[ 5].ref_hess[1][0] =
652 data.phi[ 5].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]) * p1(point[2]);
653 data.phi[ 5].ref_hess[2][0] =
654 data.phi[ 5].ref_hess[0][2] = d1p1(point[0]) * p0(point[1]) * d1p1(point[2]);
655 data.phi[ 5].ref_hess[2][1] =
656 data.phi[ 5].ref_hess[1][2] = p1(point[0]) * d1p0(point[1]) * d1p1(point[2]);
657 data.phi[ 6].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p1(point[2]);
658 data.phi[ 6].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p1(point[2]);
659 data.phi[ 6].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p1(point[2]);
660 data.phi[ 6].ref_hess[1][0] =
661 data.phi[ 6].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]) * p1(point[2]);
662 data.phi[ 6].ref_hess[2][0] =
663 data.phi[ 6].ref_hess[0][2] = d1p0(point[0]) * p1(point[1]) * d1p1(point[2]);
664 data.phi[ 6].ref_hess[2][1] =
665 data.phi[ 6].ref_hess[1][2] = p0(point[0]) * d1p1(point[1]) * d1p1(point[2]);
666 data.phi[ 7].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p1(point[2]);
667 data.phi[ 7].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p1(point[2]);
668 data.phi[ 7].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p1(point[2]);
669 data.phi[ 7].ref_hess[1][0] =
670 data.phi[ 7].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]) * p1(point[2]);
671 data.phi[ 7].ref_hess[2][0] =
672 data.phi[ 7].ref_hess[0][2] = d1p1(point[0]) * p1(point[1]) * d1p1(point[2]);
673 data.phi[ 7].ref_hess[2][1] =
674 data.phi[ 7].ref_hess[1][2] = p1(point[0]) * d1p1(point[1]) * d1p1(point[2]);
675
676 // edge dofs
677 data.phi[ 8].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p0(point[2]);
678 data.phi[ 8].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p0(point[2]);
679 data.phi[ 8].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p0(point[2]);
680 data.phi[ 8].ref_hess[1][0] =
681 data.phi[ 8].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]) * p0(point[2]);
682 data.phi[ 8].ref_hess[2][0] =
683 data.phi[ 8].ref_hess[0][2] = d1p2(point[0]) * p0(point[1]) * d1p0(point[2]);
684 data.phi[ 8].ref_hess[2][1] =
685 data.phi[ 8].ref_hess[1][2] = p2(point[0]) * d1p0(point[1]) * d1p0(point[2]);
686 data.phi[ 9].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p0(point[2]);
687 data.phi[ 9].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p0(point[2]);
688 data.phi[ 9].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p0(point[2]);
689 data.phi[ 9].ref_hess[1][0] =
690 data.phi[ 9].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]) * p0(point[2]);
691 data.phi[ 9].ref_hess[2][0] =
692 data.phi[ 9].ref_hess[0][2] = d1p2(point[0]) * p1(point[1]) * d1p0(point[2]);
693 data.phi[ 9].ref_hess[2][1] =
694 data.phi[ 9].ref_hess[1][2] = p2(point[0]) * d1p1(point[1]) * d1p0(point[2]);
695 data.phi[10].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p1(point[2]);
696 data.phi[10].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p1(point[2]);
697 data.phi[10].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p1(point[2]);
698 data.phi[10].ref_hess[1][0] =
699 data.phi[10].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]) * p1(point[2]);
700 data.phi[10].ref_hess[2][0] =
701 data.phi[10].ref_hess[0][2] = d1p2(point[0]) * p0(point[1]) * d1p1(point[2]);
702 data.phi[10].ref_hess[2][1] =
703 data.phi[10].ref_hess[1][2] = p2(point[0]) * d1p0(point[1]) * d1p1(point[2]);
704 data.phi[11].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p1(point[2]);
705 data.phi[11].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p1(point[2]);
706 data.phi[11].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p1(point[2]);
707 data.phi[11].ref_hess[1][0] =
708 data.phi[11].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]) * p1(point[2]);
709 data.phi[11].ref_hess[2][0] =
710 data.phi[11].ref_hess[0][2] = d1p2(point[0]) * p1(point[1]) * d1p1(point[2]);
711 data.phi[11].ref_hess[2][1] =
712 data.phi[11].ref_hess[1][2] = p2(point[0]) * d1p1(point[1]) * d1p1(point[2]);
713 data.phi[12].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p0(point[2]);
714 data.phi[12].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p0(point[2]);
715 data.phi[12].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p0(point[2]);
716 data.phi[12].ref_hess[1][0] =
717 data.phi[12].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]) * p0(point[2]);
718 data.phi[12].ref_hess[2][0] =
719 data.phi[12].ref_hess[0][2] = d1p0(point[0]) * p2(point[1]) * d1p0(point[2]);
720 data.phi[12].ref_hess[2][1] =
721 data.phi[12].ref_hess[1][2] = p0(point[0]) * d1p2(point[1]) * d1p0(point[2]);
722 data.phi[13].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p0(point[2]);
723 data.phi[13].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p0(point[2]);
724 data.phi[13].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p0(point[2]);
725 data.phi[13].ref_hess[1][0] =
726 data.phi[13].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]) * p0(point[2]);
727 data.phi[13].ref_hess[2][0] =
728 data.phi[13].ref_hess[0][2] = d1p1(point[0]) * p2(point[1]) * d1p0(point[2]);
729 data.phi[13].ref_hess[2][1] =
730 data.phi[13].ref_hess[1][2] = p1(point[0]) * d1p2(point[1]) * d1p0(point[2]);
731 data.phi[14].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p1(point[2]);
732 data.phi[14].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p1(point[2]);
733 data.phi[14].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p1(point[2]);
734 data.phi[14].ref_hess[1][0] =
735 data.phi[14].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]) * p1(point[2]);
736 data.phi[14].ref_hess[2][0] =
737 data.phi[14].ref_hess[0][2] = d1p0(point[0]) * p2(point[1]) * d1p1(point[2]);
738 data.phi[14].ref_hess[2][1] =
739 data.phi[14].ref_hess[1][2] = p0(point[0]) * d1p2(point[1]) * d1p1(point[2]);
740 data.phi[15].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p1(point[2]);
741 data.phi[15].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p1(point[2]);
742 data.phi[15].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p1(point[2]);
743 data.phi[15].ref_hess[1][0] =
744 data.phi[15].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]) * p1(point[2]);
745 data.phi[15].ref_hess[2][0] =
746 data.phi[15].ref_hess[0][2] = d1p1(point[0]) * p2(point[1]) * d1p1(point[2]);
747 data.phi[15].ref_hess[2][1] =
748 data.phi[15].ref_hess[1][2] = p1(point[0]) * d1p2(point[1]) * d1p1(point[2]);
749 data.phi[16].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p2(point[2]);
750 data.phi[16].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p2(point[2]);
751 data.phi[16].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p2(point[2]);
752 data.phi[16].ref_hess[1][0] =
753 data.phi[16].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]) * p2(point[2]);
754 data.phi[16].ref_hess[2][0] =
755 data.phi[16].ref_hess[0][2] = d1p0(point[0]) * p0(point[1]) * d1p2(point[2]);
756 data.phi[16].ref_hess[2][1] =
757 data.phi[16].ref_hess[1][2] = p0(point[0]) * d1p0(point[1]) * d1p2(point[2]);
758 data.phi[17].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p2(point[2]);
759 data.phi[17].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p2(point[2]);
760 data.phi[17].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p2(point[2]);
761 data.phi[17].ref_hess[1][0] =
762 data.phi[17].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]) * p2(point[2]);
763 data.phi[17].ref_hess[2][0] =
764 data.phi[17].ref_hess[0][2] = d1p1(point[0]) * p0(point[1]) * d1p2(point[2]);
765 data.phi[17].ref_hess[2][1] =
766 data.phi[17].ref_hess[1][2] = p1(point[0]) * d1p0(point[1]) * d1p2(point[2]);
767 data.phi[18].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p2(point[2]);
768 data.phi[18].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p2(point[2]);
769 data.phi[18].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p2(point[2]);
770 data.phi[18].ref_hess[1][0] =
771 data.phi[18].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]) * p2(point[2]);
772 data.phi[18].ref_hess[2][0] =
773 data.phi[18].ref_hess[0][2] = d1p0(point[0]) * p1(point[1]) * d1p2(point[2]);
774 data.phi[18].ref_hess[2][1] =
775 data.phi[18].ref_hess[1][2] = p0(point[0]) * d1p1(point[1]) * d1p2(point[2]);
776 data.phi[19].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p2(point[2]);
777 data.phi[19].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p2(point[2]);
778 data.phi[19].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p2(point[2]);
779 data.phi[19].ref_hess[1][0] =
780 data.phi[19].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]) * p2(point[2]);
781 data.phi[19].ref_hess[2][0] =
782 data.phi[19].ref_hess[0][2] = d1p1(point[0]) * p1(point[1]) * d1p2(point[2]);
783 data.phi[19].ref_hess[2][1] =
784 data.phi[19].ref_hess[1][2] = p1(point[0]) * d1p1(point[1]) * d1p2(point[2]);
785
786 // face dofs
787 data.phi[20].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p0(point[2]);
788 data.phi[20].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p0(point[2]);
789 data.phi[20].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p0(point[2]);
790 data.phi[20].ref_hess[1][0] =
791 data.phi[20].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]) * p0(point[2]);
792 data.phi[20].ref_hess[2][0] =
793 data.phi[20].ref_hess[0][2] = d1p2(point[0]) * p2(point[1]) * d1p0(point[2]);
794 data.phi[20].ref_hess[2][1] =
795 data.phi[20].ref_hess[1][2] = p2(point[0]) * d1p2(point[1]) * d1p0(point[2]);
796 data.phi[21].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p1(point[2]);
797 data.phi[21].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p1(point[2]);
798 data.phi[21].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p1(point[2]);
799 data.phi[21].ref_hess[1][0] =
800 data.phi[21].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]) * p1(point[2]);
801 data.phi[21].ref_hess[2][0] =
802 data.phi[21].ref_hess[0][2] = d1p2(point[0]) * p2(point[1]) * d1p1(point[2]);
803 data.phi[21].ref_hess[2][1] =
804 data.phi[21].ref_hess[1][2] = p2(point[0]) * d1p2(point[1]) * d1p1(point[2]);
805 data.phi[22].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p2(point[2]);
806 data.phi[22].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p2(point[2]);
807 data.phi[22].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p2(point[2]);
808 data.phi[22].ref_hess[1][0] =
809 data.phi[22].ref_hess[0][1] = d1p2(point[0]) * d1p0(point[1]) * p2(point[2]);
810 data.phi[22].ref_hess[2][0] =
811 data.phi[22].ref_hess[0][2] = d1p2(point[0]) * p0(point[1]) * d1p2(point[2]);
812 data.phi[22].ref_hess[2][1] =
813 data.phi[22].ref_hess[1][2] = p2(point[0]) * d1p0(point[1]) * d1p2(point[2]);
814 data.phi[23].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p2(point[2]);
815 data.phi[23].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p2(point[2]);
816 data.phi[23].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p2(point[2]);
817 data.phi[23].ref_hess[1][0] =
818 data.phi[23].ref_hess[0][1] = d1p2(point[0]) * d1p1(point[1]) * p2(point[2]);
819 data.phi[23].ref_hess[2][0] =
820 data.phi[23].ref_hess[0][2] = d1p2(point[0]) * p1(point[1]) * d1p2(point[2]);
821 data.phi[23].ref_hess[2][1] =
822 data.phi[23].ref_hess[1][2] = p2(point[0]) * d1p1(point[1]) * d1p2(point[2]);
823 data.phi[24].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p2(point[2]);
824 data.phi[24].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p2(point[2]);
825 data.phi[24].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p2(point[2]);
826 data.phi[24].ref_hess[1][0] =
827 data.phi[24].ref_hess[0][1] = d1p0(point[0]) * d1p2(point[1]) * p2(point[2]);
828 data.phi[24].ref_hess[2][0] =
829 data.phi[24].ref_hess[0][2] = d1p0(point[0]) * p2(point[1]) * d1p2(point[2]);
830 data.phi[24].ref_hess[2][1] =
831 data.phi[24].ref_hess[1][2] = p0(point[0]) * d1p2(point[1]) * d1p2(point[2]);
832 data.phi[25].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p2(point[2]);
833 data.phi[25].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p2(point[2]);
834 data.phi[25].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p2(point[2]);
835 data.phi[25].ref_hess[1][0] =
836 data.phi[25].ref_hess[0][1] = d1p1(point[0]) * d1p2(point[1]) * p2(point[2]);
837 data.phi[25].ref_hess[2][0] =
838 data.phi[25].ref_hess[0][2] = d1p1(point[0]) * p2(point[1]) * d1p2(point[2]);
839 data.phi[25].ref_hess[2][1] =
840 data.phi[25].ref_hess[1][2] = p1(point[0]) * d1p2(point[1]) * d1p2(point[2]);
841
842 // center dof
843 data.phi[26].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p2(point[2]);
844 data.phi[26].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p2(point[2]);
845 data.phi[26].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p2(point[2]);
846 data.phi[26].ref_hess[1][0] =
847 data.phi[26].ref_hess[0][1] = d1p2(point[0]) * d1p2(point[1]) * p2(point[2]);
848 data.phi[26].ref_hess[2][0] =
849 data.phi[26].ref_hess[0][2] = d1p2(point[0]) * p2(point[1]) * d1p2(point[2]);
850 data.phi[26].ref_hess[2][1] =
851 data.phi[26].ref_hess[1][2] = p2(point[0]) * d1p2(point[1]) * d1p2(point[2]);
852 }
853 };
854 }
855 }
856}
FEAT Kernel base header.
FEAT namespace.
Definition: adjactor.hpp:12