#ifndef XT_FUNCTION_H
#define XT_FUNCTION_H
#include <cmath>
#include <string>
#include <set>
#include <cstdlib>
#include <iostream>
#include "Array.h"
#include "ATC_TypeDefs.h"
namespace ATC {
class Function {
public:
Function(int nargs, char** args);
virtual ~Function(void) {};
const std::string & tag() { return tag_;}
virtual inline ARG_NAMES args(void) {ARG_NAMES names; return names;};
virtual inline double dfd(FieldName field, ARGS& args ) {return 0.0;};
virtual inline void dfd(FieldName field, ARGS& args, DENS_MAT vals ) {};
protected:
std::string tag_;
};
class Function_Mgr {
public:
static Function_Mgr * instance();
Function* function(char ** arg, int nargs);
Function* copy_function(Function* other);
protected:
Function_Mgr() {};
~Function_Mgr();
private:
static Function_Mgr * myInstance_;
std::set<Function * > pointerSet_;
};
class LinearFieldFunction : public Function {
public:
LinearFieldFunction(int nargs, char** args);
virtual ~LinearFieldFunction(void) {};
inline double f(double* u, double* x, double t) {return c1_*u[0]-c0_;}
inline double dfd(FieldName field, ARGS& args) {return c1_;}
private :
double c0_,c1_;
};
class UXT_Function {
public:
UXT_Function(int nargs, double* args);
virtual ~UXT_Function(void) {};
const std::string & tag() { return tag_;}
virtual inline double f(double * u, double* x, double t) {return 0.0;};
virtual inline double dfdu(double * u, double* x, double t) {return 0.0;};
protected:
std::string tag_;
};
class UXT_Function_Mgr {
public:
static UXT_Function_Mgr * instance();
UXT_Function* function(std::string & type, int nargs, double * arg);
UXT_Function* function(char ** arg, int nargs);
UXT_Function* linear_function(double c0, double c1);
UXT_Function* copy_UXT_function(UXT_Function* other);
protected:
UXT_Function_Mgr() {};
~UXT_Function_Mgr();
private:
static UXT_Function_Mgr * myInstance_;
std::set<UXT_Function * > pointerSet_;
};
class ScalarLinearFunction : public UXT_Function {
public:
ScalarLinearFunction(int nargs, double* args);
virtual ~ScalarLinearFunction(void) {};
inline double f(double* u, double* x, double t) {return c1_*u[0]+c0_;}
inline double dfdu(double* u, double* x, double t) {return c1_;}
private :
double c0_,c1_;
};
class XT_Function {
public:
XT_Function(int nargs, double* args);
virtual ~XT_Function(void) {};
const std::string & tag() { return tag_;}
virtual inline double f(double* x, double t) {return 0.0;};
virtual inline double dfdt(double* x, double t) {return 0.0;};
virtual inline double ddfdt(double* x, double t) {return 0.0;};
virtual inline double dddfdt(double* x, double t) {return 0.0;};
protected:
double mask[3], x0[3];
std::string tag_;
};
class XT_Function_Mgr {
public:
static XT_Function_Mgr * instance();
XT_Function* function(std::string & type, int nargs, double * arg);
XT_Function* function(char ** arg, int nargs);
XT_Function* constant_function(double c);
XT_Function* copy_XT_function(XT_Function* other);
protected:
XT_Function_Mgr() {};
~XT_Function_Mgr();
private:
static XT_Function_Mgr * myInstance_;
std::set<XT_Function * > pointerSet_;
};
class ConstantFunction : public XT_Function {
public:
ConstantFunction(int nargs, double* args);
ConstantFunction(double arg);
virtual ~ConstantFunction(void) {};
inline double f(double* x, double t)
{return C0;};
private :
double C0;
};
class LinearFunction : public XT_Function {
public:
LinearFunction(int nargs, double* args);
virtual ~LinearFunction(void) {};
double f(double* x, double t)
{return mask[0]*(x[0]-x0[0])+mask[1]*(x[1]-x0[1])+mask[2]*(x[2]-x0[2]) + C0;};
private :
double C0;
};
class PiecewiseLinearFunction : public XT_Function {
public:
PiecewiseLinearFunction(int nargs, double* args);
virtual ~PiecewiseLinearFunction(void) {};
double f(double* x, double t) ;
private :
Array<double> xi;
Array<double> fi;
};
class LinearTemporalRamp : public XT_Function {
public:
LinearTemporalRamp(int nargs, double* args);
~LinearTemporalRamp(void) {};
double f(double* x, double t);
double dfdt(double* x, double t);
protected :
double mask_slope[3];
double C0_initial, C0_slope;
};
class QuadraticFunction : public XT_Function {
public:
QuadraticFunction(int nargs, double* args);
virtual ~QuadraticFunction(void) {};
inline double f(double* x, double t)
{return
C2[0]*(x[0]-x0[0])*(x[0]-x0[0])+
C2[1]*(x[1]-x0[1])*(x[1]-x0[1])+
C2[2]*(x[2]-x0[2])*(x[2]-x0[2])+
2.0*C2[3]*(x[0]-x0[0])*(x[1]-x0[1]) +
2.0*C2[4]*(x[0]-x0[0])*(x[2]-x0[2]) +
2.0*C2[5]*(x[1]-x0[1])*(x[2]-x0[2]) +
mask[0]*(x[0]-x0[0])+mask[1]*(x[1]-x0[1])+mask[2]*(x[2]-x0[2]) + C0;};
private :
double C0, C2[6]; };
class SineFunction : public XT_Function {
public:
SineFunction(int nargs, double* args);
virtual ~SineFunction(void){};
inline double f(double* x, double t)
{return C*sin( mask[0]*(x[0]-x0[0])
+mask[1]*(x[1]-x0[1])
+mask[2]*(x[2]-x0[2]) - w*t) + C0;};
private :
double C, C0, w;
};
class GaussianFunction : public XT_Function {
public:
GaussianFunction(int nargs, double* args);
virtual ~GaussianFunction(void){};
inline double f(double* x, double t)
{return C*exp(-(mask[0]*(x[0]-x0[0])*(x[0]-x0[0])
+mask[1]*(x[1]-x0[1])*(x[1]-x0[1])
+mask[2]*(x[2]-x0[2])*(x[2]-x0[2]))/tau/tau) + C0;};
protected:
double tau, C, C0;
};
class GaussianTemporalRamp : public GaussianFunction {
public:
GaussianTemporalRamp(int nargs, double* args);
virtual ~GaussianTemporalRamp(void){};
double f(double* x, double t);
double dfdt(double* x, double t);
protected:
double tau_initial, tau_slope;
double C_initial, C_slope;
double C0_initial, C0_slope;
};
class TemporalRamp : public XT_Function {
public:
TemporalRamp(int nargs, double* args);
virtual ~TemporalRamp(void) {};
inline double f(double* x, double t)
{return f_initial + slope*t;};
inline double dfdt(double* x, double t)
{return slope;};
private :
double f_initial, slope;
};
class RadialPower : public XT_Function {
public:
RadialPower(int nargs, double* args);
virtual ~RadialPower(void) {};
inline double f(double* x, double t)
{
double dx = x[0]-x0[0]; double dy = x[1]-x0[1]; double dz = x[2]-x0[2];
double r = mask[0]*dx*dx+mask[1]*dy*dy+mask[2]*dz*dz; r = sqrt(r);
return C0*pow(r,n);
};
private :
double C0, n;
};
class InterpolationFunction {
public:
InterpolationFunction(void) : npts_(0) {};
virtual ~InterpolationFunction(void) {};
void initialize(int npts,std::fstream &fileId, double coef = 1.);
double f(const double t) const;
double dfdt(const double t) const;
protected:
double coordinate(double x,
double & f0, double & fp0, double & f1, double & fp1, double & inv_dx) const;
int npts_;
Array<double> xs_;
Array<double> fs_;
Array<double> fps_;
};
}
#endif