FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
evaluator_base.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/eval_data.hpp>
10#include <kernel/trafo/eval_data.hpp>
11
12namespace FEAT
13{
14 namespace Space
15 {
17 namespace Intern
18 {
19 template<bool _enable>
20 struct BasisEvalHelper;
21 } // namespace Intern
23
41 template<
42 typename SpaceEvaluator_,
43 typename TrafoEvaluator_,
44 typename SpaceEvalTraits_>
46 {
47 public:
49 typedef SpaceEvaluator_ SpaceEvaluator;
50
52 typedef TrafoEvaluator_ TrafoEvaluator;
53
55 typedef SpaceEvalTraits_ SpaceEvalTraits;
56
58 typedef typename TrafoEvaluator::EvalTraits TrafoEvalTraits;
59
61 static constexpr int domain_dim = SpaceEvalTraits::domain_dim;
63 static constexpr int image_dim = SpaceEvalTraits::image_dim;
65 static constexpr int max_local_dofs = SpaceEvalTraits::max_local_dofs;
66
67 template<SpaceTags cfg_>
69 {
71 static constexpr SpaceTags config = cfg_;
72
74 static constexpr TrafoTags trafo_config = TrafoTags::none;
75
78 };
79
80#ifdef DOXYGEN
81 static constexpr SpaceTags eval_caps = ...;
82#endif
83
84 protected:
87 SpaceEvaluator& cast()
88 {
89 return static_cast<SpaceEvaluator&>(*this);
90 }
91
93 const SpaceEvaluator& cast() const
94 {
95 return static_cast<const SpaceEvaluator&>(*this);
96 }
98
99 public:
106 void prepare(const TrafoEvaluator& DOXY(trafo_eval))
107 {
108 }
109
113 void finish()
114 {
115 }
116
128 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
131 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& trafo_data) const
132 {
133 // typedef mumbo-jumbo
134 typedef EvalData<SpaceEvalTraits, space_cfg_> EvalDataType;
135
136
137 // \compilerhack GCC 6.1 template compiler bug
138 // The following static constexpr bool variables are required to
139 // circumvent a compiler bug in GCC 6.1
140#if defined(FEAT_COMPILER_GNU) && (FEAT_COMPILER_GNU < 70000)
141 // compute basis values
142 static constexpr bool want_value = *(EvalDataType::config & SpaceTags::value);
143 Intern::BasisEvalHelper<want_value>::eval_values(space_data, cast(), trafo_data);
144 // compute basis gradients
145 static constexpr bool want_grad = *(EvalDataType::config & SpaceTags::grad);
146 Intern::BasisEvalHelper<want_grad>::eval_gradients(space_data, cast(), trafo_data);
147 // compute basis hessians
148 static constexpr bool want_hess = *(EvalDataType::config & SpaceTags::hess);
149 Intern::BasisEvalHelper<want_hess>::eval_hessians(space_data, cast(), trafo_data);
150#else
151 // compute basis values
152 Intern::BasisEvalHelper<*(EvalDataType::config & SpaceTags::value)>::eval_values(space_data, cast(), trafo_data);
153 // compute basis gradients
154 Intern::BasisEvalHelper<*(EvalDataType::config & SpaceTags::grad)>::eval_gradients(space_data, cast(), trafo_data);
155 // compute basis hessians
156 Intern::BasisEvalHelper<*(EvalDataType::config & SpaceTags::hess)>::eval_hessians(space_data, cast(), trafo_data);
157#endif
158 }
159
172 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
175 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& DOXY(trafo_data)) const
176 {
177 XABORTM("space evaluator does not support basis function values");
178 }
179
192 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
195 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& DOXY(trafo_data)) const
196 {
197 XABORTM("space evaluator does not support basis function gradients");
198 }
199
212 template<SpaceTags space_cfg_, TrafoTags trafo_cfg_>
215 const Trafo::EvalData<TrafoEvalTraits, trafo_cfg_>& DOXY(trafo_data)) const
216 {
217 XABORTM("space evaluator does not support basis function hessians");
218 }
219 }; // class EvaluatorBase<...>
220
222 namespace Intern
223 {
224 template<bool _enable>
225 struct BasisEvalHelper
226 {
227 template<typename SpaceData_, typename Evaluator_, typename TrafoData_>
228 static void eval_values(SpaceData_&, const Evaluator_&, const TrafoData_&) {}
229
230 template<typename SpaceData_, typename Evaluator_, typename TrafoData_>
231 static void eval_gradients(SpaceData_&, const Evaluator_&, const TrafoData_&) {}
232
233 template<typename SpaceData_, typename Evaluator_, typename TrafoData_>
234 static void eval_hessians(SpaceData_&, const Evaluator_&, const TrafoData_&) {}
235 };
236
237 template<>
238 struct BasisEvalHelper<true>
239 {
240 template<typename SpaceData_, typename Evaluator_, typename TrafoData_>
241 static void eval_values(SpaceData_& space_data, const Evaluator_& evaluator, const TrafoData_& trafo_data)
242 {
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);
246 }
247
248 template<typename SpaceData_, typename Evaluator_, typename TrafoData_>
249 static void eval_gradients(SpaceData_& space_data, const Evaluator_& evaluator, const TrafoData_& trafo_data)
250 {
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);
254 }
255
256 template<typename SpaceData_, typename Evaluator_, typename TrafoData_>
257 static void eval_hessians(SpaceData_& space_data, const Evaluator_& evaluator, const TrafoData_& trafo_data)
258 {
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);
262 }
263 };
264 } // namespace Intern
266 } // namespace Space
267} // namespace FEAT
#define XABORTM(msg)
Abortion macro definition with custom message.
Definition: assertion.hpp:192
Space evaluation data structure.
Definition: eval_data.hpp:141
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.
Definition: eval_data.hpp:33
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
@ grad
specifies whether the space should supply basis function gradients
TrafoTags
Trafo configuration tags enum.
Definition: eval_tags.hpp:22
Space::EvalData< SpaceEvalTraits, config > EvalDataType
evaluation data typedef
static constexpr TrafoTags trafo_config
trafo configuration
static constexpr SpaceTags config
evaluation data configuration