6#ifndef __DUNE_ACFEM_PARAMETER_EXPRESSION_HH__
7#define __DUNE_ACFEM_PARAMETER_EXPRESSION_HH__
9#include "../expressions/expressionoperations.hh"
10#include "../expressions/parameteroperations.hh"
11#include "../expressions/parameterinterface.hh"
21 template<
class ExpressionImp>
22 class ParameterExpression
23 :
public DefaultParameter<ExpressionImp>,
24 public ExpressionTemplate<ExpressionImp>
27 template<
class UnOp,
class Parameter>
28 class UnaryParameterExpression;
30 template<
class BinOp,
class LeftParameter,
class RightParameter>
31 class BinaryParameterExpression;
41 template<
class UnOp,
class Parameter>
42 class UnaryParameterExpression
43 :
public ParameterExpression<UnaryParameterExpression<UnOp, Parameter> >
45 typedef UnaryParameterExpression ThisType;
46 typedef Parameter ArgumentParameterType;
47 typedef UnaryParameterOperation<UnOp> OperationType;
48 typedef ParameterTraits<ThisType> TraitsType;
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;
56 UnaryParameterExpression(
const ArgumentParameterType& parameter)
57 : parameter_(parameter)
60 ValueType value()
const {
63 OperationType::evaluate(parameter_().value(), result);
68 ExpressionStorage<Parameter> parameter_;
71 template<
class UnOp,
class Parameter>
72 struct ParameterTraits<UnaryParameterExpression<UnOp, Parameter> >
74 typedef typename UnaryExpressionTraits<UnOp, typename Parameter::ValueType>::ResultType ResultType;
75 typedef typename ParameterSpaceTraits<ResultType>::ParameterSpaceType ParameterSpaceType;
78 template<
class BinOp,
class LeftParameter,
class RightParameter>
79 class BinaryParameterExpression
80 :
public ParameterExpression<BinaryParameterExpression<BinOp, LeftParameter, RightParameter> >
82 typedef BinaryParameterExpression ThisType;
83 typedef LeftParameter LeftParameterType;
84 typedef RightParameter RightParameterType;
85 typedef BinaryParameterOperation<BinOp> OperationType;
86 typedef ParameterTraits<ThisType> TraitsType;
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;
94 BinaryParameterExpression(
const LeftParameterType& left,
const RightParameterType& right)
95 : left_(left), right_(right)
98 ValueType value()
const {
105 const LeftParameter& left()
const
110 const RightParameter& right()
const
116 ExpressionStorage<LeftParameter> left_;
117 ExpressionStorage<RightParameter> right_;
120 template<
class BinOp,
class LeftParameter,
class RightParameter>
121 struct ParameterTraits<class BinaryParameterExpression<BinOp, LeftParameter, RightParameter> >
129 typedef typename ParameterValue<LeftParameter>::ValueType LeftValueType;
130 typedef typename ParameterValue<RightParameter>::ValueType RightValueType;
132 typedef typename BinaryExpressionTraits<BinOp, LeftValueType, RightValueType>::ResultType ResultType;
133 typedef typename ParameterSpaceTraits<ResultType>::ParameterSpaceType ParameterSpaceType;
137 template<
class Parameter>
138 UnaryParameterExpression<MinusOperation, Parameter>
139 operator-(
const ParameterInterface<Parameter>& param)
141 typedef UnaryParameterExpression<MinusOperation, Parameter> ExpressionType;
142 const Parameter& param_(
static_cast<const Parameter&
>(param));
144 return ExpressionType(param_);
148 template<
class Parameter>
149 UnaryParameterExpression<CosOperation, Parameter>
150 cos(
const ParameterInterface<Parameter>& param)
152 typedef UnaryParameterExpression<CosOperation, Parameter> ExpressionType;
153 const Parameter& param_(
asImp(param));
155 return ExpressionType(param_);
159 template<
class Parameter>
160 UnaryParameterExpression<SinOperation, Parameter>
161 sin(
const ParameterInterface<Parameter>& param)
163 typedef UnaryParameterExpression<SinOperation, Parameter> ExpressionType;
164 const Parameter& param_(
asImp(param));
166 return ExpressionType(param_);
170 template<
class Parameter>
171 UnaryParameterExpression<TanOperation, Parameter>
172 tan(
const ParameterInterface<Parameter>& param)
174 typedef UnaryParameterExpression<TanOperation, Parameter> ExpressionType;
175 const Parameter& param_(
asImp(param));
177 return ExpressionType(param_);
181 template<
class Parameter>
182 UnaryParameterExpression<AtanOperation, Parameter>
183 atan(
const ParameterInterface<Parameter>& param)
185 typedef UnaryParameterExpression<AtanOperation, Parameter> ExpressionType;
186 const Parameter& param_(
asImp(param));
188 return ExpressionType(param_);
192 template<
class Parameter>
193 UnaryParameterExpression<AcosOperation, Parameter>
194 acos(
const ParameterInterface<Parameter>& param)
196 typedef UnaryParameterExpression<AcosOperation, Parameter> ExpressionType;
197 const Parameter& param_(
asImp(param));
199 return ExpressionType(param_);
203 template<
class Parameter>
204 UnaryParameterExpression<AsinOperation, Parameter>
205 asin(
const ParameterInterface<Parameter>& param)
207 typedef UnaryParameterExpression<AsinOperation, Parameter> ExpressionType;
208 const Parameter& param_(
asImp(param));
210 return ExpressionType(param_);
214 template<
class Parameter>
215 UnaryParameterExpression<SqrtOperation, Parameter>
216 sqrt(
const ParameterInterface<Parameter>& param)
218 typedef UnaryParameterExpression<SqrtOperation, Parameter> ExpressionType;
219 const Parameter& param_(
asImp(param));
221 return ExpressionType(param_);
225 template<
class Parameter>
226 UnaryParameterExpression<ExpOperation, Parameter>
227 exp(
const ParameterInterface<Parameter>& param)
229 typedef UnaryParameterExpression<ExpOperation, Parameter> ExpressionType;
230 const Parameter& param_(
asImp(param));
232 return ExpressionType(param_);
236 template<
class Parameter>
237 UnaryParameterExpression<SquareOperation, Parameter>
238 sqr(
const ParameterInterface<Parameter>& param)
240 typedef UnaryParameterExpression<SquareOperation, Parameter> ExpressionType;
241 const Parameter& param_(
asImp(param));
243 return ExpressionType(param_);
247 template<
class Left,
class Right>
248 BinaryParameterExpression<PlusOperation, Left, Right>
249 operator+(
const ParameterInterface<Left>& left,
250 const ParameterInterface<Right>& right)
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));
256 return ExpressionType(left_, right_);
259 template<
class Right>
260 BinaryParameterExpression<PlusOperation, typename Right::ValueType, Right>
261 operator+(
const typename Right::ValueType& left,
262 const ParameterInterface<Right>& right)
264 typedef BinaryParameterExpression<PlusOperation, typename Right::ValueType, Right> ExpressionType;
265 const Right& right_(
static_cast<const Right&
>(right));
267 return ExpressionType(left, right_);
271 BinaryParameterExpression<PlusOperation, Left, typename Left::ValueType>
272 operator+(
const ParameterInterface<Left>& left,
273 const typename Left::ValueType& right)
275 typedef BinaryParameterExpression<PlusOperation, Left, typename Left::ValueType> ExpressionType;
276 const Left& left_(
static_cast<const Left&
>(left));
278 return ExpressionType(left_, right);
282 template<
class Left,
class Right>
283 BinaryParameterExpression<MinusOperation, Left, Right>
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));
291 return ExpressionType(left_, right_);
295 template<
class Right>
296 BinaryParameterExpression<MinusOperation, typename Right::ValueType, Right>
297 operator-(
const typename Right::ValueType& left,
300 typedef BinaryParameterExpression<MinusOperation, typename Right::ValueType, Right> ExpressionType;
301 const Right& right_(
static_cast<const Right&
>(right));
303 return ExpressionType(left, right_);
308 BinaryParameterExpression<MinusOperation, Left, typename Left::ValueType>
310 const typename Left::ValueType& right)
312 typedef BinaryParameterExpression<MinusOperation, Left, typename Left::ValueType> ExpressionType;
313 const Left& left_(
static_cast<const Left&
>(left));
315 return ExpressionType(left_, right);
319 template<
class Left,
class Right>
320 BinaryParameterExpression<MultiplyOperation, Left, Right>
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));
328 return ExpressionType(left_, right_);
332 template<
class Right>
333 BinaryParameterExpression<MultiplyOperation, typename Right::ValueType, Right>
337 typedef BinaryParameterExpression<MultiplyOperation, typename Right::ValueType, Right> ExpressionType;
338 const Right& right_ =
static_cast<const Right &
>(right);
340 return ExpressionType(left, right_);
346 const typename Left::ValueType& right)
347 ->
decltype(right *
asImp(left))
349 return right *
asImp(left);
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,
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);
362 return ExpressionType(left, right_);
368 const typename FieldTraits<typename Left::ValueType>::field_type& right)
369 ->
decltype(right *
asImp(left))
371 return right *
asImp(left);
375 template<
class Field,
class Parameter>
378 const BinaryParameterExpression<SMultiplyOperation, Field, Parameter>& P_)
379 ->
decltype((s_ * P_.left()) * P_.right())
381 return (s_ * P_.left()) * P_.right();
385 template<
class Field,
class Parameter1,
class Parameter2>
387 auto operator*(
const BinaryParameterExpression<SMultiplyOperation, Field, Parameter1>& P1_,
389 ->
decltype(P1_.left() * (P1_.right() *
asImp(P2_)))
391 return P1_.left() * (P1_.right() *
asImp(P2_));
395 template<
class Field,
class Parameter1,
class Parameter2>
398 const BinaryParameterExpression<SMultiplyOperation, Field, Parameter2>& P2_)
400 ->
decltype(P2_.left() * (
asImp(P1_) * P2_.right()))
402 return P2_.left() * (
asImp(P1_) * P2_.right());
406 template<
class Field,
class Parameter1,
class Parameter2>
408 auto operator*(
const BinaryParameterExpression<SMultiplyOperation, Field, Parameter1>& P1_,
409 const BinaryParameterExpression<SMultiplyOperation, Field, Parameter2>& P2_)
411 ->
decltype((P2_.left() * P2_.left()) * (P1_.right() * P2_.right()))
413 return (P2_.left() * P2_.left()) * (P1_.right() * P2_.right());
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