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