FEAT 3
Finite Element Analysis Toolbox
Loading...
Searching...
No Matches
common_functionals.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/analytic/function.hpp>
10#include <kernel/assembly/linear_functional.hpp>
11
12namespace FEAT
13{
14 namespace Assembly
15 {
16 namespace Common
17 {
30 template<typename Function_>
32 public LinearFunctional
33 {
34 public:
36 static_assert(Function_::can_value, "function can't compute values");
37
40
43
52 template<typename AsmTraits_>
53 class Evaluator :
54 public LinearFunctional::Evaluator<AsmTraits_>
55 {
56 public:
58 typedef typename AsmTraits_::TrafoEvaluator TrafoEvaluator;
60 typedef typename AsmTraits_::DataType DataType;
62 typedef typename AsmTraits_::TrafoData TrafoData;
64 typedef typename AsmTraits_::TestBasisData TestBasisData;
67
68 protected:
72 typename Function_::template Evaluator<AnalyticEvalTraits> _func_eval;
74 typename AnalyticEvalTraits::ValueType _func_value;
75
76 public:
78 explicit Evaluator(const ForceFunctional<Function_>& functional) :
79 _func_eval(functional._function),
81 {
82 }
83
85 void set_point(const TrafoData& tau)
86 {
87 // evaluate function value
88 _func_value = _func_eval.value(tau.img_point);
89 }
90
91 // copy pasted since Doxygen does not like the operator part in
92 // \copydoc LinearFunctional::Evaluator::operator()
104 ValueType eval(const TestBasisData& psi) const
105 {
106 return _func_value * psi.value;
107 }
108 }; // class ForceFunctional::Evaluator<...>
109
110 protected:
112 const Function_& _function;
113
114 public:
121 explicit ForceFunctional(const Function_& function) :
122 _function(function)
123 {
124 }
125 }; // class ForceFunctional
126
139 template<typename Function_>
141 public LinearFunctional
142 {
143 public:
145 static_assert(Function_::can_hess, "function can't compute hessians");
146
151
160 template<typename AsmTraits_>
161 class Evaluator :
162 public LinearFunctional::Evaluator<AsmTraits_>
163 {
164 public:
166 typedef typename AsmTraits_::TrafoEvaluator TrafoEvaluator;
168 typedef typename AsmTraits_::DataType DataType;
170 typedef typename AsmTraits_::TrafoData TrafoData;
172 typedef typename AsmTraits_::TestBasisData TestBasisData;
175
176 protected:
180 typename Function_::template Evaluator<AnalyticEvalTraits> _func_eval;
182 typename AnalyticEvalTraits::ValueType _func_laplace;
183
184 public:
186 explicit Evaluator(const LaplaceFunctional<Function_>& functional) :
187 _func_eval(functional._function),
189 {
190 }
191
193 void set_point(const TrafoData& tau)
194 {
195 // compute the function hessian's trace (=laplacian)
196 //_func_laplace = - _func_eval.hessian(tau.img_point).trace();
197 calc_trace(_func_eval.hessian(tau.img_point));
198 }
199
200 template<typename T_, int m_, int n_, int sm_, int sn_>
201 void calc_trace(const Tiny::Matrix<T_, m_, n_, sm_, sn_>& hess)
202 {
203 _func_laplace = - hess.trace();
204 }
205
206 template<typename T_, int l_, int m_, int n_, int sl_, int sm_, int sn_>
208 {
209 _func_laplace.format();
210 for(int i(0); i < hess.l; ++i)
211 for(int j(0); j < hess.m; ++j)
212 _func_laplace[i] -= hess[i][j][j];
213 }
214
215 // copy pasted since Doxygen does not like the operator part in
216 // \copydoc LinearFunctional::Evaluator::operator()
228 ValueType eval(const TestBasisData& psi) const
229 {
230 return _func_laplace * psi.value;
231 }
232 }; // class LaplaceFunctional::Evaluator<...>
233
234 protected:
236 const Function_& _function;
237
238 public:
245 explicit LaplaceFunctional(const Function_& function) :
246 _function(function)
247 {
248 }
249 }; // class LaplaceFunctional
250 } // namespace Common
251 } // namespace Assembly
252} // namespace FEAT
Force Functional Evaluator class template.
Analytic::EvalTraits< DataType, Function_ >::ValueType ValueType
Function return value, can be scalar or vector-valued.
Evaluator(const ForceFunctional< Function_ > &functional)
constructor
ValueType eval(const TestBasisData &psi) const
Evaluation operator.
Function_::template Evaluator< AnalyticEvalTraits > _func_eval
the function evaluator
void set_point(const TrafoData &tau)
Point initialization function.
Analytic::EvalTraits< DataType, Function_ > AnalyticEvalTraits
declare our analytic eval traits
AsmTraits_::TrafoData TrafoData
trafo data type
AnalyticEvalTraits::ValueType _func_value
the function value in the current point
AsmTraits_::TestBasisData TestBasisData
test-function data type
AsmTraits_::TrafoEvaluator TrafoEvaluator
trafo evaluator
Force functional implementation.
static constexpr TrafoTags trafo_config
ensure that the function can compute values
ForceFunctional(const Function_ &function)
Constructor.
static constexpr SpaceTags test_config
test space config tag
const Function_ & _function
a reference to the analytic function
Force Functional Evaluator class template.
AsmTraits_::TestBasisData TestBasisData
test-function data type
Analytic::EvalTraits< DataType, Function_ >::ValueType ValueType
Function return value, can be scalar or vector-valued.
Analytic::EvalTraits< DataType, Function_ > AnalyticEvalTraits
declare our analytic eval traits
AsmTraits_::TrafoEvaluator TrafoEvaluator
trafo evaluator
void set_point(const TrafoData &tau)
Point initialization function.
ValueType eval(const TestBasisData &psi) const
Evaluation operator.
Evaluator(const LaplaceFunctional< Function_ > &functional)
constructor
AnalyticEvalTraits::ValueType _func_laplace
the function laplacian in the current point
Function_::template Evaluator< AnalyticEvalTraits > _func_eval
the function evaluator
Laplace functional implementation.
static constexpr SpaceTags test_config
test space config tag
const Function_ & _function
a reference to the analytic function
static constexpr TrafoTags trafo_config
ensure that the function can compute hessian matrices
LaplaceFunctional(const Function_ &function)
Constructor.
Linear Functional Evaluator class template.
Base class for Linear Functionals.
Tiny Matrix class template.
Tiny Tensor3 class template.
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
TrafoTags
Trafo configuration tags enum.
Definition: eval_tags.hpp:22
@ img_point
specifies whether the trafo should supply image point coordinates