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
11namespace FEAT
12{
13 namespace Space
14 {
15 namespace BognerFoxSchmit
16 {
23
25 namespace Intern
26 {
27 // p1, p2, q1 and q2 are the 1D basis functions on the reference interval [-1,+1].
28 // These are used for the tensor-product approach in the evaluators.
29
30 template<typename T_>
31 inline T_ p1(T_ x)
32 {
33 return T_(0.5) + T_(0.25) * x * (x*x - T_(3));
34 }
35
36 template<typename T_>
37 inline T_ p2(T_ x)
38 {
39 return T_(0.5) - T_(0.25) * x * (x*x - T_(3));
40 }
41
42 template<typename T_>
43 inline T_ q1(T_ x)
44 {
45 return T_(0.25) * (x + T_(1)) * Math::sqr(x - T_(1));
46 }
47
48 template<typename T_>
49 inline T_ q2(T_ x)
50 {
51 return T_(0.25) * (x - T_(1)) * Math::sqr(x + T_(1));
52 }
53
54 // first order derivatives follow
55 template<typename T_>
56 inline T_ dp1(T_ x)
57 {
58 return +T_(0.75) * (x*x - T_(1));
59 }
60
61 template<typename T_>
62 inline T_ dp2(T_ x)
63 {
64 return -T_(0.75) * (x*x - T_(1));
65 }
66
67 template<typename T_>
68 inline T_ dq1(T_ x)
69 {
70 return T_(0.25) * (T_(3)*x + T_(1)) * (x - T_(1));
71 }
72
73 template<typename T_>
74 inline T_ dq2(T_ x)
75 {
76 return T_(0.25) * (T_(3)*x - T_(1)) * (x + T_(1));
77 }
78
79 // second order derivatives follow
80 template<typename T_>
81 inline T_ ddp1(T_ x)
82 {
83 return +T_(1.5) * x;
84 }
85
86 template<typename T_>
87 inline T_ ddp2(T_ x)
88 {
89 return -T_(1.5) * x;
90 }
91
92 template<typename T_>
93 inline T_ ddq1(T_ x)
94 {
95 return T_(0.5) * (T_(3)*x - T_(1));
96 }
97
98 template<typename T_>
99 inline T_ ddq2(T_ x)
100 {
101 return T_(0.5) * (T_(3)*x + T_(1));
102 }
103 } // namespace Intern
105
111 template<
112 typename Space_,
113 typename TrafoEvaluator_,
114 typename SpaceEvalTraits_,
115 typename Shape_ = typename Space_::ShapeType>
116 class Evaluator DOXY({});
117
123 template<
124 typename Space_,
125 typename TrafoEvaluator_,
126 typename SpaceEvalTraits_>
127 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<1> > :
128 public ParametricEvaluator<
129 Evaluator<
130 Space_,
131 TrafoEvaluator_,
132 SpaceEvalTraits_,
133 Shape::Hypercube<1> >,
134 TrafoEvaluator_,
135 SpaceEvalTraits_,
136 ref_caps>
137 {
138 public:
141
143 typedef Space_ SpaceType;
144
146 typedef SpaceEvalTraits_ SpaceEvalTraits;
147
149 typedef TrafoEvaluator_ TrafoEvaluator;
150
152 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
153
155 typedef typename EvalPolicy::DomainPointType DomainPointType;
156
158 typedef typename SpaceEvalTraits::DataType DataType;
159
160 protected:
163
164 public:
171 explicit Evaluator(const SpaceType& DOXY(space))
172 {
173 }
174
182 {
183 return 4;
184 }
185
192 void prepare(const TrafoEvaluator& trafo_eval)
193 {
194 // domain point
196
197 // evaluate trafo in interval midpoint
198 typedef typename TrafoEvaluator::template ConfigTraits<TrafoTags::jac_mat>::EvalDataType CoeffEvalData;
199 CoeffEvalData coeff_data;
200 trafo_eval(coeff_data, dom_point);
201
202 // store coefficient
203 _coeff = coeff_data.jac_mat(0,0);
204 }
205
215 template<typename EvalData_>
217 EvalData_& data,
218 const DomainPointType& point) const
219 {
220 // P1(x) = 1/2 + 1/4 * x * (x^2 - 3)
221 data.phi[0].ref_value = Intern::p1(DataType(point[0]));
222 // Q1(x) = c/4 * (x + 1) * (x - 1)^2
223 data.phi[1].ref_value = _coeff * Intern::q1(DataType(point[0]));
224 // P2(x) = 1/2 - 1/4 * x * (x^2 - 3)
225 data.phi[2].ref_value = Intern::p2(DataType(point[0]));
226 // Q2(x) = c/4 * (x - 1) * (x + 1)^2
227 data.phi[3].ref_value = _coeff * Intern::q2(DataType(point[0]));
228 }
229
239 template<typename EvalData_>
241 EvalData_& data,
242 const DomainPointType& point) const
243 {
244 // dx P1(x) = +3/4 * (x^2 - 1)
245 data.phi[0].ref_grad[0] = Intern::dp1(DataType(point[0]));
246 // dx Q1(x) = c/4 * (3*x + 1) * (x - 1)
247 data.phi[1].ref_grad[0] = _coeff * Intern::dq1(DataType(point[0]));
248 // dx P2(x) = -3/4 * (x^2 - 1)
249 data.phi[2].ref_grad[0] = Intern::dp2(DataType(point[0]));
250 // dx Q2(x) = c/4 * (3*x - 1) * (x + 1)
251 data.phi[3].ref_grad[0] = _coeff * Intern::dq2(DataType(point[0]));
252 }
253
263 template<typename EvalData_>
265 EvalData_& data,
266 const DomainPointType& point) const
267 {
268 // dxx P1(x) = +3/2 * x
269 data.phi[0].ref_hess[0][0] = Intern::ddp1(DataType(point[0]));
270 // dxx Q1(x) = 1/2 * (3*x - 1)
271 data.phi[1].ref_hess[0][0] = _coeff * Intern::ddq1(DataType(point[0]));
272 // dxx P2(x) = -3/2 * x
273 data.phi[2].ref_hess[0][0] = Intern::ddp2(DataType(point[0]));
274 // dxx Q2(x) = 1/2 * (3*x + 1)
275 data.phi[3].ref_hess[0][0] = _coeff * Intern::ddq2(DataType(point[0]));
276 }
277 }; // class Evaluator<...,Hypercube<1>>
278
284 template<
285 typename Space_,
286 typename TrafoEvaluator_,
287 typename SpaceEvalTraits_>
288 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hypercube<2> > :
289 public ParametricEvaluator<
290 Evaluator<
291 Space_,
292 TrafoEvaluator_,
293 SpaceEvalTraits_,
294 Shape::Hypercube<2> >,
295 TrafoEvaluator_,
296 SpaceEvalTraits_,
297 ref_caps>
298 {
299 public:
302
304 typedef Space_ SpaceType;
305
307 typedef SpaceEvalTraits_ SpaceEvalTraits;
308
310 typedef TrafoEvaluator_ TrafoEvaluator;
311
313 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
314
316 typedef typename EvalPolicy::DomainPointType DomainPointType;
317
319 typedef typename SpaceEvalTraits::DataType DataType;
320
321 protected:
324
338 {
339 return _coeff_fod[i](0,0) * rx + _coeff_fod[i](0,1) * ry;
340 }
341
355 {
356 return _coeff_fod[i](1,0) * rx + _coeff_fod[i](1,1) * ry;
357 }
358
359 public:
366 explicit Evaluator(const SpaceType& DOXY(space))
367 {
368 }
369
377 {
378 return 16;
379 }
380
387 void prepare(const TrafoEvaluator& trafo_eval)
388 {
389 // domain point
391
392 // evaluate trafo in interval midpoint
393 typedef typename TrafoEvaluator::template ConfigTraits<TrafoTags::jac_mat>::EvalDataType CoeffEvalData;
394 CoeffEvalData coeff_data;
395
396 // loop over all four vertices of the quad
397 for(int i(0); i < 4; ++i)
398 {
399 // compute reference vertex coordinates
400 dom_point[0] = DataType(-1 + ((i << 1) & 2));
401 dom_point[1] = DataType(-1 + ((i ) & 2));
402
403 // evaluate trafo data
404 trafo_eval(coeff_data, dom_point);
405
406 // store jacobian matrix
407 _coeff_fod[i] = coeff_data.jac_mat;
408 }
409 }
410
420 template<typename EvalData_>
422 EvalData_& data,
423 const DomainPointType& point) const
424 {
425 const DataType x(point[0]), y(point[1]);
426 DataType d0, d1;
427
428 // Vertex 1: (-1,-1)
429 data.phi[ 0].ref_value = Intern::p1(x) * Intern::p1(y);
430 d0 = Intern::q1(x) * Intern::p1(y);
431 d1 = Intern::p1(x) * Intern::q1(y);
432 data.phi[ 1].ref_value = _trans_dx(0, d0, d1);
433 data.phi[ 2].ref_value = _trans_dy(0, d0, d1);
434 data.phi[ 3].ref_value = Intern::q1(x) * Intern::q1(y);
435
436 // Vertex 2: (+1,-1)
437 data.phi[ 4].ref_value = Intern::p2(x) * Intern::p1(y);
438 d0 = Intern::q2(x) * Intern::p1(y);
439 d1 = Intern::p2(x) * Intern::q1(y);
440 data.phi[ 5].ref_value = _trans_dx(1, d0, d1);
441 data.phi[ 6].ref_value = _trans_dy(1, d0, d1);
442 data.phi[ 7].ref_value = Intern::q2(x) * Intern::q1(y);
443
444 // Vertex 3: (-1,+1)
445 data.phi[ 8].ref_value = Intern::p1(x) * Intern::p2(y);
446 d0 = Intern::q1(x) * Intern::p2(y);
447 d1 = Intern::p1(x) * Intern::q2(y);
448 data.phi[ 9].ref_value = _trans_dx(2, d0, d1);
449 data.phi[10].ref_value = _trans_dy(2, d0, d1);
450 data.phi[11].ref_value = Intern::q1(x) * Intern::q2(y);
451
452 // Vertex 4: (+1,+1)
453 data.phi[12].ref_value = Intern::p2(x) * Intern::p2(y);
454 d0 = Intern::q2(x) * Intern::p2(y);
455 d1 = Intern::p2(x) * Intern::q2(y);
456 data.phi[13].ref_value = _trans_dx(3, d0, d1);
457 data.phi[14].ref_value = _trans_dy(3, d0, d1);
458 data.phi[15].ref_value = Intern::q2(x) * Intern::q2(y);
459 }
460
470 template<typename EvalData_>
472 EvalData_& data,
473 const DomainPointType& point) const
474 {
475 const DataType x(point[0]), y(point[1]);
476 DataType d0x, d0y, d1x, d1y;
477
478 // Vertex 1: (-1,-1)
479 data.phi[ 0].ref_grad[0] = Intern::dp1(x) * Intern::p1(y);
480 data.phi[ 0].ref_grad[1] = Intern::p1(x) * Intern::dp1(y);
481 d0x = Intern::dq1(x) * Intern::p1(y);
482 d0y = Intern::q1(x) * Intern::dp1(y);
483 d1x = Intern::dp1(x) * Intern::q1(y);
484 d1y = Intern::p1(x) * Intern::dq1(y);
485 data.phi[ 1].ref_grad[0] = _trans_dx(0, d0x, d1x);
486 data.phi[ 1].ref_grad[1] = _trans_dx(0, d0y, d1y);
487 data.phi[ 2].ref_grad[0] = _trans_dy(0, d0x, d1x);
488 data.phi[ 2].ref_grad[1] = _trans_dy(0, d0y, d1y);
489 data.phi[ 3].ref_grad[0] = Intern::dq1(x) * Intern::q1(y);
490 data.phi[ 3].ref_grad[1] = Intern::q1(x) * Intern::dq1(y);
491
492 // Vertex 2: (+1,-1)
493 data.phi[ 4].ref_grad[0] = Intern::dp2(x) * Intern::p1(y);
494 data.phi[ 4].ref_grad[1] = Intern::p2(x) * Intern::dp1(y);
495 d0x = Intern::dq2(x) * Intern::p1(y);
496 d0y = Intern::q2(x) * Intern::dp1(y);
497 d1x = Intern::dp2(x) * Intern::q1(y);
498 d1y = Intern::p2(x) * Intern::dq1(y);
499 data.phi[ 5].ref_grad[0] = _trans_dx(1, d0x, d1x);
500 data.phi[ 5].ref_grad[1] = _trans_dx(1, d0y, d1y);
501 data.phi[ 6].ref_grad[0] = _trans_dy(1, d0x, d1x);
502 data.phi[ 6].ref_grad[1] = _trans_dy(1, d0y, d1y);
503 data.phi[ 7].ref_grad[0] = Intern::dq2(x) * Intern::q1(y);
504 data.phi[ 7].ref_grad[1] = Intern::q2(x) * Intern::dq1(y);
505
506 // Vertex 3: (-1,+1)
507 data.phi[ 8].ref_grad[0] = Intern::dp1(x) * Intern::p2(y);
508 data.phi[ 8].ref_grad[1] = Intern::p1(x) * Intern::dp2(y);
509 d0x = Intern::dq1(x) * Intern::p2(y);
510 d0y = Intern::q1(x) * Intern::dp2(y);
511 d1x = Intern::dp1(x) * Intern::q2(y);
512 d1y = Intern::p1(x) * Intern::dq2(y);
513 data.phi[ 9].ref_grad[0] = _trans_dx(2, d0x, d1x);
514 data.phi[ 9].ref_grad[1] = _trans_dx(2, d0y, d1y);
515 data.phi[10].ref_grad[0] = _trans_dy(2, d0x, d1x);
516 data.phi[10].ref_grad[1] = _trans_dy(2, d0y, d1y);
517 data.phi[11].ref_grad[0] = Intern::dq1(x) * Intern::q2(y);
518 data.phi[11].ref_grad[1] = Intern::q1(x) * Intern::dq2(y);
519
520 // Vertex 4: (+1,+1)
521 data.phi[12].ref_grad[0] = Intern::dp2(x) * Intern::p2(y);
522 data.phi[12].ref_grad[1] = Intern::p2(x) * Intern::dp2(y);
523 d0x = Intern::dq2(x) * Intern::p2(y);
524 d0y = Intern::q2(x) * Intern::dp2(y);
525 d1x = Intern::dp2(x) * Intern::q2(y);
526 d1y = Intern::p2(x) * Intern::dq2(y);
527 data.phi[13].ref_grad[0] = _trans_dx(3, d0x, d1x);
528 data.phi[13].ref_grad[1] = _trans_dx(3, d0y, d1y);
529 data.phi[14].ref_grad[0] = _trans_dy(3, d0x, d1x);
530 data.phi[14].ref_grad[1] = _trans_dy(3, d0y, d1y);
531 data.phi[15].ref_grad[0] = Intern::dq2(x) * Intern::q2(y);
532 data.phi[15].ref_grad[1] = Intern::q2(x) * Intern::dq2(y);
533 }
534
544 template<typename EvalData_>
546 EvalData_& data,
547 const DomainPointType& point) const
548 {
549 const DataType x(point[0]), y(point[1]);
550 DataType d0xx, d0xy, d0yy, d1xx, d1xy, d1yy;
551
552 // Vertex 1: (-1,-1)
553 data.phi[ 0].ref_hess[0][0] = Intern::ddp1(x) * Intern::p1(y);
554 data.phi[ 0].ref_hess[0][1] =
555 data.phi[ 0].ref_hess[1][0] = Intern::dp1(x) * Intern::dp1(y);
556 data.phi[ 0].ref_hess[1][1] = Intern::p1(x) * Intern::ddp1(y);
557 d0xx = Intern::ddq1(x) * Intern::p1(y);
558 d0xy = Intern::dq1(x) * Intern::dp1(y);
559 d0yy = Intern::q1(x) * Intern::ddp1(y);
560 d1xx = Intern::ddp1(x) * Intern::q1(y);
561 d1xy = Intern::dp1(x) * Intern::dq1(y);
562 d1yy = Intern::p1(x) * Intern::ddq1(y);
563 data.phi[ 1].ref_hess[0][0] = _trans_dx(0, d0xx, d1xx);
564 data.phi[ 1].ref_hess[0][1] =
565 data.phi[ 1].ref_hess[1][0] = _trans_dx(0, d0xy, d1xy);
566 data.phi[ 1].ref_hess[1][1] = _trans_dx(0, d0yy, d1yy);
567 data.phi[ 2].ref_hess[0][0] = _trans_dy(0, d0xx, d1xx);
568 data.phi[ 2].ref_hess[0][1] =
569 data.phi[ 2].ref_hess[1][0] = _trans_dy(0, d0xy, d1xy);
570 data.phi[ 2].ref_hess[1][1] = _trans_dy(0, d0yy, d1yy);
571 data.phi[ 3].ref_hess[0][0] = Intern::ddq1(x) * Intern::q1(y);
572 data.phi[ 3].ref_hess[0][1] =
573 data.phi[ 3].ref_hess[1][0] = Intern::dq1(x) * Intern::dq1(y);
574 data.phi[ 3].ref_hess[1][1] = Intern::q1(x) * Intern::ddq1(y);
575
576 // Vertex 2: (+1,-1)
577 data.phi[ 4].ref_hess[0][0] = Intern::ddp2(x) * Intern::p1(y);
578 data.phi[ 4].ref_hess[0][1] =
579 data.phi[ 4].ref_hess[1][0] = Intern::dp2(x) * Intern::dp1(y);
580 data.phi[ 4].ref_hess[1][1] = Intern::p2(x) * Intern::ddp1(y);
581 d0xx = Intern::ddq2(x) * Intern::p1(y);
582 d0xy = Intern::dq2(x) * Intern::dp1(y);
583 d0yy = Intern::q2(x) * Intern::ddp1(y);
584 d1xx = Intern::ddp2(x) * Intern::q1(y);
585 d1xy = Intern::dp2(x) * Intern::dq1(y);
586 d1yy = Intern::p2(x) * Intern::ddq1(y);
587 data.phi[ 5].ref_hess[0][0] = _trans_dx(1, d0xx, d1xx);
588 data.phi[ 5].ref_hess[0][1] =
589 data.phi[ 5].ref_hess[1][0] = _trans_dx(1, d0xy, d1xy);
590 data.phi[ 5].ref_hess[1][1] = _trans_dx(1, d0yy, d1yy);
591 data.phi[ 6].ref_hess[0][0] = _trans_dy(1, d0xx, d1xx);
592 data.phi[ 6].ref_hess[0][1] =
593 data.phi[ 6].ref_hess[1][0] = _trans_dy(1, d0xy, d1xy);
594 data.phi[ 6].ref_hess[1][1] = _trans_dy(1, d0yy, d1yy);
595 data.phi[ 7].ref_hess[0][0] = Intern::ddq2(x) * Intern::q1(y);
596 data.phi[ 7].ref_hess[0][1] =
597 data.phi[ 7].ref_hess[1][0] = Intern::dq2(x) * Intern::dq1(y);
598 data.phi[ 7].ref_hess[1][1] = Intern::q2(x) * Intern::ddq1(y);
599
600 // Vertex 3: (-1,+1)
601 data.phi[ 8].ref_hess[0][0] = Intern::ddp1(x) * Intern::p2(y);
602 data.phi[ 8].ref_hess[0][1] =
603 data.phi[ 8].ref_hess[1][0] = Intern::dp1(x) * Intern::dp2(y);
604 data.phi[ 8].ref_hess[1][1] = Intern::p1(x) * Intern::ddp2(y);
605 d0xx = Intern::ddq1(x) * Intern::p2(y);
606 d0xy = Intern::dq1(x) * Intern::dp2(y);
607 d0yy = Intern::q1(x) * Intern::ddp2(y);
608 d1xx = Intern::ddp1(x) * Intern::q2(y);
609 d1xy = Intern::dp1(x) * Intern::dq2(y);
610 d1yy = Intern::p1(x) * Intern::ddq2(y);
611 data.phi[ 9].ref_hess[0][0] = _trans_dx(2, d0xx, d1xx);
612 data.phi[ 9].ref_hess[0][1] =
613 data.phi[ 9].ref_hess[1][0] = _trans_dx(2, d0xy, d1xy);
614 data.phi[ 9].ref_hess[1][1] = _trans_dx(2, d0yy, d1yy);
615 data.phi[10].ref_hess[0][0] = _trans_dy(2, d0xx, d1xx);
616 data.phi[10].ref_hess[0][1] =
617 data.phi[10].ref_hess[1][0] = _trans_dy(2, d0xy, d1xy);
618 data.phi[10].ref_hess[1][1] = _trans_dy(2, d0yy, d1yy);
619 data.phi[11].ref_hess[0][0] = Intern::ddq1(x) * Intern::q2(y);
620 data.phi[11].ref_hess[0][1] =
621 data.phi[11].ref_hess[1][0] = Intern::dq1(x) * Intern::dq2(y);
622 data.phi[11].ref_hess[1][1] = Intern::q1(x) * Intern::ddq2(y);
623
624 // Vertex 4: (+1,+1)
625 data.phi[12].ref_hess[0][0] = Intern::ddp2(x) * Intern::p2(y);
626 data.phi[12].ref_hess[0][1] =
627 data.phi[12].ref_hess[1][0] = Intern::dp2(x) * Intern::dp2(y);
628 data.phi[12].ref_hess[1][1] = Intern::p2(x) * Intern::ddp2(y);
629 d0xx = Intern::ddq2(x) * Intern::p2(y);
630 d0xy = Intern::dq2(x) * Intern::dp2(y);
631 d0yy = Intern::q2(x) * Intern::ddp2(y);
632 d1xx = Intern::ddp2(x) * Intern::q2(y);
633 d1xy = Intern::dp2(x) * Intern::dq2(y);
634 d1yy = Intern::p2(x) * Intern::ddq2(y);
635 data.phi[13].ref_hess[0][0] = _trans_dx(3, d0xx, d1xx);
636 data.phi[13].ref_hess[0][1] =
637 data.phi[13].ref_hess[1][0] = _trans_dx(3, d0xy, d1xy);
638 data.phi[13].ref_hess[1][1] = _trans_dx(3, d0yy, d1yy);
639 data.phi[14].ref_hess[0][0] = _trans_dy(3, d0xx, d1xx);
640 data.phi[14].ref_hess[0][1] =
641 data.phi[14].ref_hess[1][0] = _trans_dy(3, d0xy, d1xy);
642 data.phi[14].ref_hess[1][1] = _trans_dy(3, d0yy, d1yy);
643 data.phi[15].ref_hess[0][0] = Intern::ddq2(x) * Intern::q2(y);
644 data.phi[15].ref_hess[0][1] =
645 data.phi[15].ref_hess[1][0] = Intern::dq2(x) * Intern::dq2(y);
646 data.phi[15].ref_hess[1][1] = Intern::q2(x) * Intern::ddq2(y);
647 }
648 }; // class Evaluator<...,Hypercube<2>>
649 } // namespace BognerFoxSchmit
650 } // namespace Space
651} // namespace FEAT
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:240
void eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:264
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
Definition: evaluator.hpp:192
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:140
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:216
void eval_ref_hessians(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function hessians on the reference cell.
Definition: evaluator.hpp:545
DataType _trans_dy(Index i, DataType rx, DataType ry) const
Transforms the Y-derivative basis function.
Definition: evaluator.hpp:354
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:421
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
Definition: evaluator.hpp:387
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
Definition: evaluator.hpp:301
DataType _trans_dx(Index i, DataType rx, DataType ry) const
Transforms the X-derivative basis function.
Definition: evaluator.hpp:337
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:471
Bogner-Fox-Schmit Element Evaluator class template declaration.
Definition: evaluator.hpp:116
Finite-Element Parametric Evaluator CRTP base-class template.
Tiny Matrix class template.
static constexpr SpaceTags ref_caps
Bogner-Fox-Schmit Element Evaluator reference capabilities.
Definition: evaluator.hpp:22
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
std::uint64_t Index
Index data type.
@ dom_point
specifies whether the trafo should supply domain point coordinates