00001 #ifndef WAVEFUNCTION_H
00002 #define WAVEFUNCTION_H
00003
00004 #include <armadillo>
00005 using namespace arma;
00006
00007 #include <string>
00008 using namespace std;
00009
00010 class INIParser;
00011 class Config;
00012
00016 class WaveFunction
00017 {
00018 public:
00019 WaveFunction(Config *config);
00020 virtual double evaluate(vec2 r[]) = 0;
00021 virtual void gradient(vec2 r[], vec &rGradient) {
00022 gradientNumerical(r, rGradient);
00023 }
00024 virtual double laplace(vec2 r[]) {
00025 return laplaceNumerical(r);
00026 }
00027 virtual WaveFunction* clone() = 0;
00028 virtual void loadConfiguration(INIParser *settings);
00029 virtual double laplaceNumerical(vec2 r[]);
00030 virtual void gradientNumerical(vec2 r[], vec &rGradient);
00031 virtual void setParameters(double *parameters);
00032 static WaveFunction* fromName(string waveClass, Config *config);
00033
00034 virtual double ratio(vec2 &particlePosition, int movedParticle);
00035 virtual void acceptMove(int movedParticle);
00036 virtual void rejectMove();
00037 virtual void initialize(vec2 r[]);
00038 virtual void prepareGradient(vec2 &particlePosition, int movedParticle) {
00039 (void) movedParticle;
00040 (void) particlePosition;
00041 }
00042
00043 void setUseAnalyticalLaplace(bool val) {
00044 useAnalyticalLaplace = val;
00045 }
00046
00047 void setUseAnalyticalGradient(bool val) {
00048 useAnalyticalGradient = val;
00049 }
00050
00051 ~WaveFunction();
00052 virtual void outputProperties();
00053 protected:
00054 Config *config;
00055 int nParticles;
00056 int nDimensions;
00057 double *parameters;
00058 vec2 *rPlus;
00059 vec2 *rMinus;
00060
00061 vec2 *rNew;
00062 vec2 *rOld;
00063 double previousEvaluation;
00064 double currentEvaluation;
00065
00066 bool useAnalyticalLaplace;
00067 bool useAnalyticalGradient;
00068 };
00069
00070 #endif // WAVEFUNCTION_H