VMCUpdatePbyP::RealType VMCUpdatePbyP::advanceWalkerForEE(Walker_t& w1, vector<PosType>& dR, vector<int>& iats, vector<int>& rs, vector<RealType>& ratios) { Walker_t::Buffer_t& w_buffer(w1.DataSet); W.loadWalker(w1,true); Psi.copyFromBuffer(W,w_buffer); vector<RealType> runningratio(3,1.0); int sh(0); int nshells(ratios.size()/3); vector<RealType> orb_ratios; // accumulate ratios on the way there for(int itz(0); itz<(iats.size()-1); itz++) { int iat=iats[itz]; W.makeMove(iat,dR[itz]); RealType ratio = Psi.ratioVector(W,iat,orb_ratios); runningratio[0]*=ratio; runningratio[1]*=orb_ratios[0]; runningratio[2]*=ratio/orb_ratios[0]; W.acceptMove(iat); Psi.acceptMove(W,iat); while(itz+1==rs[sh]) { ratios[sh]=runningratio[0]; ratios[nshells+sh]=runningratio[1]; ratios[nshells*2+sh++]=runningratio[2]; } } //we get to reject the last move { int iat=iats[iats.size()-1]; W.makeMove(iat,dR[iats.size()-1]); RealType ratio = Psi.ratioVector(W,iat,orb_ratios); runningratio[0]*=ratio; runningratio[1]*=orb_ratios[0]; runningratio[2]*=ratio/orb_ratios[0]; W.rejectMove(iat); Psi.rejectMove(iat); while(nshells*2+sh < ratios.size()) { ratios[sh]=runningratio[0]; ratios[nshells+sh]=runningratio[1]; ratios[nshells*2+sh++]=runningratio[2]; } } // put the particles back for(int itz(0); itz<iats.size(); itz++) dR[itz]*=-1; for(int itz(iats.size()-2); itz>=0; itz--) { int iat=iats[itz]; W.makeMove(iat,dR[itz]); RealType ratio = Psi.ratio(W,iat); W.acceptMove(iat); Psi.acceptMove(W,iat); } // Psi.updateBuffer(W,w_buffer,false); // W.saveWalker(thisWalker); return runningratio[0]; }
/* wrapper for R */ void R_runningratio(int *n, double *pos, double *numerator, double *denominator, int *n_result, double *resultpos, double *result, double *window) { runningratio(*n, pos, numerator, denominator, *n_result, resultpos, result, *window); }