FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
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/parametric_evaluator.hpp>
10#include <kernel/space/discontinuous/variant.hpp>
11
12namespace FEAT
13{
14 namespace Space
15 {
16 namespace Discontinuous
17 {
18 template<
19 typename Space_,
20 typename TrafoEvaluator_,
21 typename SpaceEvalTraits_,
22 typename VariantTag_,
23 typename Shape_ = typename Space_::ShapeType>
24 class Evaluator DOXY({});
25
26 template<
27 typename Space_,
28 typename TrafoEvaluator_,
29 typename SpaceEvalTraits_,
30 typename Shape_>
31 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Variant::StdPolyP<0>, Shape_> :
32 public EvaluatorBase<
33 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Variant::StdPolyP<0>, Shape_>,
34 TrafoEvaluator_,
35 SpaceEvalTraits_>
36 {
37 public:
39 typedef SpaceEvalTraits_ SpaceEvalTraits;
40
42 typedef typename TrafoEvaluator_::EvalTraits TrafoEvalTraits;
43
45 typedef typename SpaceEvalTraits::DataType DataType;
46
48 static constexpr SpaceTags eval_caps = SpaceTags::value;
49
50 public:
57 explicit Evaluator(const Space_& DOXY(space))
58 {
59 }
60
62 virtual ~Evaluator()
63 {
64 }
65
73 {
74 return Index(1);
75 }
76
78 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
81 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& DOXY(trafo_data)) const
82 {
83 data.phi[0].value = DataType(1);
84 }
85 };
86
87 static constexpr SpaceTags ref_caps_p1 = SpaceTags::value | SpaceTags::grad;
88
89 template<
90 typename Space_,
91 typename TrafoEvaluator_,
92 typename SpaceEvalTraits_,
93 int shape_dim_>
94 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Variant::StdPolyP<1>, Shape::Simplex<shape_dim_> > :
96 Evaluator<
97 Space_,
98 TrafoEvaluator_,
99 SpaceEvalTraits_,
100 Variant::StdPolyP<1>,
101 Shape::Simplex<shape_dim_> >,
102 TrafoEvaluator_,
103 SpaceEvalTraits_,
104 ref_caps_p1>
105 {
106 public:
109
111 typedef Space_ SpaceType;
112
114 typedef SpaceEvalTraits_ SpaceEvalTraits;
115
117 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
118
120 typedef typename EvalPolicy::DomainPointType DomainPointType;
121
123 typedef typename SpaceEvalTraits::DataType DataType;
124
125 public:
132 explicit Evaluator(const SpaceType& DOXY(space))
133 {
134 }
135
143 {
144 return (shape_dim_ + 1);
145 }
146
156 template<typename EvalData_>
158 EvalData_& data,
159 const DomainPointType& point) const
160 {
161 data.phi[0].ref_value = DataType(1);
162 for(int i(0); i < shape_dim_; ++i)
163 data.phi[0].ref_value -= (data.phi[i+1].ref_value = point[i]);
164 }
165
175 template<typename EvalData_>
177 EvalData_& data,
178 const DomainPointType& DOXY(point)) const
179 {
180 for(int i(0); i < shape_dim_; ++i)
181 {
182 data.phi[0].ref_grad[i] = -DataType(1);
183 for(int j(0); j < shape_dim_; ++j)
184 data.phi[i+1].ref_grad[j] = DataType(i == j ? 1 : 0);
185 }
186 }
187 }; // class Evaluator<...,Simplex<.>>
188
189 template<
190 typename Space_,
191 typename TrafoEvaluator_,
192 typename SpaceEvalTraits_,
193 int shape_dim_>
194 class Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Variant::StdPolyP<1>, Shape::Hypercube<shape_dim_>> :
195 public EvaluatorBase<
196 Evaluator<Space_, TrafoEvaluator_, SpaceEvalTraits_, Variant::StdPolyP<1>, Shape::Hypercube<shape_dim_>>,
197 TrafoEvaluator_,
198 SpaceEvalTraits_>
199 {
200 public:
203
205 typedef Space_ SpaceType;
206
208 typedef SpaceEvalTraits_ SpaceEvalTraits;
209
211 typedef TrafoEvaluator_ TrafoEvaluator;
212
214 typedef typename TrafoEvaluator::EvalTraits TrafoEvalTraits;
215
217 typedef typename TrafoEvaluator::TrafoType TrafoType;
218
220 typedef typename TrafoType::MeshType MeshType;
221
223 typedef typename SpaceEvalTraits::DataType DataType;
224
226 typedef typename SpaceEvalTraits::EvalPolicy EvalPolicy;
227
229 typedef typename EvalPolicy::DomainPointType DomainPointType;
231 typedef typename EvalPolicy::ImagePointType ImagePointType;
232
234 typedef typename EvalPolicy::JacobianMatrixType JacobianMatrixType;
236 typedef typename EvalPolicy::JacobianInverseType JacobianInverseType;
237
238 static constexpr SpaceTags eval_caps = SpaceTags::value | SpaceTags::grad;
239
240 template<SpaceTags cfg_>
241 struct ConfigTraits
242 {
244 static constexpr SpaceTags config = cfg_;
245
247 static constexpr TrafoTags trafo_config = TrafoTags::img_point;
248
251 };
252
253 protected:
255 static constexpr TrafoTags inv_lin_trafo_config = TrafoTags::dom_point | TrafoTags::img_point | TrafoTags::jac_inv;
256
258 typedef typename TrafoEvaluator::template ConfigTraits<inv_lin_trafo_config>::EvalDataType InvLinTrafoData;
259
262
263 // inverse linearized trafo vector
264 ImagePointType _inv_lin_vec;
265
266 public:
273 explicit Evaluator(const SpaceType& DOXY(space))
274 {
275 }
276
278 virtual ~Evaluator()
279 {
280 }
281
289 {
290 return Index(shape_dim_ + 1);
291 }
292
299 void prepare(const TrafoEvaluator& trafo_eval)
300 {
301 // create a domain point in the barycentre of the cell
303
304 // create the trafo data
305 InvLinTrafoData trafo_data;
306 trafo_eval(trafo_data, dom_point);
307
308 // store inverse trafo linearization
309 _inv_lin_mat = trafo_data.jac_inv;
310 _inv_lin_vec = trafo_data.img_point;
311 }
312
314 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
317 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
318 {
319 // transform image point
321 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
322
323 // evaluate basis functions
324 data.phi[0].value = DataType(1);
325 for(int i(0); i < shape_dim_; ++i)
326 data.phi[i+1].value = pt[i];
327 }
328
330 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
333 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
334 {
335 // transform image point to local coordinate system
336 DomainPointType pt, loc_grad;
337 pt.set_mat_vec_mult(_inv_lin_mat, trafo_data.img_point - _inv_lin_vec);
338
339 // loop over all basis functions
340 for(int i(0); i < (shape_dim_+1); ++i)
341 {
342 // compute local gradient
343 for(int j(0); j < shape_dim_; ++j)
344 loc_grad[j] = DataType(i == (j+1) ? 1 : 0);
345
346 // multiply by transpose inverse linearized trafo matrix for chain rule
347 data.phi[i].grad.set_vec_mat_mult(loc_grad, _inv_lin_mat);
348 }
349 }
350 }; // Evaluator<..., Variant::StdNonPar, Shape::Quadrilateral>
351 } // namespace Discontinuous
352 } // namespace Space
353} // namespace FEAT
EvalTraits_::BasisValueType value
basis function value object
Definition: eval_data.hpp:47
EvalTraits_::BasisGradientType grad
basis gradient object
Definition: eval_data.hpp:45
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.
Definition: evaluator.hpp:79
ParametricEvaluator< Evaluator, TrafoEvaluator_, SpaceEvalTraits_, ref_caps_p1 > BaseClass
base-class typedef
Definition: evaluator.hpp:108
void eval_ref_gradients(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function gradients on the reference cell.
Definition: evaluator.hpp:176
void eval_ref_values(EvalData_ &data, const DomainPointType &point) const
Evaluates the basis function values on the reference cell.
Definition: evaluator.hpp:157
TrafoEvaluator::template ConfigTraits< inv_lin_trafo_config >::EvalDataType InvLinTrafoData
inverse linearized trafo data
Definition: evaluator.hpp:258
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.
Definition: evaluator.hpp:315
void eval_gradients(EvalData< SpaceEvalTraits, space_cfg_ > &data, const Trafo::EvalData< TrafoEvalTraits, trafo_cfg_ > &trafo_data) const
Definition: evaluator.hpp:331
Space evaluation data structure.
Definition: eval_data.hpp:141
BasisDataType phi[max_local_dofs]
the basis function data vector
Definition: eval_data.hpp:150
Basic Space Evaluator CRTP base-class template.
Finite-Element Parametric Evaluator CRTP base-class template.
Trafo evaluation data structure.
Definition: eval_data.hpp:33
EvalTraits::ImagePointType img_point
image point
Definition: eval_data.hpp:53
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
@ grad
specifies whether the space should supply basis function gradients
std::uint64_t Index
Index data type.
TrafoTags
Trafo configuration tags enum.
Definition: eval_tags.hpp:22
@ 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
Hypercube shape tag struct template.
Definition: shape.hpp:64
Simplex shape tag struct template.
Definition: shape.hpp:44