FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
node_functional.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/node_functional_base.hpp>
10
11namespace FEAT
12{
13 namespace Space
14 {
15 namespace Lagrange2
16 {
17 template<
18 typename Space_,
19 typename ShapeType_,
20 typename DataType_>
22 public NodeFunctionalNull<Space_, DataType_>
23 {
24 public:
25 explicit NodeFunctional(const Space_& space) :
27 {
28 }
29 };
30
31 template<
32 typename Space_,
33 typename DataType_>
34 class NodeFunctional<Space_, Shape::Vertex, DataType_> :
35 public NodeFunctionalBase<Space_, DataType_>
36 {
37 public:
39 static constexpr int max_assigned_dofs = 1;
40
41 template<typename Function_>
42 struct Value
43 {
45 };
46
47 protected:
48 typedef typename Space_::TrafoType TrafoType;
49 typedef typename TrafoType::template Evaluator<Shape::Vertex, DataType_>::Type TrafoEvalType;
50 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
51 typedef typename TrafoEvalTraits::DataType DataType;
52 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
53
54 // declare trafo evaluation data
55 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
56
57 TrafoEvalType _trafo_eval;
58
59 public:
60 explicit NodeFunctional(const Space_& space) :
61 BaseClass(space),
62 _trafo_eval(space.get_trafo())
63 {
64 }
65
66 void prepare(Index cell_index)
67 {
68 BaseClass::prepare(cell_index);
69 _trafo_eval.prepare(cell_index);
70 }
71
72 void finish()
73 {
74 _trafo_eval.finish();
76 }
77
78 int get_num_assigned_dofs() const
79 {
80 return max_assigned_dofs;
81 }
82
83 template<typename NodeData_, typename Function_>
84 void operator()(NodeData_& node_data, const Function_& function) const
85 {
86 static_assert(std::is_base_of<Analytic::Function, Function_>::value, "invalid function object");
87 static_assert(Function_::can_value, "function cannot compute values");
88
89 // declare our evaluation traits
90 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
91
92 // declare function evaluator
93 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
94
95 // compute trafo data
96 DomainPointType dom_point(DataType(0));
97 TrafoEvalData trafo_data;
98 _trafo_eval(trafo_data, dom_point);
99
100 // evaluate function
101 node_data[0] = func_eval.value(trafo_data.img_point);
102 }
103 };
104
105 template<
106 typename Space_,
107 int shape_dim_,
108 typename DataType_>
109 class NodeFunctional<Space_, Shape::Hypercube<shape_dim_>, DataType_> :
110 public NodeFunctionalBase<Space_, DataType_>
111 {
112 public:
114 static constexpr int max_assigned_dofs = 1;
115
116 template<typename Function_>
117 struct Value
118 {
120 };
121
122 protected:
123 typedef typename Space_::TrafoType TrafoType;
124 typedef typename TrafoType::template Evaluator<Shape::Hypercube<shape_dim_>, DataType_>::Type TrafoEvalType;
125 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
126 typedef typename TrafoEvalTraits::DataType DataType;
127 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
128
129 // declare trafo evaluation data
130 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
131
132 TrafoEvalType _trafo_eval;
133
134 public:
135 explicit NodeFunctional(const Space_& space) :
136 BaseClass(space),
137 _trafo_eval(space.get_trafo())
138 {
139 }
140
141 void prepare(Index cell_index)
142 {
143 BaseClass::prepare(cell_index);
144 _trafo_eval.prepare(cell_index);
145 }
146
147 void finish()
148 {
149 _trafo_eval.finish();
151 }
152
153 int get_num_assigned_dofs() const
154 {
155 return max_assigned_dofs;
156 }
157
158 template<typename NodeData_, typename Function_>
159 void operator()(NodeData_& node_data, const Function_& function) const
160 {
161 static_assert(std::is_base_of<Analytic::Function, Function_>::value, "invalid function object");
162 static_assert(Function_::can_value, "function cannot compute values");
163
164 // declare our evaluation traits
165 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
166
167 // declare function evaluator
168 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
169
170 // compute trafo data
171 DomainPointType dom_point(DataType_(0));
172 TrafoEvalData trafo_data;
173 _trafo_eval(trafo_data, dom_point);
174
175 // evaluate function
176 node_data[0] = func_eval.value(trafo_data.img_point);
177 }
178 };
179
180 template<
181 typename Space_,
182 typename DataType_>
183 class NodeFunctional<Space_, Shape::Simplex<1>, DataType_> :
184 public NodeFunctionalBase<Space_, DataType_>
185 {
186 public:
188 static constexpr int max_assigned_dofs = 1;
189
190 template<typename Function_>
191 struct Value
192 {
194 };
195
196 protected:
197 typedef typename Space_::TrafoType TrafoType;
198 typedef typename TrafoType::template Evaluator<Shape::Simplex<1>, DataType_>::Type TrafoEvalType;
199 typedef typename TrafoEvalType::EvalTraits TrafoEvalTraits;
200 typedef typename TrafoEvalTraits::DataType DataType;
201 typedef typename TrafoEvalTraits::DomainPointType DomainPointType;
202
203 // declare trafo evaluation data
204 typedef typename TrafoEvalType::template ConfigTraits<TrafoTags::img_point>::EvalDataType TrafoEvalData;
205
206 TrafoEvalType _trafo_eval;
207
208 public:
209 explicit NodeFunctional(const Space_& space) :
210 BaseClass(space),
211 _trafo_eval(space.get_trafo())
212 {
213 }
214
215 void prepare(Index cell_index)
216 {
217 BaseClass::prepare(cell_index);
218 _trafo_eval.prepare(cell_index);
219 }
220
221 void finish()
222 {
223 _trafo_eval.finish();
225 }
226
227 int get_num_assigned_dofs() const
228 {
229 return max_assigned_dofs;
230 }
231
232 template<typename NodeData_, typename Function_>
233 void operator()(NodeData_& node_data, const Function_& function) const
234 {
235 static_assert(std::is_base_of<Analytic::Function, Function_>::value, "invalid function object");
236 static_assert(Function_::can_value, "function cannot compute values");
237
238 // declare our evaluation traits
239 typedef Analytic::EvalTraits<DataType_, Function_> FuncEvalTraits;
240
241 // declare function evaluator
242 typename Function_::template Evaluator<FuncEvalTraits> func_eval(function);
243
244 // compute trafo data
245 DomainPointType dom_point(DataType_(0.5));
246 TrafoEvalData trafo_data;
247 _trafo_eval(trafo_data, dom_point);
248
249 // evaluate function
250 node_data[0] = func_eval.value(trafo_data.img_point);
251 }
252 };
253 } // namespace Lagrange1
254 } // namespace Space
255} // namespace FEAT
Lagrange-2 Element Evaluator class template declaration.
Definition: evaluator.hpp:46
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.
FEAT namespace.
Definition: adjactor.hpp:12
std::uint64_t Index
Index data type.
@ dom_point
specifies whether the trafo should supply domain point coordinates