9#include <kernel/space/parametric_evaluator.hpp>
15 namespace CroRavRanTur
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::Simplex<2> > :
73 typedef typename SpaceEvalTraits::DataType
DataType;
106 template<
typename EvalData_>
125 template<
typename EvalData_>
130 data.phi[0].ref_grad[0] =
DataType(2);
131 data.phi[0].ref_grad[1] =
DataType(2);
132 data.phi[1].ref_grad[0] = -
DataType(2);
133 data.phi[1].ref_grad[1] =
DataType(0);
134 data.phi[2].ref_grad[0] =
DataType(0);
135 data.phi[2].ref_grad[1] = -
DataType(2);
146 typename TrafoEvaluator_,
147 typename SpaceEvalTraits_>
148 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Simplex<3> > :
176 typedef typename SpaceEvalTraits::DataType
DataType;
209 template<
typename EvalData_>
214 data.phi[0].ref_value =
DataType(3) * (point[0] + point[1] + point[2]) -
DataType(2);
229 template<
typename EvalData_>
234 data.phi[0].ref_grad[0] =
DataType(3);
235 data.phi[0].ref_grad[1] =
DataType(3);
236 data.phi[0].ref_grad[2] =
DataType(3);
237 data.phi[1].ref_grad[0] = -
DataType(3);
238 data.phi[1].ref_grad[1] =
DataType(0);
239 data.phi[1].ref_grad[2] =
DataType(0);
240 data.phi[2].ref_grad[0] =
DataType(0);
241 data.phi[2].ref_grad[1] = -
DataType(3);
242 data.phi[2].ref_grad[2] =
DataType(0);
243 data.phi[3].ref_grad[0] =
DataType(0);
244 data.phi[3].ref_grad[1] =
DataType(0);
245 data.phi[3].ref_grad[2] = -
DataType(3);
256 typename TrafoEvaluator_,
257 typename SpaceEvalTraits_>
258 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Quadrilateral> :
260 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Quadrilateral>,
290 typedef typename SpaceEvalTraits::DataType
DataType;
307 template<SpaceTags cfg_>
314 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
360 _inv_lin_mat = trafo_data.jac_inv;
361 _inv_lin_vec = trafo_data.img_point;
368 const TrafoType& trafo = trafo_eval.get_trafo();
371 const MeshType& mesh = trafo.get_mesh();
377 const Index cell = trafo_eval.get_cell_index();
390 const typename FacetEvalTraits::DomainPointType g1(-g), g2(+g);
394 for(
int i(0); i < 4; ++i)
397 facet_eval.prepare(
Index(facet_index_set(cell, i)));
400 facet_eval(facet_data, g1);
402 q1.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
405 facet_eval(facet_data, g2);
407 q2.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
417 _nodal_mat(1,i) = v*(w1*q1[0] + w2*q2[0]);
418 _nodal_mat(2,i) = v*(w1*q1[1] + w2*q2[1]);
419 _nodal_mat(3,i) = v*(w1*((q1[0]+q1[1])*(q1[0]-q1[1])) + w2*((q2[0]+q2[1])*(q2[0]-q2[1])));
462 _build_inv_lin_trafo(trafo_eval);
465 _build_coeff_matrix(trafo_eval);
469 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
476 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
484 for(
int i(0); i < 4; ++i)
486 data.
phi[i].
value = _coeff_mat(i,0) + _coeff_mat(i,1)*x + _coeff_mat(i,2)*y + _coeff_mat(i,3)*r;
491 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
498 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
501 for(
int i(0); i < 4; ++i)
504 loc_grad(0) = _coeff_mat(i,1) +
DataType(2) * _coeff_mat(i,3) * pt[0];
505 loc_grad(1) = _coeff_mat(i,2) -
DataType(2) * _coeff_mat(i,3) * pt[1];
508 data.
phi[i].
grad.set_vec_mat_mult(loc_grad, _inv_lin_mat);
521 typename TrafoEvaluator_,
522 typename SpaceEvalTraits_>
523 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hexahedron> :
525 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Shape::Hexahedron>,
555 typedef typename SpaceEvalTraits::DataType
DataType;
572 template<SpaceTags cfg_>
579 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
625 _inv_lin_mat = trafo_data.jac_inv;
626 _inv_lin_vec = trafo_data.img_point;
633 const TrafoType& trafo = trafo_eval.get_trafo();
636 const MeshType& mesh = trafo.get_mesh();
642 const Index cell = trafo_eval.get_cell_index();
655 typename FacetEvalTraits::DomainPointType g1, g2, g3, g4;
665 for(
int i(0); i < 6; ++i)
668 facet_eval.prepare(
Index(facet_index_set(cell, i)));
671 facet_eval(facet_data, g1);
673 q1.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
676 facet_eval(facet_data, g2);
678 q2.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
681 facet_eval(facet_data, g3);
683 q3.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
686 facet_eval(facet_data, g4);
688 q4.set_mat_vec_mult(_inv_lin_mat, facet_data.img_point - _inv_lin_vec);
698 _nodal_mat(1,i) = v*(w1*q1[0] + w2*q2[0] + w3*q3[0] + w4*q4[0]);
699 _nodal_mat(2,i) = v*(w1*q1[1] + w2*q2[1] + w3*q3[1] + w4*q4[1]);
700 _nodal_mat(3,i) = v*(w1*q1[2] + w2*q2[2] + w3*q3[2] + w4*q4[2]);
701 _nodal_mat(4,i) = v*(
702 w1*(q1[0] + q1[1])*(q1[0] - q1[1]) + w2*(q2[0] + q2[1])*(q2[0] - q2[1]) +
703 w3*(q3[0] + q3[1])*(q3[0] - q3[1]) + w4*(q4[0] + q4[1])*(q4[0] - q4[1]));
704 _nodal_mat(5,i) = v*(
705 w1*(q1[1] + q1[2])*(q1[1] - q1[2]) + w2*(q2[1] + q2[2])*(q2[1] - q2[2]) +
706 w3*(q3[1] + q3[2])*(q3[1] - q3[2]) + w4*(q4[1] + q4[2])*(q4[1] - q4[2]));
749 _build_inv_lin_trafo(trafo_eval);
752 _build_coeff_matrix(trafo_eval);
756 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
763 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
773 for(
int i(0); i < 6; ++i)
775 data.
phi[i].
value = _coeff_mat(i,0) + _coeff_mat(i,1)*x + _coeff_mat(i,2)*y + _coeff_mat(i,3)*z
776 + _coeff_mat(i,4)*rxy + _coeff_mat(i,5)*ryz;
781 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
788 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.
img_point - _inv_lin_vec);
791 for(
int i(0); i < 6; ++i)
794 loc_grad[0] = _coeff_mat(i,1) +
DataType(2) * pt[0] * _coeff_mat(i,4);
795 loc_grad[1] = _coeff_mat(i,2) +
DataType(2) * pt[1] * (_coeff_mat(i,5) - _coeff_mat(i,4));
796 loc_grad[2] = _coeff_mat(i,3) -
DataType(2) * pt[2] * _coeff_mat(i,5);
799 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
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
SpaceEvalTraits::EvalPolicy EvalPolicy
evaluation policy
SpaceEvalTraits::DataType DataType
data type
TrafoEvaluator::TrafoType TrafoType
trafo type
EvalPolicy::DomainPointType DomainPointType
domain point type
int get_num_local_dofs() const
Returns the number of local DOFs.
TrafoEvaluator_ TrafoEvaluator
trafo evaluator type
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
void _build_coeff_matrix(const TrafoEvaluator &trafo_eval)
computes the basis function coefficient matrix for the current cell
CoeffMatrixType _coeff_mat
basis function coefficient matrix
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
TrafoType::MeshType MeshType
mesh type
Space_ SpaceType
space type
Tiny::Matrix< DataType, 4, 4 > CoeffMatrixType
basis function coefficient matrix
Evaluator(const SpaceType &space)
Constructor.
EvalPolicy::ImagePointType ImagePointType
image point type
EvalPolicy::JacobianMatrixType JacobianMatrixType
jacobian matrix type
FacetTrafoEvaluator::template ConfigTraits< facet_trafo_config >::EvalDataType FacetTrafoData
facet trafo data
TrafoType::template Evaluator< Shape::Hypercube< 1 >, DataType >::Type FacetTrafoEvaluator
trafo evaluator for facets (=edges)
JacobianInverseType _inv_lin_mat
inverse linearized trafo matrix
MeshType::template IndexSet< 2, 1 >::Type FacetIndexSetType
facet-index-set type
TrafoEvaluator::EvalTraits TrafoEvalTraits
trafo evaluator traits
SpaceEvalTraits_ SpaceEvalTraits
space evaluation traits
virtual ~Evaluator()
virtual destructor
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::EvalTraits FacetEvalTraits
facet evaluation traits
EvalPolicy::JacobianInverseType JacobianInverseType
jacobian inverse matrix type
EvaluatorBase< Evaluator, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base-class typedef
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Space_ SpaceType
space type
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
SpaceEvalTraits::EvalPolicy EvalPolicy
evaluation policy
EvalPolicy::DomainPointType DomainPointType
domain point type
Evaluator(const SpaceType &space)
Constructor.
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
int get_num_local_dofs() const
Returns the number of local DOFs.
SpaceEvalTraits_ SpaceEvalTraits
space evaluation traits
SpaceEvalTraits::DataType DataType
data type
virtual ~Evaluator()
virtual destructor
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
Evaluator(const SpaceType &space)
Constructor.
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
TrafoEvaluator::TrafoType TrafoType
trafo type
TrafoType::MeshType MeshType
mesh type
FacetTrafoEvaluator::template ConfigTraits< facet_trafo_config >::EvalDataType FacetTrafoData
facet trafo data
EvaluatorBase< Evaluator, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base-class typedef
EvalPolicy::ImagePointType ImagePointType
image point type
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.
SpaceEvalTraits::DataType DataType
data type
CoeffMatrixType _coeff_mat
basis function coefficient matrix
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
SpaceEvalTraits::EvalPolicy EvalPolicy
evaluation policy
FacetTrafoEvaluator::EvalTraits FacetEvalTraits
facet evaluation traits
EvalPolicy::JacobianMatrixType JacobianMatrixType
jacobian matrix type
void _build_coeff_matrix(const TrafoEvaluator &trafo_eval)
computes the basis function coefficient matrix for the current cell
TrafoEvaluator::EvalTraits TrafoEvalTraits
trafo evaluator traits
Space_ SpaceType
space type
EvalPolicy::DomainPointType DomainPointType
domain point type
TrafoEvaluator_ TrafoEvaluator
trafo evaluator type
TrafoType::template Evaluator< Shape::Hypercube< 2 >, DataType >::Type FacetTrafoEvaluator
trafo evaluator for facets
JacobianInverseType _inv_lin_mat
inverse linearized trafo matrix
int get_num_local_dofs() const
Returns the number of local DOFs.
Tiny::Matrix< DataType, 6, 6 > CoeffMatrixType
basis function coefficient matrix
SpaceEvalTraits_ SpaceEvalTraits
space evaluation traits
EvalPolicy::JacobianInverseType JacobianInverseType
jacobian inverse matrix type
MeshType::template IndexSet< 3, 2 >::Type FacetIndexSetType
facet-index-set type
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Space_ SpaceType
space type
Evaluator(const SpaceType &space)
Constructor.
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps > BaseClass
base-class typedef
SpaceEvalTraits::EvalPolicy EvalPolicy
evaluation policy
SpaceEvalTraits::DataType DataType
data type
int get_num_local_dofs() const
Returns the number of local DOFs.
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
EvalPolicy::DomainPointType DomainPointType
domain point type
SpaceEvalTraits_ SpaceEvalTraits
space evaluation traits
Crouzeix-Raviart / Rannacher-Turek Element Evaluator class template declaration.
Space evaluation data structure.
BasisDataType phi[max_local_dofs]
the basis function data vector
Basic Space Evaluator CRTP base-class template.
Finite-Element Parametric Evaluator CRTP base-class template.
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
Crouzeix-Raviart Element 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