00001 #ifndef SLATER_H 00002 #define SLATER_H 00003 00004 #include <armadillo> 00005 using namespace arma; 00006 00007 class Config; 00008 class Orbital; 00009 00015 class Slater 00016 { 00017 public: 00018 Slater(Config *config, Orbital *orbitals[], bool spinUp_); 00019 00020 ~Slater(); 00021 double determinant(vec2 r[]); 00022 void constructMatrix(vec2 r[]); 00023 00024 mat matrix(); 00025 mat inverse(); 00026 void updateInverse(vec2 &particlePosition, int movedParticle); 00027 void calculateInverseNumerically(); 00028 void setPreviousMovedParticle(int movedParticle); 00029 double ratio(vec2 &particlePosition, int movedParticle); 00030 void acceptMove(int movedParticle); 00031 void initialize(vec2 positions[]); 00032 double laplace(vec2 r[]); 00033 void gradient(vec2 r[], vec &rGradient); 00034 bool hasParticle(int particleNumber) const; 00035 void rejectMove(); 00036 void updateMatrix(vec2 &particlePosition, int movedParticle); 00037 private: 00038 vec2 *rOld; 00039 vec2 *rNew; 00040 00041 mat currentMatrix; 00042 mat previousMatrix; 00043 00044 mat currentInverse; 00045 mat previousInverse; 00046 00047 vec2 orbitalGradient; 00048 00049 int nDimensions; 00050 int nParticles; 00051 00052 int previousMovedParticle; 00053 00054 int particleIndexOffset; 00055 00056 Orbital **orbitals; 00057 00058 bool spinUp; 00059 }; 00060 00061 #endif // SLATER_H