QMCPACK
Crowd.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) 2022 QMCPACK developers.
6 //
7 // File developed by: Peter Doak, doakpw@ornl.gov, Oak Ridge National Laboratory
8 //////////////////////////////////////////////////////////////////////////////////////
9 
10 #include "Crowd.h"
12 
13 
14 namespace qmcplusplus
15 {
17  const DriverWalkerResourceCollection& driverwalker_res,
18  const ParticleSet& pset,
19  const TrialWaveFunction& twf,
20  const QMCHamiltonian& ham,
21  const MultiWalkerDispatchers& dispatchers)
22  : dispatchers_(dispatchers), driverwalker_resource_collection_(driverwalker_res), estimator_manager_crowd_(emb)
23 {
24  if (emb.areThereListeners())
25  {
26  // By creating a tempory QMCHamiltonian before walkers are distributed to the crowds we insure that
27  // after construction that each crowd has a valid driverwalker_resource_collection_.ham_res.
28  // We can't use the golden hamiltonian to do this because QMCHamiltonian and mw_res_ are 1 to 1 or 1 to 0.
29  //
30  // Violating the incapsulation of the QMChamiltonian mw_res_ could make this very efficent but doesn't seem
31  // necessary since this happens num crowds times per section.
32  //
33  // QMCHamiltonian makes quite a smell with its non const pset and twf constructor
34  // arguments.
35  ParticleSet pset_temp(pset);
36  UPtr<TrialWaveFunction> twf_temp(twf.makeClone(pset_temp));
37  UPtr<QMCHamiltonian> ham_temp(ham.makeClone(pset_temp, *twf_temp));
38  RefVectorWithLeader<QMCHamiltonian> ham_list{*ham_temp, {*ham_temp}};
41  }
42 }
43 
44 Crowd::~Crowd() = default;
45 
47 {
48  // We're clearing the refs to the objects not the referred to objects.
49  mcp_walkers_.clear();
50  walker_elecs_.clear();
51  walker_twfs_.clear();
52  walker_hamiltonians_.clear();
53 }
54 
55 void Crowd::reserve(int crowd_size)
56 {
57  auto reserveCS = [crowd_size](auto& avector) { avector.reserve(crowd_size); };
58  reserveCS(mcp_walkers_);
59  reserveCS(walker_elecs_);
60  reserveCS(walker_twfs_);
61  reserveCS(walker_hamiltonians_);
62 }
63 
65 {
66  mcp_walkers_.push_back(walker);
67  walker_elecs_.push_back(elecs);
68  walker_twfs_.push_back(twf);
69  walker_hamiltonians_.push_back(hamiltonian);
70 };
71 
73 {
75  ham.setRandomGenerator(&rng);
76 }
77 
78 void Crowd::startBlock(int num_steps)
79 {
80  n_accept_ = 0;
81  n_reject_ = 0;
82  // VMCBatched does no nonlocal moves
85  if (wlog_collector_)
86  wlog_collector_->startBlock();
87 }
88 
90 
91 void Crowd::setWalkerLogCollector(std::unique_ptr<WalkerLogCollector>&& collector)
92 {
93  wlog_collector_ = std::move(collector);
94 }
95 
96 void Crowd::collectStepWalkerLog(int current_step)
97 {
98  if (!wlog_collector_)
99  return;
100 
101  for (int iw = 0; iw < size(); ++iw)
103  current_step);
104 }
105 
107 {
109  for (auto& crowd : crowds)
110  if (crowd && crowd->wlog_collector_)
111  refs.push_back(*crowd->wlog_collector_);
112  return refs;
113 }
114 
115 } // namespace qmcplusplus
helper functions for EinsplineSetBuilder
Definition: Configuration.h:43
Class to manage a set of ScalarEstimators As a manager, this class handles the aggregation of data fr...
Collection of Local Energy Operators.
void collectStepWalkerLog(int current_step)
Collect walker log data.
Definition: Crowd.cpp:96
unsigned long n_reject_
Definition: Crowd.h:150
RefVector< MCPWalker > mcp_walkers_
Definition: Crowd.h:132
std::vector< std::unique_ptr< T > > UPtrVector
void reserve(int crowd_size)
Because so many vectors allocate them upfront.
Definition: Crowd.cpp:55
void addWalker(MCPWalker &walker, ParticleSet &elecs, TrialWaveFunction &twf, QMCHamiltonian &hamiltonian)
Definition: Crowd.cpp:64
EstimatorManagerCrowd estimator_manager_crowd_
per crowd estimator manager
Definition: Crowd.h:141
int size() const
Definition: Crowd.h:111
void startBlock(int steps)
start a block
Specialized paritlce class for atomistic simulations.
Definition: ParticleSet.h:55
static RefVector< WalkerLogCollector > getWalkerLogCollectorRefs(const UPtrVector< Crowd > &crowds)
get refereces of active walker log collectors. If walker logging is disabled, the RefVector size can ...
Definition: Crowd.cpp:106
DriverWalker multi walker resource collections It currently supports VMC and DMC only.
void stopBlock()
Definition: Crowd.cpp:89
std::unique_ptr< T > UPtr
void startBlock(int steps)
Definition: Crowd.cpp:78
std::vector< std::reference_wrapper< T > > RefVector
RefVector< TrialWaveFunction > walker_twfs_
Definition: Crowd.h:134
RefVector< ParticleSet > walker_elecs_
Definition: Crowd.h:133
Class to represent a many-body trial wave function.
DriverWalkerResourceCollection driverwalker_resource_collection_
}@
Definition: Crowd.h:139
RefVector< QMCHamiltonian > walker_hamiltonians_
Definition: Crowd.h:135
void setRNGForHamiltonian(RandomBase< FullPrecRealType > &rng)
Definition: Crowd.cpp:72
unsigned long n_accept_
Definition: Crowd.h:151
std::unique_ptr< WalkerLogCollector > wlog_collector_
Definition: Crowd.h:143
handles acquire/release resource by the consumer (RefVectorWithLeader type).
void registerListeners(const RefVectorWithLeader< QMCHamiltonian > &ham_list)
This registers the crowd lever estimators that require listeners into the QMCHamiltonianMultiWalkerRe...
Crowd(EstimatorManagerNew &emb, const DriverWalkerResourceCollection &driverwalker_res, const ParticleSet &pset, const TrialWaveFunction &twf, const QMCHamiltonian &hamiltonian_temp, const MultiWalkerDispatchers &dispatchers)
The constructor this requires all the gold elements because it constructs a valid estimator_manager_c...
Definition: Crowd.cpp:16
void setRandomGenerator(RandomBase< FullPrecRealType > *rng)
std::unique_ptr< QMCHamiltonian > makeClone(ParticleSet &qp, TrialWaveFunction &psi) const
return a clone
bool areThereListeners() const
Do any of the instantiated estimators in operator_ests_ listen to per particle hamiltonian values...
A container class to represent a walker.
Definition: Walker.h:49
void clearWalkers()
Clears all walker vectors.
Definition: Crowd.cpp:46
Declaration of QMCHamiltonian.
void setWalkerLogCollector(std::unique_ptr< WalkerLogCollector > &&)
activate the collector
Definition: Crowd.cpp:91
unsigned long n_nonlocal_accept_
Definition: Crowd.h:152