IFEM  90A354
ExprFunctions.h
Go to the documentation of this file.
1 // $Id$
2 //==============================================================================
12 //==============================================================================
13 
14 #ifndef _EXPR_FUNCTIONS_H
15 #define _EXPR_FUNCTIONS_H
16 
17 #include "Function.h"
18 #include "TensorFunction.h"
19 
20 #include <array>
21 #include <algorithm>
22 #include <memory>
23 #include <string>
24 #include <vector>
25 
26 namespace ExprEval {
27  template<class ArgType> class Expression;
28  template<class ArgType> class FunctionList;
29  template<class ArgType> class ValueList;
30 }
31 
32 
37 template<class Scalar>
38 class EvalFuncScalar : public ScalarFunc
39 {
48 
50  std::vector< std::unique_ptr<Expression> > expr;
52  std::vector< std::unique_ptr<FunctionList> > f;
54  std::vector< std::unique_ptr<ValueList> > v;
55 
56  std::vector<Scalar*> arg;
57 
58  std::unique_ptr<FuncType> gradient;
59 
60  Real dx;
61 
62 public:
63  static int numError;
64 
66  explicit EvalFuncScalar(const char* function, const char* x = "x",
67  Real eps = Real(1.0e-8));
71  virtual ~EvalFuncScalar();
72 
74  void addDerivative(const std::string& function, const char* x = "x");
75 
77  bool isConstant() const override { return false; }
78 
80  Real deriv(Real x) const override;
81 
82 protected:
84  Real evaluate(const Real& x) const override;
85 };
86 
87 
92 template<class Scalar>
93 class EvalFuncSpatial : public RealFunc
94 {
103 
105  std::vector< std::unique_ptr<Expression> > expr;
107  std::vector< std::unique_ptr<FunctionList> > f;
109  std::vector< std::unique_ptr<ValueList> > v;
110 
112  struct Arg
113  {
114  Scalar* x;
115  Scalar* y;
116  Scalar* z;
117  Scalar* t;
118 
121  const Scalar& get(int dir) const
122  {
123  switch (dir) {
124  case 1: return *x;
125  case 2: return *y;
126  case 3: return *z;
127  case 4: return *t;
128  default: return *x;
129  }
130  }
131  };
132 
133  std::vector<Arg> arg;
134 
136  std::array<std::unique_ptr<FuncType>,4> derivative1;
138  std::array<std::unique_ptr<FuncType>,6> derivative2;
139 
140  bool IAmConstant;
141 
144 
145 public:
147  explicit EvalFuncSpatial(const char* function,
148  Real epsX = Real(1.0e-8), Real epsT = Real(1.0e-12));
152  virtual ~EvalFuncSpatial();
153 
155  void addDerivative(const std::string& function, const std::string& variables,
156  int d1, int d2 = 0);
157 
159  bool isConstant() const override { return IAmConstant; }
160 
162  Real deriv(const Vec3& X, int dir) const override;
164  Real dderiv(const Vec3& X, int dir1, int dir2) const override;
165 
167  void setParam(const std::string& name, Real value) override;
168 
170  Vec3 gradient(const Vec3& X) const override
171  {
172  return this->RealFunc::gradient(X);
173  }
174 
176  SymmTensor hessian(const Vec3& X) const override
177  {
178  return this->RealFunc::hessian(X);
179  }
180 
181 protected:
183  Real evaluate(const Vec3& X) const override;
184 };
185 
186 
191 template<class Scalar>
193 {
194 protected:
196 
198  EvalFunctions(const std::string& functions, const std::string& variables,
199  const Real epsX, const Real epsT);
203  virtual ~EvalFunctions();
204 
205 public:
207  void addDerivative(const std::string& functions,
208  const std::string& variables, int d1, int d2 = 0);
209 
211  size_t getNoSpaceDim() const { return nsd; }
212 
213 protected:
214  std::vector<std::unique_ptr<FuncType>> p;
215  size_t nsd = 0;
216 };
217 
218 
224 template <class ParentFunc, class Ret, class Scalar>
225 class EvalMultiFunction : public ParentFunc, public EvalFunctions<Scalar>
226 {
229 
230 public:
232  explicit EvalMultiFunction(const std::string& functions,
233  const std::string& variables = "",
234  const Real epsX = 1e-8,
235  const Real epsT = 1e-12)
236  : EvalFunctions<Scalar>(functions,variables,epsX,epsT)
237  {
238  this->setNoDims();
239  }
240 
242  virtual ~EvalMultiFunction() {}
243 
245  bool isConstant() const override
246  {
247  return std::all_of(this->p.begin(), this->p.end(),
248  [](const std::unique_ptr<FuncType>& func)
249  { return func->isConstant(); });
250  }
251 
253  unsigned char getType() const override { return 2; }
254 
256  Ret deriv(const Vec3& X, int dir) const override;
258  Ret dderiv(const Vec3& X, int dir1, int dir2) const override;
259 
261  void setParam(const std::string& name, Real value) override
262  {
263  for (std::unique_ptr<FuncType>& func : this->p)
264  func->setParam(name,value);
265  }
266 
267 protected:
269  void setNoDims();
270 
272  Ret evaluate(const Vec3& X) const override;
273 
275  std::vector<Real> evalGradient(const Vec3& X) const override;
276 
278  std::vector<Real> evalHessian(const Vec3& X) const override;
279 
281  std::vector<Real> evalTimeDerivative(const Vec3& X) const override;
282 };
283 
294 
296 template<> int EvalFunc::numError;
297 
298 #endif
General functions with arbitrary argument and value type.
#define Real
The floating point type to use.
Definition: ImmersedBoundaries.h:18
Spatial tensor-valued functions.
A scalar-valued function, general expression.
Definition: ExprFunctions.h:39
Real dx
Domain increment for calculation of numerical derivative.
Definition: ExprFunctions.h:60
std::unique_ptr< FuncType > gradient
First derivative expression.
Definition: ExprFunctions.h:58
std::vector< Scalar * > arg
Function argument values.
Definition: ExprFunctions.h:56
void addDerivative(const std::string &function, const char *x="x")
Adds an expression function for a first derivative.
Definition: ExprFunctions.C:245
std::vector< std::unique_ptr< Expression > > expr
Roots of the expression tree.
Definition: ExprFunctions.h:50
static int numError
Error counter - set by the exception handler.
Definition: ExprFunctions.h:63
std::vector< std::unique_ptr< ValueList > > v
Lists of variables and constants.
Definition: ExprFunctions.h:54
bool isConstant() const override
Returns whether the function is time-independent or not.
Definition: ExprFunctions.h:77
virtual ~EvalFuncScalar()
Defaulted destructor.
Real evaluate(const Real &x) const override
Evaluates the function expression.
Definition: ExprFunctions.C:254
EvalFuncScalar(const char *function, const char *x="x", Real eps=Real(1.0e-8))
The constructor parses the expression string.
Definition: ExprFunctions.C:206
Real deriv(Real x) const override
Returns the first-derivative of the function.
Definition: ExprFunctions.C:281
std::vector< std::unique_ptr< FunctionList > > f
Lists of functions.
Definition: ExprFunctions.h:52
A scalar-valued spatial function, general function expression.
Definition: ExprFunctions.h:94
bool IAmConstant
Indicates whether the time coordinate is given or not.
Definition: ExprFunctions.h:140
bool isConstant() const override
Returns whether the function is time-independent or not.
Definition: ExprFunctions.h:159
std::vector< std::unique_ptr< FunctionList > > f
Lists of functions.
Definition: ExprFunctions.h:107
Real dx
Domain increment for calculation of numerical derivative.
Definition: ExprFunctions.h:142
Real evaluate(const Vec3 &X) const override
Evaluates the function expression.
Definition: ExprFunctions.C:395
void addDerivative(const std::string &function, const std::string &variables, int d1, int d2=0)
Adds an expression function for a first or second derivative.
Definition: ExprFunctions.C:375
EvalFuncSpatial(const char *function, Real epsX=Real(1.0e-8), Real epsT=Real(1.0e-12))
The constructor parses the expression string.
Definition: ExprFunctions.C:319
Vec3 gradient(const Vec3 &X) const override
Evaluates first derivatives of the function.
Definition: ExprFunctions.h:170
std::vector< std::unique_ptr< Expression > > expr
Roots of the expression tree.
Definition: ExprFunctions.h:105
Real dt
Domain increment for calculation of numerical time-derivative.
Definition: ExprFunctions.h:143
Real deriv(const Vec3 &X, int dir) const override
Returns first-derivative of the function.
std::vector< Arg > arg
Function argument values.
Definition: ExprFunctions.h:133
Real dderiv(const Vec3 &X, int dir1, int dir2) const override
Returns second-derivative of the function.
std::array< std::unique_ptr< FuncType >, 6 > derivative2
Second order derivative expressions.
Definition: ExprFunctions.h:138
SymmTensor hessian(const Vec3 &X) const override
Evaluates first derivatives of the function.
Definition: ExprFunctions.h:176
virtual ~EvalFuncSpatial()
Defaulted destructor.
std::array< std::unique_ptr< FuncType >, 4 > derivative1
First order derivative expressions.
Definition: ExprFunctions.h:136
std::vector< std::unique_ptr< ValueList > > v
Lists of variables and constants.
Definition: ExprFunctions.h:109
void setParam(const std::string &name, Real value) override
Sets an additional parameter in the function.
Definition: ExprFunctions.C:579
A base class for multi-component expression functions.
Definition: ExprFunctions.h:193
std::vector< std::unique_ptr< FuncType > > p
Array of component expressions.
Definition: ExprFunctions.h:214
size_t nsd
Number of spatial dimensions.
Definition: ExprFunctions.h:215
void addDerivative(const std::string &functions, const std::string &variables, int d1, int d2=0)
Adds an expression function for a first or second derivative.
Definition: ExprFunctions.C:616
size_t getNoSpaceDim() const
Returns number of spatial dimension.
Definition: ExprFunctions.h:211
EvalFunctions(const std::string &functions, const std::string &variables, const Real epsX, const Real epsT)
The constructor parses the expression string for each component.
Definition: ExprFunctions.C:601
virtual ~EvalFunctions()
Defaulted destructor.
A general spatial expression function of any return type.
Definition: ExprFunctions.h:226
void setParam(const std::string &name, Real value) override
Sets an additional parameter in the function.
Definition: ExprFunctions.h:261
std::vector< Real > evalHessian(const Vec3 &X) const override
Returns the second derivatives of the function as a 1D array.
Definition: ExprFunctions.C:691
Ret evaluate(const Vec3 &X) const override
Evaluates the function expressions.
Definition: ExprFunctions.C:627
bool isConstant() const override
Returns whether the function is time-independent or not.
Definition: ExprFunctions.h:245
unsigned char getType() const override
Returns the function type flag.
Definition: ExprFunctions.h:253
Ret dderiv(const Vec3 &X, int dir1, int dir2) const override
Returns second-derivative of the function.
Definition: ExprFunctions.C:658
EvalMultiFunction(const std::string &functions, const std::string &variables="", const Real epsX=1e-8, const Real epsT=1e-12)
The constructor parses the expression string for each component.
Definition: ExprFunctions.h:232
virtual ~EvalMultiFunction()
Empty destructor.
Definition: ExprFunctions.h:242
std::vector< Real > evalTimeDerivative(const Vec3 &X) const override
Returns the time derivatives of the function as a 1D array.
Definition: ExprFunctions.C:711
void setNoDims()
Sets the number of spatial dimensions (default implementation).
Definition: ExprFunctions.C:638
std::vector< Real > evalGradient(const Vec3 &X) const override
Returns the gradient of the function as a 1D array.
Definition: ExprFunctions.C:671
Ret deriv(const Vec3 &X, int dir) const override
Returns first-derivative of the function.
Definition: ExprFunctions.C:646
Definition: ExprFunctions.h:27
Definition: ExprFunctions.h:28
Definition: ExprFunctions.h:29
Scalar-valued unary function of a spatial point.
Definition: Function.h:193
virtual Vec3 gradient(const Vec3 &X) const
Evaluates first derivatives of the function.
Definition: Function.h:209
virtual SymmTensor hessian(const Vec3 &X) const
Evaluates second derivatives of the function.
Definition: Function.h:219
Scalar-valued unary function of a scalar value.
Definition: Function.h:127
Simple class for representing a symmetric second-order tensor.
Definition: Tensor.h:183
Simple class for representing a point in 3D space.
Definition: Vec3.h:27
A struct representing a spatial function argument.
Definition: ExprFunctions.h:113
Scalar * y
Y-coordinate.
Definition: ExprFunctions.h:115
Scalar * x
X-coordinate.
Definition: ExprFunctions.h:114
const Scalar & get(int dir) const
Returns a const ref to a member.
Definition: ExprFunctions.h:121
Scalar * z
Z-coordinate.
Definition: ExprFunctions.h:116
Scalar * t
Time.
Definition: ExprFunctions.h:117