00001 #ifndef MONTECARLO_H 00002 #define MONTECARLO_H 00003 00004 #include "../wavefunction/wavefunction.h" 00005 #include "../hamiltonian/hamiltonian.h" 00006 00007 class INIParser; 00008 00012 class MonteCarlo 00013 { 00014 public: 00015 MonteCarlo(Config *config); 00016 ~MonteCarlo(); 00017 00018 virtual void sample(int nCycles) = 0; 00019 virtual void loadConfiguration(INIParser *settings); 00020 00021 static MonteCarlo *fromName(string monteCarloClass, Config *config); 00022 00023 double *allEnergies() { 00024 return m_allEnergies; 00025 } 00026 00027 double energy() { 00028 return m_energy; 00029 } 00030 double energySquared() { 00031 return m_energySquared; 00032 } 00033 00034 void setThermalizationEnabled(bool arg) { 00035 terminalized = !arg; 00036 terminalizationTrials = 0; 00037 } 00038 00039 vec2 **moves() { 00040 return m_moves; 00041 } 00042 00043 void setStoreEnergies(bool arg) { 00044 storeEnergies = arg; 00045 } 00046 00047 void setOutputEnergies(bool arg) { 00048 outputEnergies = arg; 00049 } 00050 00051 void checkTerminalization(double localEnergy); 00052 void setRecordMoves(bool arg, int nMoves); 00053 void recordMove(int i, int nthMove); 00054 void randomizePositions(); 00055 00056 protected: 00057 Config *config; 00058 int nParticles; 00059 int nDimensions; 00060 00061 double m_energy; 00062 double m_energySquared; 00063 double *m_allEnergies; 00064 long *idumMC; 00065 00066 double terminalizationSum; 00067 int terminalizationNum; 00068 bool terminalized; 00069 double diffAverage; 00070 00071 double prevTerminalizationAverage; 00072 00073 int terminalizationTrials; 00074 00075 WaveFunction* wave; 00076 Hamiltonian *hamiltonian; 00077 00078 bool recordMoves; 00079 int nMoves; 00080 vec2 **m_moves; 00081 int move; 00082 00083 int cycle; 00084 00085 vec2 *rOld; 00086 vec2 *rNew; 00087 double stepLength; 00088 bool storeEnergies; 00089 double spawnRadius; 00090 00091 bool sampleVariationalGradient; 00092 bool outputEnergies; 00093 }; 00094 00095 #endif // MONTECARLO_H