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 Q1TBNP
16 {
23
29 template<
30 typename Space_,
31 typename TrafoEvaluator_,
32 typename SpaceEvalTraits_,
33 typename Shape_ = typename Space_::ShapeType>
34 class Evaluator DOXY({});
35
41 template<
42 typename Space_,
43 typename TrafoEvaluator_,
44 typename SpaceEvalTraits_>
45 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Quadrilateral> :
46 public EvaluatorBase<
47 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Quadrilateral>,
48 TrafoEvaluator_,
49 SpaceEvalTraits_>
50 {
51 public:
54
56 typedef Space_ SpaceType;
57
59 typedef SpaceEvalTraits_ SpaceEvalTraits;
60
62 typedef TrafoEvaluator_ TrafoEvaluator;
63
65 typedef typename TrafoEvaluator::EvalTraits TrafoEvalTraits;
66
68 typedef typename TrafoEvaluator::TrafoType TrafoType;
69
71 typedef typename TrafoType::MeshType MeshType;
72
74 typedef typename MeshType::template IndexSet<2,1>::Type FacetIndexSetType;
75
77 typedef typename SpaceEvalTraits::DataType DataType;
78
80 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
81
83 typedef typename EvalPolicy::DomainPointType DomainPointType;
85 typedef typename EvalPolicy::ImagePointType ImagePointType;
86
88 typedef typename EvalPolicy::JacobianMatrixType JacobianMatrixType;
90 typedef typename EvalPolicy::JacobianInverseType JacobianInverseType;
91
92 static constexpr SpaceTags eval_caps = SpaceTags::value | SpaceTags::grad;
93
94 template<SpaceTags cfg_>
95 struct ConfigTraits
96 {
98 static constexpr SpaceTags config = cfg_;
99
101 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
102
105 };
106
107 protected:
110
112 typedef typename TrafoEvaluator::template ConfigTraits<inv_lin_trafo_config>::EvalDataType InvLinTrafoData;
113
115 typedef typename TrafoType::template Evaluator<Shape::Hypercube<1>, DataType>::Type FacetTrafoEvaluator;
117 typedef typename FacetTrafoEvaluator::EvalTraits FacetEvalTraits;
118
120 static constexpr TrafoTags facet_trafo_config = TrafoTags::img_point | TrafoTags::jac_det;
121
123 typedef typename FacetTrafoEvaluator::template ConfigTraits<facet_trafo_config>::EvalDataType FacetTrafoData;
124
127
130
131 // inverse linearized trafo vector
132 ImagePointType _inv_lin_vec;
133
136
137 void _build_inv_lin_trafo(const TrafoEvaluator& trafo_eval)
138 {
139 // create a domain point in the barycentre of the cell
141
142 // create the trafo data
143 InvLinTrafoData trafo_data;
144 trafo_eval(trafo_data, dom_point);
145
146 // store inverse trafo linearization
147 _inv_lin_mat = trafo_data.jac_inv;
148 _inv_lin_vec = trafo_data.img_point;
149 }
150
152 void _build_coeff_matrix(const TrafoEvaluator& trafo_eval)
153 {
154 // fetch the trafo
155 const TrafoType& trafo = trafo_eval.get_trafo();
156
157 // fetch the mesh
158 const MeshType& mesh = trafo.get_mesh();
159
160 // fetch the facet-index-set of the mesh
161 const FacetIndexSetType& facet_index_set = mesh.template get_index_set<2,1>();
162
163 // fetch the cell index of the currently active cell
164 const Index cell = trafo_eval.get_cell_index();
165
166 // create a nodal matrix
167 CoeffMatrixType _nodal_mat(DataType(0));
168
169 // create a facet trafo evaluator
170 FacetTrafoEvaluator facet_eval(trafo);
171
172 // create facet evaluation data
173 FacetTrafoData facet_data;
174
175 // define 2-point Gauss cubature point coordinate
176 const DataType g = Math::sqrt(DataType(1) / DataType(3));
177 const typename FacetEvalTraits::DomainPointType g1(-g), g2(+g);
178 DomainPointType q1, q2;
179
180 // loop over all 4 edges of the quad
181 for(int i(0); i < 4; ++i)
182 {
183 // initialize facet evaluator
184 facet_eval.prepare(Index(facet_index_set(cell, i)));
185
186 // map first cubature point
187 facet_eval(facet_data, g1);
188 DataType w1(facet_data.jac_det);
189 q1.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
190
191 // map second cubature point
192 facet_eval(facet_data, g2);
193 DataType w2(facet_data.jac_det);
194 q2.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
195
196 // release facet evaluator
197 facet_eval.finish();
198
199 // compute reciprocal edge length
200 DataType v = DataType(1) / (w1 + w2);
201
202 // evaluate node functionals
203 _nodal_mat(0,i) = DataType(1); // = v*(w1 + w2)
204 _nodal_mat(1,i) = v*(w1*q1[0] + w2*q2[0]);
205 _nodal_mat(2,i) = v*(w1*q1[1] + w2*q2[1]);
206 _nodal_mat(3,i) = v*(w1*((q1[0]+q1[1])*(q1[0]-q1[1])) + w2*((q2[0]+q2[1])*(q2[0]-q2[1])));
207 _nodal_mat(4,i) = v*(w1*q1[0]*q1[1] + w2*q2[0]*q2[1]);
208 }
209
210 // loop over all 4 cubature points
211 InvLinTrafoData trafo_data;
212 DataType vol_t = DataType(0);
213 for(int i(0); i < 4; ++i)
214 {
216 dom_point[0] = DataType(1 - 2*(i&1)) * g;
217 dom_point[1] = DataType(1 - 1*(i&2)) * g;
218 trafo_eval(trafo_data, dom_point);
219 dom_point.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
220 const DataType x = dom_point[0];
221 const DataType y = dom_point[1];
222 const DataType w = trafo_data.jac_det * x*y;
223 vol_t += trafo_data.jac_det;
224 _nodal_mat(0,4) += w;
225 _nodal_mat(1,4) += w*x;
226 _nodal_mat(2,4) += w*y;
227 _nodal_mat(3,4) += w*(x+y)*(x-y);
228 _nodal_mat(4,4) += w*x*y;
229 }
230 vol_t = DataType(1) / vol_t;
231 for(int i(0); i < 5; ++i)
232 _nodal_mat(i,4) *= vol_t;
233
234 // invert nodal matrix to obtain coefficient matrix
235 _coeff_mat.set_inverse(_nodal_mat);
236 }
237
238 public:
245 explicit Evaluator(const SpaceType& DOXY(space))
246 {
247 }
248
250 virtual ~Evaluator()
251 {
252 }
253
261 {
262 return 5;
263 }
264
271 void prepare(const TrafoEvaluator& trafo_eval)
272 {
273 // prepare inverse linearized trafo
274 _build_inv_lin_trafo(trafo_eval);
275
276 // build coefficient matrix
277 _build_coeff_matrix(trafo_eval);
278 }
279
281 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
284 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
285 {
286 // transform image point
288 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
289
290 // "evaluate" monomials
291 const DataType x(pt[0]);
292 const DataType y(pt[1]);
293 const DataType r((x+y)*(x-y));
294 const DataType b(x*y);
295
296 // loop over all basis functions
297 for(int i(0); i < 5; ++i)
298 {
299 data.phi[i].value = _coeff_mat(i,0) + _coeff_mat(i,1)*x + _coeff_mat(i,2)*y + _coeff_mat(i,3)*r + _coeff_mat(i,4)*b;
300 }
301 }
302
304 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
307 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
308 {
309 // transform image point to local coordinate system
310 DomainPointType pt, loc_grad;
311 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
312
313 // loop over all basis functions
314 for(int i(0); i < 5; ++i)
315 {
316 // calculate local gradients
317 loc_grad(0) = _coeff_mat(i,1) + DataType(2) * _coeff_mat(i,3) * pt[0] + _coeff_mat(i,4) * pt[1];
318 loc_grad(1) = _coeff_mat(i,2) - DataType(2) * _coeff_mat(i,3) * pt[1] + _coeff_mat(i,4) * pt[0];
319
320 // multiply by transpose inverse linearized trafo matrix for chain rule
321 data.phi[i].grad.set_vec_mat_mult(loc_grad, _inv_lin_mat);
322 }
323 }
324 }; // Evaluator<..., Shape::Quadrilateral>
325
331 template<
332 typename Space_,
333 typename TrafoEvaluator_,
334 typename SpaceEvalTraits_>
335 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hexahedron> :
336 public EvaluatorBase<
337 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hexahedron>,
338 TrafoEvaluator_,
339 SpaceEvalTraits_>
340 {
341 public:
344
346 typedef Space_ SpaceType;
347
349 typedef SpaceEvalTraits_ SpaceEvalTraits;
350
352 typedef TrafoEvaluator_ TrafoEvaluator;
353
355 typedef typename TrafoEvaluator::EvalTraits TrafoEvalTraits;
356
358 typedef typename TrafoEvaluator::TrafoType TrafoType;
359
361 typedef typename TrafoType::MeshType MeshType;
362
364 typedef typename MeshType::template IndexSet<3,2>::Type FacetIndexSetType;
365
367 typedef typename SpaceEvalTraits::DataType DataType;
368
370 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
371
373 typedef typename EvalPolicy::DomainPointType DomainPointType;
375 typedef typename EvalPolicy::ImagePointType ImagePointType;
376
378 typedef typename EvalPolicy::JacobianMatrixType JacobianMatrixType;
380 typedef typename EvalPolicy::JacobianInverseType JacobianInverseType;
381
382 static constexpr SpaceTags eval_caps = SpaceTags::value | SpaceTags::grad;
383
384 template<SpaceTags cfg_>
385 struct ConfigTraits
386 {
388 static constexpr SpaceTags config = cfg_;
389
391 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
392
395 };
396
397 protected:
400
402 typedef typename TrafoEvaluator::template ConfigTraits<inv_lin_trafo_config>::EvalDataType InvLinTrafoData;
403
405 typedef typename TrafoType::template Evaluator<Shape::Hypercube<2>, DataType>::Type FacetTrafoEvaluator;
407 typedef typename FacetTrafoEvaluator::EvalTraits FacetEvalTraits;
408
410 static constexpr TrafoTags facet_trafo_config = TrafoTags::img_point | TrafoTags::jac_det;
411
413 typedef typename FacetTrafoEvaluator::template ConfigTraits<facet_trafo_config>::EvalDataType FacetTrafoData;
414
417
420
421 // inverse linearized trafo vector
422 ImagePointType _inv_lin_vec;
423
426
427 void _build_inv_lin_trafo(const TrafoEvaluator& trafo_eval)
428 {
429 // create a domain point in the barycenter of the cell
431
432 // create the trafo data
433 InvLinTrafoData trafo_data;
434 trafo_eval(trafo_data, dom_point);
435
436 // store inverse trafo linearization
437 _inv_lin_mat = trafo_data.jac_inv;
438 _inv_lin_vec = trafo_data.img_point;
439 }
440
442 void _build_coeff_matrix(const TrafoEvaluator& trafo_eval)
443 {
444 // fetch the trafo
445 const TrafoType& trafo = trafo_eval.get_trafo();
446
447 // fetch the mesh
448 const MeshType& mesh = trafo.get_mesh();
449
450 // fetch the facet-index-set of the mesh
451 const FacetIndexSetType& facet_index_set = mesh.template get_index_set<3,2>();
452
453 // fetch the cell index of the currently active cell
454 const Index cell = trafo_eval.get_cell_index();
455
456 // create a nodal matrix
457 CoeffMatrixType _nodal_mat(DataType(0));
458
459 // create a facet trafo evaluator
460 FacetTrafoEvaluator facet_eval(trafo);
461
462 // create facet evaluation data
463 FacetTrafoData facet_data;
464
465 // define 2-point Gauss cubature point coordinate
466 const DataType g = Math::sqrt(DataType(1) / DataType(3));
467 typename FacetEvalTraits::DomainPointType g1, g2, g3, g4;
468 DomainPointType q1, q2, q3, q4;
469
470 // set up cubature points
471 g1[0] = g2[0] = -g;
472 g3[0] = g4[0] = +g;
473 g1[1] = g3[1] = -g;
474 g2[1] = g4[1] = +g;
475
476 // loop over all 6 faces of the hexa
477 for(int i(0); i < 6; ++i)
478 {
479 // initialize facet evaluator
480 facet_eval.prepare(Index(facet_index_set(cell, i)));
481
482 // map first cubature point
483 facet_eval(facet_data, g1);
484 DataType w1(facet_data.jac_det);
485 q1.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
486
487 // map second cubature point
488 facet_eval(facet_data, g2);
489 DataType w2(facet_data.jac_det);
490 q2.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
491
492 // map third cubature point
493 facet_eval(facet_data, g3);
494 DataType w3(facet_data.jac_det);
495 q3.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
496
497 // map fourth cubature point
498 facet_eval(facet_data, g4);
499 DataType w4(facet_data.jac_det);
500 q4.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
501
502 // release facet evaluator
503 facet_eval.finish();
504
505 // compute reciprocal quad area
506 DataType v = DataType(1) / (w1 + w2 + w3 + w4);
507
508 // evaluate node functionals
509 _nodal_mat(0,i) = DataType(1); // = v*(w1 + w2 + w3 + w4)
510 _nodal_mat(1,i) = v*(w1*q1[0] + w2*q2[0] + w3*q3[0] + w4*q4[0]);
511 _nodal_mat(2,i) = v*(w1*q1[1] + w2*q2[1] + w3*q3[1] + w4*q4[1]);
512 _nodal_mat(3,i) = v*(w1*q1[2] + w2*q2[2] + w3*q3[2] + w4*q4[2]);
513 _nodal_mat(4,i) = v*( // x^2 - y^2
514 w1*(q1[0] + q1[1])*(q1[0] - q1[1]) + w2*(q2[0] + q2[1])*(q2[0] - q2[1]) +
515 w3*(q3[0] + q3[1])*(q3[0] - q3[1]) + w4*(q4[0] + q4[1])*(q4[0] - q4[1]));
516 _nodal_mat(5,i) = v*( // y^2 - z^2
517 w1*(q1[1] + q1[2])*(q1[1] - q1[2]) + w2*(q2[1] + q2[2])*(q2[1] - q2[2]) +
518 w3*(q3[1] + q3[2])*(q3[1] - q3[2]) + w4*(q4[1] + q4[2])*(q4[1] - q4[2]));
519 _nodal_mat(6,i) = v*(w1*q1[0]*q1[1] + w2*q2[0]*q2[1] + w3*q3[0]*q3[1] + w4*q4[0]*q4[1]);
520 _nodal_mat(7,i) = v*(w1*q1[1]*q1[2] + w2*q2[1]*q2[2] + w3*q3[1]*q3[2] + w4*q4[1]*q4[2]);
521 _nodal_mat(8,i) = v*(w1*q1[2]*q1[0] + w2*q2[2]*q2[0] + w3*q3[2]*q3[0] + w4*q4[2]*q4[0]);
522 }
523
524 // loop over all 8 cubature points
525 InvLinTrafoData trafo_data;
526 DataType vol_t = DataType(0);
527 for(int i(0); i < 8; ++i)
528 {
530 dom_point[0] = DataType(1 - ((i&1) << 1)) * g;
531 dom_point[1] = DataType(1 - ((i&2) )) * g;
532 dom_point[2] = DataType(1 - ((i&4) >> 1)) * g;
533 trafo_eval(trafo_data, dom_point);
534 dom_point.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
535 const DataType x = dom_point[0];
536 const DataType y = dom_point[1];
537 const DataType z = dom_point[2];
538 const DataType w = trafo_data.jac_det;
539 vol_t += trafo_data.jac_det;
540 _nodal_mat(0,6) += w*x*y;
541 _nodal_mat(1,6) += w*x*x*y;
542 _nodal_mat(2,6) += w*y*x*y;
543 _nodal_mat(3,6) += w*z*x*y;
544 _nodal_mat(4,6) += w*(x+y)*(x-y)*x*y;
545 _nodal_mat(5,6) += w*(y+z)*(y-z)*x*y;
546 _nodal_mat(6,6) += w*x*y*x*y;
547 _nodal_mat(7,6) += w*y*z*x*y;
548 _nodal_mat(8,6) += w*z*x*x*y;
549
550 _nodal_mat(0,7) += w*y*z;
551 _nodal_mat(1,7) += w*x*y*z;
552 _nodal_mat(2,7) += w*y*y*z;
553 _nodal_mat(3,7) += w*z*y*z;
554 _nodal_mat(4,7) += w*(x+y)*(x-y)*y*z;
555 _nodal_mat(5,7) += w*(y+z)*(y-z)*y*z;
556 _nodal_mat(6,7) += w*x*y*y*z;
557 _nodal_mat(7,7) += w*y*z*y*z;
558 _nodal_mat(8,7) += w*z*x*y*z;
559
560 _nodal_mat(0,8) += w*z*x;
561 _nodal_mat(1,8) += w*x*z*x;
562 _nodal_mat(2,8) += w*y*z*x;
563 _nodal_mat(3,8) += w*z*z*x;
564 _nodal_mat(4,8) += w*(x+y)*(x-y)*z*x;
565 _nodal_mat(5,8) += w*(y+z)*(y-z)*z*x;
566 _nodal_mat(6,8) += w*x*y*z*x;
567 _nodal_mat(7,8) += w*y*z*z*x;
568 _nodal_mat(8,8) += w*z*x*z*x;
569 }
570 vol_t = DataType(1) / vol_t;
571 for(int i(0); i < 9; ++i)
572 {
573 _nodal_mat(i,6) *= vol_t;
574 _nodal_mat(i,7) *= vol_t;
575 _nodal_mat(i,8) *= vol_t;
576 }
577
578 // invert nodal matrix to obtain coefficient matrix
579 _coeff_mat.set_inverse(_nodal_mat);
580 }
581
582 public:
589 explicit Evaluator(const SpaceType& DOXY(space))
590 {
591 }
592
594 virtual ~Evaluator()
595 {
596 }
597
605 {
606 return 9;
607 }
608
615 void prepare(const TrafoEvaluator& trafo_eval)
616 {
617 // prepare inverse linearized trafo
618 _build_inv_lin_trafo(trafo_eval);
619
620 // build coefficient matrix
621 _build_coeff_matrix(trafo_eval);
622 }
623
625 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
628 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
629 {
630 // transform image point
632 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
633
634 // "evaluate" monomials
635 DataType x(pt[0]);
636 DataType y(pt[1]);
637 DataType z(pt[2]);
638 DataType rxy((x+y)*(x-y)); // = x^2 - y^2
639 DataType ryz((y+z)*(y-z)); // = y^2 - z^2
640
641 // loop over all basis functions
642 for(int i(0); i < 9; ++i)
643 {
644 data.phi[i].value = _coeff_mat(i,0) + _coeff_mat(i,4)*rxy + _coeff_mat(i,5)*ryz
645 + x*(_coeff_mat(i,1) + y*_coeff_mat(i,6))
646 + y*(_coeff_mat(i,2) + z*_coeff_mat(i,7))
647 + z*(_coeff_mat(i,3) + x*_coeff_mat(i,8));
648 }
649 }
650
652 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
655 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
656 {
657 // transform image point to local coordinate system
658 DomainPointType pt, loc_grad;
659 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
660
661 // loop over all basis functions
662 for(int i(0); i < 9; ++i)
663 {
664 // calculate local gradients
665 loc_grad[0] = _coeff_mat(i,1) + pt[1]*_coeff_mat(i,6) + DataType(2) * pt[0] * _coeff_mat(i,4);
666 loc_grad[1] = _coeff_mat(i,2) + pt[2]*_coeff_mat(i,7) + DataType(2) * pt[1] * (_coeff_mat(i,5) - _coeff_mat(i,4));
667 loc_grad[2] = _coeff_mat(i,3) + pt[0]*_coeff_mat(i,8) - DataType(2) * pt[2] * _coeff_mat(i,5);
668
669 // multiply by transpose inverse linearized trafo matrix for chain rule
670 data.phi[i].grad.set_vec_mat_mult(loc_grad, _inv_lin_mat);
671 }
672 }
673 }; // Evaluator<..., Shape::Hexahedron>
674 } // namespace Q1TBNP
675 } // namespace Space
676} // namespace FEAT
EvalTraits_::BasisValueType value
basis function value object
Definition: eval_data.hpp:47
EvalTraits_::BasisGradientType grad
basis gradient object
Definition: eval_data.hpp:45
Space evaluation data structure.
Definition: eval_data.hpp:141
BasisDataType phi[max_local_dofs]
the basis function data vector
Definition: eval_data.hpp:150
Basic Space Evaluator CRTP base-class template.
FacetTrafoEvaluator::template ConfigTraits< facet_trafo_config >::EvalDataType FacetTrafoData
facet trafo data
Definition: evaluator.hpp:413
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
Definition: evaluator.hpp:615
void eval_values(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Evaluates the basis function values on the real cell.
Definition: evaluator.hpp:626
Tiny::Matrix< DataType, 9, 9 > CoeffMatrixType
basis function coefficient matrix
Definition: evaluator.hpp:416
EvalPolicy::JacobianInverseType JacobianInverseType
jacobian inverse matrix type
Definition: evaluator.hpp:380
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Definition: evaluator.hpp:653
void _build_coeff_matrix(const TrafoEvaluator &trafo_eval)
computes the basis function coefficient matrix for the current cell
Definition: evaluator.hpp:442
EvaluatorBase< Evaluator, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base-class typedef
Definition: evaluator.hpp:343
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
Definition: evaluator.hpp:402
TrafoType::template Evaluator< Shape::Hypercube< 2 >, DataType >::Type FacetTrafoEvaluator
trafo evaluator for facets
Definition: evaluator.hpp:405
MeshType::template IndexSet< 3, 2 >::Type FacetIndexSetType
facet-index-set type
Definition: evaluator.hpp:364
MeshType::template IndexSet< 2, 1 >::Type FacetIndexSetType
facet-index-set type
Definition: evaluator.hpp:74
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Definition: evaluator.hpp:305
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
Definition: evaluator.hpp:271
void _build_coeff_matrix(const TrafoEvaluator &trafo_eval)
computes the basis function coefficient matrix for the current cell
Definition: evaluator.hpp:152
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
Definition: evaluator.hpp:112
TrafoType::template Evaluator< Shape::Hypercube< 1 >, DataType >::Type FacetTrafoEvaluator
trafo evaluator for facets (=edges)
Definition: evaluator.hpp:115
EvaluatorBase< Evaluator, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base-class typedef
Definition: evaluator.hpp:53
Tiny::Matrix< DataType, 5, 5 > CoeffMatrixType
basis function coefficient matrix
Definition: evaluator.hpp:126
EvalPolicy::JacobianInverseType JacobianInverseType
jacobian inverse matrix type
Definition: evaluator.hpp:90
void eval_values(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Evaluates the basis function values on the real cell.
Definition: evaluator.hpp:282
FacetTrafoEvaluator::template ConfigTraits< facet_trafo_config >::EvalDataType FacetTrafoData
facet trafo data
Definition: evaluator.hpp:123
Q1TBNP Element Evaluator class template declaration.
Definition: evaluator.hpp:34
Tiny Matrix class template.
CUDA_HOST_DEVICE Matrix & set_inverse(const Matrix< T_, m_, n_, sma_, sna_ > &a)
Sets this matrix to the inverse of another matrix.
Trafo evaluation data structure.
Definition: eval_data.hpp:33
EvalTraits::ImagePointType img_point
image point
Definition: eval_data.hpp:53
T_ sqrt(T_ x)
Returns the square-root of a value.
Definition: math.hpp:300
static constexpr SpaceTags ref_caps
Q1TBNP Evaluator reference capabilities.
Definition: evaluator.hpp:22
FEAT namespace.
Definition: adjactor.hpp:12
SpaceTags
Space configuration tags enum.
Definition: eval_tags.hpp:97
@ value
specifies whether the space should supply basis function values
@ ref_value
specifies whether the space should supply reference basis function values
@ ref_grad
specifies whether the space should supply reference basis function gradients
@ grad
specifies whether the space should supply basis function gradients
std::uint64_t Index
Index data type.
TrafoTags
Trafo configuration tags enum.
Definition: eval_tags.hpp:22
@ img_point
specifies whether the trafo should supply image point coordinates
@ dom_point
specifies whether the trafo should supply domain point coordinates
@ jac_inv
specifies whether the trafo should supply inverse jacobian matrices
@ jac_det
specifies whether the trafo should supply jacobian determinants