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