00001 #ifndef HAMILTONIAN_H 00002 #define HAMILTONIAN_H 00003 00004 #include <string> 00005 #include <armadillo> 00006 using namespace arma; 00007 00008 using namespace std; 00009 00010 class WaveFunction; 00011 class Config; 00012 00016 class Hamiltonian 00017 { 00018 public: 00019 Hamiltonian(Config *config); 00020 virtual double energy(WaveFunction *wave, vec2 r[]) { 00021 double potEnergy = potentialEnergy(wave, r); 00022 double kinEnergy = kineticEnergy(wave, r); 00023 m_totalPotentialEnergy += potEnergy; 00024 m_totalKineticEnergy += kinEnergy; 00025 return potEnergy + kinEnergy; 00026 } 00027 virtual double potentialEnergy(WaveFunction *wave, vec2 r[]) = 0; 00028 virtual double kineticEnergy(WaveFunction *wave, vec2 r[]) = 0; 00029 virtual void resetTotalEnergies(); 00030 virtual void outputTotals(); 00031 virtual string totalsString(); 00032 double totalPotentialEnergy () { 00033 return m_totalPotentialEnergy; 00034 } 00035 double totalKineticEnergy () { 00036 return m_totalKineticEnergy; 00037 } 00038 00039 static Hamiltonian *fromName(string hamiltonianClass, Config *config); 00040 protected: 00041 int m_nParticles; 00042 int m_nDimensions; 00043 bool m_interactionEnabled; 00044 double m_totalPotentialEnergy; 00045 double m_totalKineticEnergy; 00046 }; 00047 00048 #endif // HAMILTONIAN_H