Added three more time-dependent functions: RampFunc (replacing LinearTinitFunc), DiracFunc and StepFunc

git-svn-id: http://svn.sintef.no/trondheim/IFEM/trunk@867 e10b68d5-8a6e-419e-a041-bce267b0401d
This commit is contained in:
kmo 2011-03-22 08:10:10 +00:00 committed by Knut Morten Okstad
parent 379cbe00c5
commit 36148701c2
2 changed files with 184 additions and 102 deletions

View File

@ -23,27 +23,41 @@ PressureField::PressureField (real p, int dir) : pdir(dir)
}
real ConstTimeFunc::evaluate (const Vec3& x) const
real RampFunc::evaluate (const real& x) const
{
const Vec4* X = dynamic_cast<const Vec4*>(&x);
return (*tfunc)(X ? X->t : real(0));
return x < xmax ? fval*x/xmax : fval;
}
real SpaceTimeFunc::evaluate (const Vec3& x) const
real DiracFunc::evaluate (const real& x) const
{
const Vec4* X = dynamic_cast<const Vec4*>(&x);
return (*sfunc)(x) * (*tfunc)(X ? X->t : real(0));
return fabs(x-xmax) < 1.0e-4 ? amp : real(0);
}
real LinearTinitFunc::evaluate (const Vec3& x) const
real StepFunc::evaluate (const real& x) const
{
const Vec4* X = dynamic_cast<const Vec4*>(&x);
if (X && X->t < Tinit)
return value*X->t/Tinit;
else
return value;
return x >= xmax ? amp : real(0);
}
real SineFunc::evaluate (const real& x) const
{
return scale*sin(freq*x+phase);
}
real ConstTimeFunc::evaluate (const Vec3& X) const
{
const Vec4* Xt = dynamic_cast<const Vec4*>(&X);
return (*tfunc)(Xt ? Xt->t : real(0));
}
real SpaceTimeFunc::evaluate (const Vec3& X) const
{
const Vec4* Xt = dynamic_cast<const Vec4*>(&X);
return (*sfunc)(X) * (*tfunc)(Xt ? Xt->t : real(0));
}
@ -67,59 +81,68 @@ real LinearZFunc::evaluate (const Vec3& X) const
real QuadraticXFunc::evaluate (const Vec3& X) const
{
real val = 0.5*(a-b);
real val = (a-b)/real(2);
return max*(a-X.x)*(X.x-b)/(val*val);
}
real QuadraticYFunc::evaluate (const Vec3& X) const
{
real val = 0.5*(a-b);
real val = (a-b)/real(2);
return max*(a-X.y)*(X.y-b)/(val*val);
}
real QuadraticZFunc::evaluate (const Vec3& X) const
{
real val = 0.5*(a-b);
real val = (a-b)/real(2);
return max*(a-X.z)*(X.z-b)/(val*val);
}
real LinearRotZFunc::evaluate (const Vec3& _X) const
real LinearRotZFunc::evaluate (const Vec3& X) const
{
// Always return zero if the argument has no time component
const Vec4* X = dynamic_cast<const Vec4*>(&_X);
if (!X) return real(0);
const Vec4* Xt = dynamic_cast<const Vec4*>(&X);
if (!Xt) return real(0);
real x = X->x - x0;
real y = X->y - y0;
real c = cos(A*X->t);
real s = sin(A*X->t);
real x = X.x - x0;
real y = X.y - y0;
real c = cos(A*Xt->t);
real s = sin(A*Xt->t);
return rX ? x*c-y*s-x : x*s+y*c-y;
}
real StepXFunc::evaluate (const Vec3& X) const
{
return X.x < x0 || X.x > x1 ? 0.0 : fv;
return X.x < x0 || X.x > x1 ? real(0) : fv;
}
real StepXYFunc::evaluate (const Vec3& X) const
{
return X.x < x0 || X.x > x1 || X.y < y0 || X.y > y1 ? 0.0 : fv;
return X.x < x0 || X.x > x1 || X.y < y0 || X.y > y1 ? real(0) : fv;
}
/*!
The functions is assumed on the general form
\f[ f({\bf X},t) = A * g({\bf X}) * h(t) \f]
The character string \a cline is assumed to contain first the definition
of the spatial function \a g( \b X ) and then the time function \a h(t).
Either of the two components may be omitted, for creating a space-function
constant in time, or a time function constant in space.
*/
const RealFunc* utl::parseRealFunc (char* cline, real A)
{
// Check for spatial variation
int linear = 0;
int quadratic = 0;
if (!cline)
linear = -1;
return 0;
else if (strcmp(cline,"X") == 0)
linear = 1;
else if (strcmp(cline,"Y") == 0)
@ -130,18 +153,16 @@ const RealFunc* utl::parseRealFunc (char* cline, real A)
linear = 4;
else if (strcmp(cline,"YrotZ") == 0)
linear = 5;
else if (strcmp(cline,"Tinit") == 0)
else if (strcmp(cline,"StepX") == 0)
linear = 6;
else if (strcmp(cline,"StepXY") == 0)
linear = 7;
else if (strcmp(cline,"quadX") == 0)
quadratic = 1;
else if (strcmp(cline,"quadY") == 0)
quadratic = 2;
else if (strcmp(cline,"quadZ") == 0)
quadratic = 3;
else if (strcmp(cline,"StepX") == 0)
linear = 7;
else if (strcmp(cline,"StepXY") == 0)
linear = 8;
real C = A;
const RealFunc* f = 0;
@ -170,28 +191,24 @@ const RealFunc* utl::parseRealFunc (char* cline, real A)
f = new LinearRotZFunc(false,A,atof(cline),atof(strtok(NULL," ")));
break;
case 6:
std::cout <<"RampT("<< cline <<"))";
f = new LinearTinitFunc(A,atof(cline));
break;
case 7:
std::cout <<"StepX("<< cline <<"))";
f = new StepXFunc(A,atof(cline),atof(strtok(NULL," ")));
break;
case 8:
case 7:
std::cout <<"StepXY("<< cline <<"))";
f = new StepXYFunc(A,atof(cline),atof(strtok(NULL," ")));
break;
}
cline = strtok(NULL," ");
}
else if (quadratic && (cline = strtok(NULL," ")))
else if (quadratic > 0 && (cline = strtok(NULL," ")))
{
C = real(1);
real a = atof(cline);
real b = atof(strtok(NULL," "));
real val = 0.5*(a-b);
val *= val;
std::cout << A/val << "*(" << char('W' + quadratic) << "-" << a << ")*("
<< b << "-" << char('W' + quadratic) << ")";
real val = (a-b)*(a-b)/real(4);
char var = 'W' + quadratic;
std::cout << A/val <<" * ("<< a <<"-"<< var <<")*("<< b <<"-"<< var <<")";
switch (quadratic) {
case 1:
f = new QuadraticXFunc(A,a,b);
@ -205,23 +222,51 @@ const RealFunc* utl::parseRealFunc (char* cline, real A)
}
cline = strtok(NULL," ");
}
if (quadratic == 0)
else // constant in space
std::cout << C;
// Check for time variation
if (!cline) return f;
if (!cline) return f; // constant in time
const ScalarFunc* s = 0;
double freq = atof(cline);
if (strncmp(cline,"Ramp",4) == 0 || strcmp(cline,"Tinit") == 0)
{
real xmax = atof(strtok(NULL," "));
std::cout <<" * Ramp(t,"<< xmax <<")";
s = new RampFunc(C,xmax);
}
else if (strncmp(cline,"Dirac",5) == 0)
{
real xmax = atof(strtok(NULL," "));
std::cout <<" * Dirac(t,"<< xmax <<")";
s = new DiracFunc(C,xmax);
}
else if (strncmp(cline,"Step",4) == 0)
{
real xmax = atof(strtok(NULL," "));
std::cout <<"Step(t,"<< xmax <<")";
s = new StepFunc(C,xmax);
}
else if (strcmp(cline,"sin") == 0)
{
real freq = atof(strtok(NULL," "));
if ((cline = strtok(NULL," ")))
{
std::cout <<" * sin("<< freq <<"*t + "<< cline <<")";
s = new SineFunc(C,freq,atof(cline));
real phase = atof(cline);
std::cout <<" * sin("<< freq <<"*t + "<< phase <<")";
s = new SineFunc(C,freq,phase);
}
else
{
std::cout <<" * "<< freq <<"*t";
s = new LinearFunc(C*freq);
std::cout <<" * sin("<< freq <<"*t)";
s = new SineFunc(C,freq);
}
}
else // linear in time
{
real scale = atof(cline);
std::cout <<" * "<< scale <<"*t";
s = new LinearFunc(C*scale);
}
if (f)

View File

@ -15,11 +15,10 @@
#define _FUNCTIONS_H
#include "Function.h"
#include <math.h>
/*!
\brief A linear scalar function.
\brief A scalar-valued linear function.
*/
class LinearFunc : public ScalarFunc
@ -31,13 +30,70 @@ public:
LinearFunc(real s = real(1)) : scale(s) {}
protected:
//! \brief Evaluates the scalar function.
//! \brief Evaluates the function at \a x.
virtual real evaluate(const real& x) const { return scale*x; }
};
/*!
\brief A sinusoidal scalar function.
\brief A scalar-valued ramp function, linear up to \a xmax.
*/
class RampFunc : public ScalarFunc
{
real fval; //!< Max function value
real xmax; //!< Function is linear from \a x = 0 to \a x = \a xmax
public:
//! \brief Constructor initializing the function parameters.
RampFunc(real f = real(1), real x = real(1)) : fval(f), xmax(x) {}
protected:
//! \brief Evaluates the function at \a x.
virtual real evaluate(const real& x) const;
};
/*!
\brief A scalar-valued dirac function.
*/
class DiracFunc : public ScalarFunc
{
real amp; //!< The amplitude of the dirac function
real xmax; //!< Associated \a x value
public:
//! \brief Constructor initializing the function parameters.
DiracFunc(real a = real(1), real x = real(0)) : amp(a), xmax(x) {}
protected:
//! \brief Evaluates the function at \a x.
virtual real evaluate(const real& x) const;
};
/*!
\brief A scalar-valued step function.
*/
class StepFunc : public ScalarFunc
{
real amp; //!< The amplitude of the step function
real xmax; //!< Associated \a x value
public:
//! \brief Constructor initializing the function parameters.
StepFunc(real a, real x = real(0)) : amp(a), xmax(x) {}
protected:
//! \brief Evaluates the function at \a x.
virtual real evaluate(const real& x) const;
};
/*!
\brief A scalar-valued sinusoidal function.
*/
class SineFunc : public ScalarFunc
@ -52,13 +108,13 @@ public:
: scale(s), freq(f), phase(p) {}
protected:
//! \brief Evaluates the scalar function.
virtual real evaluate(const real& x) const { return scale*sin(freq*x+phase); }
//! \brief Evaluates the function at \a x.
virtual real evaluate(const real& x) const;
};
/*!
\brief A scalar function, constant in space and time.
\brief A scalar-valued spatial function, constant in space and time.
*/
class ConstFunc : public RealFunc
@ -76,7 +132,7 @@ protected:
/*!
\brief A scalar function, constant in space but varying in time.
\brief A scalar-valued spatial function, constant in space, varying in time.
*/
class ConstTimeFunc : public RealFunc
@ -91,12 +147,12 @@ public:
protected:
//! \brief Evaluates the time-varying function.
virtual real evaluate(const Vec3& x) const;
virtual real evaluate(const Vec3& X) const;
};
/*!
\brief A scalar function, varying in space and time.
\brief A scalar-valued spatial function, varying in space and time.
\details The function value is defined as a product between one
space-dependent component and one time-dependent component.
*/
@ -114,31 +170,12 @@ public:
protected:
//! \brief Evaluates the space-time function.
virtual real evaluate(const Vec3& x) const;
virtual real evaluate(const Vec3& X) const;
};
/*!
\brief A scalar function, linear in \a t up to \a Tinit.
*/
class LinearTinitFunc : public RealFunc
{
real value; //!< Max function value
real Tinit; //!< Function is linear from t = 0 to t = Tinit
public:
//! \brief Constructor initializing the function parameters.
LinearTinitFunc(real value_, real Tinit_) : value(value_), Tinit(Tinit_) {}
protected:
//! \brief Evaluates the linear function.
virtual real evaluate(const Vec3& x) const;
};
/*!
\brief A scalar function, linear in \a x.
\brief A scalar-valued spatial function, linear in \a x.
*/
class LinearXFunc : public RealFunc
@ -157,7 +194,7 @@ protected:
/*!
\brief A scalar function, linear in \a y.
\brief A scalar-valued spatial function, linear in \a y.
*/
class LinearYFunc : public RealFunc
@ -176,7 +213,7 @@ protected:
/*!
\brief A scalar function, linear in \a z.
\brief A scalar-valued spatial function, linear in \a z.
*/
class LinearZFunc : public RealFunc
@ -195,7 +232,7 @@ protected:
/*!
\brief A scalar function, quadratic in \a x.
\brief A scalar-valued spatial function, quadratic in \a x.
*/
class QuadraticXFunc : public RealFunc
@ -215,7 +252,7 @@ protected:
/*!
\brief A scalar function, quadratic in \a y.
\brief A scalar-valued spatial function, quadratic in \a y.
*/
class QuadraticYFunc : public RealFunc
@ -235,7 +272,7 @@ protected:
/*!
\brief A scalar function, quadratic in \a x.
\brief A scalar-valued spatial function, quadratic in \a z.
*/
class QuadraticZFunc : public RealFunc
@ -255,11 +292,11 @@ protected:
/*!
\brief A scalar function, defining a linear rotation about the global Z-axis.
\brief A scalar-valued spatial function, defining a rotation about the Z-axis.
\details The time component of the function argument multiplied with the
function parameter \a A, is interpreted as the angle of rotation (in radians)
about the Z-axis passing through the point \a x0, \a y0.
The function then returns the translation in either \a x or \a y direction
about the global Z-axis passing through the point \a x0, \a y0.
The function then returns the translation in either X- or Y-direction
(depending on the \a retX argument to the constructor) of the global point
{ \a X.x, \a X.y } corresponding to this rotation.
\note If the function is passed a Vec3 object as argument (and not a Vec4),
@ -268,10 +305,10 @@ protected:
class LinearRotZFunc : public RealFunc
{
bool rX; //!< Flag telling whether to return the X (true) or Y component
bool rX; //!< Flag telling whether to return the X- (true) or Y-component
real A; //!< Magnitude of the rotation
real x0; //!< Global x-coordinate of rotation centre
real y0; //!< Global y-coordinate of rotation centre
real x0; //!< Global X-coordinate of rotation centre
real y0; //!< Global Y-coordinate of rotation centre
public:
//! \brief Constructor initializing the function parameters.
@ -285,7 +322,7 @@ protected:
/*!
\brief A scalar function, step in \a x.
\brief A scalar-valued spatial function, step in \a x.
*/
class StepXFunc : public RealFunc
@ -300,13 +337,13 @@ public:
: fv(v), x0(X0), x1(X1) {}
protected:
//! \brief Evaluates the linear function.
//! \brief Evaluates the step function.
virtual real evaluate(const Vec3& X) const;
};
/*!
\brief A scalar function, step in \a x and \a y.
\brief A scalar-valued spatial function, step in \a x and \a y.
*/
class StepXYFunc : public RealFunc
@ -325,15 +362,15 @@ public:
: fv(v), x0(X0), y0(Y0), x1(X1), y1(Y1) {}
protected:
//! \brief Evaluates the linear function.
//! \brief Evaluates the step function.
virtual real evaluate(const Vec3& X) const;
};
namespace utl
{
//! \brief Creates a real function by parsing data from a character string.
const RealFunc* parseRealFunc(char* cline, real A = real(0));
//! \brief Creates a scalar-valued function by parsing a character string.
const RealFunc* parseRealFunc(char* cline, real A = real(1));
}
#endif