blob: e09379972370ccc1381264cff59bde4176abc9e6 [file] [log] [blame]
#ifndef FORCELAW_H
#define FORCELAW_H
#include <stdlib.h>
#include <math.h>
#include <assert.h>
using namespace std;
class FGrid {
public:
FGrid();
~FGrid(){
};
float fgor(float r);
void fgor_r2_interp(int nInterp, float **r2, float **f);
float rmax(){return m_rmax;};
protected:
float m_b, m_c, m_d, m_e, m_f, m_g, m_h, m_l, m_rmax;
};
class FGridEval
{
public:
FGridEval() {};
virtual ~FGridEval() {};
virtual float eval(float) = 0;
virtual float r2min() = 0;
virtual float r2max() = 0;
};
class FGridEvalFit : public FGridEval
{
public:
FGridEvalFit(FGrid *fg);
~FGridEvalFit() {};
float eval(float);
float r2min(){return 0.0;};
float r2max(){return m_fg->rmax()*m_fg->rmax();};
protected:
FGrid *m_fg;
};
class FGridEvalPoly : public FGridEval
{
public:
FGridEvalPoly(FGrid *fg);
~FGridEvalPoly() {
};
float eval(float);
float r2min(){return 0.0;};
float r2max(){return m_fg->rmax()*m_fg->rmax();};
protected:
FGrid *m_fg;
float m_r2min, m_r2max;
//float m_a0, m_a1, m_a2, m_a3, m_a4, m_a5, m_a6;
float m_a[7];
};
class FGridEvalInterp : public FGridEval
{
public:
FGridEvalInterp(FGrid *fg, int nInterp);
~FGridEvalInterp();
float eval(float);
float r2min(){return m_r2min;}
float r2max(){return m_r2max;}
int nInterp() {return m_nInterp;}
float* r2() {return m_r2;}
float* f() {return m_f;}
protected:
float *m_r2;
float *m_f;
float m_r2min;
float m_r2max;
float m_dr2;
float m_oodr2;
int m_nInterp;
};
class ForceLaw
{
public:
ForceLaw(){};
virtual ~ForceLaw(){};
virtual float f_over_r(float r2) = 0;
};
class ForceLawNewton : public ForceLaw
{
public:
~ForceLawNewton() {
};
float f_over_r(float r2){return 1.0/r2/sqrt(r2);}
};
class ForceLawSR : public ForceLaw
{
public:
ForceLawSR(FGridEval *fgore, float rsm);
~ForceLawSR() {
};
float f_over_r(float r2);
protected:
float m_rsm;
float m_rsm2;
float m_r2min;
float m_r2max;
FGridEval *m_fgore;
};
#endif