#ifndef KERNEL_FUNCTION_H
#define KERNEL_FUNCTION_H
#include <set>
#include "LammpsInterface.h"
#include "MatrixLibrary.h"
namespace ATC {
class KernelFunctionMgr {
public:
static KernelFunctionMgr * instance();
class KernelFunction* function(char** arg, int nargs);
protected:
KernelFunctionMgr() {};
~KernelFunctionMgr();
private:
static KernelFunctionMgr * myInstance_;
std::set<KernelFunction*> pointerSet_;
};
class KernelFunction {
public:
KernelFunction(int nparameters, double* parameters);
virtual ~KernelFunction() {};
virtual double value(DENS_VEC& x_atom) const =0 ;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const =0 ;
virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const;
virtual void bond_intercepts(DENS_VEC& xa,
DENS_VEC& xb, double &lam1, double &lam2) const;
virtual bool node_contributes(DENS_VEC node) const;
virtual bool in_support(DENS_VEC node) const;
double inv_vol(void) const { return invVol_; }
virtual double dimensionality_factor(void) const { return 1.; }
protected:
double invVol_; double Rc_, invRc_; int nsd_ ;
LammpsInterface * lammpsInterface_;
int periodicity[3];
double box_bounds[2][3];
double box_length[3];
};
class KernelFunctionStep : public KernelFunction {
public:
KernelFunctionStep(int nparameters, double* parameters);
virtual ~KernelFunctionStep() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const
{ return lam2-lam1; }
};
class KernelFunctionCell : public KernelFunction {
public:
KernelFunctionCell(int nparameters, double* parameters);
virtual ~KernelFunctionCell() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double bond(DENS_VEC& xa, DENS_VEC&xb, double lam1, double lam2) const
{return lam2 -lam1;}
void bond_intercepts(DENS_VEC& xa, DENS_VEC& xb,
double &lam1, double &lam2) const;
bool node_contributes(DENS_VEC node) const;
bool in_support(DENS_VEC dx) const;
protected:
double hx, hy, hz;
DENS_VEC cellBounds_;
};
class KernelFunctionCubicSphere : public KernelFunction {
public:
KernelFunctionCubicSphere(int nparameters, double* parameters);
virtual ~KernelFunctionCubicSphere() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
};
class KernelFunctionQuarticSphere : public KernelFunction {
public:
KernelFunctionQuarticSphere(int nparameters, double* parameters);
virtual ~KernelFunctionQuarticSphere() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
};
class KernelFunctionCubicCyl : public KernelFunction {
public:
KernelFunctionCubicCyl(int nparameters, double* parameters);
virtual ~KernelFunctionCubicCyl() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.5; }
};
class KernelFunctionQuarticCyl : public KernelFunction {
public:
KernelFunctionQuarticCyl(int nparameters, double* parameters);
virtual ~KernelFunctionQuarticCyl() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.5; }
};
class KernelFunctionCubicBar : public KernelFunction {
public:
KernelFunctionCubicBar(int nparameters, double* parameters);
virtual ~KernelFunctionCubicBar() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.25; }
};
class KernelFunctionLinearBar : public KernelFunction {
public:
KernelFunctionLinearBar(int nparameters, double* parameters);
virtual ~KernelFunctionLinearBar() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.25; }
};
class KernelFunctionQuarticBar : public KernelFunction {
public:
KernelFunctionQuarticBar(int nparameters, double* parameters);
virtual ~KernelFunctionQuarticBar() {};
virtual double value(DENS_VEC& x_atom) const;
virtual void derivative(const DENS_VEC& x_atom, DENS_VEC& deriv) const;
virtual double dimensionality_factor(void) const { return 0.25; }
};
};
#endif