9#include <kernel/space/node_functional_base.hpp>
40 static constexpr int max_assigned_dofs = 3;
42 template<
typename Function_>
49 typedef typename Space_::TrafoType TrafoType;
50 typedef typename Space_::ShapeType ShapeType;
52 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
53 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
56 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
58 TrafoEvalType _trafo_eval;
63 _trafo_eval(space.get_trafo())
70 _trafo_eval.prepare(cell_index);
81 return max_assigned_dofs;
84 template<
typename NodeData_,
typename Function_>
85 void operator()(NodeData_& node_data,
const Function_& function)
const
87 static_assert(std::is_base_of<Analytic::Function, Function_>::value,
"invalid function object");
88 static_assert(Function_::can_value,
"function cannot compute values");
89 static_assert(Function_::can_grad,
"function cannot compute gradients");
92 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
95 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
99 TrafoEvalData trafo_data;
103 const auto func_value = func_eval.value(trafo_data.img_point);
104 const auto func_grad = func_eval.gradient(trafo_data.img_point);
107 node_data[0] = func_value;
108 node_data[1] = func_grad[0];
109 node_data[2] = func_grad[1];
121 static constexpr int max_assigned_dofs = 1;
123 template<
typename Function_>
130 typedef typename Space_::TrafoType TrafoType;
131 typedef typename Space_::ShapeType ShapeType;
133 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
134 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
137 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
139 TrafoEvalType _trafo_eval;
144 _trafo_eval(space.get_trafo())
151 _trafo_eval.prepare(cell_index);
156 _trafo_eval.finish();
162 return max_assigned_dofs;
165 template<
typename NodeData_,
typename Function_>
166 void operator()(NodeData_& node_data,
const Function_& function)
const
168 static_assert(std::is_base_of<Analytic::Function, Function_>::value,
"invalid function object");
169 static_assert(Function_::can_value,
"function cannot compute values");
172 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
175 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
178 DomainPointType
dom_point(DataType_(1) / DataType_(3));
179 TrafoEvalData trafo_data;
183 node_data[0] = func_eval.value(trafo_data.img_point);
195 static constexpr int max_assigned_dofs = 2;
197 template<
typename Function_>
204 typedef typename Space_::TrafoType TrafoType;
205 typedef typename Space_::ShapeType ShapeType;
207 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
208 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
211 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
213 TrafoEvalType _trafo_eval;
218 _trafo_eval(space.get_trafo())
225 _trafo_eval.prepare(cell_index);
230 _trafo_eval.finish();
236 return max_assigned_dofs;
239 template<
typename NodeData_,
typename Function_>
240 void operator()(NodeData_& node_data,
const Function_& function)
const
242 static_assert(std::is_base_of<Analytic::Function, Function_>::value,
"invalid function object");
243 static_assert(Function_::can_value,
"function cannot compute values");
244 static_assert(Function_::can_grad,
"function cannot compute gradients");
247 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
250 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
254 TrafoEvalData trafo_data;
258 const auto func_value = func_eval.value(trafo_data.img_point);
259 const auto func_grad = func_eval.gradient(trafo_data.img_point);
262 node_data[0] = func_value;
263 node_data[1] = func_grad[0];
275 static constexpr int max_assigned_dofs = 4;
277 template<
typename Function_>
284 typedef typename Space_::TrafoType TrafoType;
285 typedef typename Space_::ShapeType ShapeType;
287 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
288 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
291 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
293 TrafoEvalType _trafo_eval;
298 _trafo_eval(space.get_trafo())
305 _trafo_eval.prepare(cell_index);
310 _trafo_eval.finish();
317 return max_assigned_dofs;
320 template<
typename NodeData_,
typename Function_>
321 void operator()(NodeData_& node_data,
const Function_& function)
const
323 static_assert(std::is_base_of<Analytic::Function, Function_>::value,
"invalid function object");
324 static_assert(Function_::can_value,
"function cannot compute values");
325 static_assert(Function_::can_grad,
"function cannot compute gradients");
326 static_assert(Function_::can_hess,
"function cannot compute hessians");
329 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
332 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
336 TrafoEvalData trafo_data;
340 const auto func_value = func_eval.value(trafo_data.img_point);
341 const auto func_grad = func_eval.gradient(trafo_data.img_point);
342 const auto func_hess = func_eval.hessian(trafo_data.img_point);
345 node_data[0] = func_value;
346 node_data[1] = func_grad[0];
347 node_data[2] = func_grad[1];
348 node_data[3] = func_hess[0][1];
Hermite-3 Element Evaluator class template declaration.
Node-functional base class template.
void finish()
Releases the node-functional from the current cell.
void prepare(Index cell_index)
Prepares the node-functional for a given cell.
Null-Node-Functional class template.
int get_num_assigned_dofs() const
Returns the number of assigned dofs on the current cell.
NodeFunctionalBase< Space_, DataType_ > BaseClass
base-class typedef
void operator()(NodeData_ &node_data, const Function_ &function) const
Evaluation operator.
std::uint64_t Index
Index data type.
@ dom_point
specifies whether the trafo should supply domain point coordinates