FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
parametric_evaluator.hpp
1// FEAT3: Finite Element Analysis Toolbox, Version 3
2// Copyright (C) 2010 by Stefan Turek & the FEAT group
3// FEAT3 is released under the GNU General Public License version 3,
4// see the file 'copyright.txt' in the top level directory for details.
5
6#pragma once
7
8// includes, FEAT
9#include <kernel/space/evaluator_base.hpp>
10#include <kernel/space/details.hpp>
11
12namespace FEAT
13{
14 namespace Space
15 {
17 namespace Intern
18 {
19 template<bool _enable>
20 struct ParamBasisEvalHelper;
21 } // namespace Intern
23
43 template<
44 typename SpaceEvaluator_,
45 typename TrafoEvaluator_,
46 typename SpaceEvalTraits_,
47 SpaceTags ref_caps_>
49 public EvaluatorBase<SpaceEvaluator_, TrafoEvaluator_, SpaceEvalTraits_>
50 {
51 public:
54
56 typedef SpaceEvaluator_ SpaceEvaluator;
57
59 typedef TrafoEvaluator_ TrafoEvaluator;
60
62 typedef SpaceEvalTraits_ SpaceEvalTraits;
63
65 typedef typename TrafoEvaluator::EvalTraits TrafoEvalTraits;
66
68 static constexpr TrafoTags trafo_caps = TrafoEvaluator::eval_caps;
69
71 static constexpr SpaceTags eval_caps =
72 // reference values, gradients and hessians are supplied by our derived CRTP class
73 // (if available), so we mask that out from the reference capabilities
75 // we supply values if the derived class supplies reference values and the
76 // trafo supplies domain point coordinates:
77 ((*(ref_caps_ & SpaceTags::ref_value) && *(trafo_caps & TrafoTags::dom_point)) ?
78 SpaceTags::value : SpaceTags::none) |
79 // we supply gradients if the derived class supplies reference gradients and
80 // the trafo supplies domain point coordinates and jacobian inverse matrices
81 // (which we require for the first-order chain rule)
83 SpaceTags::grad : SpaceTags::none) |
84 // we supply hessians if the derived class supplies reference hessians and
85 // the trafo supplies domain point coordinates, jacobian inverse matrices and
86 // hessian inverse tensors (which we require for the second-order chain rule)
88 SpaceTags::hess : SpaceTags::none);
89
91 static constexpr int domain_dim = SpaceEvalTraits::domain_dim;
93 static constexpr int image_dim = SpaceEvalTraits::image_dim;
95 static constexpr int max_local_dofs = SpaceEvalTraits::max_local_dofs;
96
100 template<SpaceTags cfg_>
102 {
104 static constexpr SpaceTags config =
106 // we need reference hessians if hessians are required
107 (*(cfg_ & (SpaceTags::ref_hess | SpaceTags::hess)) ? SpaceTags::ref_hess : SpaceTags::none) |
108 // we need reference gradients if gradients or hessians are required
109 (*(cfg_ & (SpaceTags::ref_grad | SpaceTags::grad | SpaceTags::hess)) ? SpaceTags::ref_grad : SpaceTags::none) |
110 // we need reference values if values are required
111 (*(cfg_ & (SpaceTags::ref_value | SpaceTags::value)) ? SpaceTags::ref_value : SpaceTags::none);
112
115 // we need jacobian inverse matrices for gradient or hessian computation by the chain rule
116 (*(config & (SpaceTags::grad | SpaceTags::hess)) ? TrafoTags::jac_inv : TrafoTags::none) |
117 // we need hessan inverse tensors for hessian computation by the chain rule
118 (*(config & SpaceTags::hess) ? TrafoTags::hess_inv : TrafoTags::none);
119
122 };
123
124 protected:
127 SpaceEvaluator& cast()
128 {
129 return static_cast<SpaceEvaluator&>(*this);
130 }
131
133 const SpaceEvaluator& cast() const
134 {
135 return static_cast<const SpaceEvaluator&>(*this);
136 }
138
139 public:
151 template<SpaceTags space_cfg_>
154 const typename SpaceEvalTraits::DomainPointType& dom_point) const
155 {
156 // compute reference basis values
157 Intern::ParamBasisEvalHelper<*(space_cfg_ & SpaceTags::ref_value)>::eval_ref_values(space_ref_data, cast(), dom_point);
158 // compute reference basis values
159 Intern::ParamBasisEvalHelper<*(space_cfg_ & SpaceTags::ref_grad)>::eval_ref_gradients(space_ref_data, cast(), dom_point);
160 // compute reference basis values
161 Intern::ParamBasisEvalHelper<*(space_cfg_ & SpaceTags::ref_hess)>::eval_ref_hessians(space_ref_data, cast(), dom_point);
162 }
163
165 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
168 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
169 {
170 // evaluate reference data
171 cast().reference_eval(space_data, trafo_data.dom_point);
172
173 // transform basis values
174 Intern::ParamBasisEvalHelper<*(space_cfg_ & SpaceTags::value)>::trans_values(space_data, trafo_data);
175 // transform basis gradients
176 Intern::ParamBasisEvalHelper<*(space_cfg_ & SpaceTags::grad)>::trans_gradients(space_data, trafo_data);
177 // transform basis hessians
178 Intern::ParamBasisEvalHelper<*(space_cfg_ & SpaceTags::hess)>::trans_hessians(space_data, trafo_data);
179 }
180 }; // class EvaluatorParametric<...>
181
183 namespace Intern
184 {
185 template<bool _enable>
186 struct ParamBasisEvalHelper
187 {
188 template<typename SpaceData_, typename Evaluator_, typename DomPoint_>
189 static void eval_ref_values(SpaceData_&, const Evaluator_&, const DomPoint_&) {}
190
191 template<typename SpaceData_, typename Evaluator_, typename DomPoint_>
192 static void eval_ref_gradients(SpaceData_&, const Evaluator_&, const DomPoint_&) {}
193
194 template<typename SpaceData_, typename Evaluator_, typename DomPoint_>
195 static void eval_ref_hessians(SpaceData_&, const Evaluator_&, const DomPoint_&) {}
196
197 template<typename SpaceData_, typename TrafoData_>
198 static void trans_values(SpaceData_&, const TrafoData_&) {}
199
200 template<typename SpaceData_, typename TrafoData_>
201 static void trans_gradients(SpaceData_&, const TrafoData_&) {}
202
203 template<typename SpaceData_, typename TrafoData_>
204 static void trans_hessians(SpaceData_&, const TrafoData_&) {}
205 };
206
207 template<>
208 struct ParamBasisEvalHelper<true>
209 {
210 template<typename SpaceData_, typename Evaluator_, typename DomPoint_>
211 static void eval_ref_values(SpaceData_& space_data, const Evaluator_& evaluator, const DomPoint_& dom_point)
212 {
213 evaluator.eval_ref_values(space_data, dom_point);
214 }
215
216 template<typename SpaceData_, typename Evaluator_, typename DomPoint_>
217 static void eval_ref_gradients(SpaceData_& space_data, const Evaluator_& evaluator, const DomPoint_& dom_point)
218 {
219 evaluator.eval_ref_gradients(space_data, dom_point);
220 }
221
222 template<typename SpaceData_, typename Evaluator_, typename DomPoint_>
223 static void eval_ref_hessians(SpaceData_& space_data, const Evaluator_& evaluator, const DomPoint_& dom_point)
224 {
225 evaluator.eval_ref_hessians(space_data, dom_point);
226 }
227
228 template<typename SpaceData_, typename TrafoData_>
229 static void trans_values(SpaceData_& space_data, const TrafoData_&)
230 {
231 ParametricEvalHelper::trans_values(space_data);
232 }
233
234 template<typename SpaceData_, typename TrafoData_>
235 static void trans_gradients(SpaceData_& space_data, const TrafoData_& trafo_data)
236 {
237 ParametricEvalHelper::trans_gradients(space_data, trafo_data.jac_inv);
238 }
239
240 template<typename SpaceData_, typename TrafoData_>
241 static void trans_hessians(SpaceData_& space_data, const TrafoData_& trafo_data)
242 {
243 ParametricEvalHelper::trans_hessians(space_data, trafo_data.jac_inv, trafo_data.hess_inv);
244 }
245 };
246 } // namespace Intern
248 } // namespace Space
249} // namespace FEAT
Space evaluation data structure.
Definition: eval_data.hpp:141
Basic Space Evaluator CRTP base-class template.
Finite-Element Parametric Evaluator CRTP base-class template.
TrafoEvaluator_ TrafoEvaluator
trafo evaluator type
static constexpr int image_dim
image dimension
SpaceEvaluator_ SpaceEvaluator
space evaluator type
SpaceEvalTraits_ SpaceEvalTraits
space evaluator traits
static constexpr SpaceTags eval_caps
our evaluation capabilities
static constexpr int domain_dim
domain dimension
TrafoEvaluator::EvalTraits TrafoEvalTraits
trafo evaluator traits
static constexpr int max_local_dofs
maximum number of local dofs
EvaluatorBase< SpaceEvaluator_, TrafoEvaluator_, SpaceEvalTraits_ > BaseClass
base class typedef
static constexpr TrafoTags trafo_caps
the capabilities of the trafo evaluator
void operator()(EvalData< SpaceEvalTraits, space_cfg_ > &space_data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Space evaluation operator.
void reference_eval(EvalData< SpaceEvalTraits, space_cfg_ > &space_ref_data, const typename SpaceEvalTraits::DomainPointType &dom_point) const
Space reference evaluation function.
Trafo evaluation data structure.
Definition: eval_data.hpp:33
EvalTraits::DomainPointType dom_point
domain point
Definition: eval_data.hpp:55
FEAT namespace.
Definition: adjactor.hpp:12
SpaceTags
Space configuration tags enum.
Definition: eval_tags.hpp:97
@ value
specifies whether the space should supply basis function values
@ hess
specifies whether the space should supply basis function hessians
@ ref_value
specifies whether the space should supply reference basis function values
@ ref_hess
specifies whether the space should supply reference basis function hessians
@ ref_grad
specifies whether the space should supply reference basis function gradients
@ grad
specifies whether the space should supply basis function gradients
TrafoTags
Trafo configuration tags enum.
Definition: eval_tags.hpp:22
@ hess_inv
specifies whether the trafo should supply inverse hessian tensors
@ dom_point
specifies whether the trafo should supply domain point coordinates
@ jac_inv
specifies whether the trafo should supply inverse jacobian matrices
Space configuration traits class template.
static constexpr TrafoTags trafo_config
trafo evaluation configuration
Space::EvalData< SpaceEvalTraits, config > EvalDataType
evaluation data typedef
static constexpr SpaceTags config
space evaluation config