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