9#include <kernel/space/parametric_evaluator.hpp>
31 typename TrafoEvaluator_,
32 typename SpaceEvalTraits_,
33 typename Shape_ =
typename Space_::ShapeType>
43 typename TrafoEvaluator_,
44 typename SpaceEvalTraits_>
45 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Quadrilateral> :
47 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Quadrilateral>,
68 typedef typename TrafoEvaluator::TrafoType
TrafoType;
77 typedef typename SpaceEvalTraits::DataType
DataType;
94 template<SpaceTags cfg_>
101 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
147 _inv_lin_mat = trafo_data.jac_inv;
148 _inv_lin_vec = trafo_data.img_point;
155 const TrafoType& trafo = trafo_eval.get_trafo();
158 const MeshType& mesh = trafo.get_mesh();
164 const Index cell = trafo_eval.get_cell_index();
177 const typename FacetEvalTraits::DomainPointType g1(-g), g2(+g);
181 for(
int i(0); i < 4; ++i)
184 facet_eval.prepare(
Index(facet_index_set(cell, i)));
187 facet_eval(facet_data, g1);
189 q1.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
192 facet_eval(facet_data, g2);
194 q2.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
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]);
213 for(
int i(0); i < 4; ++i)
219 dom_point.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
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;
231 for(
int i(0); i < 5; ++i)
232 _nodal_mat(i,4) *= vol_t;
274 _build_inv_lin_trafo(trafo_eval);
277 _build_coeff_matrix(trafo_eval);
281 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
288 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
297 for(
int i(0); i < 5; ++i)
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;
304 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
311 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
314 for(
int i(0); i < 5; ++i)
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];
321 data.
phi[i].
grad.set_vec_mat_mult(loc_grad, _inv_lin_mat);
333 typename TrafoEvaluator_,
334 typename SpaceEvalTraits_>
335 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hexahedron> :
337 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hexahedron>,
367 typedef typename SpaceEvalTraits::DataType
DataType;
384 template<SpaceTags cfg_>
391 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
437 _inv_lin_mat = trafo_data.jac_inv;
438 _inv_lin_vec = trafo_data.img_point;
445 const TrafoType& trafo = trafo_eval.get_trafo();
448 const MeshType& mesh = trafo.get_mesh();
454 const Index cell = trafo_eval.get_cell_index();
467 typename FacetEvalTraits::DomainPointType g1, g2, g3, g4;
477 for(
int i(0); i < 6; ++i)
480 facet_eval.prepare(
Index(facet_index_set(cell, i)));
483 facet_eval(facet_data, g1);
485 q1.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
488 facet_eval(facet_data, g2);
490 q2.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
493 facet_eval(facet_data, g3);
495 q3.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
498 facet_eval(facet_data, g4);
500 q4.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
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*(
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*(
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]);
527 for(
int i(0); i < 8; ++i)
534 dom_point.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
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;
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;
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;
571 for(
int i(0); i < 9; ++i)
573 _nodal_mat(i,6) *= vol_t;
574 _nodal_mat(i,7) *= vol_t;
575 _nodal_mat(i,8) *= vol_t;
618 _build_inv_lin_trafo(trafo_eval);
621 _build_coeff_matrix(trafo_eval);
625 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
632 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
642 for(
int i(0); i < 9; ++i)
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));
652 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
659 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
662 for(
int i(0); i < 9; ++i)
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);
670 data.
phi[i].
grad.set_vec_mat_mult(loc_grad, _inv_lin_mat);
EvalTraits_::BasisValueType value
basis function value object
EvalTraits_::BasisGradientType grad
basis gradient object
Space evaluation data structure.
BasisDataType phi[max_local_dofs]
the basis function data vector
Basic Space Evaluator CRTP base-class template.
FacetTrafoEvaluator::template ConfigTraits< facet_trafo_config >::EvalDataType FacetTrafoData
facet trafo data
Space_ SpaceType
space type
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
TrafoEvaluator::EvalTraits TrafoEvalTraits
trafo evaluator traits
int get_num_local_dofs() const
Returns the number of local DOFs.
SpaceEvalTraits_ SpaceEvalTraits
space evaluation traits
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.
JacobianInverseType _inv_lin_mat
inverse linearized trafo matrix
TrafoType::MeshType MeshType
mesh type
Tiny::Matrix< DataType, 9, 9 > CoeffMatrixType
basis function coefficient matrix
TrafoEvaluator::TrafoType TrafoType
trafo type
EvalPolicy::JacobianInverseType JacobianInverseType
jacobian inverse matrix type
CoeffMatrixType _coeff_mat
basis function coefficient matrix
EvalPolicy::DomainPointType DomainPointType
domain point type
EvalPolicy::ImagePointType ImagePointType
image point type
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
void _build_coeff_matrix(const TrafoEvaluator &trafo_eval)
computes the basis function coefficient matrix for the current cell
FacetTrafoEvaluator::EvalTraits FacetEvalTraits
facet evaluation traits
SpaceEvalTraits::EvalPolicy EvalPolicy
evaluation policy
SpaceEvalTraits::DataType DataType
data type
virtual ~Evaluator()
virtual destructor
EvaluatorBase< Evaluator, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base-class typedef
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
TrafoType::template Evaluator< Shape::Hypercube< 2 >, DataType >::Type FacetTrafoEvaluator
trafo evaluator for facets
TrafoEvaluator_ TrafoEvaluator
trafo evaluator type
MeshType::template IndexSet< 3, 2 >::Type FacetIndexSetType
facet-index-set type
EvalPolicy::JacobianMatrixType JacobianMatrixType
jacobian matrix type
Evaluator(const SpaceType &space)
Constructor.
TrafoEvaluator::TrafoType TrafoType
trafo type
MeshType::template IndexSet< 2, 1 >::Type FacetIndexSetType
facet-index-set type
TrafoEvaluator_ TrafoEvaluator
trafo evaluator type
EvalPolicy::ImagePointType ImagePointType
image point type
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
SpaceEvalTraits_ SpaceEvalTraits
space evaluation traits
JacobianInverseType _inv_lin_mat
inverse linearized trafo matrix
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
EvalPolicy::JacobianMatrixType JacobianMatrixType
jacobian matrix type
Evaluator(const SpaceType &space)
Constructor.
void _build_coeff_matrix(const TrafoEvaluator &trafo_eval)
computes the basis function coefficient matrix for the current cell
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
TrafoType::template Evaluator< Shape::Hypercube< 1 >, DataType >::Type FacetTrafoEvaluator
trafo evaluator for facets (=edges)
EvaluatorBase< Evaluator, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base-class typedef
TrafoEvaluator::EvalTraits TrafoEvalTraits
trafo evaluator traits
Tiny::Matrix< DataType, 5, 5 > CoeffMatrixType
basis function coefficient matrix
CoeffMatrixType _coeff_mat
basis function coefficient matrix
SpaceEvalTraits::DataType DataType
data type
EvalPolicy::JacobianInverseType JacobianInverseType
jacobian inverse matrix type
virtual ~Evaluator()
virtual destructor
Space_ SpaceType
space type
TrafoType::MeshType MeshType
mesh type
SpaceEvalTraits::EvalPolicy EvalPolicy
evaluation policy
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.
FacetTrafoEvaluator::template ConfigTraits< facet_trafo_config >::EvalDataType FacetTrafoData
facet trafo data
FacetTrafoEvaluator::EvalTraits FacetEvalTraits
facet evaluation traits
int get_num_local_dofs() const
Returns the number of local DOFs.
EvalPolicy::DomainPointType DomainPointType
domain point type
Q1TBNP Element Evaluator class template declaration.
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.
EvalTraits::ImagePointType img_point
image point
T_ sqrt(T_ x)
Returns the square-root of a value.
static constexpr SpaceTags ref_caps
Q1TBNP Evaluator reference capabilities.
SpaceTags
Space configuration tags enum.
@ 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.
@ 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
Space::EvalData< SpaceEvalTraits, config > EvalDataType
evaluation data typedef
Space::EvalData< SpaceEvalTraits, config > EvalDataType
evaluation data typedef