QMCPACK
CSVMCUpdateAll.cpp
Go to the documentation of this file.
1 //////////////////////////////////////////////////////////////////////////////////////
2 // This file is distributed under the University of Illinois/NCSA Open Source License.
3 // See LICENSE file in top directory for details.
4 //
5 // Copyright (c) 2016 Jeongnim Kim and QMCPACK developers.
6 //
7 // File developed by: Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
8 // Jeongnim Kim, jeongnim.kim@gmail.com, University of Illinois at Urbana-Champaign
9 // Raymond Clay III, j.k.rofling@gmail.com, Lawrence Livermore National Laboratory
10 // Mark A. Berrill, berrillma@ornl.gov, Oak Ridge National Laboratory
11 //
12 // File created by: Jeremy McMinnis, jmcminis@gmail.com, University of Illinois at Urbana-Champaign
13 //////////////////////////////////////////////////////////////////////////////////////
14 
15 
16 #include "CSVMCUpdateAll.h"
18 //#include "Utilities/OhmmsInfo.h"
19 //#include "Particle/MCWalkerConfiguration.h"
20 //#include "Particle/HDFWalkerIO.h"
21 //#include "ParticleBase/ParticleUtility.h"
22 //#include "ParticleBase/RandomSeqGenerator.h"
23 //#include "ParticleBase/ParticleAttribOps.h"
24 //#include "Message/Communicate.h"
25 //#include "Estimators/MultipleEnergyEstimator.h"
27 
28 namespace qmcplusplus
29 {
31 
32 /// Constructor.
34  std::vector<TrialWaveFunction*>& psi,
35  std::vector<QMCHamiltonian*>& h,
37  : CSUpdateBase(w, psi, h, rg)
38 {
39  UpdatePbyP = false;
40 }
41 
42 void CSVMCUpdateAll::advanceWalker(Walker_t& thisWalker, bool recompute)
43 {
45  //create a 3N-Dimensional Gaussian with variance=1
47 
48  RealType tau_over_mass = std::sqrt(Tau * MassInvS[0]);
49 
50  if (!W.makeMoveAllParticles(thisWalker, deltaR, tau_over_mass))
51  {
52  for (int ipsi = 0; ipsi < nPsi; ipsi++)
53  H1[ipsi]->rejectedMove(W, thisWalker);
54  return;
55  }
56 
57  //Evaluate Psi and graidients and laplacians
58  //\f$\sum_i \ln(|psi_i|)\f$ and catching the sign separately
59  for (int ipsi = 0; ipsi < nPsi; ipsi++)
60  {
61  logpsi[ipsi] = Psi1[ipsi]->evaluateLog(W);
62  Psi1[ipsi]->L = W.L;
63  Psi1[ipsi]->G = W.G;
64 
65  *G1[ipsi] = W.G;
66  *L1[ipsi] = W.L;
67  sumratio[ipsi] = 1.0;
68  }
69  // Compute the sum over j of Psi^2[j]/Psi^2[i] for each i
70  for (int ipsi = 0; ipsi < nPsi - 1; ipsi++)
71  {
72  for (int jpsi = ipsi + 1; jpsi < nPsi; jpsi++)
73  {
74  RealType ratioij = avgNorm[ipsi] / avgNorm[jpsi] * std::exp(2.0 * (logpsi[jpsi] - logpsi[ipsi]));
75  sumratio[ipsi] += ratioij;
76  sumratio[jpsi] += 1.0 / ratioij;
77  }
78  }
79  for (int ipsi = 0; ipsi < nPsi; ipsi++)
80  {
81  invsumratio[ipsi] = 1.0 / sumratio[ipsi];
82  cumNorm[ipsi] += invsumratio[ipsi];
83  }
84 
85  for (int ipsi = 0; ipsi < nPsi; ipsi++)
86  cumNorm[ipsi] += invsumratio[ipsi];
87 
88  RealType g = sumratio[0] / thisWalker.Multiplicity * std::exp(2.0 * (logpsi[0] - thisWalker.Properties(WP::LOGPSI)));
89 
90  if (Random() > g)
91  {
92  thisWalker.Age++;
93  ++nReject;
94  for (int ipsi = 0; ipsi < nPsi; ipsi++)
95  H1[ipsi]->rejectedMove(W, thisWalker);
96  }
97  else
98  {
99  thisWalker.Age = 0;
100  thisWalker.Multiplicity = sumratio[0];
101  thisWalker.R = W.R;
102  for (int ipsi = 0; ipsi < nPsi; ipsi++)
103  {
104  W.L = *L1[ipsi];
105  W.G = *G1[ipsi];
106 
107  RealType et = H1[ipsi]->evaluate(W);
108  thisWalker.Properties(ipsi, WP::LOGPSI) = logpsi[ipsi];
109  thisWalker.Properties(ipsi, WP::SIGN) = Psi1[ipsi]->getPhase();
110  thisWalker.Properties(ipsi, WP::UMBRELLAWEIGHT) = invsumratio[ipsi];
111  thisWalker.Properties(ipsi, WP::LOCALENERGY) = et;
112  H1[ipsi]->auxHevaluate(W, thisWalker);
113  H1[ipsi]->saveProperty(thisWalker.getPropertyBase(ipsi));
114  }
115  ++nAccept;
116  }
117 }
118 
119 
121  std::vector<TrialWaveFunction*>& psi,
122  std::vector<QMCHamiltonian*>& h,
124  : CSUpdateBase(w, psi, h, rg)
125 {
126  UpdatePbyP = false;
127 }
128 
129 void CSVMCUpdateAllWithDrift::advanceWalker(Walker_t& thisWalker, bool recompute)
130 {
131  //create a 3N-Dimensional Gaussian with variance=1
132  W.loadWalker(thisWalker, false);
135 
136  Walker_t::ParticleGradient cumGrad(W.G);
137  cumGrad = 0.0;
138 
139  RealType tau_over_mass = std::sqrt(Tau * MassInvS[0]);
140 
142  {
143  for (int ipsi = 1; ipsi < nPsi; ipsi++)
144  H1[ipsi]->rejectedMove(W, thisWalker);
145  return;
146  }
147 
148 
149  RealType logGf = -0.5 * Dot(deltaR, deltaR);
150 
151  //Evaluate Psi and graidients and laplacians
152  //\f$\sum_i \ln(|psi_i|)\f$ and catching the sign separately
153  for (int ipsi = 0; ipsi < nPsi; ipsi++)
154  {
155  logpsi[ipsi] = Psi1[ipsi]->evaluateLog(W);
156  Psi1[ipsi]->L = W.L;
157  Psi1[ipsi]->G = W.G;
158  *G1[ipsi] = W.G;
159  *L1[ipsi] = W.L;
160  sumratio[ipsi] = 1.0;
161  }
162  // Compute the sum over j of Psi^2[j]/Psi^2[i] for each i
163  for (int ipsi = 0; ipsi < nPsi - 1; ipsi++)
164  {
165  for (int jpsi = ipsi + 1; jpsi < nPsi; jpsi++)
166  {
167  RealType ratioij = avgNorm[ipsi] / avgNorm[jpsi] * std::exp(2.0 * (logpsi[jpsi] - logpsi[ipsi]));
168  sumratio[ipsi] += ratioij;
169  sumratio[jpsi] += 1.0 / ratioij;
170  }
171  }
172  for (int ipsi = 0; ipsi < nPsi; ipsi++)
173  {
174  invsumratio[ipsi] = 1.0 / sumratio[ipsi];
175  cumGrad += Psi1[ipsi]->G * static_cast<Walker_t::SingleParticleValue>(invsumratio[ipsi]);
176  }
177 
178  for (int ipsi = 0; ipsi < nPsi; ipsi++)
179  cumNorm[ipsi] += invsumratio[ipsi];
180 
181  assignDrift(Tau, MassInvP, cumGrad, drift);
182 
183  deltaR = thisWalker.R - W.R - drift;
184 
185  RealType logGb = logBackwardGF(deltaR);
186 
187  RealType g = sumratio[0] / thisWalker.Multiplicity *
188  std::exp(logGb - logGf + 2.0 * (logpsi[0] - thisWalker.Properties(WP::LOGPSI)));
189 
190  if (Random() > g)
191  {
192  thisWalker.Age++;
193  ++nReject;
194  for (int ipsi = 1; ipsi < nPsi; ipsi++)
195  H1[ipsi]->rejectedMove(W, thisWalker);
196  }
197  else
198  {
199  thisWalker.Age = 0;
200  thisWalker.Multiplicity = sumratio[0];
201  thisWalker.R = W.R;
202  thisWalker.G = cumGrad;
203  for (int ipsi = 0; ipsi < nPsi; ipsi++)
204  {
205  W.L = *L1[ipsi];
206  W.G = *G1[ipsi];
207  RealType et = H1[ipsi]->evaluate(W);
208  thisWalker.Properties(ipsi, WP::LOGPSI) = logpsi[ipsi];
209  thisWalker.Properties(ipsi, WP::SIGN) = Psi1[ipsi]->getPhase();
210  thisWalker.Properties(ipsi, WP::UMBRELLAWEIGHT) = invsumratio[ipsi];
211  thisWalker.Properties(ipsi, WP::LOCALENERGY) = et;
212  H1[ipsi]->auxHevaluate(W, thisWalker);
213  H1[ipsi]->saveProperty(thisWalker.getPropertyBase(ipsi));
214  }
215  ++nAccept;
216  }
217 }
218 
219 } // namespace qmcplusplus
ParticleSet::ParticlePos drift
temporary storage for drift
std::vector< RealType > sumratio
Definition: CSUpdateBase.h:40
PropertyContainer_t Properties
scalar properties of a walker
Definition: Walker.h:125
typename p_traits::ParticleGradient ParticleGradient
array of gradients
Definition: Walker.h:68
std::vector< RealType > cumNorm
Definition: CSUpdateBase.h:45
CSVMCUpdateAll(MCWalkerConfiguration &w, std::vector< TrialWaveFunction *> &psi, std::vector< QMCHamiltonian *> &h, RandomBase< FullPrecRealType > &rg)
Constructor.
A set of walkers that are to be advanced by Metropolis Monte Carlo.
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
QTBase::RealType RealType
Definition: Configuration.h:58
CSVMCUpdateAllWithDrift(MCWalkerConfiguration &w, std::vector< TrialWaveFunction *> &psi, std::vector< QMCHamiltonian *> &h, RandomBase< FullPrecRealType > &rg)
Constructor.
void assignDrift(T s, const ParticleAttrib< TinyVector< TG, D >> &ga, ParticleAttrib< TinyVector< T, D >> &da)
#define Random
Definition of CSVMCUpdateAll.
ParticleSet::ParticlePos deltaR
temporary storage for random displacement
ParticleLaplacian L
laplacians of the particles
Definition: ParticleSet.h:85
std::vector< TrialWaveFunction * > Psi1
a list of TrialWaveFunctions for multiple method
Definition: CSUpdateBase.h:57
int Age
Age of this walker age is incremented when a walker is not moved after a sweep.
Definition: Walker.h:100
T Dot(const ParticleAttrib< TinyVector< T, D >> &pa, const ParticleAttrib< TinyVector< T, D >> &pb)
std::vector< RealType > logpsi
Definition: CSUpdateBase.h:39
WalkerProperties::Indexes WP
Definition: ParticleSet.cpp:34
std::vector< RealType > invsumratio
Definition: CSUpdateBase.h:41
std::vector< RealType > SqrtTauOverMass
sqrt(tau/Mass) per particle
ParticleGradient G
gradients of the particles
Definition: ParticleSet.h:83
RealType Tau
timestep
Definition: QMCUpdateBase.h:73
RealType logBackwardGF(const ParticleSet::ParticlePos &displ)
ParticlePos R
Position.
Definition: ParticleSet.h:79
std::vector< ParticleSet::ParticleGradient * > G1
Definition: CSUpdateBase.h:59
MakeReturn< UnaryNode< FnExp, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t exp(const Vector< T1, C1 > &l)
MCWalkerConfiguration & W
walker ensemble
std::vector< RealType > MassInvP
1/Mass per particle
void advanceWalker(Walker_t &thisWalker, bool recompute) override
move a walker
void loadWalker(Walker_t &awalker, bool pbyp)
load a Walker_t to the current ParticleSet
MakeReturn< UnaryNode< FnSqrt, typename CreateLeaf< Vector< T1, C1 > >::Leaf_t > >::Expression_t sqrt(const Vector< T1, C1 > &l)
RandomBase< FullPrecRealType > & RandomGen
random number generator
Indexes
an enum denoting index of physical properties
typename p_traits::SingleParticleValue SingleParticleValue
typedef for value data type.
Definition: Walker.h:72
std::vector< RealType > avgNorm
Definition: CSUpdateBase.h:42
bool makeMoveAllParticlesWithDrift(const Walker_t &awalker, const ParticlePos &drift, const ParticlePos &deltaR, RealType dt)
move all the particles including the drift
std::vector< ParticleSet::ParticleLaplacian * > L1
Definition: CSUpdateBase.h:60
IndexType nAccept
counter for number of moves accepted
Definition: QMCUpdateBase.h:63
IndexType nReject
counter for number of moves rejected
Definition: QMCUpdateBase.h:65
void advanceWalker(Walker_t &thisWalker, bool recompute) override
move a walker
FullPrecRealType * getPropertyBase()
Definition: Walker.h:277
FullPrecRealType Multiplicity
Number of copies for branching When Multiplicity = 0, this walker will be destroyed.
Definition: Walker.h:106
std::vector< RealType > MassInvS
1/Mass per species
bool makeMoveAllParticles(const Walker_t &awalker, const ParticlePos &deltaR, RealType dt)
move all the particles of a walker
A container class to represent a walker.
Definition: Walker.h:49
std::vector< QMCHamiltonian * > H1
a list of QMCHamiltonians for multiple method
Definition: CSUpdateBase.h:55
ParticlePos R
The configuration vector (3N-dimensional vector to store the positions of all the particles for a sin...
Definition: Walker.h:114
bool UpdatePbyP
update particle-by-particle
void makeGaussRandomWithEngine(ParticleAttrib< TinyVector< T, D >> &a, RG &rng)