QMCPACK
MCPopulation Class Reference
+ Collaboration diagram for MCPopulation:

Public Types

using MCPWalker = Walker< QMCTraits, PtclOnLatticeTraits >
 
using WFBuffer = MCPWalker::WFBuffer_t
 
using RealType = QMCTraits::RealType
 
using Properties = MCPWalker::PropertyContainer_t
 
using IndexType = QMCTraits::IndexType
 
using FullPrecRealType = QMCTraits::FullPrecRealType
 
using opt_variables_type = optimize::VariableSet
 

Public Member Functions

 MCPopulation (int num_ranks, int this_rank, ParticleSet *elecs, TrialWaveFunction *trial_wf, QMCHamiltonian *hamiltonian_)
 Temporary constructor to deal with MCWalkerConfiguration be the only source of some information in QMCDriverFactory. More...
 
 ~MCPopulation ()
 
 MCPopulation (MCPopulation &)=delete
 
MCPopulationoperator= (MCPopulation &)=delete
 
 MCPopulation (MCPopulation &&)=default
 
WalkerElementsRef spawnWalker ()
 State Requirement: More...
 
void killWalker (MCPWalker &)
 Kill a walker (just barely) More...
 
void killLastWalker ()
 Kill last walker (just barely) More...
 
void createWalkers (IndexType num_walkers, const WalkerConfigurations &walker_configs, RealType reserve=1.0)
 }@ More...
 
template<typename WTTV >
void redistributeWalkers (WTTV &walker_consumers)
 distributes walkers and their "cloned" elements to the elements of a vector of unique_ptr to "walker_consumers". More...
 
void syncWalkersPerRank (Communicate *comm)
 
void measureGlobalEnergyVariance (Communicate &comm, FullPrecRealType &ener, FullPrecRealType &variance) const
 
int get_num_ranks () const
 The number of cases in which this and get_num_local_walkers is so few that I strongly suspect it is a design issue. More...
 
int get_rank () const
 
IndexType get_num_global_walkers () const
 
IndexType get_num_local_walkers () const
 
IndexType get_max_samples () const
 
IndexType get_target_population () const
 
IndexType get_target_samples () const
 
const ParticleSetget_golden_electrons () const
 
ParticleSetget_golden_electrons ()
 
const TrialWaveFunctionget_golden_twf () const
 
TrialWaveFunctionget_golden_twf ()
 
QMCHamiltonianget_golden_hamiltonian ()
 
void set_num_global_walkers (IndexType num_global_walkers)
 
void set_num_local_walkers (IndexType num_local_walkers)
 
void set_target (IndexType pop)
 
void set_target_samples (IndexType samples)
 
void set_ensemble_property (const MCDataType< QMCTraits::FullPrecRealType > &ensemble_property)
 
UPtrVector< MCPWalker > & get_walkers ()
 
const UPtrVector< MCPWalker > & get_walkers () const
 
const UPtrVector< MCPWalker > & get_dead_walkers () const
 
UPtrVector< ParticleSet > & get_elec_particle_sets ()
 
UPtrVector< TrialWaveFunction > & get_twfs ()
 
UPtrVector< TrialWaveFunction > & get_dead_twfs ()
 
UPtrVector< QMCHamiltonian > & get_hamiltonians ()
 
UPtrVector< QMCHamiltonian > & get_dead_hamiltonians ()
 
WalkerElementsRef getWalkerElementsRef (const size_t walker_index)
 Non threadsafe access to walkers and their elements. More...
 
std::vector< WalkerElementsRefget_walker_elements ()
 As long as walker WalkerElements is used we need this for unit tests. More...
 
const std::vector< RealType > & get_ptclgrp_mass () const
 
const std::vector< RealType > & get_ptclgrp_inv_mass () const
 
const std::vector< RealType > & get_ptcl_inv_mass () const
 
void checkIntegrity () const
 }@ More...
 
void saveWalkerConfigurations (WalkerConfigurations &walker_configs)
 save walker configurations to walker_configs_ref_ More...
 

Private Attributes

MCDataType< QMCTraits::FullPrecRealTypeensemble_property_
 
IndexType num_global_walkers_ = 0
 
IndexType num_local_walkers_ = 0
 
IndexType max_samples_ = 0
 
IndexType target_population_ = 0
 
IndexType target_samples_ = 0
 
UPtrVector< MCPWalkerwalkers_
 
UPtrVector< MCPWalkerdead_walkers_
 
std::vector< RealTypeptclgrp_mass_
 
std::vector< RealTypeptclgrp_inv_mass_
 1/Mass per species More...
 
std::vector< RealTypeptcl_inv_mass_
 1/Mass per particle More...
 
TrialWaveFunctiontrial_wf_
 
ParticleSetelec_particle_set_
 
QMCHamiltonianhamiltonian_
 
UPtrVector< ParticleSetwalker_elec_particle_sets_
 
UPtrVector< TrialWaveFunctionwalker_trial_wavefunctions_
 
UPtrVector< QMCHamiltonianwalker_hamiltonians_
 
UPtrVector< ParticleSetdead_walker_elec_particle_sets_
 
UPtrVector< TrialWaveFunctiondead_walker_trial_wavefunctions_
 
UPtrVector< QMCHamiltoniandead_walker_hamiltonians_
 
int num_ranks_
 
int rank_
 

Detailed Description

Definition at line 38 of file MCPopulation.h.

Member Typedef Documentation

◆ FullPrecRealType

Definition at line 46 of file MCPopulation.h.

◆ IndexType

Definition at line 45 of file MCPopulation.h.

◆ MCPWalker

Definition at line 41 of file MCPopulation.h.

◆ opt_variables_type

Definition at line 47 of file MCPopulation.h.

◆ Properties

Definition at line 44 of file MCPopulation.h.

◆ RealType

Definition at line 43 of file MCPopulation.h.

◆ WFBuffer

Definition at line 42 of file MCPopulation.h.

Constructor & Destructor Documentation

◆ MCPopulation() [1/3]

MCPopulation ( int  num_ranks,
int  this_rank,
ParticleSet elecs,
TrialWaveFunction trial_wf,
QMCHamiltonian hamiltonian_ 
)

Temporary constructor to deal with MCWalkerConfiguration be the only source of some information in QMCDriverFactory.

Definition at line 23 of file MCPopulation.cpp.

References ParticleSet::first(), ParticleSet::getTotalNum(), ParticleSet::groups(), ParticleSet::last(), ParticleSet::Mass, MCPopulation::ptcl_inv_mass_, MCPopulation::ptclgrp_inv_mass_, and MCPopulation::ptclgrp_mass_.

28  : trial_wf_(trial_wf), elec_particle_set_(elecs), hamiltonian_(hamiltonian), num_ranks_(num_ranks), rank_(this_rank)
29 {
30  const auto num_groups = elecs->groups();
31  ptclgrp_mass_.resize(num_groups);
32  ptclgrp_inv_mass_.resize(num_groups);
33  for (int ig = 0; ig < num_groups; ++ig)
34  {
35  ptclgrp_mass_[ig] = elecs->Mass[elecs->first(ig)];
36  ptclgrp_inv_mass_[ig] = 1.0 / ptclgrp_mass_[ig];
37  }
38 
39  ptcl_inv_mass_.resize(elecs->getTotalNum());
40  for (int ig = 0; ig < num_groups; ++ig)
41  for (int iat = elecs->first(ig); iat < elecs->last(ig); ++iat)
43 }
std::vector< RealType > ptcl_inv_mass_
1/Mass per particle
Definition: MCPopulation.h:67
QMCHamiltonian * hamiltonian_
Definition: MCPopulation.h:74
std::vector< RealType > ptclgrp_inv_mass_
1/Mass per species
Definition: MCPopulation.h:65
std::vector< RealType > ptclgrp_mass_
Definition: MCPopulation.h:63
TrialWaveFunction * trial_wf_
Definition: MCPopulation.h:72
ParticleSet * elec_particle_set_
Definition: MCPopulation.h:73

◆ ~MCPopulation()

~MCPopulation ( )
default

◆ MCPopulation() [2/3]

MCPopulation ( MCPopulation )
delete

◆ MCPopulation() [3/3]

MCPopulation ( MCPopulation &&  )
default

Member Function Documentation

◆ checkIntegrity()

void checkIntegrity ( ) const

}@

check if all the internal vector contain consistent sizes;

Definition at line 264 of file MCPopulation.cpp.

References MCPopulation::dead_walker_elec_particle_sets_, MCPopulation::dead_walker_hamiltonians_, MCPopulation::dead_walker_trial_wavefunctions_, MCPopulation::dead_walkers_, MCPopulation::num_local_walkers_, MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

Referenced by WalkerControl::branch(), and WalkerControl::killDeadWalkersOnRank().

265 {
266  // check active walkers
267  const size_t num_local_walkers_active = num_local_walkers_;
268  if (walkers_.size() != num_local_walkers_active)
269  throw std::runtime_error("walkers_ has inconsistent size");
270  if (walker_elec_particle_sets_.size() != num_local_walkers_active)
271  throw std::runtime_error("walker_elec_particle_sets_ has inconsistent size");
272  if (walker_trial_wavefunctions_.size() != num_local_walkers_active)
273  throw std::runtime_error("walker_trial_wavefunctions_ has inconsistent size");
274  if (walker_trial_wavefunctions_.size() != num_local_walkers_active)
275  throw std::runtime_error("walker_trial_wavefunctions_ has inconsistent size");
276  if (walker_hamiltonians_.size() != num_local_walkers_active)
277  throw std::runtime_error("walker_hamiltonians_ has inconsistent size");
278 
279  // check dead walkers
280  const size_t num_local_walkers_dead = dead_walkers_.size();
281  if (dead_walker_elec_particle_sets_.size() != num_local_walkers_dead)
282  throw std::runtime_error("dead_walker_elec_particle_sets_ has inconsistent size");
283  if (dead_walker_trial_wavefunctions_.size() != num_local_walkers_dead)
284  throw std::runtime_error("dead_walker_trial_wavefunctions_ has inconsistent size");
285  if (dead_walker_trial_wavefunctions_.size() != num_local_walkers_dead)
286  throw std::runtime_error("dead_walker_trial_wavefunctions_ has inconsistent size");
287  if (dead_walker_hamiltonians_.size() != num_local_walkers_dead)
288  throw std::runtime_error("dead_walker_hamiltonians_ has inconsistent size");
289 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
UPtrVector< QMCHamiltonian > dead_walker_hamiltonians_
Definition: MCPopulation.h:84
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
UPtrVector< TrialWaveFunction > dead_walker_trial_wavefunctions_
Definition: MCPopulation.h:83
UPtrVector< ParticleSet > dead_walker_elec_particle_sets_
Definition: MCPopulation.h:82
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
UPtrVector< MCPWalker > dead_walkers_
Definition: MCPopulation.h:62

◆ createWalkers()

void createWalkers ( IndexType  num_walkers,
const WalkerConfigurations walker_configs,
RealType  reserve = 1.0 
)

}@

Creates walkers with a clone of the golden electron particle set and golden trial wavefunction

Parameters
[in]num_walkersnumber of living walkers in initial population
[in]reservemultiple above that to reserve >=1.0

Definition at line 47 of file MCPopulation.cpp.

References MCPopulation::elec_particle_set_, WalkerConfigurations::getActiveWalkers(), ParticleSet::getTotalNum(), MCPopulation::hamiltonian_, MCPopulation::killLastWalker(), QMCHamiltonian::makeClone(), TrialWaveFunction::makeClone(), MCPopulation::num_local_walkers_, MCPopulation::num_ranks_, qmcplusplus::hdf::num_walkers, outputManager, OutputManagerClass::pause(), ParticleSet::Properties, ParticleSet::PropertyList, ParticleSet::R, MCPopulation::rank_, ConstantSizeMatrix< T, ALLOC >::resize(), OutputManagerClass::resume(), RecordNamedProperty< T >::size(), ParticleSet::spins, MCPopulation::trial_wf_, MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

Referenced by QMCDriverNew::makeLocalWalkers(), and qmcplusplus::TEST_CASE().

48 {
49  IndexType num_walkers_plus_reserve = static_cast<IndexType>(num_walkers * reserve);
50 
51  // Hack to hopefully insure no truly new walkers will be made by spawn, since I suspect that
52  // doesn't capture everything that needs to make a walker + elements valid to load from a transferred
53  // buffer;
54  // Ye: need to resize walker_t and ParticleSet Properties
55  // Really MCPopulation does not own this elec_particle_set_ seems like it should be immutable
57 
58  // This pattern is begging for a micro benchmark, is this really better
59  // than the simpler walkers_.pushback;
60  walkers_.resize(num_walkers_plus_reserve);
61  walker_elec_particle_sets_.resize(num_walkers_plus_reserve);
62  walker_trial_wavefunctions_.resize(num_walkers_plus_reserve);
63  walker_hamiltonians_.resize(num_walkers_plus_reserve);
64 
66 
67  //this part is time consuming, it must be threaded and calls should be thread-safe.
68 #pragma omp parallel for
69  for (size_t iw = 0; iw < num_walkers_plus_reserve; iw++)
70  {
71  walkers_[iw] = std::make_unique<MCPWalker>(elec_particle_set_->getTotalNum());
72  walkers_[iw]->Properties = elec_particle_set_->Properties;
73 
74  // initialize coord
75  if (const auto num_existing_walkers = walker_configs.getActiveWalkers())
76  *walkers_[iw] = *walker_configs[iw % num_existing_walkers];
77  else
78  {
79  walkers_[iw]->R = elec_particle_set_->R;
80  walkers_[iw]->spins = elec_particle_set_->spins;
81  }
82 
83  walkers_[iw]->registerData();
84  walkers_[iw]->DataSet.allocate();
85 
86  walker_elec_particle_sets_[iw] = std::make_unique<ParticleSet>(*elec_particle_set_);
90  };
91 
93 
94  int num_walkers_created = 0;
95  for (auto& walker_ptr : walkers_)
96  {
97  if (walker_ptr->getWalkerID() == 0)
98  {
99  // And so walker ID's start at one because 0 is magic.
100  // \todo This is C++ all indexes start at 0, make uninitialized ID = -1
101  walker_ptr->setWalkerID((num_walkers_created++) * num_ranks_ + rank_ + 1);
102  walker_ptr->setParentID(walker_ptr->getWalkerID());
103  }
104  }
105 
106  // kill and spawn walkers update the state variable num_local_walkers_
107  // so it must start at the number of reserved walkers
108  num_local_walkers_ = num_walkers_plus_reserve;
109 
110  IndexType extra_walkers = num_walkers_plus_reserve - num_walkers;
111  // Now we kill the extra reserve walkers and elements that we made.
112  for (int i = 0; i < extra_walkers; ++i)
113  killLastWalker();
114 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
void pause()
Pause the summary and log streams.
ParticleScalar spins
internal spin variables for dynamical spin calculations
Definition: ParticleSet.h:81
PropertyContainer_t Properties
properties of the current walker
Definition: ParticleSet.h:119
size_t getTotalNum() const
Definition: ParticleSet.h:493
const char num_walkers[]
Definition: HDFVersion.h:37
QMCHamiltonian * hamiltonian_
Definition: MCPopulation.h:74
std::unique_ptr< TrialWaveFunction > makeClone(ParticleSet &tqp) const
OutputManagerClass outputManager(Verbosity::HIGH)
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
PropertySetType PropertyList
name-value map of Walker Properties
Definition: ParticleSet.h:112
void resume()
Resume the summary and log streams.
ParticlePos R
Position.
Definition: ParticleSet.h:79
QMCTraits::IndexType IndexType
Definition: MCPopulation.h:45
TrialWaveFunction * trial_wf_
Definition: MCPopulation.h:72
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
std::unique_ptr< QMCHamiltonian > makeClone(ParticleSet &qp, TrialWaveFunction &psi) const
return a clone
void killLastWalker()
Kill last walker (just barely)
ParticleSet * elec_particle_set_
Definition: MCPopulation.h:73

◆ get_dead_hamiltonians()

UPtrVector<QMCHamiltonian>& get_dead_hamiltonians ( )
inline

Definition at line 204 of file MCPopulation.h.

References MCPopulation::dead_walker_hamiltonians_.

204 { return dead_walker_hamiltonians_; }
UPtrVector< QMCHamiltonian > dead_walker_hamiltonians_
Definition: MCPopulation.h:84

◆ get_dead_twfs()

UPtrVector<TrialWaveFunction>& get_dead_twfs ( )
inline

Definition at line 201 of file MCPopulation.h.

References MCPopulation::dead_walker_trial_wavefunctions_.

UPtrVector< TrialWaveFunction > dead_walker_trial_wavefunctions_
Definition: MCPopulation.h:83

◆ get_dead_walkers()

const UPtrVector<MCPWalker>& get_dead_walkers ( ) const
inline

Definition at line 196 of file MCPopulation.h.

References MCPopulation::dead_walkers_.

Referenced by QMCDriverNew::get_num_dead_walkers().

196 { return dead_walkers_; }
UPtrVector< MCPWalker > dead_walkers_
Definition: MCPopulation.h:62

◆ get_elec_particle_sets()

UPtrVector<ParticleSet>& get_elec_particle_sets ( )
inline

Definition at line 198 of file MCPopulation.h.

References MCPopulation::walker_elec_particle_sets_.

Referenced by VMCBatched::run().

198 { return walker_elec_particle_sets_; }
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76

◆ get_golden_electrons() [1/2]

◆ get_golden_electrons() [2/2]

ParticleSet& get_golden_electrons ( )
inline

Definition at line 177 of file MCPopulation.h.

References MCPopulation::elec_particle_set_.

177 { return *elec_particle_set_; }
ParticleSet * elec_particle_set_
Definition: MCPopulation.h:73

◆ get_golden_hamiltonian()

QMCHamiltonian& get_golden_hamiltonian ( )
inline

◆ get_golden_twf() [1/2]

const TrialWaveFunction& get_golden_twf ( ) const
inline

Definition at line 178 of file MCPopulation.h.

References MCPopulation::trial_wf_.

Referenced by QMCDriverNew::initializeQMC(), and QMCFixedSampleLinearOptimizeBatched::processOptXML().

178 { return *trial_wf_; }
TrialWaveFunction * trial_wf_
Definition: MCPopulation.h:72

◆ get_golden_twf() [2/2]

TrialWaveFunction& get_golden_twf ( )
inline

Definition at line 179 of file MCPopulation.h.

References MCPopulation::trial_wf_.

179 { return *trial_wf_; }
TrialWaveFunction * trial_wf_
Definition: MCPopulation.h:72

◆ get_hamiltonians()

UPtrVector<QMCHamiltonian>& get_hamiltonians ( )
inline

Definition at line 203 of file MCPopulation.h.

References MCPopulation::walker_hamiltonians_.

Referenced by DMCBatched::run().

203 { return walker_hamiltonians_; }
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78

◆ get_max_samples()

IndexType get_max_samples ( ) const
inline

Definition at line 170 of file MCPopulation.h.

References MCPopulation::max_samples_.

170 { return max_samples_; }

◆ get_num_global_walkers()

IndexType get_num_global_walkers ( ) const
inline

◆ get_num_local_walkers()

◆ get_num_ranks()

int get_num_ranks ( ) const
inline

The number of cases in which this and get_num_local_walkers is so few that I strongly suspect it is a design issue.

get_active_walkers is onlyh useful between the setting of num_local_walkers_ and creation of walkers. I would reason this is actually a time over which the MCPopulation object is invalid. Ideally MCPopulation not process any calls in this state, next best would be to only process calls to become valid.

Definition at line 166 of file MCPopulation.h.

References MCPopulation::num_ranks_.

Referenced by VMCBatched::enable_sample_collection().

166 { return num_ranks_; }

◆ get_ptcl_inv_mass()

const std::vector<RealType>& get_ptcl_inv_mass ( ) const
inline

Definition at line 225 of file MCPopulation.h.

References MCPopulation::ptcl_inv_mass_.

225 { return ptcl_inv_mass_; }
std::vector< RealType > ptcl_inv_mass_
1/Mass per particle
Definition: MCPopulation.h:67

◆ get_ptclgrp_inv_mass()

const std::vector<RealType>& get_ptclgrp_inv_mass ( ) const
inline

Definition at line 224 of file MCPopulation.h.

References MCPopulation::ptclgrp_inv_mass_.

Referenced by VMCBatched::advanceWalkers(), and DMCBatched::advanceWalkers().

224 { return ptclgrp_inv_mass_; }
std::vector< RealType > ptclgrp_inv_mass_
1/Mass per species
Definition: MCPopulation.h:65

◆ get_ptclgrp_mass()

const std::vector<RealType>& get_ptclgrp_mass ( ) const
inline

Definition at line 223 of file MCPopulation.h.

References MCPopulation::ptclgrp_mass_.

223 { return ptclgrp_mass_; }
std::vector< RealType > ptclgrp_mass_
Definition: MCPopulation.h:63

◆ get_rank()

int get_rank ( ) const
inline

Definition at line 167 of file MCPopulation.h.

References MCPopulation::rank_.

167 { return rank_; }

◆ get_target_population()

IndexType get_target_population ( ) const
inline

Definition at line 171 of file MCPopulation.h.

References MCPopulation::target_population_.

171 { return target_population_; }

◆ get_target_samples()

IndexType get_target_samples ( ) const
inline

Definition at line 172 of file MCPopulation.h.

References MCPopulation::target_samples_.

172 { return target_samples_; }

◆ get_twfs()

UPtrVector<TrialWaveFunction>& get_twfs ( )
inline

Definition at line 200 of file MCPopulation.h.

References MCPopulation::walker_trial_wavefunctions_.

200 { return walker_trial_wavefunctions_; }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77

◆ get_walker_elements()

std::vector< WalkerElementsRef > get_walker_elements ( )

As long as walker WalkerElements is used we need this for unit tests.

As operator[] don't use it to ignore the concurrency design.

Definition at line 121 of file MCPopulation.cpp.

References MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

122 {
123  std::vector<WalkerElementsRef> walker_elements;
124  for (int iw = 0; iw < walkers_.size(); ++iw)
125  {
126  walker_elements.emplace_back(*walkers_[iw], *walker_elec_particle_sets_[iw], *walker_trial_wavefunctions_[iw]);
127  }
128  return walker_elements;
129 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61

◆ get_walkers() [1/2]

◆ get_walkers() [2/2]

const UPtrVector<MCPWalker>& get_walkers ( ) const
inline

Definition at line 195 of file MCPopulation.h.

References MCPopulation::walkers_.

195 { return walkers_; }
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61

◆ getWalkerElementsRef()

WalkerElementsRef getWalkerElementsRef ( const size_t  walker_index)

Non threadsafe access to walkers and their elements.

Prefer to distribute the walker elements and access through a crowd to support the concurrency design.

You should not use this unless absolutely necessary. That doesn't include that you would rather just use omp parallel and ignore concurrency.

Definition at line 116 of file MCPopulation.cpp.

References MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

117 {
118  return {*walkers_[index], *walker_elec_particle_sets_[index], *walker_trial_wavefunctions_[index]};
119 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61

◆ killLastWalker()

void killLastWalker ( )

Kill last walker (just barely)

By kill we mean put it and all its elements in a "dead" list.

Definition at line 188 of file MCPopulation.cpp.

References MCPopulation::dead_walker_elec_particle_sets_, MCPopulation::dead_walker_hamiltonians_, MCPopulation::dead_walker_trial_wavefunctions_, MCPopulation::dead_walkers_, MCPopulation::num_local_walkers_, MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

Referenced by MCPopulation::createWalkers(), and QMCDriverNew::makeLocalWalkers().

189 {
191  // kill the walker but just barely we need all its setup and connections to remain
192  dead_walkers_.push_back(std::move(walkers_.back()));
193  walkers_.pop_back();
194  dead_walker_elec_particle_sets_.push_back(std::move(walker_elec_particle_sets_.back()));
195  walker_elec_particle_sets_.pop_back();
197  walker_trial_wavefunctions_.pop_back();
198  dead_walker_hamiltonians_.push_back(std::move(walker_hamiltonians_.back()));
199  walker_hamiltonians_.pop_back();
200 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
UPtrVector< QMCHamiltonian > dead_walker_hamiltonians_
Definition: MCPopulation.h:84
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
UPtrVector< TrialWaveFunction > dead_walker_trial_wavefunctions_
Definition: MCPopulation.h:83
UPtrVector< ParticleSet > dead_walker_elec_particle_sets_
Definition: MCPopulation.h:82
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
UPtrVector< MCPWalker > dead_walkers_
Definition: MCPopulation.h:62

◆ killWalker()

void killWalker ( MCPWalker walker)

Kill a walker (just barely)

By kill we mean put it and all its elements in a "dead" list.

Definition at line 205 of file MCPopulation.cpp.

References MCPopulation::dead_walker_elec_particle_sets_, MCPopulation::dead_walker_hamiltonians_, MCPopulation::dead_walker_trial_wavefunctions_, MCPopulation::dead_walkers_, MCPopulation::num_local_walkers_, qmcplusplus::walker, MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

Referenced by WalkerControl::killDeadWalkersOnRank().

206 {
207  // find the walker and move its pointer to the dead walkers vector
208  auto it_walkers = walkers_.begin();
209  auto it_psets = walker_elec_particle_sets_.begin();
210  auto it_twfs = walker_trial_wavefunctions_.begin();
211  auto it_hams = walker_hamiltonians_.begin();
212  while (it_walkers != walkers_.end())
213  {
214  if (&walker == (*it_walkers).get())
215  {
216  dead_walkers_.push_back(std::move(*it_walkers));
217  walkers_.erase(it_walkers);
218  dead_walker_elec_particle_sets_.push_back(std::move(*it_psets));
219  walker_elec_particle_sets_.erase(it_psets);
220  dead_walker_trial_wavefunctions_.push_back(std::move(*it_twfs));
221  walker_trial_wavefunctions_.erase(it_twfs);
222  dead_walker_hamiltonians_.push_back(std::move(*it_hams));
223  walker_hamiltonians_.erase(it_hams);
225  return;
226  }
227  ++it_walkers;
228  ++it_psets;
229  ++it_twfs;
230  ++it_hams;
231  }
232  throw std::runtime_error("Attempt to kill nonexistent walker in MCPopulation!");
233 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
UPtrVector< QMCHamiltonian > dead_walker_hamiltonians_
Definition: MCPopulation.h:84
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
UPtrVector< TrialWaveFunction > dead_walker_trial_wavefunctions_
Definition: MCPopulation.h:83
UPtrVector< ParticleSet > dead_walker_elec_particle_sets_
Definition: MCPopulation.h:82
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
UPtrVector< MCPWalker > dead_walkers_
Definition: MCPopulation.h:62

◆ measureGlobalEnergyVariance()

void measureGlobalEnergyVariance ( Communicate comm,
FullPrecRealType ener,
FullPrecRealType variance 
) const

Definition at line 245 of file MCPopulation.cpp.

References Communicate::allreduce(), qmcplusplus::comm, qmcplusplus::Units::charge::e, MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, and MCPopulation::walkers_.

Referenced by DMCBatched::run().

248 {
249  std::vector<FullPrecRealType> weight_energy_variance(3, 0.0);
250  for (int iw = 0; iw < walker_elec_particle_sets_.size(); iw++)
251  {
252  auto w = walkers_[iw]->Weight;
253  auto e = walker_hamiltonians_[iw]->getLocalEnergy();
254  weight_energy_variance[0] += w;
255  weight_energy_variance[1] += w * e;
256  weight_energy_variance[2] += w * e * e;
257  }
258 
259  comm.allreduce(weight_energy_variance);
260  ener = weight_energy_variance[1] / weight_energy_variance[0];
261  variance = weight_energy_variance[2] / weight_energy_variance[0] - ener * ener;
262 }
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
void allreduce(T &)
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61

◆ operator=()

MCPopulation& operator= ( MCPopulation )
delete

◆ redistributeWalkers()

void redistributeWalkers ( WTTV &  walker_consumers)
inline

distributes walkers and their "cloned" elements to the elements of a vector of unique_ptr to "walker_consumers".

a valid "walker_consumer" has a member function of void addWalker(MCPWalker& walker, ParticleSet& elecs, TrialWaveFunction& twf, QMCHamiltonian& hamiltonian);

Definition at line 131 of file MCPopulation.h.

References fairDivide(), MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

Referenced by QMCDriverNew::initializeQMC(), and DMCBatched::run().

132  {
133  // The type returned here is dependent on the integral type that the walker_consumers
134  // use to return there size.
135  auto walkers_per_crowd = fairDivide(walkers_.size(), walker_consumers.size());
136 
137  auto walker_index = 0;
138  for (int i = 0; i < walker_consumers.size(); ++i)
139  {
140  walker_consumers[i]->clearWalkers();
141  for (int j = 0; j < walkers_per_crowd[i]; ++j)
142  {
143  walker_consumers[i]->addWalker(*walkers_[walker_index], *walker_elec_particle_sets_[walker_index],
144  *walker_trial_wavefunctions_[walker_index], *walker_hamiltonians_[walker_index]);
145  ++walker_index;
146  }
147  }
148  }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
std::vector< IV > fairDivide(IV ntot, IV npart)
return the occupation vector for ntot entities partitioned npart ways.
Definition: FairDivide.h:77

◆ saveWalkerConfigurations()

void saveWalkerConfigurations ( WalkerConfigurations walker_configs)

save walker configurations to walker_configs_ref_

Definition at line 291 of file MCPopulation.cpp.

References MCPopulation::elec_particle_set_, ParticleSet::getTotalNum(), WalkerConfigurations::resize(), MCPopulation::walker_elec_particle_sets_, and MCPopulation::walkers_.

Referenced by QMCDriverNew::finalize(), and QMCDriverNew::recordBlock().

292 {
293  walker_configs.resize(walker_elec_particle_sets_.size(), elec_particle_set_->getTotalNum());
294  for (int iw = 0; iw < walker_elec_particle_sets_.size(); iw++)
295  {
296  walker_elec_particle_sets_[iw]->saveWalker(*walker_configs[iw]);
297  walker_configs[iw]->Weight = walkers_[iw]->Weight;
298  }
299 }
size_t getTotalNum() const
Definition: ParticleSet.h:493
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
ParticleSet * elec_particle_set_
Definition: MCPopulation.h:73

◆ set_ensemble_property()

void set_ensemble_property ( const MCDataType< QMCTraits::FullPrecRealType > &  ensemble_property)
inline

Definition at line 189 of file MCPopulation.h.

References MCPopulation::ensemble_property_.

Referenced by WalkerControl::branch().

190  {
191  ensemble_property_ = ensemble_property;
192  }
MCDataType< QMCTraits::FullPrecRealType > ensemble_property_
Definition: MCPopulation.h:51

◆ set_num_global_walkers()

void set_num_global_walkers ( IndexType  num_global_walkers)
inline

Definition at line 183 of file MCPopulation.h.

References MCPopulation::num_global_walkers_.

Referenced by WalkerControl::branch(), and QMCDriverNew::initializeQMC().

183 { num_global_walkers_ = num_global_walkers; }

◆ set_num_local_walkers()

void set_num_local_walkers ( IndexType  num_local_walkers)
inline

Definition at line 184 of file MCPopulation.h.

References MCPopulation::num_local_walkers_.

184 { num_local_walkers_ = num_local_walkers; }

◆ set_target()

void set_target ( IndexType  pop)
inline

Definition at line 186 of file MCPopulation.h.

References MCPopulation::target_population_.

186 { target_population_ = pop; }

◆ set_target_samples()

void set_target_samples ( IndexType  samples)
inline

Definition at line 187 of file MCPopulation.h.

References MCPopulation::target_samples_.

187 { target_samples_ = samples; }

◆ spawnWalker()

WalkerElementsRef spawnWalker ( )

State Requirement:

creates a walker and returns a reference

  • createWalkers must have been called

Walkers are reused It would be better if this could be done just by reusing memory. Not thread safe.

Definition at line 138 of file MCPopulation.cpp.

References qmcplusplus::app_warning(), MCPopulation::dead_walker_elec_particle_sets_, MCPopulation::dead_walker_hamiltonians_, MCPopulation::dead_walker_trial_wavefunctions_, MCPopulation::dead_walkers_, MCPopulation::elec_particle_set_, MCPopulation::hamiltonian_, QMCHamiltonian::makeClone(), TrialWaveFunction::makeClone(), MCPopulation::num_local_walkers_, MCPopulation::num_ranks_, outputManager, OutputManagerClass::pause(), MCPopulation::rank_, OutputManagerClass::resume(), MCPopulation::trial_wf_, MCPopulation::walker_elec_particle_sets_, MCPopulation::walker_hamiltonians_, MCPopulation::walker_trial_wavefunctions_, and MCPopulation::walkers_.

Referenced by WalkerControl::branch(), and QMCDriverNew::makeLocalWalkers().

139 {
142 
143  if (dead_walkers_.size() > 0)
144  {
145  walkers_.push_back(std::move(dead_walkers_.back()));
146  dead_walkers_.pop_back();
147  walker_elec_particle_sets_.push_back(std::move(dead_walker_elec_particle_sets_.back()));
151  walker_hamiltonians_.push_back(std::move(dead_walker_hamiltonians_.back()));
152  dead_walker_hamiltonians_.pop_back();
153  // Emulating the legacy implementation valid walker elements were created with the initial walker and DataSet
154  // registration and allocation were done then so are not necessary when resurrecting walkers and elements
155  walkers_.back()->Generation = 0;
156  walkers_.back()->Age = 0;
157  walkers_.back()->Multiplicity = 1.0;
158  walkers_.back()->Weight = 1.0;
159  }
160  else
161  {
162  app_warning() << "Spawning walker number " << walkers_.size() + 1
163  << " outside of reserves, this ideally should never happened." << std::endl;
164  walkers_.push_back(std::make_unique<MCPWalker>(*(walkers_.back())));
165 
166  // There is no value in doing this here because its going to be wiped out
167  // When we load from the receive buffer. It also won't necessarily be correct
168  // Because the buffer is changed by Hamiltonians and wavefunctions that
169  // Add to the dataSet.
170 
171  walker_elec_particle_sets_.emplace_back(std::make_unique<ParticleSet>(*elec_particle_set_));
173  walker_hamiltonians_.emplace_back(
175  walkers_.back()->Multiplicity = 1.0;
176  walkers_.back()->Weight = 1.0;
177  walkers_.back()->setWalkerID((walkers_.size() + 1) * num_ranks_ + rank_ + 1);
178  }
179 
181  return {*walkers_.back().get(), *walker_elec_particle_sets_.back().get(), *walker_trial_wavefunctions_.back().get()};
182 }
UPtrVector< TrialWaveFunction > walker_trial_wavefunctions_
Definition: MCPopulation.h:77
void pause()
Pause the summary and log streams.
std::ostream & app_warning()
Definition: OutputManager.h:69
UPtrVector< QMCHamiltonian > dead_walker_hamiltonians_
Definition: MCPopulation.h:84
QMCHamiltonian * hamiltonian_
Definition: MCPopulation.h:74
std::unique_ptr< TrialWaveFunction > makeClone(ParticleSet &tqp) const
OutputManagerClass outputManager(Verbosity::HIGH)
UPtrVector< QMCHamiltonian > walker_hamiltonians_
Definition: MCPopulation.h:78
UPtrVector< TrialWaveFunction > dead_walker_trial_wavefunctions_
Definition: MCPopulation.h:83
void resume()
Resume the summary and log streams.
UPtrVector< ParticleSet > dead_walker_elec_particle_sets_
Definition: MCPopulation.h:82
TrialWaveFunction * trial_wf_
Definition: MCPopulation.h:72
UPtrVector< ParticleSet > walker_elec_particle_sets_
Definition: MCPopulation.h:76
UPtrVector< MCPWalker > walkers_
Definition: MCPopulation.h:61
UPtrVector< MCPWalker > dead_walkers_
Definition: MCPopulation.h:62
std::unique_ptr< QMCHamiltonian > makeClone(ParticleSet &qp, TrialWaveFunction &psi) const
return a clone
ParticleSet * elec_particle_set_
Definition: MCPopulation.h:73

◆ syncWalkersPerRank()

void syncWalkersPerRank ( Communicate comm)

Definition at line 235 of file MCPopulation.cpp.

References Communicate::allreduce(), qmcplusplus::comm, MCPopulation::num_global_walkers_, MCPopulation::num_local_walkers_, Communicate::rank(), and Communicate::size().

Referenced by WalkerControl::branch().

236 {
237  std::vector<IndexType> num_local_walkers_per_rank(comm->size(), 0);
238 
239  num_local_walkers_per_rank[comm->rank()] = num_local_walkers_;
240  comm->allreduce(num_local_walkers_per_rank);
241 
242  num_global_walkers_ = std::accumulate(num_local_walkers_per_rank.begin(), num_local_walkers_per_rank.end(), 0);
243 }
int rank() const
return the rank
Definition: Communicate.h:116
int size() const
return the number of tasks
Definition: Communicate.h:118
void allreduce(T &)

Member Data Documentation

◆ dead_walker_elec_particle_sets_

UPtrVector<ParticleSet> dead_walker_elec_particle_sets_
private

◆ dead_walker_hamiltonians_

◆ dead_walker_trial_wavefunctions_

◆ dead_walkers_

◆ elec_particle_set_

◆ ensemble_property_

MCDataType<QMCTraits::FullPrecRealType> ensemble_property_
private

Definition at line 51 of file MCPopulation.h.

Referenced by MCPopulation::set_ensemble_property().

◆ hamiltonian_

◆ max_samples_

IndexType max_samples_ = 0
private

Definition at line 55 of file MCPopulation.h.

Referenced by MCPopulation::get_max_samples().

◆ num_global_walkers_

◆ num_local_walkers_

◆ num_ranks_

int num_ranks_
private

◆ ptcl_inv_mass_

std::vector<RealType> ptcl_inv_mass_
private

1/Mass per particle

Definition at line 67 of file MCPopulation.h.

Referenced by MCPopulation::get_ptcl_inv_mass(), and MCPopulation::MCPopulation().

◆ ptclgrp_inv_mass_

std::vector<RealType> ptclgrp_inv_mass_
private

1/Mass per species

Definition at line 65 of file MCPopulation.h.

Referenced by MCPopulation::get_ptclgrp_inv_mass(), and MCPopulation::MCPopulation().

◆ ptclgrp_mass_

std::vector<RealType> ptclgrp_mass_
private

Definition at line 63 of file MCPopulation.h.

Referenced by MCPopulation::get_ptclgrp_mass(), and MCPopulation::MCPopulation().

◆ rank_

int rank_
private

◆ target_population_

IndexType target_population_ = 0
private

Definition at line 56 of file MCPopulation.h.

Referenced by MCPopulation::get_target_population(), and MCPopulation::set_target().

◆ target_samples_

IndexType target_samples_ = 0
private

◆ trial_wf_

◆ walker_elec_particle_sets_

◆ walker_hamiltonians_

◆ walker_trial_wavefunctions_

◆ walkers_


The documentation for this class was generated from the following files: