DUNE-ACFEM (2.5.1)

parameterexpression.hh
Go to the documentation of this file.
1
6#ifndef __DUNE_ACFEM_PARAMETER_EXPRESSION_HH__
7#define __DUNE_ACFEM_PARAMETER_EXPRESSION_HH__
8
9#include "../expressions/expressionoperations.hh"
10#include "../expressions/parameteroperations.hh"
11#include "../expressions/parameterinterface.hh"
12
13namespace Dune {
14
15 namespace ACFem {
16
21 template<class ExpressionImp>
22 class ParameterExpression
23 : public DefaultParameter<ExpressionImp>,
24 public ExpressionTemplate<ExpressionImp>
25 {};
26
27 template<class UnOp, class Parameter>
28 class UnaryParameterExpression;
29
30 template<class BinOp, class LeftParameter, class RightParameter>
31 class BinaryParameterExpression;
32
41 template<class UnOp, class Parameter>
42 class UnaryParameterExpression
43 : public ParameterExpression<UnaryParameterExpression<UnOp, Parameter> >
44 {
45 typedef UnaryParameterExpression ThisType;
46 typedef Parameter ArgumentParameterType;
47 typedef UnaryParameterOperation<UnOp> OperationType;
48 typedef ParameterTraits<ThisType> TraitsType;
49 public:
50 typedef typename TraitsType::ParameterSpaceType ParameterSpaceType;
51 typedef typename ParameterSpaceType::ScalarParameterSpaceType ScalarParameterSpaceType;
52 enum { dimension = ParameterSpaceType::dimension };
53 typedef typename ParameterSpaceType::FieldType FieldType;
54 typedef typename ParameterSpaceType::ValueType ValueType;
55
56 UnaryParameterExpression(const ArgumentParameterType& parameter)
57 : parameter_(parameter)
58 {}
59
60 ValueType value() const {
61 ValueType result;
62
63 OperationType::evaluate(parameter_().value(), result);
64 return result;
65 }
66
67 protected:
68 ExpressionStorage<Parameter> parameter_;
69 };
70
71 template<class UnOp, class Parameter>
72 struct ParameterTraits<UnaryParameterExpression<UnOp, Parameter> >
73 {
74 typedef typename UnaryExpressionTraits<UnOp, typename Parameter::ValueType>::ResultType ResultType;
75 typedef typename ParameterSpaceTraits<ResultType>::ParameterSpaceType ParameterSpaceType;
76 };
77
78 template<class BinOp, class LeftParameter, class RightParameter>
79 class BinaryParameterExpression
80 : public ParameterExpression<BinaryParameterExpression<BinOp, LeftParameter, RightParameter> >
81 {
82 typedef BinaryParameterExpression ThisType;
83 typedef LeftParameter LeftParameterType;
84 typedef RightParameter RightParameterType;
85 typedef BinaryParameterOperation<BinOp> OperationType;
86 typedef ParameterTraits<ThisType> TraitsType;
87 public:
88 typedef typename TraitsType::ParameterSpaceType ParameterSpaceType;
89 typedef typename ParameterSpaceType::ScalarParameterSpaceType ScalarParameterSpaceType;
90 enum { dimension = ParameterSpaceType::dimension };
91 typedef typename ParameterSpaceType::FieldType FieldType;
92 typedef typename ParameterSpaceType::ValueType ValueType;
93
94 BinaryParameterExpression(const LeftParameterType& left, const RightParameterType& right)
95 : left_(left), right_(right)
96 {}
97
98 ValueType value() const {
99 ValueType result;
100
101 OperationType::evaluate(parameterValue(left_()), parameterValue(right_()), result);
102 return result;
103 }
104
105 const LeftParameter& left() const
106 {
107 return left_();
108 }
109
110 const RightParameter& right() const
111 {
112 return right_();
113 }
114
115 protected:
116 ExpressionStorage<LeftParameter> left_;
117 ExpressionStorage<RightParameter> right_;
118 };
119
120 template<class BinOp, class LeftParameter, class RightParameter>
121 struct ParameterTraits<class BinaryParameterExpression<BinOp, LeftParameter, RightParameter> >
122 {
123 private:
124 // The recursive to ParameterTraits seems too complicated but
125 // hacks also the case where one of the parameters is actually
126 // just a scalar or some other data type, in which case the
127 // ValueType will simply return the template argument as
128 // parameter type.
129 typedef typename ParameterValue<LeftParameter>::ValueType LeftValueType;
130 typedef typename ParameterValue<RightParameter>::ValueType RightValueType;
131 public:
132 typedef typename BinaryExpressionTraits<BinOp, LeftValueType, RightValueType>::ResultType ResultType;
133 typedef typename ParameterSpaceTraits<ResultType>::ParameterSpaceType ParameterSpaceType;
134 };
135
136 // unary minus
137 template<class Parameter>
138 UnaryParameterExpression<MinusOperation, Parameter>
139 operator-(const ParameterInterface<Parameter>& param)
140 {
141 typedef UnaryParameterExpression<MinusOperation, Parameter> ExpressionType;
142 const Parameter& param_(static_cast<const Parameter&>(param));
143
144 return ExpressionType(param_);
145 }
146
147 // cos
148 template<class Parameter>
149 UnaryParameterExpression<CosOperation, Parameter>
150 cos(const ParameterInterface<Parameter>& param)
151 {
152 typedef UnaryParameterExpression<CosOperation, Parameter> ExpressionType;
153 const Parameter& param_(asImp(param));
154
155 return ExpressionType(param_);
156 }
157
158 // sin
159 template<class Parameter>
160 UnaryParameterExpression<SinOperation, Parameter>
161 sin(const ParameterInterface<Parameter>& param)
162 {
163 typedef UnaryParameterExpression<SinOperation, Parameter> ExpressionType;
164 const Parameter& param_(asImp(param));
165
166 return ExpressionType(param_);
167 }
168
169 // tan
170 template<class Parameter>
171 UnaryParameterExpression<TanOperation, Parameter>
172 tan(const ParameterInterface<Parameter>& param)
173 {
174 typedef UnaryParameterExpression<TanOperation, Parameter> ExpressionType;
175 const Parameter& param_(asImp(param));
176
177 return ExpressionType(param_);
178 }
179
180 // atan
181 template<class Parameter>
182 UnaryParameterExpression<AtanOperation, Parameter>
183 atan(const ParameterInterface<Parameter>& param)
184 {
185 typedef UnaryParameterExpression<AtanOperation, Parameter> ExpressionType;
186 const Parameter& param_(asImp(param));
187
188 return ExpressionType(param_);
189 }
190
191 // acos
192 template<class Parameter>
193 UnaryParameterExpression<AcosOperation, Parameter>
194 acos(const ParameterInterface<Parameter>& param)
195 {
196 typedef UnaryParameterExpression<AcosOperation, Parameter> ExpressionType;
197 const Parameter& param_(asImp(param));
198
199 return ExpressionType(param_);
200 }
201
202 // asin
203 template<class Parameter>
204 UnaryParameterExpression<AsinOperation, Parameter>
205 asin(const ParameterInterface<Parameter>& param)
206 {
207 typedef UnaryParameterExpression<AsinOperation, Parameter> ExpressionType;
208 const Parameter& param_(asImp(param));
209
210 return ExpressionType(param_);
211 }
212
213 // sqrt
214 template<class Parameter>
215 UnaryParameterExpression<SqrtOperation, Parameter>
216 sqrt(const ParameterInterface<Parameter>& param)
217 {
218 typedef UnaryParameterExpression<SqrtOperation, Parameter> ExpressionType;
219 const Parameter& param_(asImp(param));
220
221 return ExpressionType(param_);
222 }
223
224 // exp
225 template<class Parameter>
226 UnaryParameterExpression<ExpOperation, Parameter>
227 exp(const ParameterInterface<Parameter>& param)
228 {
229 typedef UnaryParameterExpression<ExpOperation, Parameter> ExpressionType;
230 const Parameter& param_(asImp(param));
231
232 return ExpressionType(param_);
233 }
234
235 // sqr (component-wise)
236 template<class Parameter>
237 UnaryParameterExpression<SquareOperation, Parameter>
238 sqr(const ParameterInterface<Parameter>& param)
239 {
240 typedef UnaryParameterExpression<SquareOperation, Parameter> ExpressionType;
241 const Parameter& param_(asImp(param));
242
243 return ExpressionType(param_);
244 }
245
246 // plus
247 template<class Left, class Right>
248 BinaryParameterExpression<PlusOperation, Left, Right>
249 operator+(const ParameterInterface<Left>& left,
250 const ParameterInterface<Right>& right)
251 {
252 typedef BinaryParameterExpression<PlusOperation, Left, Right> ExpressionType;
253 const Left& left_(static_cast<const Left&>(left));
254 const Right& right_(static_cast<const Right&>(right));
255
256 return ExpressionType(left_, right_);
257 }
258
259 template<class Right>
260 BinaryParameterExpression<PlusOperation, typename Right::ValueType, Right>
261 operator+(const typename Right::ValueType& left,
262 const ParameterInterface<Right>& right)
263 {
264 typedef BinaryParameterExpression<PlusOperation, typename Right::ValueType, Right> ExpressionType;
265 const Right& right_(static_cast<const Right&>(right));
266
267 return ExpressionType(left, right_);
268 }
269
270 template<class Left>
271 BinaryParameterExpression<PlusOperation, Left, typename Left::ValueType>
272 operator+(const ParameterInterface<Left>& left,
273 const typename Left::ValueType& right)
274 {
275 typedef BinaryParameterExpression<PlusOperation, Left, typename Left::ValueType> ExpressionType;
276 const Left& left_(static_cast<const Left&>(left));
277
278 return ExpressionType(left_, right);
279 }
280
282 template<class Left, class Right>
283 BinaryParameterExpression<MinusOperation, Left, Right>
284 operator-(const ParameterInterface<Left>& left,
285 const ParameterInterface<Right>& right)
286 {
287 typedef BinaryParameterExpression<MinusOperation, Left, Right> ExpressionType;
288 const Left& left_(static_cast<const Left&>(left));
289 const Right& right_(static_cast<const Right&>(right));
290
291 return ExpressionType(left_, right_);
292 }
293
295 template<class Right>
296 BinaryParameterExpression<MinusOperation, typename Right::ValueType, Right>
297 operator-(const typename Right::ValueType& left,
298 const ParameterInterface<Right>& right)
299 {
300 typedef BinaryParameterExpression<MinusOperation, typename Right::ValueType, Right> ExpressionType;
301 const Right& right_(static_cast<const Right&>(right));
302
303 return ExpressionType(left, right_);
304 }
305
307 template<class Left>
308 BinaryParameterExpression<MinusOperation, Left, typename Left::ValueType>
309 operator-(const ParameterInterface<Left>& left,
310 const typename Left::ValueType& right)
311 {
312 typedef BinaryParameterExpression<MinusOperation, Left, typename Left::ValueType> ExpressionType;
313 const Left& left_(static_cast<const Left&>(left));
314
315 return ExpressionType(left_, right);
316 }
317
319 template<class Left, class Right>
320 BinaryParameterExpression<MultiplyOperation, Left, Right>
322 const ParameterInterface<Right>& right)
323 {
324 typedef BinaryParameterExpression<MultiplyOperation, Left, Right> ExpressionType;
325 const Left& left_(static_cast<const Left&>(left));
326 const Right& right_(static_cast<const Right&>(right));
327
328 return ExpressionType(left_, right_);
329 }
330
332 template<class Right>
333 BinaryParameterExpression<MultiplyOperation, typename Right::ValueType, Right>
334 operator*(const typename Right::ValueType& left,
335 const ParameterInterface<Right>& right)
336 {
337 typedef BinaryParameterExpression<MultiplyOperation, typename Right::ValueType, Right> ExpressionType;
338 const Right& right_ = static_cast<const Right &>(right);
339
340 return ExpressionType(left, right_);
341 }
342
344 template<class Left>
346 const typename Left::ValueType& right)
347 -> decltype(right * asImp(left))
348 {
349 return right * asImp(left);
350 }
351
353 template<class Right>
354 BinaryParameterExpression<SMultiplyOperation, typename FieldTraits<typename Right::ValueType>::field_type, Right>
355 operator*(const typename FieldTraits<typename Right::ValueType>::field_type& left,
356 const ParameterInterface<Right>& right)
357 {
358 typedef typename FieldTraits<typename Right::ValueType>::field_type FieldType;
359 typedef BinaryParameterExpression<SMultiplyOperation, FieldType, Right> ExpressionType;
360 const Right& right_ = static_cast<const Right &>(right);
361
362 return ExpressionType(left, right_);
363 }
364
366 template<class Left>
368 const typename FieldTraits<typename Left::ValueType>::field_type& right)
369 -> decltype(right * asImp(left))
370 {
371 return right * asImp(left);
372 }
373
375 template<class Field, class Parameter>
376 static inline
377 auto operator*(const Field& s_,
378 const BinaryParameterExpression<SMultiplyOperation, Field, Parameter>& P_)
379 -> decltype((s_ * P_.left()) * P_.right())
380 {
381 return (s_ * P_.left()) * P_.right();
382 }
383
385 template<class Field, class Parameter1, class Parameter2>
386 static inline
387 auto operator*(const BinaryParameterExpression<SMultiplyOperation, Field, Parameter1>& P1_,
389 -> decltype(P1_.left() * (P1_.right() * asImp(P2_)))
390 {
391 return P1_.left() * (P1_.right() * asImp(P2_));
392 }
393
395 template<class Field, class Parameter1, class Parameter2>
396 static inline
398 const BinaryParameterExpression<SMultiplyOperation, Field, Parameter2>& P2_)
399
400 -> decltype(P2_.left() * (asImp(P1_) * P2_.right()))
401 {
402 return P2_.left() * (asImp(P1_) * P2_.right());
403 }
404
406 template<class Field, class Parameter1, class Parameter2>
407 static inline
408 auto operator*(const BinaryParameterExpression<SMultiplyOperation, Field, Parameter1>& P1_,
409 const BinaryParameterExpression<SMultiplyOperation, Field, Parameter2>& P2_)
410
411 -> decltype((P2_.left() * P2_.left()) * (P1_.right() * P2_.right()))
412 {
413 return (P2_.left() * P2_.left()) * (P1_.right() * P2_.right());
414 }
415
417
419
420 } //ACFem
421
422} // Dune
423
424
425#endif // __DUNE_ACFEM_PARAMETER_EXPRESSION_HH__
Parameters are quasi-constant quantities, like the time-step size in one time-step when solving trans...
Definition: parameterinterface.hh:80
const Implementation & asImp(const Fem::BartonNackmanInterface< Interface, Implementation > &arg)
Up-cast to the implementation for any Fem::BartonNackmanInterface.
Definition: expressionoperations.hh:71
ParameterValue< Value >::ResultType parameterValue(const Value &value)
Return the unaltered argument for non-parameters and otherwise the parameter value.
Definition: parameterinterface.hh:263
BinaryParameterExpression< MultiplyOperation, Left, Right > operator*(const ParameterInterface< Left > &left, const ParameterInterface< Right > &right)
Scalar product between parameters.
Definition: parameterexpression.hh:321
Creative Commons License   |  Legal Statements / Impressum  |  Hosted by TU Dresden & Uni Heidelberg  |  generated with Hugo v0.111.3 (Mar 12, 23:28, 2025)