9#include <kernel/space/eval_data.hpp>
10#include <kernel/trafo/eval_data.hpp>
19 template<
bool _enable>
20 struct BasisEvalHelper;
42 typename SpaceEvaluator_,
43 typename TrafoEvaluator_,
44 typename SpaceEvalTraits_>
61 static constexpr int domain_dim = SpaceEvalTraits::domain_dim;
63 static constexpr int image_dim = SpaceEvalTraits::image_dim;
67 template<SpaceTags cfg_>
81 static constexpr SpaceTags eval_caps = ...;
128 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
140#if defined(FEAT_COMPILER_GNU) && (FEAT_COMPILER_GNU < 70000)
142 static constexpr bool want_value = *(EvalDataType::config &
SpaceTags::value);
143 Intern::BasisEvalHelper<want_value>::eval_values(space_data, cast(), trafo_data);
145 static constexpr bool want_grad = *(EvalDataType::config &
SpaceTags::grad);
146 Intern::BasisEvalHelper<want_grad>::eval_gradients(space_data, cast(), trafo_data);
148 static constexpr bool want_hess = *(EvalDataType::config &
SpaceTags::hess);
149 Intern::BasisEvalHelper<want_hess>::eval_hessians(space_data, cast(), trafo_data);
172 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
177 XABORTM(
"space evaluator does not support basis function values");
192 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
197 XABORTM(
"space evaluator does not support basis function gradients");
212 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
217 XABORTM(
"space evaluator does not support basis function hessians");
224 template<
bool _enable>
225 struct BasisEvalHelper
227 template<
typename SpaceData_,
typename Evaluator_,
typename TrafoData_>
228 static void eval_values(SpaceData_&,
const Evaluator_&,
const TrafoData_&) {}
230 template<
typename SpaceData_,
typename Evaluator_,
typename TrafoData_>
231 static void eval_gradients(SpaceData_&,
const Evaluator_&,
const TrafoData_&) {}
233 template<
typename SpaceData_,
typename Evaluator_,
typename TrafoData_>
234 static void eval_hessians(SpaceData_&,
const Evaluator_&,
const TrafoData_&) {}
238 struct BasisEvalHelper<true>
240 template<
typename SpaceData_,
typename Evaluator_,
typename TrafoData_>
241 static void eval_values(SpaceData_& space_data,
const Evaluator_& evaluator,
const TrafoData_& trafo_data)
243 if(!*(Evaluator_::eval_caps & SpaceTags::value))
244 XABORTM(
"space evaluator does not support basis function values");
245 evaluator.eval_values(space_data, trafo_data);
248 template<
typename SpaceData_,
typename Evaluator_,
typename TrafoData_>
249 static void eval_gradients(SpaceData_& space_data,
const Evaluator_& evaluator,
const TrafoData_& trafo_data)
251 if(!*(Evaluator_::eval_caps & SpaceTags::grad))
252 XABORTM(
"space evaluator does not support basis function gradients");
253 evaluator.eval_gradients(space_data, trafo_data);
256 template<
typename SpaceData_,
typename Evaluator_,
typename TrafoData_>
257 static void eval_hessians(SpaceData_& space_data,
const Evaluator_& evaluator,
const TrafoData_& trafo_data)
259 if(!*(Evaluator_::eval_caps & SpaceTags::hess))
260 XABORTM(
"space evaluator does not support basis function hessians");
261 evaluator.eval_hessians(space_data, trafo_data);
#define XABORTM(msg)
Abortion macro definition with custom message.
Space evaluation data structure.
Basic Space Evaluator CRTP base-class template.
static constexpr int domain_dim
trafo domain dimension
void eval_values(EvalData< SpaceEvalTraits, space_cfg_ > &space_data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Evaluates the basis function values on the real cell.
SpaceEvaluator_ SpaceEvaluator
space evaluator type
void finish()
Releases the evaluator from the current cell.
SpaceEvalTraits_ SpaceEvalTraits
space evaluator traits
TrafoEvaluator::EvalTraits TrafoEvalTraits
trafo evaluator traits
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &space_data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Evaluates the basis function gradients on the real cell.
TrafoEvaluator_ TrafoEvaluator
trafo evaluator type
void prepare(const TrafoEvaluator &trafo_eval)
Prepares the evaluator for a given cell.
void eval_hessians(EvalData< SpaceEvalTraits, space_cfg_ > &space_data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Evaluates the basis function hessians on the real cell.
static constexpr int max_local_dofs
maximum number of local DOFs
void operator()(EvalData< SpaceEvalTraits, space_cfg_ > &space_data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Space evaluation operator.
static constexpr int image_dim
trafo image dimension
Trafo evaluation data structure.
SpaceTags
Space configuration tags enum.
@ value
specifies whether the space should supply basis function values
@ hess
specifies whether the space should supply basis function hessians
@ grad
specifies whether the space should supply basis function gradients
TrafoTags
Trafo configuration tags enum.
Space::EvalData< SpaceEvalTraits, config > EvalDataType
evaluation data typedef
static constexpr TrafoTags trafo_config
trafo configuration
static constexpr SpaceTags config
evaluation data configuration