FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
evaluator.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// includes, FEAT
9#include <kernel/space/parametric_evaluator.hpp>
10#include <kernel/space/dof_mapping_common.hpp>
11
12namespace FEAT
13{
14 namespace Space
15 {
16 namespace Lagrange3
17 {
24
25 static constexpr SpaceTags ref_caps_3d = SpaceTags::ref_value | SpaceTags::ref_grad;
26
28 namespace Intern
29 {
30 // p0, p1, p2 and p3 are the 1D basis functions on the reference interval [-1,+1].
31 // These are used for the tensor-product approach in the Hypercube evaluators.
32
33 // basis function for left vertex
34 template<typename T_>
35 inline T_ p0(T_ x)
36 {
37 return T_(0.0625) * (-T_(1) + x*( T_(1) + T_(9)*x*(T_(1) - x)));
38 }
39
40 // basis function for right vertex
41 template<typename T_>
42 inline T_ p1(T_ x)
43 {
44 return T_(0.0625) * (-T_(1) + x*(-T_(1) + T_(9)*x*(T_(1) + x)));
45 }
46
47 // basis function for first edge point
48 template<typename T_>
49 inline T_ p2(T_ x)
50 {
51 return T_(0.5625) * (T_(1) + x*(-T_(3) + x*(-T_(1) + T_(3)*x)));
52 }
53
54 // basis function for second edge point
55 template<typename T_>
56 inline T_ p3(T_ x)
57 {
58 return T_(0.5625) * (T_(1) + x*( T_(3) + x*(-T_(1) - T_(3)*x)));
59 }
60
61 // first order derivatives
62
63 template<typename T_>
64 inline T_ d1p0(T_ x)
65 {
66 return T_(0.0625) * ( T_(1) + x*(T_(18) - T_(27)*x));
67 }
68
69 template<typename T_>
70 inline T_ d1p1(T_ x)
71 {
72 return T_(0.0625) * (-T_(1) + x*(T_(18) + T_(27)*x));
73 }
74
75 template<typename T_>
76 inline T_ d1p2(T_ x)
77 {
78 return T_(0.0625) * (-T_(27) + x*(-T_(18) + T_(81)*x));
79 }
80
81 template<typename T_>
82 inline T_ d1p3(T_ x)
83 {
84 return T_(0.0625) * ( T_(27) + x*(-T_(18) - T_(81)*x));
85 }
86
87 // second order derivatives
88
89 template<typename T_>
90 inline T_ d2p0(T_ x)
91 {
92 return T_(1.125) * (T_(1) - T_(3)*x);
93 }
94
95 template<typename T_>
96 inline T_ d2p1(T_ x)
97 {
98 return T_(1.125) * (T_(1) + T_(3)*x);
99 }
100
101 template<typename T_>
102 inline T_ d2p2(T_ x)
103 {
104 return T_(1.125) * (-T_(1) + T_(9)*x);
105 }
106
107 template<typename T_>
108 inline T_ d2p3(T_ x)
109 {
110 return T_(1.125) * (-T_(1) - T_(9)*x);
111 }
112 } // namespace Intern
114
120 template<
121 typename Space_,
122 typename TrafoEvaluator_,
123 typename SpaceEvalTraits_,
124 typename Shape_ = typename Space_::ShapeType>
125 class Evaluator DOXY({});
126
132 template<
133 typename Space_,
134 typename TrafoEvaluator_,
135 typename SpaceEvalTraits_>
136 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Simplex<2> > :
137 public ParametricEvaluator<
138 Evaluator<
139 Space_,
140 TrafoEvaluator_,
141 SpaceEvalTraits_,
142 Shape::Simplex<2> >,
143 TrafoEvaluator_,
144 SpaceEvalTraits_,
145 ref_caps>
146 {
147 public:
150
152 typedef Space_ SpaceType;
153
155 typedef SpaceEvalTraits_ SpaceEvalTraits;
156
158 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
159
161 typedef typename EvalPolicy::DomainPointType DomainPointType;
162
164 typedef typename SpaceEvalTraits::DataType DataType;
165
166 protected:
168 int ek[3][2];
169
170 public:
177 explicit Evaluator(const SpaceType& DOXY(space))
178 {
179 }
180
188 {
189 return 10;
190 }
191
192 void NOINLINE prepare(const TrafoEvaluator_& trafo_eval)
193 {
194 // compute edge orientations
195 Geometry::Intern::SubIndexMapping<Shape::Simplex<2>, 1, 0> sim(
196 trafo_eval.get_trafo().get_mesh().template get_index_set<2,0>()[trafo_eval.get_cell_index()],
197 trafo_eval.get_trafo().get_mesh().template get_index_set<2,1>()[trafo_eval.get_cell_index()],
198 trafo_eval.get_trafo().get_mesh().template get_index_set<1,0>());
199
200 // fetch edge dof indices
201 for(int i(0); i < 3; ++i)
202 {
203 for(int j(0); j < 2; ++j)
204 {
205 ek[i][j] = 3 + 2*i + int(sim.map(i, j));
206 }
207 }
208 }
209
219 template<typename EvalData_>
220 void NOINLINE eval_ref_values(EvalData_& data, const DomainPointType& point) const
221 {
222 // vertex dofs
223 data.phi[0].ref_value = - DataType(4.5) * (point[0] + point[1] - (DataType(1) / DataType(3))) * (point[0] + point[1] - (DataType(2) / DataType(3))) * (point[0] + point[1] - DataType(1));
224 data.phi[1].ref_value = DataType(4.5) * point[0] * (point[0] - (DataType(1) / DataType(3))) * (point[0] - (DataType(2) / DataType(3)));
225 data.phi[2].ref_value = DataType(4.5) * point[1] * (point[1] - (DataType(1) / DataType(3))) * (point[1] - (DataType(2) / DataType(3)));
226 // edge dofs
227 data.phi[ek[0][0]].ref_value = DataType(13.5) * point[0] * point[1] * (point[0] - (DataType(1) / DataType(3)));
228 data.phi[ek[0][1]].ref_value = DataType(13.5) * point[0] * point[1] * (point[1] - (DataType(1) / DataType(3)));
229 data.phi[ek[1][0]].ref_value = - DataType(13.5) * point[1] * (point[1] - (DataType(1) / DataType(3))) * (point[0] + point[1] - DataType(1));
230 data.phi[ek[1][1]].ref_value = DataType(13.5) * point[1] * (point[0] + point[1] - DataType(1)) * (point[0] + point[1] - (DataType(2) / DataType(3)));
231 data.phi[ek[2][0]].ref_value = DataType(13.5) * point[0] * (point[0] + point[1] - DataType(1)) * (point[0] + point[1] - (DataType(2) / DataType(3)));
232 data.phi[ek[2][1]].ref_value = - DataType(13.5) * point[0] * (point[0] - (DataType(1) / DataType(3))) * (point[0] + point[1] - DataType(1));
233 // center dofs
234 data.phi[9].ref_value = - DataType(27) * point[0] * point[1] * (point[0] + point[1] - DataType(1));
235 }
236
246 template<typename EvalData_>
247 void NOINLINE eval_ref_gradients(EvalData_& data, const DomainPointType& point) const
248 {
249 // vertex dofs
250 data.phi[0].ref_grad[0] = - DataType(0.5) * (DataType(27) * point[0] * point[0] + (DataType(54) * point[1] - DataType(36)) * point[0] + DataType(27) * point[1] * point[1] - DataType(36) * point[1] + DataType(11));
251 data.phi[0].ref_grad[1] = - DataType(0.5) * (DataType(27) * point[1] * point[1] + (DataType(54) * point[0] - DataType(36)) * point[1] + DataType(27) * point[0] * point[0] - DataType(36) * point[0] + DataType(11));
252 data.phi[1].ref_grad[0] = DataType(0.5) * (DataType(27) * point[0] * point[0] - DataType(18) * point[0] + DataType(2));
253 data.phi[1].ref_grad[1] = DataType(0);
254 data.phi[2].ref_grad[0] = DataType(0);
255 data.phi[2].ref_grad[1] = DataType(0.5) * (DataType(27) * point[1] * point[1] - DataType(18) * point[1] + DataType(2));
256 // edge dofs
257 data.phi[ek[0][0]].ref_grad[0] = DataType(0.5) * (DataType(9) * point[1] * (DataType(6) * point[0] - DataType(1)));
258 data.phi[ek[0][0]].ref_grad[1] = DataType(0.5) * (DataType(9) * point[0] * (DataType(3) * point[0] - DataType(1)));
259 data.phi[ek[0][1]].ref_grad[0] = DataType(0.5) * (DataType(9) * point[1] * (DataType(3) * point[1] - DataType(1)));
260 data.phi[ek[0][1]].ref_grad[1] = DataType(0.5) * (DataType(9) * point[0] * (DataType(6) * point[1] - DataType(1)));
261 data.phi[ek[1][0]].ref_grad[0] = DataType(0.5) * (- DataType(9) * point[1] * (DataType(3) * point[1] - DataType(1)));
262 data.phi[ek[1][0]].ref_grad[1] = DataType(0.5) * (- DataType(81) * point[1] * point[1] - (DataType(54) * point[0] - DataType(72)) * point[1] + DataType(9) * point[0] - DataType(9));
263 data.phi[ek[1][1]].ref_grad[0] = DataType(0.5) * (DataType(9) * point[1] * (DataType(6) * point[0] + DataType(6) * point[1] - DataType(5)));
264 data.phi[ek[1][1]].ref_grad[1] = DataType(0.5) * (DataType(81) * point[1] * point[1] + ( DataType(108) * point[0] - DataType(90)) * point[1] + DataType(27) * point[0] * point[0] - DataType(45) * point[0] + DataType(18));
265 data.phi[ek[2][0]].ref_grad[0] = DataType(0.5) * (DataType(81) * point[0] * point[0] + ( DataType(108) * point[1] - DataType(90)) * point[0] + DataType(27) * point[1] * point[1] - DataType(45) * point[1] + DataType(18));
266 data.phi[ek[2][0]].ref_grad[1] = DataType(0.5) * (DataType(9) * point[0] * (DataType(6) * point[1] + DataType(6) * point[0] - DataType(5)));
267 data.phi[ek[2][1]].ref_grad[0] = DataType(0.5) * (- DataType(81) * point[0] * point[0] - (DataType(54) * point[1] - DataType(72)) * point[0] + DataType(9) * point[1] - DataType(9));
268 data.phi[ek[2][1]].ref_grad[1] = DataType(0.5) * (DataType(27) * (DataType(1) / DataType(3) - point[0]) * point[0]);
269 // center dofs
270 data.phi[9].ref_grad[0] = - DataType(27) * point[1] * (DataType(2) * point[0] + point[1] - DataType(1));
271 data.phi[9].ref_grad[1] = - DataType(27) * point[0] * (DataType(2) * point[1] + point[0] - DataType(1));
272 }
273
283 template<typename EvalData_>
284 void NOINLINE eval_ref_hessians(EvalData_& data, const DomainPointType& point) const
285 {
286 // vertex dofs
287 data.phi[0].ref_hess[0][0] = - DataType(27) * (point[0] + point[1]) + DataType(18); // dxx
288 data.phi[0].ref_hess[1][1] = - DataType(27) * (point[1] + point[0]) + DataType(18); // dyy
289 data.phi[0].ref_hess[1][0] =
290 data.phi[0].ref_hess[0][1] = - DataType(27) * (point[1] + point[0]) + DataType(18); // dxy
291 data.phi[1].ref_hess[0][0] = DataType(27) * point[0] - DataType(9);
292 data.phi[1].ref_hess[1][1] = DataType(0);
293 data.phi[1].ref_hess[1][0] =
294 data.phi[1].ref_hess[0][1] = DataType(0);
295 data.phi[2].ref_hess[0][0] = DataType(0);
296 data.phi[2].ref_hess[1][1] = DataType(27) * point[1] - DataType(9);
297 data.phi[2].ref_hess[1][0] =
298 data.phi[2].ref_hess[0][1] = DataType(0);
299 // edge dofs
300 data.phi[ek[0][0]].ref_hess[0][0] = DataType(27) * point[1];
301 data.phi[ek[0][0]].ref_hess[1][1] = DataType(0);
302 data.phi[ek[0][0]].ref_hess[0][1] =
303 data.phi[ek[0][0]].ref_hess[1][0] = DataType(0.5) * (DataType(54) * point[0] - DataType(9));
304 data.phi[ek[0][1]].ref_hess[0][0] = DataType(0);
305 data.phi[ek[0][1]].ref_hess[1][1] = DataType(27) * point[0];
306 data.phi[ek[0][1]].ref_hess[0][1] =
307 data.phi[ek[0][1]].ref_hess[1][0] = DataType(0.5) * (DataType(54) * point[1] - DataType(9));
308 data.phi[ek[1][0]].ref_hess[0][0] = DataType(0);
309 data.phi[ek[1][0]].ref_hess[1][1] = - DataType(81) * point[1] - DataType(27) * point[0] + DataType(36);
310 data.phi[ek[1][0]].ref_hess[0][1] =
311 data.phi[ek[1][0]].ref_hess[1][0] = - DataType(0.5) * (DataType(54) * point[1] - DataType(9));
312 data.phi[ek[1][1]].ref_hess[0][0] = DataType(27) * point[1];
313 data.phi[ek[1][1]].ref_hess[1][1] = DataType(81) * point[1] + DataType(54) * point[0] - DataType(45);
314 data.phi[ek[1][1]].ref_hess[0][1] =
315 data.phi[ek[1][1]].ref_hess[1][0] = DataType(0.5) * (DataType(108) * point[1] + DataType(54) * point[0] - DataType(45));
316 data.phi[ek[2][0]].ref_hess[0][0] = DataType(81) * point[0] + DataType(54) * point[1] - DataType(45);
317 data.phi[ek[2][0]].ref_hess[1][1] = DataType(27) * point[0];
318 data.phi[ek[2][0]].ref_hess[0][1] =
319 data.phi[ek[2][0]].ref_hess[1][0] = DataType(0.5) * (DataType(108) * point[0] + DataType(54) * point[1] - DataType(45));
320 data.phi[ek[2][1]].ref_hess[0][0] = - DataType(81) * point[0] - DataType(27) * point[1] + DataType(36);
321 data.phi[ek[2][1]].ref_hess[1][1] = DataType(0);
322 data.phi[ek[2][1]].ref_hess[0][1] =
323 data.phi[ek[2][1]].ref_hess[1][0] = - DataType(0.5) * (DataType(54) * point[0] - DataType(9));
324 // center dofs
325 data.phi[9].ref_hess[0][0] = - DataType(54) * point[1];
326 data.phi[9].ref_hess[1][1] = - DataType(54) * point[0];
327 data.phi[9].ref_hess[0][1] =
328 data.phi[9].ref_hess[1][0] = DataType(27) * (DataType(1) - DataType(2)*(point[0] + point[1]));
329 }
330 }; // class Evaluator<...,Simplex<2>>
331
332
338 template<
339 typename Space_,
340 typename TrafoEvaluator_,
341 typename SpaceEvalTraits_>
342 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Simplex<3> > :
343 public ParametricEvaluator<
344 Evaluator<
345 Space_,
346 TrafoEvaluator_,
347 SpaceEvalTraits_,
348 Shape::Simplex<3> >,
349 TrafoEvaluator_,
350 SpaceEvalTraits_,
351 ref_caps_3d>
352 {
353 public:
356
358 typedef Space_ SpaceType;
359
361 typedef SpaceEvalTraits_ SpaceEvalTraits;
362
364 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
365
367 typedef typename EvalPolicy::DomainPointType DomainPointType;
368
370 typedef typename SpaceEvalTraits::DataType DataType;
371
372 protected:
374 int ek[6][2];
375
376 public:
383 explicit Evaluator(const SpaceType& DOXY(space))
384 {
385 }
386
394 {
395 return 20;
396 }
397
398 void NOINLINE prepare(const TrafoEvaluator_& trafo_eval)
399 {
400 // compute edge orientations
401 Geometry::Intern::SubIndexMapping<Shape::Simplex<3>, 1, 0> sim(
402 trafo_eval.get_trafo().get_mesh().template get_index_set<3,0>()[trafo_eval.get_cell_index()],
403 trafo_eval.get_trafo().get_mesh().template get_index_set<3,1>()[trafo_eval.get_cell_index()],
404 trafo_eval.get_trafo().get_mesh().template get_index_set<1,0>());
405
406 // fetch edge dof indices
407 for(int i(0); i < 6; ++i)
408 {
409 for(int j(0); j < 2; ++j)
410 {
411 ek[i][j] = 4 + 2*i + int(sim.map(i, j));
412 }
413 }
414 }
415
425 template<typename EvalData_>
426 void NOINLINE eval_ref_values(EvalData_& data, const DomainPointType& point) const
427 {
428 static constexpr DataType D1 = DataType(1);
429 static constexpr DataType D4_5 = DataType(4.5);
430 static constexpr DataType D5_5 = DataType(5.5);
431 static constexpr DataType D9 = DataType(9);
432 static constexpr DataType D13_5 = DataType(13.5);
433 static constexpr DataType D18 = DataType(18);
434 static constexpr DataType D22_5 = DataType(22.5);
435 static constexpr DataType D27 = DataType(27);
436
437 // get point coordinates
438 const DataType x = point[0];
439 const DataType y = point[1];
440 const DataType z = point[2];
441
442 // vertex dofs
443 data.phi[ 0].ref_value = D1 + (-D5_5 + (D9 - D4_5 * z) * z) * z + (-D5_5 + (D18 - D13_5 * z) * z + (D9 - D13_5 * z - D4_5 * y) * y) * y + (-D5_5 + (D18 - D13_5 * z) * z + (D18 - D27 * z - D13_5 * y) * y + (D9 - D13_5 * y - D13_5 * z - D4_5 * x) * x) * x;
444 data.phi[ 1].ref_value = (D1 + (-D4_5 + D4_5 * x) * x) * x;
445 data.phi[ 2].ref_value = (D1 + (-D4_5 + D4_5 * y) * y) * y;
446 data.phi[ 3].ref_value = (D1 + (-D4_5 + D4_5 * z) * z) * z;
447 // egde dofs
448 data.phi[ek[0][0]].ref_value = (D9 + (-D22_5 + D13_5 * z) * z + (-D22_5 + D27 * z + D13_5 * y) * y + (-D22_5 + D27 * y + D27 * z + D13_5 * x) * x) * x;
449 data.phi[ek[0][1]].ref_value = (-D4_5 + D4_5 * y + D4_5 * z + (D18 - D13_5 * y - D13_5 * z - D13_5 * x) * x) * x;
450 data.phi[ek[1][0]].ref_value = (D9 + (-D22_5 + D13_5 * z) * z + (-D22_5 + D27 * z + D13_5 * y) * y) * y + ((-D22_5 + D27 * y + D27 * z) * y + D13_5 * x * y) * x;
451 data.phi[ek[1][1]].ref_value = (-D4_5 + D4_5 * z + (D18 - D13_5 * y - D13_5 * z) * y) * y + (D4_5 - D13_5 * y) * y * x;
452 data.phi[ek[2][0]].ref_value = (D9 + (-D22_5 + D13_5 * z) * z) * z + ((-D22_5 + D27 * z) * z + D13_5 * y * z) * y + ((-D22_5 + D27 * z) * z + D27 * y * z + D13_5 * z * x) * x;
453 data.phi[ek[2][1]].ref_value = (-D4_5 + (D18 - D13_5 * z) * z) * z + (D4_5 - D13_5 * z) * z * y + (D4_5 - D13_5 * z) * z * x;
454 data.phi[ek[3][0]].ref_value = (-D4_5 * y + D13_5 * x * y) * x;
455 data.phi[ek[3][1]].ref_value = (-D4_5 + D13_5 * y) * y * x;
456 data.phi[ek[4][0]].ref_value = (-D4_5 * z + D13_5 * z * x) * x;
457 data.phi[ek[4][1]].ref_value = (-D4_5 + D13_5 * z) * z * x;
458 data.phi[ek[5][0]].ref_value = (-D4_5 * z + D13_5 * y * z) * y;
459 data.phi[ek[5][1]].ref_value = (-D4_5 + D13_5 * z) * z * y;
460 // face dofs
461 data.phi[16].ref_value = D27 * x * y * z;
462 data.phi[17].ref_value = ((D27 - D27 * z) * z - D27 * y * z) * y - D27 * x * y * z;
463 data.phi[18].ref_value = ((D27 - D27 * z) * z - D27 * y * z - D27 * z * x) * x;
464 data.phi[19].ref_value = ((D27 - D27 * z - D27 * y) * y - D27 * x * y) * x;
465 }
466
476 template<typename EvalData_>
477 void NOINLINE eval_ref_gradients(EvalData_& data, const DomainPointType& point) const
478 {
479 static constexpr DataType D0 = DataType(0);
480 static constexpr DataType D1 = DataType(1);
481 static constexpr DataType D4_5 = DataType(4.5);
482 static constexpr DataType D5_5 = DataType(5.5);
483 static constexpr DataType D9 = DataType(9);
484 static constexpr DataType D13_5 = DataType(13.5);
485 static constexpr DataType D18 = DataType(18);
486 static constexpr DataType D22_5 = DataType(22.5);
487 static constexpr DataType D27 = DataType(27);
488 static constexpr DataType D36 = DataType(36);
489 static constexpr DataType D40_5 = DataType(40.5);
490 static constexpr DataType D45 = DataType(45);
491 static constexpr DataType D54 = DataType(54);
492
493 // get point coordinates
494 const DataType x = point[0];
495 const DataType y = point[1];
496 const DataType z = point[2];
497
498 // vertex dofs
499 data.phi[ 0].ref_grad[0] = -D5_5 + (D18 - D13_5 * z) * z + (D18 - D27 * z - D13_5 * y) * y + (D18 - D27 * y - D27 * z - D13_5 * x) * x;
500 data.phi[ 0].ref_grad[1] = -D5_5 + (D18 - D13_5 * z) * z + (D18 - D27 * z - D13_5 * y) * y + (D18 - D27 * y - D27 * z - D13_5 * x) * x;
501 data.phi[ 0].ref_grad[2] = -D5_5 + (D18 - D13_5 * z) * z + (D18 - D27 * z - D13_5 * y) * y + (D18 - D27 * y - D27 * z - D13_5 * x) * x;
502 data.phi[ 1].ref_grad[0] = D1 + (-D9 + D13_5 * x) * x;
503 data.phi[ 1].ref_grad[1] = D0;
504 data.phi[ 1].ref_grad[2] = D0;
505 data.phi[ 2].ref_grad[0] = D0;
506 data.phi[ 2].ref_grad[1] = D1 + (-D9 + D13_5 * y) * y;
507 data.phi[ 2].ref_grad[2] = D0;
508 data.phi[ 3].ref_grad[0] = D0;
509 data.phi[ 3].ref_grad[1] = D0;
510 data.phi[ 3].ref_grad[2] = D1 + (-D9 + D13_5 * z) * z;
511 // edge dofs
512 data.phi[ek[0][0]].ref_grad[0] = D9 + (-D22_5 + D13_5 * z) * z + (-D22_5 + D27 * z + D13_5 * y) * y + (-D45 + D54 * y + D54 * z + D40_5 * x) * x;
513 data.phi[ek[0][0]].ref_grad[1] = (-D22_5 + D27 * y + D27 * z + D27 * x) * x;
514 data.phi[ek[0][0]].ref_grad[2] = (-D22_5 + D27 * y + D27 * z + D27 * x) * x;
515 data.phi[ek[0][1]].ref_grad[0] = -D4_5 + D4_5 * y + D4_5 * z + (D36 - D27 * y - D27 * z - D40_5 * x) * x;
516 data.phi[ek[0][1]].ref_grad[1] = (D4_5 - D13_5 * x) * x;
517 data.phi[ek[0][1]].ref_grad[2] = (D4_5 - D13_5 * x) * x;
518 data.phi[ek[1][0]].ref_grad[0] = (-D22_5 + D27 * y + D27 * z) * y + D27 * x * y;
519 data.phi[ek[1][0]].ref_grad[1] = D9 + (-D22_5 + D13_5 * z) * z + (-D45 + D54 * z + D40_5 * y) * y + (-D22_5 + D54 * y + D27 * z + D13_5 * x) * x;
520 data.phi[ek[1][0]].ref_grad[2] = (-D22_5 + D27 * y + D27 * z) * y + D27 * x * y;
521 data.phi[ek[1][1]].ref_grad[0] = (D4_5 - D13_5 * y) * y;
522 data.phi[ek[1][1]].ref_grad[1] = -D4_5 + D4_5 * z + (D36 - D27 * z - D40_5 * y) * y + (D4_5 - D27 * y) * x;
523 data.phi[ek[1][1]].ref_grad[2] = (D4_5 - D13_5 * y) * y;
524 data.phi[ek[2][0]].ref_grad[0] = (-D22_5 + D27 * z) * z + D27 * y * z + D27 * z * x;
525 data.phi[ek[2][0]].ref_grad[1] = (-D22_5 + D27 * z) * z + D27 * y * z + D27 * z * x;
526 data.phi[ek[2][0]].ref_grad[2] = D9 + (-D45 + D40_5 * z) * z + (-D22_5 + D54 * z + D13_5 * y) * y + (-D22_5 + D54 * z + D27 * y + D13_5 * x) * x;
527 data.phi[ek[2][1]].ref_grad[0] = (D4_5 - D13_5 * z) * z;
528 data.phi[ek[2][1]].ref_grad[1] = (D4_5 - D13_5 * z) * z;
529 data.phi[ek[2][1]].ref_grad[2] = -D4_5 + (D36 - D40_5 * z) * z + (D4_5 - D27 * z) * y + (D4_5 - D27 * z) * x;
530 data.phi[ek[3][0]].ref_grad[0] = -D4_5 * y + D27 * x * y;
531 data.phi[ek[3][0]].ref_grad[1] = (-D4_5 + D13_5 * x) * x;
532 data.phi[ek[3][0]].ref_grad[2] = D0;
533 data.phi[ek[3][1]].ref_grad[0] = (-D4_5 + D13_5 * y) * y;
534 data.phi[ek[3][1]].ref_grad[1] = (-D4_5 + D27 * y) * x;
535 data.phi[ek[3][1]].ref_grad[2] = D0;
536 data.phi[ek[4][0]].ref_grad[0] = -D4_5 * z + D27 * z * x;
537 data.phi[ek[4][0]].ref_grad[1] = D0;
538 data.phi[ek[4][0]].ref_grad[2] = (-D4_5 + D13_5 * x) * x;
539 data.phi[ek[4][1]].ref_grad[0] = (-D4_5 + D13_5 * z) * z;
540 data.phi[ek[4][1]].ref_grad[1] = D0;
541 data.phi[ek[4][1]].ref_grad[2] = (-D4_5 + D27 * z) * x;
542 data.phi[ek[5][0]].ref_grad[0] = D0;
543 data.phi[ek[5][0]].ref_grad[1] = -D4_5 * z + D27 * y * z;
544 data.phi[ek[5][0]].ref_grad[2] = (-D4_5 + D13_5 * y) * y;
545 data.phi[ek[5][1]].ref_grad[0] = D0;
546 data.phi[ek[5][1]].ref_grad[1] = (-D4_5 + D13_5 * z) * z;
547 data.phi[ek[5][1]].ref_grad[2] = (-D4_5 + D27 * z) * y;
548 // face dofs
549 data.phi[16].ref_grad[0] = D27 * y * z;
550 data.phi[16].ref_grad[1] = D27 * z * x;
551 data.phi[16].ref_grad[2] = D27 * x * y;
552 data.phi[17].ref_grad[0] = -D27 * y * z;
553 data.phi[17].ref_grad[1] = (D27 - D27 * z) * z - D54 * y * z - D27 * z * x;
554 data.phi[17].ref_grad[2] = (-D54 * z + D27 - D27 * y) * y - D27 * x * y;
555 data.phi[18].ref_grad[0] = (D27 - D27 * z) * z - D27 * y * z - D54 * z * x;
556 data.phi[18].ref_grad[1] = -D27 * z * x;
557 data.phi[18].ref_grad[2] = (-D54 * z + D27 - D27 * y - D27 * x) * x;
558 data.phi[19].ref_grad[0] = (D27 - D27 * z - D27 * y) * y - D54 * x * y;
559 data.phi[19].ref_grad[1] = (-D54 * y - D27 * z + D27 - D27 * x) * x;
560 data.phi[19].ref_grad[2] = -D27 * x * y;
561 }
562 }; // class Evaluator<...,Simplex<3>>
563
564
570 template<
571 typename Space_,
572 typename TrafoEvaluator_,
573 typename SpaceEvalTraits_>
574 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<1> > :
575 public ParametricEvaluator<
576 Evaluator<
577 Space_,
578 TrafoEvaluator_,
579 SpaceEvalTraits_,
580 Shape::Hypercube<1> >,
581 TrafoEvaluator_,
582 SpaceEvalTraits_,
583 ref_caps>
584 {
585 public:
588
590 typedef Space_ SpaceType;
591
593 typedef SpaceEvalTraits_ SpaceEvalTraits;
594
596 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
597
599 typedef typename EvalPolicy::DomainPointType DomainPointType;
600
602 typedef typename SpaceEvalTraits::DataType DataType;
603
604 public:
611 explicit Evaluator(const SpaceType& DOXY(space))
612 {
613 }
614
622 {
623 return 4;
624 }
625
635 template<typename EvalData_>
636 void eval_ref_values(EvalData_& data, const DomainPointType& point) const
637 {
638 data.phi[0].ref_value = Intern::p0(point[0]);
639 data.phi[1].ref_value = Intern::p1(point[0]);
640 data.phi[2].ref_value = Intern::p2(point[0]);
641 data.phi[3].ref_value = Intern::p3(point[0]);
642 }
643
653 template<typename EvalData_>
654 void eval_ref_gradients(EvalData_& data, const DomainPointType& point) const
655 {
656 data.phi[0].ref_grad[0] = Intern::d1p0(point[0]);
657 data.phi[1].ref_grad[0] = Intern::d1p1(point[0]);
658 data.phi[2].ref_grad[0] = Intern::d1p2(point[0]);
659 data.phi[3].ref_grad[0] = Intern::d1p3(point[0]);
660 }
661
671 template<typename EvalData_>
672 void eval_ref_hessians(EvalData_& data, const DomainPointType& point) const
673 {
674 data.phi[0].ref_hess[0][0] = Intern::d2p0(point[0]);
675 data.phi[1].ref_hess[0][0] = Intern::d2p1(point[0]);
676 data.phi[2].ref_hess[0][0] = Intern::d2p2(point[0]);
677 data.phi[3].ref_hess[0][0] = Intern::d2p3(point[0]);
678 }
679 }; // class Evaluator<...,Hypercube<1>>
680
686 template<
687 typename Space_,
688 typename TrafoEvaluator_,
689 typename SpaceEvalTraits_>
690 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<2> > :
691 public ParametricEvaluator<
692 Evaluator<
693 Space_,
694 TrafoEvaluator_,
695 SpaceEvalTraits_,
696 Shape::Hypercube<2> >,
697 TrafoEvaluator_,
698 SpaceEvalTraits_,
699 ref_caps>
700 {
701 public:
704
706 typedef Space_ SpaceType;
707
709 typedef SpaceEvalTraits_ SpaceEvalTraits;
710
712 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
713
715 typedef typename EvalPolicy::DomainPointType DomainPointType;
716
718 typedef typename SpaceEvalTraits::DataType DataType;
719
720 protected:
722 int ek[4][2];
723
724 public:
731 explicit Evaluator(const SpaceType& DOXY(space))
732 {
733 }
734
742 {
743 return 16;
744 }
745
746 void NOINLINE prepare(const TrafoEvaluator_& trafo_eval)
747 {
748 // compute edge orientations
749 Geometry::Intern::SubIndexMapping<Shape::Hypercube<2>, 1, 0> sim(
750 trafo_eval.get_trafo().get_mesh().template get_index_set<2,0>()[trafo_eval.get_cell_index()],
751 trafo_eval.get_trafo().get_mesh().template get_index_set<2,1>()[trafo_eval.get_cell_index()],
752 trafo_eval.get_trafo().get_mesh().template get_index_set<1,0>());
753
754 // fetch edge dof indices
755 for(int i(0); i < 4; ++i)
756 {
757 for(int j(0); j < 2; ++j)
758 {
759 ek[i][j] = 4 + 2*i + int(sim.map(i, j));
760 }
761 }
762 }
763
773 template<typename EvalData_>
774 void NOINLINE eval_ref_values(EvalData_& data, const DomainPointType& point) const
775 {
776 using namespace Lagrange3::Intern;
777
778 // vertex dofs
779 data.phi[0].ref_value = p0(point[0]) * p0(point[1]);
780 data.phi[1].ref_value = p1(point[0]) * p0(point[1]);
781 data.phi[2].ref_value = p0(point[0]) * p1(point[1]);
782 data.phi[3].ref_value = p1(point[0]) * p1(point[1]);
783 // edge dofs
784 data.phi[ek[0][0]].ref_value = p2(point[0]) * p0(point[1]);
785 data.phi[ek[0][1]].ref_value = p3(point[0]) * p0(point[1]);
786 data.phi[ek[1][0]].ref_value = p2(point[0]) * p1(point[1]);
787 data.phi[ek[1][1]].ref_value = p3(point[0]) * p1(point[1]);
788 data.phi[ek[2][0]].ref_value = p0(point[0]) * p2(point[1]);
789 data.phi[ek[2][1]].ref_value = p0(point[0]) * p3(point[1]);
790 data.phi[ek[3][0]].ref_value = p1(point[0]) * p2(point[1]);
791 data.phi[ek[3][1]].ref_value = p1(point[0]) * p3(point[1]);
792 // center dofs
793 data.phi[12].ref_value = p2(point[0]) * p2(point[1]);
794 data.phi[13].ref_value = p3(point[0]) * p2(point[1]);
795 data.phi[14].ref_value = p2(point[0]) * p3(point[1]);
796 data.phi[15].ref_value = p3(point[0]) * p3(point[1]);
797 }
798
808 template<typename EvalData_>
809 void NOINLINE eval_ref_gradients(EvalData_& data, const DomainPointType& point) const
810 {
811 using namespace Lagrange3::Intern;
812
813 // vertex dofs
814 data.phi[0].ref_grad[0] = d1p0(point[0]) * p0(point[1]);
815 data.phi[0].ref_grad[1] = p0(point[0]) * d1p0(point[1]);
816 data.phi[1].ref_grad[0] = d1p1(point[0]) * p0(point[1]);
817 data.phi[1].ref_grad[1] = p1(point[0]) * d1p0(point[1]);
818 data.phi[2].ref_grad[0] = d1p0(point[0]) * p1(point[1]);
819 data.phi[2].ref_grad[1] = p0(point[0]) * d1p1(point[1]);
820 data.phi[3].ref_grad[0] = d1p1(point[0]) * p1(point[1]);
821 data.phi[3].ref_grad[1] = p1(point[0]) * d1p1(point[1]);
822 // edge dofs
823 data.phi[ek[0][0]].ref_grad[0] = d1p2(point[0]) * p0(point[1]);
824 data.phi[ek[0][0]].ref_grad[1] = p2(point[0]) * d1p0(point[1]);
825 data.phi[ek[0][1]].ref_grad[0] = d1p3(point[0]) * p0(point[1]);
826 data.phi[ek[0][1]].ref_grad[1] = p3(point[0]) * d1p0(point[1]);
827 data.phi[ek[1][0]].ref_grad[0] = d1p2(point[0]) * p1(point[1]);
828 data.phi[ek[1][0]].ref_grad[1] = p2(point[0]) * d1p1(point[1]);
829 data.phi[ek[1][1]].ref_grad[0] = d1p3(point[0]) * p1(point[1]);
830 data.phi[ek[1][1]].ref_grad[1] = p3(point[0]) * d1p1(point[1]);
831 data.phi[ek[2][0]].ref_grad[0] = d1p0(point[0]) * p2(point[1]);
832 data.phi[ek[2][0]].ref_grad[1] = p0(point[0]) * d1p2(point[1]);
833 data.phi[ek[2][1]].ref_grad[0] = d1p0(point[0]) * p3(point[1]);
834 data.phi[ek[2][1]].ref_grad[1] = p0(point[0]) * d1p3(point[1]);
835 data.phi[ek[3][0]].ref_grad[0] = d1p1(point[0]) * p2(point[1]);
836 data.phi[ek[3][0]].ref_grad[1] = p1(point[0]) * d1p2(point[1]);
837 data.phi[ek[3][1]].ref_grad[0] = d1p1(point[0]) * p3(point[1]);
838 data.phi[ek[3][1]].ref_grad[1] = p1(point[0]) * d1p3(point[1]);
839 // center dofs
840 data.phi[12].ref_grad[0] = d1p2(point[0]) * p2(point[1]);
841 data.phi[12].ref_grad[1] = p2(point[0]) * d1p2(point[1]);
842 data.phi[13].ref_grad[0] = d1p3(point[0]) * p2(point[1]);
843 data.phi[13].ref_grad[1] = p3(point[0]) * d1p2(point[1]);
844 data.phi[14].ref_grad[0] = d1p2(point[0]) * p3(point[1]);
845 data.phi[14].ref_grad[1] = p2(point[0]) * d1p3(point[1]);
846 data.phi[15].ref_grad[0] = d1p3(point[0]) * p3(point[1]);
847 data.phi[15].ref_grad[1] = p3(point[0]) * d1p3(point[1]);
848 }
849
859 template<typename EvalData_>
860 void NOINLINE eval_ref_hessians(EvalData_& data, const DomainPointType& point) const
861 {
862 using namespace Lagrange3::Intern;
863
864 // vertex dofs
865 data.phi[0].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]);
866 data.phi[0].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]);
867 data.phi[0].ref_hess[1][0] =
868 data.phi[0].ref_hess[0][1] = d1p0(point[0]) * d1p0(point[1]);
869 data.phi[1].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]);
870 data.phi[1].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]);
871 data.phi[1].ref_hess[1][0] =
872 data.phi[1].ref_hess[0][1] = d1p1(point[0]) * d1p0(point[1]);
873 data.phi[2].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]);
874 data.phi[2].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]);
875 data.phi[2].ref_hess[1][0] =
876 data.phi[2].ref_hess[0][1] = d1p0(point[0]) * d1p1(point[1]);
877 data.phi[3].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]);
878 data.phi[3].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]);
879 data.phi[3].ref_hess[1][0] =
880 data.phi[3].ref_hess[0][1] = d1p1(point[0]) * d1p1(point[1]);
881 // edge dofs
882 data.phi[ek[0][0]].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]);
883 data.phi[ek[0][0]].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]);
884 data.phi[ek[0][0]].ref_hess[0][1] =
885 data.phi[ek[0][0]].ref_hess[1][0] = d1p2(point[0]) * d1p0(point[1]);
886 data.phi[ek[0][1]].ref_hess[0][0] = d2p3(point[0]) * p0(point[1]);
887 data.phi[ek[0][1]].ref_hess[1][1] = p3(point[0]) * d2p0(point[1]);
888 data.phi[ek[0][1]].ref_hess[0][1] =
889 data.phi[ek[0][1]].ref_hess[1][0] = d1p3(point[0]) * d1p0(point[1]);
890 data.phi[ek[1][0]].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]);
891 data.phi[ek[1][0]].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]);
892 data.phi[ek[1][0]].ref_hess[0][1] =
893 data.phi[ek[1][0]].ref_hess[1][0] = d1p2(point[0]) * d1p1(point[1]);
894 data.phi[ek[1][1]].ref_hess[0][0] = d2p3(point[0]) * p1(point[1]);
895 data.phi[ek[1][1]].ref_hess[1][1] = p3(point[0]) * d2p1(point[1]);
896 data.phi[ek[1][1]].ref_hess[0][1] =
897 data.phi[ek[1][1]].ref_hess[1][0] = d1p3(point[0]) * d1p1(point[1]);
898 data.phi[ek[2][0]].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]);
899 data.phi[ek[2][0]].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]);
900 data.phi[ek[2][0]].ref_hess[0][1] =
901 data.phi[ek[2][0]].ref_hess[1][0] = d1p0(point[0]) * d1p2(point[1]);
902 data.phi[ek[2][1]].ref_hess[0][0] = d2p0(point[0]) * p3(point[1]);
903 data.phi[ek[2][1]].ref_hess[1][1] = p0(point[0]) * d2p3(point[1]);
904 data.phi[ek[2][1]].ref_hess[0][1] =
905 data.phi[ek[2][1]].ref_hess[1][0] = d1p0(point[0]) * d1p3(point[1]);
906 data.phi[ek[3][0]].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]);
907 data.phi[ek[3][0]].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]);
908 data.phi[ek[3][0]].ref_hess[0][1] =
909 data.phi[ek[3][0]].ref_hess[1][0] = d1p1(point[0]) * d1p2(point[1]);
910 data.phi[ek[3][1]].ref_hess[0][0] = d2p1(point[0]) * p3(point[1]);
911 data.phi[ek[3][1]].ref_hess[1][1] = p1(point[0]) * d2p3(point[1]);
912 data.phi[ek[3][1]].ref_hess[0][1] =
913 data.phi[ek[3][1]].ref_hess[1][0] = d1p1(point[0]) * d1p3(point[1]);
914 // center dofs
915 data.phi[12].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]);
916 data.phi[12].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]);
917 data.phi[12].ref_hess[0][1] =
918 data.phi[12].ref_hess[1][0] = d1p2(point[0]) * d1p2(point[1]);
919 data.phi[13].ref_hess[0][0] = d2p3(point[0]) * p2(point[1]);
920 data.phi[13].ref_hess[1][1] = p3(point[0]) * d2p2(point[1]);
921 data.phi[13].ref_hess[0][1] =
922 data.phi[13].ref_hess[1][0] = d1p3(point[0]) * d1p2(point[1]);
923 data.phi[14].ref_hess[0][0] = d2p2(point[0]) * p3(point[1]);
924 data.phi[14].ref_hess[1][1] = p2(point[0]) * d2p3(point[1]);
925 data.phi[14].ref_hess[0][1] =
926 data.phi[14].ref_hess[1][0] = d1p2(point[0]) * d1p3(point[1]);
927 data.phi[15].ref_hess[0][0] = d2p3(point[0]) * p3(point[1]);
928 data.phi[15].ref_hess[1][1] = p3(point[0]) * d2p3(point[1]);
929 data.phi[15].ref_hess[0][1] =
930 data.phi[15].ref_hess[1][0] = d1p3(point[0]) * d1p3(point[1]);
931 }
932 }; // class Evaluator<...,Hypercube<2>>
933
939 template<
940 typename Space_,
941 typename TrafoEvaluator_,
942 typename SpaceEvalTraits_>
943 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<3> > :
944 public ParametricEvaluator<
945 Evaluator<
946 Space_,
947 TrafoEvaluator_,
948 SpaceEvalTraits_,
949 Shape::Hypercube<3> >,
950 TrafoEvaluator_,
951 SpaceEvalTraits_,
952 ref_caps>
953 {
954 public:
957
959 typedef Space_ SpaceType;
960
962 typedef SpaceEvalTraits_ SpaceEvalTraits;
963
965 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
966
968 typedef typename EvalPolicy::DomainPointType DomainPointType;
969
971 typedef typename SpaceEvalTraits::DataType DataType;
972
973 protected:
975 int ek[12][2];
977 int qk[6][4];
978
979 public:
986 explicit Evaluator(const SpaceType& DOXY(space))
987 {
988 }
989
997 {
998 return 64;
999 }
1000
1001 void NOINLINE prepare(const TrafoEvaluator_& trafo_eval)
1002 {
1003 // compute edge orientations
1004 Geometry::Intern::SubIndexMapping<Shape::Hypercube<3>, 1, 0> sim1(
1005 trafo_eval.get_trafo().get_mesh().template get_index_set<3,0>()[trafo_eval.get_cell_index()],
1006 trafo_eval.get_trafo().get_mesh().template get_index_set<3,1>()[trafo_eval.get_cell_index()],
1007 trafo_eval.get_trafo().get_mesh().template get_index_set<1,0>());
1008
1009 // compute quad orientations
1010 Geometry::Intern::SubIndexMapping<Shape::Hypercube<3>, 2, 0> sim2(
1011 trafo_eval.get_trafo().get_mesh().template get_index_set<3,0>()[trafo_eval.get_cell_index()],
1012 trafo_eval.get_trafo().get_mesh().template get_index_set<3,2>()[trafo_eval.get_cell_index()],
1013 trafo_eval.get_trafo().get_mesh().template get_index_set<2,0>());
1014
1015 // fetch edge dof indices (9,...,31)
1016 for(int i(0); i < 12; ++i)
1017 {
1018 for(int j(0); j < 2; ++j)
1019 {
1020 ek[i][j] = 8 + 2*i + int(sim1.map(i, j));
1021 }
1022 }
1023
1024 // fetch quad dof indices (32,...,55)
1025 for(int i(0); i < 6; ++i)
1026 {
1027 for(int j(0); j < 4; ++j)
1028 {
1029 qk[i][j] = 32 + 4*i + int(sim2.map(i, j));
1030 }
1031 }
1032 }
1033
1043 template<typename EvalData_>
1044 void NOINLINE eval_ref_values(EvalData_& data, const DomainPointType& point) const
1045 {
1046 using namespace Lagrange3::Intern;
1047
1048 // vertex dofs
1049 data.phi[0].ref_value = p0(point[0]) * p0(point[1]) * p0(point[2]);
1050 data.phi[1].ref_value = p1(point[0]) * p0(point[1]) * p0(point[2]);
1051 data.phi[2].ref_value = p0(point[0]) * p1(point[1]) * p0(point[2]);
1052 data.phi[3].ref_value = p1(point[0]) * p1(point[1]) * p0(point[2]);
1053 data.phi[4].ref_value = p0(point[0]) * p0(point[1]) * p1(point[2]);
1054 data.phi[5].ref_value = p1(point[0]) * p0(point[1]) * p1(point[2]);
1055 data.phi[6].ref_value = p0(point[0]) * p1(point[1]) * p1(point[2]);
1056 data.phi[7].ref_value = p1(point[0]) * p1(point[1]) * p1(point[2]);
1057 // edge dofs
1058 data.phi[ek[ 0][0]].ref_value = p2(point[0]) * p0(point[1]) * p0(point[2]);
1059 data.phi[ek[ 0][1]].ref_value = p3(point[0]) * p0(point[1]) * p0(point[2]);
1060 data.phi[ek[ 1][0]].ref_value = p2(point[0]) * p1(point[1]) * p0(point[2]);
1061 data.phi[ek[ 1][1]].ref_value = p3(point[0]) * p1(point[1]) * p0(point[2]);
1062 data.phi[ek[ 2][0]].ref_value = p2(point[0]) * p0(point[1]) * p1(point[2]);
1063 data.phi[ek[ 2][1]].ref_value = p3(point[0]) * p0(point[1]) * p1(point[2]);
1064 data.phi[ek[ 3][0]].ref_value = p2(point[0]) * p1(point[1]) * p1(point[2]);
1065 data.phi[ek[ 3][1]].ref_value = p3(point[0]) * p1(point[1]) * p1(point[2]);
1066 data.phi[ek[ 4][0]].ref_value = p0(point[0]) * p2(point[1]) * p0(point[2]);
1067 data.phi[ek[ 4][1]].ref_value = p0(point[0]) * p3(point[1]) * p0(point[2]);
1068 data.phi[ek[ 5][0]].ref_value = p1(point[0]) * p2(point[1]) * p0(point[2]);
1069 data.phi[ek[ 5][1]].ref_value = p1(point[0]) * p3(point[1]) * p0(point[2]);
1070 data.phi[ek[ 6][0]].ref_value = p0(point[0]) * p2(point[1]) * p1(point[2]);
1071 data.phi[ek[ 6][1]].ref_value = p0(point[0]) * p3(point[1]) * p1(point[2]);
1072 data.phi[ek[ 7][0]].ref_value = p1(point[0]) * p2(point[1]) * p1(point[2]);
1073 data.phi[ek[ 7][1]].ref_value = p1(point[0]) * p3(point[1]) * p1(point[2]);
1074 data.phi[ek[ 8][0]].ref_value = p0(point[0]) * p0(point[1]) * p2(point[2]);
1075 data.phi[ek[ 8][1]].ref_value = p0(point[0]) * p0(point[1]) * p3(point[2]);
1076 data.phi[ek[ 9][0]].ref_value = p1(point[0]) * p0(point[1]) * p2(point[2]);
1077 data.phi[ek[ 9][1]].ref_value = p1(point[0]) * p0(point[1]) * p3(point[2]);
1078 data.phi[ek[10][0]].ref_value = p0(point[0]) * p1(point[1]) * p2(point[2]);
1079 data.phi[ek[10][1]].ref_value = p0(point[0]) * p1(point[1]) * p3(point[2]);
1080 data.phi[ek[11][0]].ref_value = p1(point[0]) * p1(point[1]) * p2(point[2]);
1081 data.phi[ek[11][1]].ref_value = p1(point[0]) * p1(point[1]) * p3(point[2]);
1082 // face dofs
1083 data.phi[qk[0][0]].ref_value = p2(point[0]) * p2(point[1]) * p0(point[2]);
1084 data.phi[qk[0][1]].ref_value = p3(point[0]) * p2(point[1]) * p0(point[2]);
1085 data.phi[qk[0][2]].ref_value = p2(point[0]) * p3(point[1]) * p0(point[2]);
1086 data.phi[qk[0][3]].ref_value = p3(point[0]) * p3(point[1]) * p0(point[2]);
1087 data.phi[qk[1][0]].ref_value = p2(point[0]) * p2(point[1]) * p1(point[2]);
1088 data.phi[qk[1][1]].ref_value = p3(point[0]) * p2(point[1]) * p1(point[2]);
1089 data.phi[qk[1][2]].ref_value = p2(point[0]) * p3(point[1]) * p1(point[2]);
1090 data.phi[qk[1][3]].ref_value = p3(point[0]) * p3(point[1]) * p1(point[2]);
1091 data.phi[qk[2][0]].ref_value = p2(point[0]) * p0(point[1]) * p2(point[2]);
1092 data.phi[qk[2][1]].ref_value = p3(point[0]) * p0(point[1]) * p2(point[2]);
1093 data.phi[qk[2][2]].ref_value = p2(point[0]) * p0(point[1]) * p3(point[2]);
1094 data.phi[qk[2][3]].ref_value = p3(point[0]) * p0(point[1]) * p3(point[2]);
1095 data.phi[qk[3][0]].ref_value = p2(point[0]) * p1(point[1]) * p2(point[2]);
1096 data.phi[qk[3][1]].ref_value = p3(point[0]) * p1(point[1]) * p2(point[2]);
1097 data.phi[qk[3][2]].ref_value = p2(point[0]) * p1(point[1]) * p3(point[2]);
1098 data.phi[qk[3][3]].ref_value = p3(point[0]) * p1(point[1]) * p3(point[2]);
1099 data.phi[qk[4][0]].ref_value = p0(point[0]) * p2(point[1]) * p2(point[2]);
1100 data.phi[qk[4][1]].ref_value = p0(point[0]) * p3(point[1]) * p2(point[2]);
1101 data.phi[qk[4][2]].ref_value = p0(point[0]) * p2(point[1]) * p3(point[2]);
1102 data.phi[qk[4][3]].ref_value = p0(point[0]) * p3(point[1]) * p3(point[2]);
1103 data.phi[qk[5][0]].ref_value = p1(point[0]) * p2(point[1]) * p2(point[2]);
1104 data.phi[qk[5][1]].ref_value = p1(point[0]) * p3(point[1]) * p2(point[2]);
1105 data.phi[qk[5][2]].ref_value = p1(point[0]) * p2(point[1]) * p3(point[2]);
1106 data.phi[qk[5][3]].ref_value = p1(point[0]) * p3(point[1]) * p3(point[2]);
1107 // center dofs
1108 data.phi[56].ref_value = p2(point[0]) * p2(point[1]) * p2(point[2]);
1109 data.phi[57].ref_value = p3(point[0]) * p2(point[1]) * p2(point[2]);
1110 data.phi[58].ref_value = p2(point[0]) * p3(point[1]) * p2(point[2]);
1111 data.phi[59].ref_value = p3(point[0]) * p3(point[1]) * p2(point[2]);
1112 data.phi[60].ref_value = p2(point[0]) * p2(point[1]) * p3(point[2]);
1113 data.phi[61].ref_value = p3(point[0]) * p2(point[1]) * p3(point[2]);
1114 data.phi[62].ref_value = p2(point[0]) * p3(point[1]) * p3(point[2]);
1115 data.phi[63].ref_value = p3(point[0]) * p3(point[1]) * p3(point[2]);
1116 }
1117
1127 template<typename EvalData_>
1128 void NOINLINE eval_ref_gradients(EvalData_& data, const DomainPointType& point) const
1129 {
1130 using namespace Lagrange3::Intern;
1131
1132 // vertex dofs
1133 data.phi[0].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p0(point[2]);
1134 data.phi[0].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p0(point[2]);
1135 data.phi[0].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p0(point[2]);
1136 data.phi[1].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p0(point[2]);
1137 data.phi[1].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p0(point[2]);
1138 data.phi[1].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p0(point[2]);
1139 data.phi[2].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p0(point[2]);
1140 data.phi[2].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p0(point[2]);
1141 data.phi[2].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p0(point[2]);
1142 data.phi[3].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p0(point[2]);
1143 data.phi[3].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p0(point[2]);
1144 data.phi[3].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p0(point[2]);
1145 data.phi[4].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p1(point[2]);
1146 data.phi[4].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p1(point[2]);
1147 data.phi[4].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p1(point[2]);
1148 data.phi[5].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p1(point[2]);
1149 data.phi[5].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p1(point[2]);
1150 data.phi[5].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p1(point[2]);
1151 data.phi[6].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p1(point[2]);
1152 data.phi[6].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p1(point[2]);
1153 data.phi[6].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p1(point[2]);
1154 data.phi[7].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p1(point[2]);
1155 data.phi[7].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p1(point[2]);
1156 data.phi[7].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p1(point[2]);
1157 // edge dofs
1158 data.phi[ek[ 0][0]].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p0(point[2]);
1159 data.phi[ek[ 0][0]].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p0(point[2]);
1160 data.phi[ek[ 0][0]].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p0(point[2]);
1161 data.phi[ek[ 0][1]].ref_grad[0] = d1p3(point[0]) * p0(point[1]) * p0(point[2]);
1162 data.phi[ek[ 0][1]].ref_grad[1] = p3(point[0]) * d1p0(point[1]) * p0(point[2]);
1163 data.phi[ek[ 0][1]].ref_grad[2] = p3(point[0]) * p0(point[1]) * d1p0(point[2]);
1164 data.phi[ek[ 1][0]].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p0(point[2]);
1165 data.phi[ek[ 1][0]].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p0(point[2]);
1166 data.phi[ek[ 1][0]].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p0(point[2]);
1167 data.phi[ek[ 1][1]].ref_grad[0] = d1p3(point[0]) * p1(point[1]) * p0(point[2]);
1168 data.phi[ek[ 1][1]].ref_grad[1] = p3(point[0]) * d1p1(point[1]) * p0(point[2]);
1169 data.phi[ek[ 1][1]].ref_grad[2] = p3(point[0]) * p1(point[1]) * d1p0(point[2]);
1170 data.phi[ek[ 2][0]].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p1(point[2]);
1171 data.phi[ek[ 2][0]].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p1(point[2]);
1172 data.phi[ek[ 2][0]].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p1(point[2]);
1173 data.phi[ek[ 2][1]].ref_grad[0] = d1p3(point[0]) * p0(point[1]) * p1(point[2]);
1174 data.phi[ek[ 2][1]].ref_grad[1] = p3(point[0]) * d1p0(point[1]) * p1(point[2]);
1175 data.phi[ek[ 2][1]].ref_grad[2] = p3(point[0]) * p0(point[1]) * d1p1(point[2]);
1176 data.phi[ek[ 3][0]].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p1(point[2]);
1177 data.phi[ek[ 3][0]].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p1(point[2]);
1178 data.phi[ek[ 3][0]].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p1(point[2]);
1179 data.phi[ek[ 3][1]].ref_grad[0] = d1p3(point[0]) * p1(point[1]) * p1(point[2]);
1180 data.phi[ek[ 3][1]].ref_grad[1] = p3(point[0]) * d1p1(point[1]) * p1(point[2]);
1181 data.phi[ek[ 3][1]].ref_grad[2] = p3(point[0]) * p1(point[1]) * d1p1(point[2]);
1182 data.phi[ek[ 4][0]].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p0(point[2]);
1183 data.phi[ek[ 4][0]].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p0(point[2]);
1184 data.phi[ek[ 4][0]].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p0(point[2]);
1185 data.phi[ek[ 4][1]].ref_grad[0] = d1p0(point[0]) * p3(point[1]) * p0(point[2]);
1186 data.phi[ek[ 4][1]].ref_grad[1] = p0(point[0]) * d1p3(point[1]) * p0(point[2]);
1187 data.phi[ek[ 4][1]].ref_grad[2] = p0(point[0]) * p3(point[1]) * d1p0(point[2]);
1188 data.phi[ek[ 5][0]].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p0(point[2]);
1189 data.phi[ek[ 5][0]].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p0(point[2]);
1190 data.phi[ek[ 5][0]].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p0(point[2]);
1191 data.phi[ek[ 5][1]].ref_grad[0] = d1p1(point[0]) * p3(point[1]) * p0(point[2]);
1192 data.phi[ek[ 5][1]].ref_grad[1] = p1(point[0]) * d1p3(point[1]) * p0(point[2]);
1193 data.phi[ek[ 5][1]].ref_grad[2] = p1(point[0]) * p3(point[1]) * d1p0(point[2]);
1194 data.phi[ek[ 6][0]].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p1(point[2]);
1195 data.phi[ek[ 6][0]].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p1(point[2]);
1196 data.phi[ek[ 6][0]].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p1(point[2]);
1197 data.phi[ek[ 6][1]].ref_grad[0] = d1p0(point[0]) * p3(point[1]) * p1(point[2]);
1198 data.phi[ek[ 6][1]].ref_grad[1] = p0(point[0]) * d1p3(point[1]) * p1(point[2]);
1199 data.phi[ek[ 6][1]].ref_grad[2] = p0(point[0]) * p3(point[1]) * d1p1(point[2]);
1200 data.phi[ek[ 7][0]].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p1(point[2]);
1201 data.phi[ek[ 7][0]].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p1(point[2]);
1202 data.phi[ek[ 7][0]].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p1(point[2]);
1203 data.phi[ek[ 7][1]].ref_grad[0] = d1p1(point[0]) * p3(point[1]) * p1(point[2]);
1204 data.phi[ek[ 7][1]].ref_grad[1] = p1(point[0]) * d1p3(point[1]) * p1(point[2]);
1205 data.phi[ek[ 7][1]].ref_grad[2] = p1(point[0]) * p3(point[1]) * d1p1(point[2]);
1206 data.phi[ek[ 8][0]].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p2(point[2]);
1207 data.phi[ek[ 8][0]].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p2(point[2]);
1208 data.phi[ek[ 8][0]].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p2(point[2]);
1209 data.phi[ek[ 8][1]].ref_grad[0] = d1p0(point[0]) * p0(point[1]) * p3(point[2]);
1210 data.phi[ek[ 8][1]].ref_grad[1] = p0(point[0]) * d1p0(point[1]) * p3(point[2]);
1211 data.phi[ek[ 8][1]].ref_grad[2] = p0(point[0]) * p0(point[1]) * d1p3(point[2]);
1212 data.phi[ek[ 9][0]].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p2(point[2]);
1213 data.phi[ek[ 9][0]].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p2(point[2]);
1214 data.phi[ek[ 9][0]].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p2(point[2]);
1215 data.phi[ek[ 9][1]].ref_grad[0] = d1p1(point[0]) * p0(point[1]) * p3(point[2]);
1216 data.phi[ek[ 9][1]].ref_grad[1] = p1(point[0]) * d1p0(point[1]) * p3(point[2]);
1217 data.phi[ek[ 9][1]].ref_grad[2] = p1(point[0]) * p0(point[1]) * d1p3(point[2]);
1218 data.phi[ek[10][0]].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p2(point[2]);
1219 data.phi[ek[10][0]].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p2(point[2]);
1220 data.phi[ek[10][0]].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p2(point[2]);
1221 data.phi[ek[10][1]].ref_grad[0] = d1p0(point[0]) * p1(point[1]) * p3(point[2]);
1222 data.phi[ek[10][1]].ref_grad[1] = p0(point[0]) * d1p1(point[1]) * p3(point[2]);
1223 data.phi[ek[10][1]].ref_grad[2] = p0(point[0]) * p1(point[1]) * d1p3(point[2]);
1224 data.phi[ek[11][0]].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p2(point[2]);
1225 data.phi[ek[11][0]].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p2(point[2]);
1226 data.phi[ek[11][0]].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p2(point[2]);
1227 data.phi[ek[11][1]].ref_grad[0] = d1p1(point[0]) * p1(point[1]) * p3(point[2]);
1228 data.phi[ek[11][1]].ref_grad[1] = p1(point[0]) * d1p1(point[1]) * p3(point[2]);
1229 data.phi[ek[11][1]].ref_grad[2] = p1(point[0]) * p1(point[1]) * d1p3(point[2]);
1230 // face dofs
1231 data.phi[qk[0][0]].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p0(point[2]);
1232 data.phi[qk[0][0]].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p0(point[2]);
1233 data.phi[qk[0][0]].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p0(point[2]);
1234 data.phi[qk[0][1]].ref_grad[0] = d1p3(point[0]) * p2(point[1]) * p0(point[2]);
1235 data.phi[qk[0][1]].ref_grad[1] = p3(point[0]) * d1p2(point[1]) * p0(point[2]);
1236 data.phi[qk[0][1]].ref_grad[2] = p3(point[0]) * p2(point[1]) * d1p0(point[2]);
1237 data.phi[qk[0][2]].ref_grad[0] = d1p2(point[0]) * p3(point[1]) * p0(point[2]);
1238 data.phi[qk[0][2]].ref_grad[1] = p2(point[0]) * d1p3(point[1]) * p0(point[2]);
1239 data.phi[qk[0][2]].ref_grad[2] = p2(point[0]) * p3(point[1]) * d1p0(point[2]);
1240 data.phi[qk[0][3]].ref_grad[0] = d1p3(point[0]) * p3(point[1]) * p0(point[2]);
1241 data.phi[qk[0][3]].ref_grad[1] = p3(point[0]) * d1p3(point[1]) * p0(point[2]);
1242 data.phi[qk[0][3]].ref_grad[2] = p3(point[0]) * p3(point[1]) * d1p0(point[2]);
1243 data.phi[qk[1][0]].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p1(point[2]);
1244 data.phi[qk[1][0]].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p1(point[2]);
1245 data.phi[qk[1][0]].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p1(point[2]);
1246 data.phi[qk[1][1]].ref_grad[0] = d1p3(point[0]) * p2(point[1]) * p1(point[2]);
1247 data.phi[qk[1][1]].ref_grad[1] = p3(point[0]) * d1p2(point[1]) * p1(point[2]);
1248 data.phi[qk[1][1]].ref_grad[2] = p3(point[0]) * p2(point[1]) * d1p1(point[2]);
1249 data.phi[qk[1][2]].ref_grad[0] = d1p2(point[0]) * p3(point[1]) * p1(point[2]);
1250 data.phi[qk[1][2]].ref_grad[1] = p2(point[0]) * d1p3(point[1]) * p1(point[2]);
1251 data.phi[qk[1][2]].ref_grad[2] = p2(point[0]) * p3(point[1]) * d1p1(point[2]);
1252 data.phi[qk[1][3]].ref_grad[0] = d1p3(point[0]) * p3(point[1]) * p1(point[2]);
1253 data.phi[qk[1][3]].ref_grad[1] = p3(point[0]) * d1p3(point[1]) * p1(point[2]);
1254 data.phi[qk[1][3]].ref_grad[2] = p3(point[0]) * p3(point[1]) * d1p1(point[2]);
1255 data.phi[qk[2][0]].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p2(point[2]);
1256 data.phi[qk[2][0]].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p2(point[2]);
1257 data.phi[qk[2][0]].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p2(point[2]);
1258 data.phi[qk[2][1]].ref_grad[0] = d1p3(point[0]) * p0(point[1]) * p2(point[2]);
1259 data.phi[qk[2][1]].ref_grad[1] = p3(point[0]) * d1p0(point[1]) * p2(point[2]);
1260 data.phi[qk[2][1]].ref_grad[2] = p3(point[0]) * p0(point[1]) * d1p2(point[2]);
1261 data.phi[qk[2][2]].ref_grad[0] = d1p2(point[0]) * p0(point[1]) * p3(point[2]);
1262 data.phi[qk[2][2]].ref_grad[1] = p2(point[0]) * d1p0(point[1]) * p3(point[2]);
1263 data.phi[qk[2][2]].ref_grad[2] = p2(point[0]) * p0(point[1]) * d1p3(point[2]);
1264 data.phi[qk[2][3]].ref_grad[0] = d1p3(point[0]) * p0(point[1]) * p3(point[2]);
1265 data.phi[qk[2][3]].ref_grad[1] = p3(point[0]) * d1p0(point[1]) * p3(point[2]);
1266 data.phi[qk[2][3]].ref_grad[2] = p3(point[0]) * p0(point[1]) * d1p3(point[2]);
1267 data.phi[qk[3][0]].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p2(point[2]);
1268 data.phi[qk[3][0]].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p2(point[2]);
1269 data.phi[qk[3][0]].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p2(point[2]);
1270 data.phi[qk[3][1]].ref_grad[0] = d1p3(point[0]) * p1(point[1]) * p2(point[2]);
1271 data.phi[qk[3][1]].ref_grad[1] = p3(point[0]) * d1p1(point[1]) * p2(point[2]);
1272 data.phi[qk[3][1]].ref_grad[2] = p3(point[0]) * p1(point[1]) * d1p2(point[2]);
1273 data.phi[qk[3][2]].ref_grad[0] = d1p2(point[0]) * p1(point[1]) * p3(point[2]);
1274 data.phi[qk[3][2]].ref_grad[1] = p2(point[0]) * d1p1(point[1]) * p3(point[2]);
1275 data.phi[qk[3][2]].ref_grad[2] = p2(point[0]) * p1(point[1]) * d1p3(point[2]);
1276 data.phi[qk[3][3]].ref_grad[0] = d1p3(point[0]) * p1(point[1]) * p3(point[2]);
1277 data.phi[qk[3][3]].ref_grad[1] = p3(point[0]) * d1p1(point[1]) * p3(point[2]);
1278 data.phi[qk[3][3]].ref_grad[2] = p3(point[0]) * p1(point[1]) * d1p3(point[2]);
1279 data.phi[qk[4][0]].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p2(point[2]);
1280 data.phi[qk[4][0]].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p2(point[2]);
1281 data.phi[qk[4][0]].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p2(point[2]);
1282 data.phi[qk[4][1]].ref_grad[0] = d1p0(point[0]) * p3(point[1]) * p2(point[2]);
1283 data.phi[qk[4][1]].ref_grad[1] = p0(point[0]) * d1p3(point[1]) * p2(point[2]);
1284 data.phi[qk[4][1]].ref_grad[2] = p0(point[0]) * p3(point[1]) * d1p2(point[2]);
1285 data.phi[qk[4][2]].ref_grad[0] = d1p0(point[0]) * p2(point[1]) * p3(point[2]);
1286 data.phi[qk[4][2]].ref_grad[1] = p0(point[0]) * d1p2(point[1]) * p3(point[2]);
1287 data.phi[qk[4][2]].ref_grad[2] = p0(point[0]) * p2(point[1]) * d1p3(point[2]);
1288 data.phi[qk[4][3]].ref_grad[0] = d1p0(point[0]) * p3(point[1]) * p3(point[2]);
1289 data.phi[qk[4][3]].ref_grad[1] = p0(point[0]) * d1p3(point[1]) * p3(point[2]);
1290 data.phi[qk[4][3]].ref_grad[2] = p0(point[0]) * p3(point[1]) * d1p3(point[2]);
1291 data.phi[qk[5][0]].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p2(point[2]);
1292 data.phi[qk[5][0]].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p2(point[2]);
1293 data.phi[qk[5][0]].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p2(point[2]);
1294 data.phi[qk[5][1]].ref_grad[0] = d1p1(point[0]) * p3(point[1]) * p2(point[2]);
1295 data.phi[qk[5][1]].ref_grad[1] = p1(point[0]) * d1p3(point[1]) * p2(point[2]);
1296 data.phi[qk[5][1]].ref_grad[2] = p1(point[0]) * p3(point[1]) * d1p2(point[2]);
1297 data.phi[qk[5][2]].ref_grad[0] = d1p1(point[0]) * p2(point[1]) * p3(point[2]);
1298 data.phi[qk[5][2]].ref_grad[1] = p1(point[0]) * d1p2(point[1]) * p3(point[2]);
1299 data.phi[qk[5][2]].ref_grad[2] = p1(point[0]) * p2(point[1]) * d1p3(point[2]);
1300 data.phi[qk[5][3]].ref_grad[0] = d1p1(point[0]) * p3(point[1]) * p3(point[2]);
1301 data.phi[qk[5][3]].ref_grad[1] = p1(point[0]) * d1p3(point[1]) * p3(point[2]);
1302 data.phi[qk[5][3]].ref_grad[2] = p1(point[0]) * p3(point[1]) * d1p3(point[2]);
1303 // center dofs
1304 data.phi[56].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p2(point[2]);
1305 data.phi[56].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p2(point[2]);
1306 data.phi[56].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p2(point[2]);
1307 data.phi[57].ref_grad[0] = d1p3(point[0]) * p2(point[1]) * p2(point[2]);
1308 data.phi[57].ref_grad[1] = p3(point[0]) * d1p2(point[1]) * p2(point[2]);
1309 data.phi[57].ref_grad[2] = p3(point[0]) * p2(point[1]) * d1p2(point[2]);
1310 data.phi[58].ref_grad[0] = d1p2(point[0]) * p3(point[1]) * p2(point[2]);
1311 data.phi[58].ref_grad[1] = p2(point[0]) * d1p3(point[1]) * p2(point[2]);
1312 data.phi[58].ref_grad[2] = p2(point[0]) * p3(point[1]) * d1p2(point[2]);
1313 data.phi[59].ref_grad[0] = d1p3(point[0]) * p3(point[1]) * p2(point[2]);
1314 data.phi[59].ref_grad[1] = p3(point[0]) * d1p3(point[1]) * p2(point[2]);
1315 data.phi[59].ref_grad[2] = p3(point[0]) * p3(point[1]) * d1p2(point[2]);
1316 data.phi[60].ref_grad[0] = d1p2(point[0]) * p2(point[1]) * p3(point[2]);
1317 data.phi[60].ref_grad[1] = p2(point[0]) * d1p2(point[1]) * p3(point[2]);
1318 data.phi[60].ref_grad[2] = p2(point[0]) * p2(point[1]) * d1p3(point[2]);
1319 data.phi[61].ref_grad[0] = d1p3(point[0]) * p2(point[1]) * p3(point[2]);
1320 data.phi[61].ref_grad[1] = p3(point[0]) * d1p2(point[1]) * p3(point[2]);
1321 data.phi[61].ref_grad[2] = p3(point[0]) * p2(point[1]) * d1p3(point[2]);
1322 data.phi[62].ref_grad[0] = d1p2(point[0]) * p3(point[1]) * p3(point[2]);
1323 data.phi[62].ref_grad[1] = p2(point[0]) * d1p3(point[1]) * p3(point[2]);
1324 data.phi[62].ref_grad[2] = p2(point[0]) * p3(point[1]) * d1p3(point[2]);
1325 data.phi[63].ref_grad[0] = d1p3(point[0]) * p3(point[1]) * p3(point[2]);
1326 data.phi[63].ref_grad[1] = p3(point[0]) * d1p3(point[1]) * p3(point[2]);
1327 data.phi[63].ref_grad[2] = p3(point[0]) * p3(point[1]) * d1p3(point[2]);
1328 }
1329
1339 template<typename EvalData_>
1340 void NOINLINE eval_ref_hessians(EvalData_& data, const DomainPointType& point) const
1341 {
1342 using namespace Lagrange3::Intern;
1343
1344 // all hail to regular expressions!
1345 data.phi[0].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p0(point[2]);
1346 data.phi[0].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p0(point[2]);
1347 data.phi[0].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p0(point[2]);
1348 data.phi[0].ref_hess[0][1] =
1349 data.phi[0].ref_hess[1][0] = d1p0(point[0]) * d1p0(point[1]) * p0(point[2]);
1350 data.phi[0].ref_hess[0][2] =
1351 data.phi[0].ref_hess[2][0] = d1p0(point[0]) * p0(point[1]) * d1p0(point[2]);
1352 data.phi[0].ref_hess[1][2] =
1353 data.phi[0].ref_hess[2][1] = p0(point[0]) * d1p0(point[1]) * d1p0(point[2]);
1354 data.phi[1].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p0(point[2]);
1355 data.phi[1].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p0(point[2]);
1356 data.phi[1].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p0(point[2]);
1357 data.phi[1].ref_hess[0][1] =
1358 data.phi[1].ref_hess[1][0] = d1p1(point[0]) * d1p0(point[1]) * p0(point[2]);
1359 data.phi[1].ref_hess[0][2] =
1360 data.phi[1].ref_hess[2][0] = d1p1(point[0]) * p0(point[1]) * d1p0(point[2]);
1361 data.phi[1].ref_hess[1][2] =
1362 data.phi[1].ref_hess[2][1] = p1(point[0]) * d1p0(point[1]) * d1p0(point[2]);
1363 data.phi[2].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p0(point[2]);
1364 data.phi[2].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p0(point[2]);
1365 data.phi[2].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p0(point[2]);
1366 data.phi[2].ref_hess[0][1] =
1367 data.phi[2].ref_hess[1][0] = d1p0(point[0]) * d1p1(point[1]) * p0(point[2]);
1368 data.phi[2].ref_hess[0][2] =
1369 data.phi[2].ref_hess[2][0] = d1p0(point[0]) * p1(point[1]) * d1p0(point[2]);
1370 data.phi[2].ref_hess[1][2] =
1371 data.phi[2].ref_hess[2][1] = p0(point[0]) * d1p1(point[1]) * d1p0(point[2]);
1372 data.phi[3].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p0(point[2]);
1373 data.phi[3].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p0(point[2]);
1374 data.phi[3].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p0(point[2]);
1375 data.phi[3].ref_hess[0][1] =
1376 data.phi[3].ref_hess[1][0] = d1p1(point[0]) * d1p1(point[1]) * p0(point[2]);
1377 data.phi[3].ref_hess[0][2] =
1378 data.phi[3].ref_hess[2][0] = d1p1(point[0]) * p1(point[1]) * d1p0(point[2]);
1379 data.phi[3].ref_hess[1][2] =
1380 data.phi[3].ref_hess[2][1] = p1(point[0]) * d1p1(point[1]) * d1p0(point[2]);
1381 data.phi[4].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p1(point[2]);
1382 data.phi[4].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p1(point[2]);
1383 data.phi[4].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p1(point[2]);
1384 data.phi[4].ref_hess[0][1] =
1385 data.phi[4].ref_hess[1][0] = d1p0(point[0]) * d1p0(point[1]) * p1(point[2]);
1386 data.phi[4].ref_hess[0][2] =
1387 data.phi[4].ref_hess[2][0] = d1p0(point[0]) * p0(point[1]) * d1p1(point[2]);
1388 data.phi[4].ref_hess[1][2] =
1389 data.phi[4].ref_hess[2][1] = p0(point[0]) * d1p0(point[1]) * d1p1(point[2]);
1390 data.phi[5].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p1(point[2]);
1391 data.phi[5].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p1(point[2]);
1392 data.phi[5].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p1(point[2]);
1393 data.phi[5].ref_hess[0][1] =
1394 data.phi[5].ref_hess[1][0] = d1p1(point[0]) * d1p0(point[1]) * p1(point[2]);
1395 data.phi[5].ref_hess[0][2] =
1396 data.phi[5].ref_hess[2][0] = d1p1(point[0]) * p0(point[1]) * d1p1(point[2]);
1397 data.phi[5].ref_hess[1][2] =
1398 data.phi[5].ref_hess[2][1] = p1(point[0]) * d1p0(point[1]) * d1p1(point[2]);
1399 data.phi[6].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p1(point[2]);
1400 data.phi[6].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p1(point[2]);
1401 data.phi[6].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p1(point[2]);
1402 data.phi[6].ref_hess[0][1] =
1403 data.phi[6].ref_hess[1][0] = d1p0(point[0]) * d1p1(point[1]) * p1(point[2]);
1404 data.phi[6].ref_hess[0][2] =
1405 data.phi[6].ref_hess[2][0] = d1p0(point[0]) * p1(point[1]) * d1p1(point[2]);
1406 data.phi[6].ref_hess[1][2] =
1407 data.phi[6].ref_hess[2][1] = p0(point[0]) * d1p1(point[1]) * d1p1(point[2]);
1408 data.phi[7].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p1(point[2]);
1409 data.phi[7].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p1(point[2]);
1410 data.phi[7].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p1(point[2]);
1411 data.phi[7].ref_hess[0][1] =
1412 data.phi[7].ref_hess[1][0] = d1p1(point[0]) * d1p1(point[1]) * p1(point[2]);
1413 data.phi[7].ref_hess[0][2] =
1414 data.phi[7].ref_hess[2][0] = d1p1(point[0]) * p1(point[1]) * d1p1(point[2]);
1415 data.phi[7].ref_hess[1][2] =
1416 data.phi[7].ref_hess[2][1] = p1(point[0]) * d1p1(point[1]) * d1p1(point[2]);
1417 data.phi[ek[ 0][0]].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p0(point[2]);
1418 data.phi[ek[ 0][0]].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p0(point[2]);
1419 data.phi[ek[ 0][0]].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p0(point[2]);
1420 data.phi[ek[ 0][0]].ref_hess[0][1] =
1421 data.phi[ek[ 0][0]].ref_hess[1][0] = d1p2(point[0]) * d1p0(point[1]) * p0(point[2]);
1422 data.phi[ek[ 0][0]].ref_hess[0][2] =
1423 data.phi[ek[ 0][0]].ref_hess[2][0] = d1p2(point[0]) * p0(point[1]) * d1p0(point[2]);
1424 data.phi[ek[ 0][0]].ref_hess[1][2] =
1425 data.phi[ek[ 0][0]].ref_hess[2][1] = p2(point[0]) * d1p0(point[1]) * d1p0(point[2]);
1426 data.phi[ek[ 0][1]].ref_hess[0][0] = d2p3(point[0]) * p0(point[1]) * p0(point[2]);
1427 data.phi[ek[ 0][1]].ref_hess[1][1] = p3(point[0]) * d2p0(point[1]) * p0(point[2]);
1428 data.phi[ek[ 0][1]].ref_hess[2][2] = p3(point[0]) * p0(point[1]) * d2p0(point[2]);
1429 data.phi[ek[ 0][1]].ref_hess[0][1] =
1430 data.phi[ek[ 0][1]].ref_hess[1][0] = d1p3(point[0]) * d1p0(point[1]) * p0(point[2]);
1431 data.phi[ek[ 0][1]].ref_hess[0][2] =
1432 data.phi[ek[ 0][1]].ref_hess[2][0] = d1p3(point[0]) * p0(point[1]) * d1p0(point[2]);
1433 data.phi[ek[ 0][1]].ref_hess[1][2] =
1434 data.phi[ek[ 0][1]].ref_hess[2][1] = p3(point[0]) * d1p0(point[1]) * d1p0(point[2]);
1435 data.phi[ek[ 1][0]].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p0(point[2]);
1436 data.phi[ek[ 1][0]].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p0(point[2]);
1437 data.phi[ek[ 1][0]].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p0(point[2]);
1438 data.phi[ek[ 1][0]].ref_hess[0][1] =
1439 data.phi[ek[ 1][0]].ref_hess[1][0] = d1p2(point[0]) * d1p1(point[1]) * p0(point[2]);
1440 data.phi[ek[ 1][0]].ref_hess[0][2] =
1441 data.phi[ek[ 1][0]].ref_hess[2][0] = d1p2(point[0]) * p1(point[1]) * d1p0(point[2]);
1442 data.phi[ek[ 1][0]].ref_hess[1][2] =
1443 data.phi[ek[ 1][0]].ref_hess[2][1] = p2(point[0]) * d1p1(point[1]) * d1p0(point[2]);
1444 data.phi[ek[ 1][1]].ref_hess[0][0] = d2p3(point[0]) * p1(point[1]) * p0(point[2]);
1445 data.phi[ek[ 1][1]].ref_hess[1][1] = p3(point[0]) * d2p1(point[1]) * p0(point[2]);
1446 data.phi[ek[ 1][1]].ref_hess[2][2] = p3(point[0]) * p1(point[1]) * d2p0(point[2]);
1447 data.phi[ek[ 1][1]].ref_hess[0][1] =
1448 data.phi[ek[ 1][1]].ref_hess[1][0] = d1p3(point[0]) * d1p1(point[1]) * p0(point[2]);
1449 data.phi[ek[ 1][1]].ref_hess[0][2] =
1450 data.phi[ek[ 1][1]].ref_hess[2][0] = d1p3(point[0]) * p1(point[1]) * d1p0(point[2]);
1451 data.phi[ek[ 1][1]].ref_hess[1][2] =
1452 data.phi[ek[ 1][1]].ref_hess[2][1] = p3(point[0]) * d1p1(point[1]) * d1p0(point[2]);
1453 data.phi[ek[ 2][0]].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p1(point[2]);
1454 data.phi[ek[ 2][0]].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p1(point[2]);
1455 data.phi[ek[ 2][0]].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p1(point[2]);
1456 data.phi[ek[ 2][0]].ref_hess[0][1] =
1457 data.phi[ek[ 2][0]].ref_hess[1][0] = d1p2(point[0]) * d1p0(point[1]) * p1(point[2]);
1458 data.phi[ek[ 2][0]].ref_hess[0][2] =
1459 data.phi[ek[ 2][0]].ref_hess[2][0] = d1p2(point[0]) * p0(point[1]) * d1p1(point[2]);
1460 data.phi[ek[ 2][0]].ref_hess[1][2] =
1461 data.phi[ek[ 2][0]].ref_hess[2][1] = p2(point[0]) * d1p0(point[1]) * d1p1(point[2]);
1462 data.phi[ek[ 2][1]].ref_hess[0][0] = d2p3(point[0]) * p0(point[1]) * p1(point[2]);
1463 data.phi[ek[ 2][1]].ref_hess[1][1] = p3(point[0]) * d2p0(point[1]) * p1(point[2]);
1464 data.phi[ek[ 2][1]].ref_hess[2][2] = p3(point[0]) * p0(point[1]) * d2p1(point[2]);
1465 data.phi[ek[ 2][1]].ref_hess[0][1] =
1466 data.phi[ek[ 2][1]].ref_hess[1][0] = d1p3(point[0]) * d1p0(point[1]) * p1(point[2]);
1467 data.phi[ek[ 2][1]].ref_hess[0][2] =
1468 data.phi[ek[ 2][1]].ref_hess[2][0] = d1p3(point[0]) * p0(point[1]) * d1p1(point[2]);
1469 data.phi[ek[ 2][1]].ref_hess[1][2] =
1470 data.phi[ek[ 2][1]].ref_hess[2][1] = p3(point[0]) * d1p0(point[1]) * d1p1(point[2]);
1471 data.phi[ek[ 3][0]].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p1(point[2]);
1472 data.phi[ek[ 3][0]].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p1(point[2]);
1473 data.phi[ek[ 3][0]].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p1(point[2]);
1474 data.phi[ek[ 3][0]].ref_hess[0][1] =
1475 data.phi[ek[ 3][0]].ref_hess[1][0] = d1p2(point[0]) * d1p1(point[1]) * p1(point[2]);
1476 data.phi[ek[ 3][0]].ref_hess[0][2] =
1477 data.phi[ek[ 3][0]].ref_hess[2][0] = d1p2(point[0]) * p1(point[1]) * d1p1(point[2]);
1478 data.phi[ek[ 3][0]].ref_hess[1][2] =
1479 data.phi[ek[ 3][0]].ref_hess[2][1] = p2(point[0]) * d1p1(point[1]) * d1p1(point[2]);
1480 data.phi[ek[ 3][1]].ref_hess[0][0] = d2p3(point[0]) * p1(point[1]) * p1(point[2]);
1481 data.phi[ek[ 3][1]].ref_hess[1][1] = p3(point[0]) * d2p1(point[1]) * p1(point[2]);
1482 data.phi[ek[ 3][1]].ref_hess[2][2] = p3(point[0]) * p1(point[1]) * d2p1(point[2]);
1483 data.phi[ek[ 3][1]].ref_hess[0][1] =
1484 data.phi[ek[ 3][1]].ref_hess[1][0] = d1p3(point[0]) * d1p1(point[1]) * p1(point[2]);
1485 data.phi[ek[ 3][1]].ref_hess[0][2] =
1486 data.phi[ek[ 3][1]].ref_hess[2][0] = d1p3(point[0]) * p1(point[1]) * d1p1(point[2]);
1487 data.phi[ek[ 3][1]].ref_hess[1][2] =
1488 data.phi[ek[ 3][1]].ref_hess[2][1] = p3(point[0]) * d1p1(point[1]) * d1p1(point[2]);
1489 data.phi[ek[ 4][0]].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p0(point[2]);
1490 data.phi[ek[ 4][0]].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p0(point[2]);
1491 data.phi[ek[ 4][0]].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p0(point[2]);
1492 data.phi[ek[ 4][0]].ref_hess[0][1] =
1493 data.phi[ek[ 4][0]].ref_hess[1][0] = d1p0(point[0]) * d1p2(point[1]) * p0(point[2]);
1494 data.phi[ek[ 4][0]].ref_hess[0][2] =
1495 data.phi[ek[ 4][0]].ref_hess[2][0] = d1p0(point[0]) * p2(point[1]) * d1p0(point[2]);
1496 data.phi[ek[ 4][0]].ref_hess[1][2] =
1497 data.phi[ek[ 4][0]].ref_hess[2][1] = p0(point[0]) * d1p2(point[1]) * d1p0(point[2]);
1498 data.phi[ek[ 4][1]].ref_hess[0][0] = d2p0(point[0]) * p3(point[1]) * p0(point[2]);
1499 data.phi[ek[ 4][1]].ref_hess[1][1] = p0(point[0]) * d2p3(point[1]) * p0(point[2]);
1500 data.phi[ek[ 4][1]].ref_hess[2][2] = p0(point[0]) * p3(point[1]) * d2p0(point[2]);
1501 data.phi[ek[ 4][1]].ref_hess[0][1] =
1502 data.phi[ek[ 4][1]].ref_hess[1][0] = d1p0(point[0]) * d1p3(point[1]) * p0(point[2]);
1503 data.phi[ek[ 4][1]].ref_hess[0][2] =
1504 data.phi[ek[ 4][1]].ref_hess[2][0] = d1p0(point[0]) * p3(point[1]) * d1p0(point[2]);
1505 data.phi[ek[ 4][1]].ref_hess[1][2] =
1506 data.phi[ek[ 4][1]].ref_hess[2][1] = p0(point[0]) * d1p3(point[1]) * d1p0(point[2]);
1507 data.phi[ek[ 5][0]].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p0(point[2]);
1508 data.phi[ek[ 5][0]].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p0(point[2]);
1509 data.phi[ek[ 5][0]].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p0(point[2]);
1510 data.phi[ek[ 5][0]].ref_hess[0][1] =
1511 data.phi[ek[ 5][0]].ref_hess[1][0] = d1p1(point[0]) * d1p2(point[1]) * p0(point[2]);
1512 data.phi[ek[ 5][0]].ref_hess[0][2] =
1513 data.phi[ek[ 5][0]].ref_hess[2][0] = d1p1(point[0]) * p2(point[1]) * d1p0(point[2]);
1514 data.phi[ek[ 5][0]].ref_hess[1][2] =
1515 data.phi[ek[ 5][0]].ref_hess[2][1] = p1(point[0]) * d1p2(point[1]) * d1p0(point[2]);
1516 data.phi[ek[ 5][1]].ref_hess[0][0] = d2p1(point[0]) * p3(point[1]) * p0(point[2]);
1517 data.phi[ek[ 5][1]].ref_hess[1][1] = p1(point[0]) * d2p3(point[1]) * p0(point[2]);
1518 data.phi[ek[ 5][1]].ref_hess[2][2] = p1(point[0]) * p3(point[1]) * d2p0(point[2]);
1519 data.phi[ek[ 5][1]].ref_hess[0][1] =
1520 data.phi[ek[ 5][1]].ref_hess[1][0] = d1p1(point[0]) * d1p3(point[1]) * p0(point[2]);
1521 data.phi[ek[ 5][1]].ref_hess[0][2] =
1522 data.phi[ek[ 5][1]].ref_hess[2][0] = d1p1(point[0]) * p3(point[1]) * d1p0(point[2]);
1523 data.phi[ek[ 5][1]].ref_hess[1][2] =
1524 data.phi[ek[ 5][1]].ref_hess[2][1] = p1(point[0]) * d1p3(point[1]) * d1p0(point[2]);
1525 data.phi[ek[ 6][0]].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p1(point[2]);
1526 data.phi[ek[ 6][0]].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p1(point[2]);
1527 data.phi[ek[ 6][0]].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p1(point[2]);
1528 data.phi[ek[ 6][0]].ref_hess[0][1] =
1529 data.phi[ek[ 6][0]].ref_hess[1][0] = d1p0(point[0]) * d1p2(point[1]) * p1(point[2]);
1530 data.phi[ek[ 6][0]].ref_hess[0][2] =
1531 data.phi[ek[ 6][0]].ref_hess[2][0] = d1p0(point[0]) * p2(point[1]) * d1p1(point[2]);
1532 data.phi[ek[ 6][0]].ref_hess[1][2] =
1533 data.phi[ek[ 6][0]].ref_hess[2][1] = p0(point[0]) * d1p2(point[1]) * d1p1(point[2]);
1534 data.phi[ek[ 6][1]].ref_hess[0][0] = d2p0(point[0]) * p3(point[1]) * p1(point[2]);
1535 data.phi[ek[ 6][1]].ref_hess[1][1] = p0(point[0]) * d2p3(point[1]) * p1(point[2]);
1536 data.phi[ek[ 6][1]].ref_hess[2][2] = p0(point[0]) * p3(point[1]) * d2p1(point[2]);
1537 data.phi[ek[ 6][1]].ref_hess[0][1] =
1538 data.phi[ek[ 6][1]].ref_hess[1][0] = d1p0(point[0]) * d1p3(point[1]) * p1(point[2]);
1539 data.phi[ek[ 6][1]].ref_hess[0][2] =
1540 data.phi[ek[ 6][1]].ref_hess[2][0] = d1p0(point[0]) * p3(point[1]) * d1p1(point[2]);
1541 data.phi[ek[ 6][1]].ref_hess[1][2] =
1542 data.phi[ek[ 6][1]].ref_hess[2][1] = p0(point[0]) * d1p3(point[1]) * d1p1(point[2]);
1543 data.phi[ek[ 7][0]].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p1(point[2]);
1544 data.phi[ek[ 7][0]].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p1(point[2]);
1545 data.phi[ek[ 7][0]].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p1(point[2]);
1546 data.phi[ek[ 7][0]].ref_hess[0][1] =
1547 data.phi[ek[ 7][0]].ref_hess[1][0] = d1p1(point[0]) * d1p2(point[1]) * p1(point[2]);
1548 data.phi[ek[ 7][0]].ref_hess[0][2] =
1549 data.phi[ek[ 7][0]].ref_hess[2][0] = d1p1(point[0]) * p2(point[1]) * d1p1(point[2]);
1550 data.phi[ek[ 7][0]].ref_hess[1][2] =
1551 data.phi[ek[ 7][0]].ref_hess[2][1] = p1(point[0]) * d1p2(point[1]) * d1p1(point[2]);
1552 data.phi[ek[ 7][1]].ref_hess[0][0] = d2p1(point[0]) * p3(point[1]) * p1(point[2]);
1553 data.phi[ek[ 7][1]].ref_hess[1][1] = p1(point[0]) * d2p3(point[1]) * p1(point[2]);
1554 data.phi[ek[ 7][1]].ref_hess[2][2] = p1(point[0]) * p3(point[1]) * d2p1(point[2]);
1555 data.phi[ek[ 7][1]].ref_hess[0][1] =
1556 data.phi[ek[ 7][1]].ref_hess[1][0] = d1p1(point[0]) * d1p3(point[1]) * p1(point[2]);
1557 data.phi[ek[ 7][1]].ref_hess[0][2] =
1558 data.phi[ek[ 7][1]].ref_hess[2][0] = d1p1(point[0]) * p3(point[1]) * d1p1(point[2]);
1559 data.phi[ek[ 7][1]].ref_hess[1][2] =
1560 data.phi[ek[ 7][1]].ref_hess[2][1] = p1(point[0]) * d1p3(point[1]) * d1p1(point[2]);
1561 data.phi[ek[ 8][0]].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p2(point[2]);
1562 data.phi[ek[ 8][0]].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p2(point[2]);
1563 data.phi[ek[ 8][0]].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p2(point[2]);
1564 data.phi[ek[ 8][0]].ref_hess[0][1] =
1565 data.phi[ek[ 8][0]].ref_hess[1][0] = d1p0(point[0]) * d1p0(point[1]) * p2(point[2]);
1566 data.phi[ek[ 8][0]].ref_hess[0][2] =
1567 data.phi[ek[ 8][0]].ref_hess[2][0] = d1p0(point[0]) * p0(point[1]) * d1p2(point[2]);
1568 data.phi[ek[ 8][0]].ref_hess[1][2] =
1569 data.phi[ek[ 8][0]].ref_hess[2][1] = p0(point[0]) * d1p0(point[1]) * d1p2(point[2]);
1570 data.phi[ek[ 8][1]].ref_hess[0][0] = d2p0(point[0]) * p0(point[1]) * p3(point[2]);
1571 data.phi[ek[ 8][1]].ref_hess[1][1] = p0(point[0]) * d2p0(point[1]) * p3(point[2]);
1572 data.phi[ek[ 8][1]].ref_hess[2][2] = p0(point[0]) * p0(point[1]) * d2p3(point[2]);
1573 data.phi[ek[ 8][1]].ref_hess[0][1] =
1574 data.phi[ek[ 8][1]].ref_hess[1][0] = d1p0(point[0]) * d1p0(point[1]) * p3(point[2]);
1575 data.phi[ek[ 8][1]].ref_hess[0][2] =
1576 data.phi[ek[ 8][1]].ref_hess[2][0] = d1p0(point[0]) * p0(point[1]) * d1p3(point[2]);
1577 data.phi[ek[ 8][1]].ref_hess[1][2] =
1578 data.phi[ek[ 8][1]].ref_hess[2][1] = p0(point[0]) * d1p0(point[1]) * d1p3(point[2]);
1579 data.phi[ek[ 9][0]].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p2(point[2]);
1580 data.phi[ek[ 9][0]].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p2(point[2]);
1581 data.phi[ek[ 9][0]].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p2(point[2]);
1582 data.phi[ek[ 9][0]].ref_hess[0][1] =
1583 data.phi[ek[ 9][0]].ref_hess[1][0] = d1p1(point[0]) * d1p0(point[1]) * p2(point[2]);
1584 data.phi[ek[ 9][0]].ref_hess[0][2] =
1585 data.phi[ek[ 9][0]].ref_hess[2][0] = d1p1(point[0]) * p0(point[1]) * d1p2(point[2]);
1586 data.phi[ek[ 9][0]].ref_hess[1][2] =
1587 data.phi[ek[ 9][0]].ref_hess[2][1] = p1(point[0]) * d1p0(point[1]) * d1p2(point[2]);
1588 data.phi[ek[ 9][1]].ref_hess[0][0] = d2p1(point[0]) * p0(point[1]) * p3(point[2]);
1589 data.phi[ek[ 9][1]].ref_hess[1][1] = p1(point[0]) * d2p0(point[1]) * p3(point[2]);
1590 data.phi[ek[ 9][1]].ref_hess[2][2] = p1(point[0]) * p0(point[1]) * d2p3(point[2]);
1591 data.phi[ek[ 9][1]].ref_hess[0][1] =
1592 data.phi[ek[ 9][1]].ref_hess[1][0] = d1p1(point[0]) * d1p0(point[1]) * p3(point[2]);
1593 data.phi[ek[ 9][1]].ref_hess[0][2] =
1594 data.phi[ek[ 9][1]].ref_hess[2][0] = d1p1(point[0]) * p0(point[1]) * d1p3(point[2]);
1595 data.phi[ek[ 9][1]].ref_hess[1][2] =
1596 data.phi[ek[ 9][1]].ref_hess[2][1] = p1(point[0]) * d1p0(point[1]) * d1p3(point[2]);
1597 data.phi[ek[10][0]].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p2(point[2]);
1598 data.phi[ek[10][0]].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p2(point[2]);
1599 data.phi[ek[10][0]].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p2(point[2]);
1600 data.phi[ek[10][0]].ref_hess[0][1] =
1601 data.phi[ek[10][0]].ref_hess[1][0] = d1p0(point[0]) * d1p1(point[1]) * p2(point[2]);
1602 data.phi[ek[10][0]].ref_hess[0][2] =
1603 data.phi[ek[10][0]].ref_hess[2][0] = d1p0(point[0]) * p1(point[1]) * d1p2(point[2]);
1604 data.phi[ek[10][0]].ref_hess[1][2] =
1605 data.phi[ek[10][0]].ref_hess[2][1] = p0(point[0]) * d1p1(point[1]) * d1p2(point[2]);
1606 data.phi[ek[10][1]].ref_hess[0][0] = d2p0(point[0]) * p1(point[1]) * p3(point[2]);
1607 data.phi[ek[10][1]].ref_hess[1][1] = p0(point[0]) * d2p1(point[1]) * p3(point[2]);
1608 data.phi[ek[10][1]].ref_hess[2][2] = p0(point[0]) * p1(point[1]) * d2p3(point[2]);
1609 data.phi[ek[10][1]].ref_hess[0][1] =
1610 data.phi[ek[10][1]].ref_hess[1][0] = d1p0(point[0]) * d1p1(point[1]) * p3(point[2]);
1611 data.phi[ek[10][1]].ref_hess[0][2] =
1612 data.phi[ek[10][1]].ref_hess[2][0] = d1p0(point[0]) * p1(point[1]) * d1p3(point[2]);
1613 data.phi[ek[10][1]].ref_hess[1][2] =
1614 data.phi[ek[10][1]].ref_hess[2][1] = p0(point[0]) * d1p1(point[1]) * d1p3(point[2]);
1615 data.phi[ek[11][0]].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p2(point[2]);
1616 data.phi[ek[11][0]].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p2(point[2]);
1617 data.phi[ek[11][0]].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p2(point[2]);
1618 data.phi[ek[11][0]].ref_hess[0][1] =
1619 data.phi[ek[11][0]].ref_hess[1][0] = d1p1(point[0]) * d1p1(point[1]) * p2(point[2]);
1620 data.phi[ek[11][0]].ref_hess[0][2] =
1621 data.phi[ek[11][0]].ref_hess[2][0] = d1p1(point[0]) * p1(point[1]) * d1p2(point[2]);
1622 data.phi[ek[11][0]].ref_hess[1][2] =
1623 data.phi[ek[11][0]].ref_hess[2][1] = p1(point[0]) * d1p1(point[1]) * d1p2(point[2]);
1624 data.phi[ek[11][1]].ref_hess[0][0] = d2p1(point[0]) * p1(point[1]) * p3(point[2]);
1625 data.phi[ek[11][1]].ref_hess[1][1] = p1(point[0]) * d2p1(point[1]) * p3(point[2]);
1626 data.phi[ek[11][1]].ref_hess[2][2] = p1(point[0]) * p1(point[1]) * d2p3(point[2]);
1627 data.phi[ek[11][1]].ref_hess[0][1] =
1628 data.phi[ek[11][1]].ref_hess[1][0] = d1p1(point[0]) * d1p1(point[1]) * p3(point[2]);
1629 data.phi[ek[11][1]].ref_hess[0][2] =
1630 data.phi[ek[11][1]].ref_hess[2][0] = d1p1(point[0]) * p1(point[1]) * d1p3(point[2]);
1631 data.phi[ek[11][1]].ref_hess[1][2] =
1632 data.phi[ek[11][1]].ref_hess[2][1] = p1(point[0]) * d1p1(point[1]) * d1p3(point[2]);
1633 data.phi[qk[0][0]].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p0(point[2]);
1634 data.phi[qk[0][0]].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p0(point[2]);
1635 data.phi[qk[0][0]].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p0(point[2]);
1636 data.phi[qk[0][0]].ref_hess[0][1] =
1637 data.phi[qk[0][0]].ref_hess[1][0] = d1p2(point[0]) * d1p2(point[1]) * p0(point[2]);
1638 data.phi[qk[0][0]].ref_hess[0][2] =
1639 data.phi[qk[0][0]].ref_hess[2][0] = d1p2(point[0]) * p2(point[1]) * d1p0(point[2]);
1640 data.phi[qk[0][0]].ref_hess[1][2] =
1641 data.phi[qk[0][0]].ref_hess[2][1] = p2(point[0]) * d1p2(point[1]) * d1p0(point[2]);
1642 data.phi[qk[0][1]].ref_hess[0][0] = d2p3(point[0]) * p2(point[1]) * p0(point[2]);
1643 data.phi[qk[0][1]].ref_hess[1][1] = p3(point[0]) * d2p2(point[1]) * p0(point[2]);
1644 data.phi[qk[0][1]].ref_hess[2][2] = p3(point[0]) * p2(point[1]) * d2p0(point[2]);
1645 data.phi[qk[0][1]].ref_hess[0][1] =
1646 data.phi[qk[0][1]].ref_hess[1][0] = d1p3(point[0]) * d1p2(point[1]) * p0(point[2]);
1647 data.phi[qk[0][1]].ref_hess[0][2] =
1648 data.phi[qk[0][1]].ref_hess[2][0] = d1p3(point[0]) * p2(point[1]) * d1p0(point[2]);
1649 data.phi[qk[0][1]].ref_hess[1][2] =
1650 data.phi[qk[0][1]].ref_hess[2][1] = p3(point[0]) * d1p2(point[1]) * d1p0(point[2]);
1651 data.phi[qk[0][2]].ref_hess[0][0] = d2p2(point[0]) * p3(point[1]) * p0(point[2]);
1652 data.phi[qk[0][2]].ref_hess[1][1] = p2(point[0]) * d2p3(point[1]) * p0(point[2]);
1653 data.phi[qk[0][2]].ref_hess[2][2] = p2(point[0]) * p3(point[1]) * d2p0(point[2]);
1654 data.phi[qk[0][2]].ref_hess[0][1] =
1655 data.phi[qk[0][2]].ref_hess[1][0] = d1p2(point[0]) * d1p3(point[1]) * p0(point[2]);
1656 data.phi[qk[0][2]].ref_hess[0][2] =
1657 data.phi[qk[0][2]].ref_hess[2][0] = d1p2(point[0]) * p3(point[1]) * d1p0(point[2]);
1658 data.phi[qk[0][2]].ref_hess[1][2] =
1659 data.phi[qk[0][2]].ref_hess[2][1] = p2(point[0]) * d1p3(point[1]) * d1p0(point[2]);
1660 data.phi[qk[0][3]].ref_hess[0][0] = d2p3(point[0]) * p3(point[1]) * p0(point[2]);
1661 data.phi[qk[0][3]].ref_hess[1][1] = p3(point[0]) * d2p3(point[1]) * p0(point[2]);
1662 data.phi[qk[0][3]].ref_hess[2][2] = p3(point[0]) * p3(point[1]) * d2p0(point[2]);
1663 data.phi[qk[0][3]].ref_hess[0][1] =
1664 data.phi[qk[0][3]].ref_hess[1][0] = d1p3(point[0]) * d1p3(point[1]) * p0(point[2]);
1665 data.phi[qk[0][3]].ref_hess[0][2] =
1666 data.phi[qk[0][3]].ref_hess[2][0] = d1p3(point[0]) * p3(point[1]) * d1p0(point[2]);
1667 data.phi[qk[0][3]].ref_hess[1][2] =
1668 data.phi[qk[0][3]].ref_hess[2][1] = p3(point[0]) * d1p3(point[1]) * d1p0(point[2]);
1669 data.phi[qk[1][0]].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p1(point[2]);
1670 data.phi[qk[1][0]].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p1(point[2]);
1671 data.phi[qk[1][0]].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p1(point[2]);
1672 data.phi[qk[1][0]].ref_hess[0][1] =
1673 data.phi[qk[1][0]].ref_hess[1][0] = d1p2(point[0]) * d1p2(point[1]) * p1(point[2]);
1674 data.phi[qk[1][0]].ref_hess[0][2] =
1675 data.phi[qk[1][0]].ref_hess[2][0] = d1p2(point[0]) * p2(point[1]) * d1p1(point[2]);
1676 data.phi[qk[1][0]].ref_hess[1][2] =
1677 data.phi[qk[1][0]].ref_hess[2][1] = p2(point[0]) * d1p2(point[1]) * d1p1(point[2]);
1678 data.phi[qk[1][1]].ref_hess[0][0] = d2p3(point[0]) * p2(point[1]) * p1(point[2]);
1679 data.phi[qk[1][1]].ref_hess[1][1] = p3(point[0]) * d2p2(point[1]) * p1(point[2]);
1680 data.phi[qk[1][1]].ref_hess[2][2] = p3(point[0]) * p2(point[1]) * d2p1(point[2]);
1681 data.phi[qk[1][1]].ref_hess[0][1] =
1682 data.phi[qk[1][1]].ref_hess[1][0] = d1p3(point[0]) * d1p2(point[1]) * p1(point[2]);
1683 data.phi[qk[1][1]].ref_hess[0][2] =
1684 data.phi[qk[1][1]].ref_hess[2][0] = d1p3(point[0]) * p2(point[1]) * d1p1(point[2]);
1685 data.phi[qk[1][1]].ref_hess[1][2] =
1686 data.phi[qk[1][1]].ref_hess[2][1] = p3(point[0]) * d1p2(point[1]) * d1p1(point[2]);
1687 data.phi[qk[1][2]].ref_hess[0][0] = d2p2(point[0]) * p3(point[1]) * p1(point[2]);
1688 data.phi[qk[1][2]].ref_hess[1][1] = p2(point[0]) * d2p3(point[1]) * p1(point[2]);
1689 data.phi[qk[1][2]].ref_hess[2][2] = p2(point[0]) * p3(point[1]) * d2p1(point[2]);
1690 data.phi[qk[1][2]].ref_hess[0][1] =
1691 data.phi[qk[1][2]].ref_hess[1][0] = d1p2(point[0]) * d1p3(point[1]) * p1(point[2]);
1692 data.phi[qk[1][2]].ref_hess[0][2] =
1693 data.phi[qk[1][2]].ref_hess[2][0] = d1p2(point[0]) * p3(point[1]) * d1p1(point[2]);
1694 data.phi[qk[1][2]].ref_hess[1][2] =
1695 data.phi[qk[1][2]].ref_hess[2][1] = p2(point[0]) * d1p3(point[1]) * d1p1(point[2]);
1696 data.phi[qk[1][3]].ref_hess[0][0] = d2p3(point[0]) * p3(point[1]) * p1(point[2]);
1697 data.phi[qk[1][3]].ref_hess[1][1] = p3(point[0]) * d2p3(point[1]) * p1(point[2]);
1698 data.phi[qk[1][3]].ref_hess[2][2] = p3(point[0]) * p3(point[1]) * d2p1(point[2]);
1699 data.phi[qk[1][3]].ref_hess[0][1] =
1700 data.phi[qk[1][3]].ref_hess[1][0] = d1p3(point[0]) * d1p3(point[1]) * p1(point[2]);
1701 data.phi[qk[1][3]].ref_hess[0][2] =
1702 data.phi[qk[1][3]].ref_hess[2][0] = d1p3(point[0]) * p3(point[1]) * d1p1(point[2]);
1703 data.phi[qk[1][3]].ref_hess[1][2] =
1704 data.phi[qk[1][3]].ref_hess[2][1] = p3(point[0]) * d1p3(point[1]) * d1p1(point[2]);
1705 data.phi[qk[2][0]].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p2(point[2]);
1706 data.phi[qk[2][0]].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p2(point[2]);
1707 data.phi[qk[2][0]].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p2(point[2]);
1708 data.phi[qk[2][0]].ref_hess[0][1] =
1709 data.phi[qk[2][0]].ref_hess[1][0] = d1p2(point[0]) * d1p0(point[1]) * p2(point[2]);
1710 data.phi[qk[2][0]].ref_hess[0][2] =
1711 data.phi[qk[2][0]].ref_hess[2][0] = d1p2(point[0]) * p0(point[1]) * d1p2(point[2]);
1712 data.phi[qk[2][0]].ref_hess[1][2] =
1713 data.phi[qk[2][0]].ref_hess[2][1] = p2(point[0]) * d1p0(point[1]) * d1p2(point[2]);
1714 data.phi[qk[2][1]].ref_hess[0][0] = d2p3(point[0]) * p0(point[1]) * p2(point[2]);
1715 data.phi[qk[2][1]].ref_hess[1][1] = p3(point[0]) * d2p0(point[1]) * p2(point[2]);
1716 data.phi[qk[2][1]].ref_hess[2][2] = p3(point[0]) * p0(point[1]) * d2p2(point[2]);
1717 data.phi[qk[2][1]].ref_hess[0][1] =
1718 data.phi[qk[2][1]].ref_hess[1][0] = d1p3(point[0]) * d1p0(point[1]) * p2(point[2]);
1719 data.phi[qk[2][1]].ref_hess[0][2] =
1720 data.phi[qk[2][1]].ref_hess[2][0] = d1p3(point[0]) * p0(point[1]) * d1p2(point[2]);
1721 data.phi[qk[2][1]].ref_hess[1][2] =
1722 data.phi[qk[2][1]].ref_hess[2][1] = p3(point[0]) * d1p0(point[1]) * d1p2(point[2]);
1723 data.phi[qk[2][2]].ref_hess[0][0] = d2p2(point[0]) * p0(point[1]) * p3(point[2]);
1724 data.phi[qk[2][2]].ref_hess[1][1] = p2(point[0]) * d2p0(point[1]) * p3(point[2]);
1725 data.phi[qk[2][2]].ref_hess[2][2] = p2(point[0]) * p0(point[1]) * d2p3(point[2]);
1726 data.phi[qk[2][2]].ref_hess[0][1] =
1727 data.phi[qk[2][2]].ref_hess[1][0] = d1p2(point[0]) * d1p0(point[1]) * p3(point[2]);
1728 data.phi[qk[2][2]].ref_hess[0][2] =
1729 data.phi[qk[2][2]].ref_hess[2][0] = d1p2(point[0]) * p0(point[1]) * d1p3(point[2]);
1730 data.phi[qk[2][2]].ref_hess[1][2] =
1731 data.phi[qk[2][2]].ref_hess[2][1] = p2(point[0]) * d1p0(point[1]) * d1p3(point[2]);
1732 data.phi[qk[2][3]].ref_hess[0][0] = d2p3(point[0]) * p0(point[1]) * p3(point[2]);
1733 data.phi[qk[2][3]].ref_hess[1][1] = p3(point[0]) * d2p0(point[1]) * p3(point[2]);
1734 data.phi[qk[2][3]].ref_hess[2][2] = p3(point[0]) * p0(point[1]) * d2p3(point[2]);
1735 data.phi[qk[2][3]].ref_hess[0][1] =
1736 data.phi[qk[2][3]].ref_hess[1][0] = d1p3(point[0]) * d1p0(point[1]) * p3(point[2]);
1737 data.phi[qk[2][3]].ref_hess[0][2] =
1738 data.phi[qk[2][3]].ref_hess[2][0] = d1p3(point[0]) * p0(point[1]) * d1p3(point[2]);
1739 data.phi[qk[2][3]].ref_hess[1][2] =
1740 data.phi[qk[2][3]].ref_hess[2][1] = p3(point[0]) * d1p0(point[1]) * d1p3(point[2]);
1741 data.phi[qk[3][0]].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p2(point[2]);
1742 data.phi[qk[3][0]].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p2(point[2]);
1743 data.phi[qk[3][0]].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p2(point[2]);
1744 data.phi[qk[3][0]].ref_hess[0][1] =
1745 data.phi[qk[3][0]].ref_hess[1][0] = d1p2(point[0]) * d1p1(point[1]) * p2(point[2]);
1746 data.phi[qk[3][0]].ref_hess[0][2] =
1747 data.phi[qk[3][0]].ref_hess[2][0] = d1p2(point[0]) * p1(point[1]) * d1p2(point[2]);
1748 data.phi[qk[3][0]].ref_hess[1][2] =
1749 data.phi[qk[3][0]].ref_hess[2][1] = p2(point[0]) * d1p1(point[1]) * d1p2(point[2]);
1750 data.phi[qk[3][1]].ref_hess[0][0] = d2p3(point[0]) * p1(point[1]) * p2(point[2]);
1751 data.phi[qk[3][1]].ref_hess[1][1] = p3(point[0]) * d2p1(point[1]) * p2(point[2]);
1752 data.phi[qk[3][1]].ref_hess[2][2] = p3(point[0]) * p1(point[1]) * d2p2(point[2]);
1753 data.phi[qk[3][1]].ref_hess[0][1] =
1754 data.phi[qk[3][1]].ref_hess[1][0] = d1p3(point[0]) * d1p1(point[1]) * p2(point[2]);
1755 data.phi[qk[3][1]].ref_hess[0][2] =
1756 data.phi[qk[3][1]].ref_hess[2][0] = d1p3(point[0]) * p1(point[1]) * d1p2(point[2]);
1757 data.phi[qk[3][1]].ref_hess[1][2] =
1758 data.phi[qk[3][1]].ref_hess[2][1] = p3(point[0]) * d1p1(point[1]) * d1p2(point[2]);
1759 data.phi[qk[3][2]].ref_hess[0][0] = d2p2(point[0]) * p1(point[1]) * p3(point[2]);
1760 data.phi[qk[3][2]].ref_hess[1][1] = p2(point[0]) * d2p1(point[1]) * p3(point[2]);
1761 data.phi[qk[3][2]].ref_hess[2][2] = p2(point[0]) * p1(point[1]) * d2p3(point[2]);
1762 data.phi[qk[3][2]].ref_hess[0][1] =
1763 data.phi[qk[3][2]].ref_hess[1][0] = d1p2(point[0]) * d1p1(point[1]) * p3(point[2]);
1764 data.phi[qk[3][2]].ref_hess[0][2] =
1765 data.phi[qk[3][2]].ref_hess[2][0] = d1p2(point[0]) * p1(point[1]) * d1p3(point[2]);
1766 data.phi[qk[3][2]].ref_hess[1][2] =
1767 data.phi[qk[3][2]].ref_hess[2][1] = p2(point[0]) * d1p1(point[1]) * d1p3(point[2]);
1768 data.phi[qk[3][3]].ref_hess[0][0] = d2p3(point[0]) * p1(point[1]) * p3(point[2]);
1769 data.phi[qk[3][3]].ref_hess[1][1] = p3(point[0]) * d2p1(point[1]) * p3(point[2]);
1770 data.phi[qk[3][3]].ref_hess[2][2] = p3(point[0]) * p1(point[1]) * d2p3(point[2]);
1771 data.phi[qk[3][3]].ref_hess[0][1] =
1772 data.phi[qk[3][3]].ref_hess[1][0] = d1p3(point[0]) * d1p1(point[1]) * p3(point[2]);
1773 data.phi[qk[3][3]].ref_hess[0][2] =
1774 data.phi[qk[3][3]].ref_hess[2][0] = d1p3(point[0]) * p1(point[1]) * d1p3(point[2]);
1775 data.phi[qk[3][3]].ref_hess[1][2] =
1776 data.phi[qk[3][3]].ref_hess[2][1] = p3(point[0]) * d1p1(point[1]) * d1p3(point[2]);
1777 data.phi[qk[4][0]].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p2(point[2]);
1778 data.phi[qk[4][0]].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p2(point[2]);
1779 data.phi[qk[4][0]].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p2(point[2]);
1780 data.phi[qk[4][0]].ref_hess[0][1] =
1781 data.phi[qk[4][0]].ref_hess[1][0] = d1p0(point[0]) * d1p2(point[1]) * p2(point[2]);
1782 data.phi[qk[4][0]].ref_hess[0][2] =
1783 data.phi[qk[4][0]].ref_hess[2][0] = d1p0(point[0]) * p2(point[1]) * d1p2(point[2]);
1784 data.phi[qk[4][0]].ref_hess[1][2] =
1785 data.phi[qk[4][0]].ref_hess[2][1] = p0(point[0]) * d1p2(point[1]) * d1p2(point[2]);
1786 data.phi[qk[4][1]].ref_hess[0][0] = d2p0(point[0]) * p3(point[1]) * p2(point[2]);
1787 data.phi[qk[4][1]].ref_hess[1][1] = p0(point[0]) * d2p3(point[1]) * p2(point[2]);
1788 data.phi[qk[4][1]].ref_hess[2][2] = p0(point[0]) * p3(point[1]) * d2p2(point[2]);
1789 data.phi[qk[4][1]].ref_hess[0][1] =
1790 data.phi[qk[4][1]].ref_hess[1][0] = d1p0(point[0]) * d1p3(point[1]) * p2(point[2]);
1791 data.phi[qk[4][1]].ref_hess[0][2] =
1792 data.phi[qk[4][1]].ref_hess[2][0] = d1p0(point[0]) * p3(point[1]) * d1p2(point[2]);
1793 data.phi[qk[4][1]].ref_hess[1][2] =
1794 data.phi[qk[4][1]].ref_hess[2][1] = p0(point[0]) * d1p3(point[1]) * d1p2(point[2]);
1795 data.phi[qk[4][2]].ref_hess[0][0] = d2p0(point[0]) * p2(point[1]) * p3(point[2]);
1796 data.phi[qk[4][2]].ref_hess[1][1] = p0(point[0]) * d2p2(point[1]) * p3(point[2]);
1797 data.phi[qk[4][2]].ref_hess[2][2] = p0(point[0]) * p2(point[1]) * d2p3(point[2]);
1798 data.phi[qk[4][2]].ref_hess[0][1] =
1799 data.phi[qk[4][2]].ref_hess[1][0] = d1p0(point[0]) * d1p2(point[1]) * p3(point[2]);
1800 data.phi[qk[4][2]].ref_hess[0][2] =
1801 data.phi[qk[4][2]].ref_hess[2][0] = d1p0(point[0]) * p2(point[1]) * d1p3(point[2]);
1802 data.phi[qk[4][2]].ref_hess[1][2] =
1803 data.phi[qk[4][2]].ref_hess[2][1] = p0(point[0]) * d1p2(point[1]) * d1p3(point[2]);
1804 data.phi[qk[4][3]].ref_hess[0][0] = d2p0(point[0]) * p3(point[1]) * p3(point[2]);
1805 data.phi[qk[4][3]].ref_hess[1][1] = p0(point[0]) * d2p3(point[1]) * p3(point[2]);
1806 data.phi[qk[4][3]].ref_hess[2][2] = p0(point[0]) * p3(point[1]) * d2p3(point[2]);
1807 data.phi[qk[4][3]].ref_hess[0][1] =
1808 data.phi[qk[4][3]].ref_hess[1][0] = d1p0(point[0]) * d1p3(point[1]) * p3(point[2]);
1809 data.phi[qk[4][3]].ref_hess[0][2] =
1810 data.phi[qk[4][3]].ref_hess[2][0] = d1p0(point[0]) * p3(point[1]) * d1p3(point[2]);
1811 data.phi[qk[4][3]].ref_hess[1][2] =
1812 data.phi[qk[4][3]].ref_hess[2][1] = p0(point[0]) * d1p3(point[1]) * d1p3(point[2]);
1813 data.phi[qk[5][0]].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p2(point[2]);
1814 data.phi[qk[5][0]].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p2(point[2]);
1815 data.phi[qk[5][0]].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p2(point[2]);
1816 data.phi[qk[5][0]].ref_hess[0][1] =
1817 data.phi[qk[5][0]].ref_hess[1][0] = d1p1(point[0]) * d1p2(point[1]) * p2(point[2]);
1818 data.phi[qk[5][0]].ref_hess[0][2] =
1819 data.phi[qk[5][0]].ref_hess[2][0] = d1p1(point[0]) * p2(point[1]) * d1p2(point[2]);
1820 data.phi[qk[5][0]].ref_hess[1][2] =
1821 data.phi[qk[5][0]].ref_hess[2][1] = p1(point[0]) * d1p2(point[1]) * d1p2(point[2]);
1822 data.phi[qk[5][1]].ref_hess[0][0] = d2p1(point[0]) * p3(point[1]) * p2(point[2]);
1823 data.phi[qk[5][1]].ref_hess[1][1] = p1(point[0]) * d2p3(point[1]) * p2(point[2]);
1824 data.phi[qk[5][1]].ref_hess[2][2] = p1(point[0]) * p3(point[1]) * d2p2(point[2]);
1825 data.phi[qk[5][1]].ref_hess[0][1] =
1826 data.phi[qk[5][1]].ref_hess[1][0] = d1p1(point[0]) * d1p3(point[1]) * p2(point[2]);
1827 data.phi[qk[5][1]].ref_hess[0][2] =
1828 data.phi[qk[5][1]].ref_hess[2][0] = d1p1(point[0]) * p3(point[1]) * d1p2(point[2]);
1829 data.phi[qk[5][1]].ref_hess[1][2] =
1830 data.phi[qk[5][1]].ref_hess[2][1] = p1(point[0]) * d1p3(point[1]) * d1p2(point[2]);
1831 data.phi[qk[5][2]].ref_hess[0][0] = d2p1(point[0]) * p2(point[1]) * p3(point[2]);
1832 data.phi[qk[5][2]].ref_hess[1][1] = p1(point[0]) * d2p2(point[1]) * p3(point[2]);
1833 data.phi[qk[5][2]].ref_hess[2][2] = p1(point[0]) * p2(point[1]) * d2p3(point[2]);
1834 data.phi[qk[5][2]].ref_hess[0][1] =
1835 data.phi[qk[5][2]].ref_hess[1][0] = d1p1(point[0]) * d1p2(point[1]) * p3(point[2]);
1836 data.phi[qk[5][2]].ref_hess[0][2] =
1837 data.phi[qk[5][2]].ref_hess[2][0] = d1p1(point[0]) * p2(point[1]) * d1p3(point[2]);
1838 data.phi[qk[5][2]].ref_hess[1][2] =
1839 data.phi[qk[5][2]].ref_hess[2][1] = p1(point[0]) * d1p2(point[1]) * d1p3(point[2]);
1840 data.phi[qk[5][3]].ref_hess[0][0] = d2p1(point[0]) * p3(point[1]) * p3(point[2]);
1841 data.phi[qk[5][3]].ref_hess[1][1] = p1(point[0]) * d2p3(point[1]) * p3(point[2]);
1842 data.phi[qk[5][3]].ref_hess[2][2] = p1(point[0]) * p3(point[1]) * d2p3(point[2]);
1843 data.phi[qk[5][3]].ref_hess[0][1] =
1844 data.phi[qk[5][3]].ref_hess[1][0] = d1p1(point[0]) * d1p3(point[1]) * p3(point[2]);
1845 data.phi[qk[5][3]].ref_hess[0][2] =
1846 data.phi[qk[5][3]].ref_hess[2][0] = d1p1(point[0]) * p3(point[1]) * d1p3(point[2]);
1847 data.phi[qk[5][3]].ref_hess[1][2] =
1848 data.phi[qk[5][3]].ref_hess[2][1] = p1(point[0]) * d1p3(point[1]) * d1p3(point[2]);
1849 data.phi[56].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p2(point[2]);
1850 data.phi[56].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p2(point[2]);
1851 data.phi[56].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p2(point[2]);
1852 data.phi[56].ref_hess[0][1] =
1853 data.phi[56].ref_hess[1][0] = d1p2(point[0]) * d1p2(point[1]) * p2(point[2]);
1854 data.phi[56].ref_hess[0][2] =
1855 data.phi[56].ref_hess[2][0] = d1p2(point[0]) * p2(point[1]) * d1p2(point[2]);
1856 data.phi[56].ref_hess[1][2] =
1857 data.phi[56].ref_hess[2][1] = p2(point[0]) * d1p2(point[1]) * d1p2(point[2]);
1858 data.phi[57].ref_hess[0][0] = d2p3(point[0]) * p2(point[1]) * p2(point[2]);
1859 data.phi[57].ref_hess[1][1] = p3(point[0]) * d2p2(point[1]) * p2(point[2]);
1860 data.phi[57].ref_hess[2][2] = p3(point[0]) * p2(point[1]) * d2p2(point[2]);
1861 data.phi[57].ref_hess[0][1] =
1862 data.phi[57].ref_hess[1][0] = d1p3(point[0]) * d1p2(point[1]) * p2(point[2]);
1863 data.phi[57].ref_hess[0][2] =
1864 data.phi[57].ref_hess[2][0] = d1p3(point[0]) * p2(point[1]) * d1p2(point[2]);
1865 data.phi[57].ref_hess[1][2] =
1866 data.phi[57].ref_hess[2][1] = p3(point[0]) * d1p2(point[1]) * d1p2(point[2]);
1867 data.phi[58].ref_hess[0][0] = d2p2(point[0]) * p3(point[1]) * p2(point[2]);
1868 data.phi[58].ref_hess[1][1] = p2(point[0]) * d2p3(point[1]) * p2(point[2]);
1869 data.phi[58].ref_hess[2][2] = p2(point[0]) * p3(point[1]) * d2p2(point[2]);
1870 data.phi[58].ref_hess[0][1] =
1871 data.phi[58].ref_hess[1][0] = d1p2(point[0]) * d1p3(point[1]) * p2(point[2]);
1872 data.phi[58].ref_hess[0][2] =
1873 data.phi[58].ref_hess[2][0] = d1p2(point[0]) * p3(point[1]) * d1p2(point[2]);
1874 data.phi[58].ref_hess[1][2] =
1875 data.phi[58].ref_hess[2][1] = p2(point[0]) * d1p3(point[1]) * d1p2(point[2]);
1876 data.phi[59].ref_hess[0][0] = d2p3(point[0]) * p3(point[1]) * p2(point[2]);
1877 data.phi[59].ref_hess[1][1] = p3(point[0]) * d2p3(point[1]) * p2(point[2]);
1878 data.phi[59].ref_hess[2][2] = p3(point[0]) * p3(point[1]) * d2p2(point[2]);
1879 data.phi[59].ref_hess[0][1] =
1880 data.phi[59].ref_hess[1][0] = d1p3(point[0]) * d1p3(point[1]) * p2(point[2]);
1881 data.phi[59].ref_hess[0][2] =
1882 data.phi[59].ref_hess[2][0] = d1p3(point[0]) * p3(point[1]) * d1p2(point[2]);
1883 data.phi[59].ref_hess[1][2] =
1884 data.phi[59].ref_hess[2][1] = p3(point[0]) * d1p3(point[1]) * d1p2(point[2]);
1885 data.phi[60].ref_hess[0][0] = d2p2(point[0]) * p2(point[1]) * p3(point[2]);
1886 data.phi[60].ref_hess[1][1] = p2(point[0]) * d2p2(point[1]) * p3(point[2]);
1887 data.phi[60].ref_hess[2][2] = p2(point[0]) * p2(point[1]) * d2p3(point[2]);
1888 data.phi[60].ref_hess[0][1] =
1889 data.phi[60].ref_hess[1][0] = d1p2(point[0]) * d1p2(point[1]) * p3(point[2]);
1890 data.phi[60].ref_hess[0][2] =
1891 data.phi[60].ref_hess[2][0] = d1p2(point[0]) * p2(point[1]) * d1p3(point[2]);
1892 data.phi[60].ref_hess[1][2] =
1893 data.phi[60].ref_hess[2][1] = p2(point[0]) * d1p2(point[1]) * d1p3(point[2]);
1894 data.phi[61].ref_hess[0][0] = d2p3(point[0]) * p2(point[1]) * p3(point[2]);
1895 data.phi[61].ref_hess[1][1] = p3(point[0]) * d2p2(point[1]) * p3(point[2]);
1896 data.phi[61].ref_hess[2][2] = p3(point[0]) * p2(point[1]) * d2p3(point[2]);
1897 data.phi[61].ref_hess[0][1] =
1898 data.phi[61].ref_hess[1][0] = d1p3(point[0]) * d1p2(point[1]) * p3(point[2]);
1899 data.phi[61].ref_hess[0][2] =
1900 data.phi[61].ref_hess[2][0] = d1p3(point[0]) * p2(point[1]) * d1p3(point[2]);
1901 data.phi[61].ref_hess[1][2] =
1902 data.phi[61].ref_hess[2][1] = p3(point[0]) * d1p2(point[1]) * d1p3(point[2]);
1903 data.phi[62].ref_hess[0][0] = d2p2(point[0]) * p3(point[1]) * p3(point[2]);
1904 data.phi[62].ref_hess[1][1] = p2(point[0]) * d2p3(point[1]) * p3(point[2]);
1905 data.phi[62].ref_hess[2][2] = p2(point[0]) * p3(point[1]) * d2p3(point[2]);
1906 data.phi[62].ref_hess[0][1] =
1907 data.phi[62].ref_hess[1][0] = d1p2(point[0]) * d1p3(point[1]) * p3(point[2]);
1908 data.phi[62].ref_hess[0][2] =
1909 data.phi[62].ref_hess[2][0] = d1p2(point[0]) * p3(point[1]) * d1p3(point[2]);
1910 data.phi[62].ref_hess[1][2] =
1911 data.phi[62].ref_hess[2][1] = p2(point[0]) * d1p3(point[1]) * d1p3(point[2]);
1912 data.phi[63].ref_hess[0][0] = d2p3(point[0]) * p3(point[1]) * p3(point[2]);
1913 data.phi[63].ref_hess[1][1] = p3(point[0]) * d2p3(point[1]) * p3(point[2]);
1914 data.phi[63].ref_hess[2][2] = p3(point[0]) * p3(point[1]) * d2p3(point[2]);
1915 data.phi[63].ref_hess[0][1] =
1916 data.phi[63].ref_hess[1][0] = d1p3(point[0]) * d1p3(point[1]) * p3(point[2]);
1917 data.phi[63].ref_hess[0][2] =
1918 data.phi[63].ref_hess[2][0] = d1p3(point[0]) * p3(point[1]) * d1p3(point[2]);
1919 data.phi[63].ref_hess[1][2] =
1920 data.phi[63].ref_hess[2][1] = p3(point[0]) * d1p3(point[1]) * d1p3(point[2]);
1921 }
1922 }; // class Evaluator<...,Hypercube<3>>
1923 } // namespace Lagrange3
1924 } // namespace Space
1925} // namespace FEAT
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:703
void NOINLINE eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:860
void NOINLINE eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:774
void NOINLINE eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:809
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:636
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:654
void eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:672
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:587
void NOINLINE eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:220
void NOINLINE eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:284
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:149
void NOINLINE eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:247
void NOINLINE eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:426
void NOINLINE eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:477
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps_3d > BaseClass
base-class typedef
Definition: evaluator.hpp:355
void NOINLINE eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:1044
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:956
void NOINLINE eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:1340
void NOINLINE eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:1128
Lagrange-3 Element Evaluator class template declaration.
Definition: evaluator.hpp:125
Finite-Element Parametric Evaluator CRTP base-class template.
static constexpr SpaceTags ref_caps
Lagrange-3 Element Evaluator reference capabilities.
Definition: evaluator.hpp:23
FEAT namespace.
Definition: adjactor.hpp:12
SpaceTags
Space configuration tags enum.
Definition: eval_tags.hpp:97
@ ref_value
specifies whether the space should supply reference basis function values
@ ref_hess
specifies whether the space should supply reference basis function hessians
@ ref_grad
specifies whether the space should supply reference basis function gradients