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
26namespace ExprEval {
27 template<class ArgType> class Expression;
28 template<class ArgType> class FunctionList;
29 template<class ArgType> class ValueList;
30}
31
32
37template<class Scalar>
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
61
62public:
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
82protected:
84 Real evaluate(const Real& x) const override;
85};
86
87
92template<class Scalar>
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
141
144
145public:
147 explicit EvalFuncSpatial(const char* function,
148 Real epsX = Real(1.0e-8), Real epsT = Real(1.0e-12));
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
181protected:
183 Real evaluate(const Vec3& X) const override;
184};
185
186
191template<class Scalar>
193{
194protected:
196
198 EvalFunctions(const std::string& functions, const std::string& variables,
199 const Real epsX, const Real epsT);
203 virtual ~EvalFunctions();
204
205public:
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
213protected:
214 std::vector<std::unique_ptr<FuncType>> p;
215 size_t nsd = 0;
216};
217
218
224template <class ParentFunc, class Ret, class Scalar>
225class EvalMultiFunction : public ParentFunc, public EvalFunctions<Scalar>
226{
229
230public:
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
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
267protected:
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
296template<> 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
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
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
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
typename EvalFunctions< Scalar >::FuncType FuncType
Type alias for the function.
Definition ExprFunctions.h:228
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
const Scalar & get(int dir) const
Returns a const ref to a member.
Definition ExprFunctions.h:121
Scalar * y
Y-coordinate.
Definition ExprFunctions.h:115
Scalar * x
X-coordinate.
Definition ExprFunctions.h:114
Scalar * z
Z-coordinate.
Definition ExprFunctions.h:116
Scalar * t
Time.
Definition ExprFunctions.h:117