mirror of https://github.com/QMCPACK/qmcpack.git
continuing population control work
This commit is contained in:
parent
5653ffacd1
commit
30513ef5df
|
@ -411,6 +411,8 @@ struct Walker
|
|||
*/
|
||||
inline size_t byteSize()
|
||||
{
|
||||
// TODO: fix this! this is a non intuitive side effect for a size call
|
||||
// breaks a bunch of things that could be const
|
||||
if (!DataSet.size())
|
||||
{
|
||||
registerData();
|
||||
|
|
|
@ -513,8 +513,8 @@ void WalkerControlMPI::swapWalkersSimple(MCPopulation& pop, PopulationAdjustment
|
|||
++messages_incoming;
|
||||
if ( adjust.bad_walkers.size() > 0)
|
||||
{
|
||||
pop.kill_walker(adjust.bad_walkers.back());
|
||||
adjust.bad_walkers.pop();
|
||||
pop.killWalker(adjust.bad_walkers.back());
|
||||
adjust.bad_walkers.pop_back();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -550,7 +550,7 @@ void WalkerControlMPI::swapWalkersSimple(MCPopulation& pop, PopulationAdjustment
|
|||
messages_incoming *= 2; // extra message sent for multiplicity
|
||||
if( messages_incoming > 0)
|
||||
{
|
||||
for( int im = 0 ; im < messasges_incoming; ++im)
|
||||
for( int im = 0 ; im < messages_incoming; ++im)
|
||||
{
|
||||
WalkerMessage message(pop.spawnWalker(), MyContext);
|
||||
receive_requests.push_back(myComm->comm.ireceive_value(message.multiplicity));
|
||||
|
|
|
@ -26,12 +26,12 @@ class WalkerControlMPITest;
|
|||
|
||||
struct WalkerMessage
|
||||
{
|
||||
const WalkerControlBase::MCPWalker& walker;
|
||||
WalkerControlBase::MCPWalker& walker;
|
||||
// i.e. MPI rank
|
||||
const int target_rank;
|
||||
int multiplicity = 1;
|
||||
size_t byteSize = 0;
|
||||
WalkerMessage(const WalkerControlBase::MCPWalker& walk, const int target) : walker(walk), target_rank(target){};
|
||||
WalkerMessage(WalkerControlBase::MCPWalker& walk, const int target) : walker(walk), target_rank(target){};
|
||||
};
|
||||
|
||||
bool operator==(const WalkerMessage& A, const WalkerMessage& B)
|
||||
|
|
|
@ -142,18 +142,30 @@ void MCPopulation::createWalkers(IndexType num_walkers)
|
|||
|
||||
/** creates a walker and returns a reference
|
||||
*/
|
||||
MCPopulation::MCPWalker& MCPopulation::spawnWalker(const MCPWalker& walker)
|
||||
MCPopulation::MCPWalker& MCPopulation::spawnWalker()
|
||||
{
|
||||
auto it_walkers = walkers_.begin();
|
||||
int walker_index;
|
||||
while (it_walkers != walkers_.end())
|
||||
{
|
||||
if (*it_walkers == nullptr)
|
||||
|
||||
{
|
||||
createWalkerInplace(*it_walkers);
|
||||
allocateWalkerStuffInplace(walker_index);
|
||||
break;
|
||||
}
|
||||
++walker_index;
|
||||
}
|
||||
// you need to add to all the vectors if no walkers have been killed
|
||||
// for now we throw since this must be implemented
|
||||
if (walker_index == walkers_.size())
|
||||
throw std::runtime_error("Needed to add to population in MCPopulation but it is not implemented.");
|
||||
return **it_walkers;
|
||||
}
|
||||
|
||||
/** Kill a walker
|
||||
*/
|
||||
void MCPopulation::killWalker(const MCPWalker& walker)
|
||||
void MCPopulation::killWalker(MCPWalker& walker)
|
||||
{
|
||||
// find the walker and null its pointer in the walker vector
|
||||
auto it_walkers = walkers_.begin();
|
||||
|
|
|
@ -107,6 +107,7 @@ public:
|
|||
MCPWalker& spawnWalker();
|
||||
void killWalker(MCPWalker&);
|
||||
void createWalkerInplace(UPtr<MCPWalker>& walker_ptr);
|
||||
void allocateWalkerStuffInplace(int walker_index);
|
||||
/** }@ */
|
||||
|
||||
void createWalkers();
|
||||
|
|
Loading…
Reference in New Issue