Add evaluateRatios batched interfaces.

This commit is contained in:
Ye Luo 2020-01-05 20:05:51 +08:00
parent 861ac9a1e4
commit 7abc41d264
2 changed files with 42 additions and 10 deletions

View File

@ -335,9 +335,8 @@ TrialWaveFunction::ValueType TrialWaveFunction::calcRatio(ParticleSet& P, int ia
if (ct == ComputeType::ALL || (Z[i]->is_fermionic && ct == ComputeType::FERMIONIC) ||
(!Z[i]->is_fermionic && ct == ComputeType::NONFERMIONIC))
{
myTimers[ii]->start();
ScopedTimer local_timer(myTimers[ii]);
r *= Z[i]->ratio(P, iat);
myTimers[ii]->stop();
}
return static_cast<ValueType>(r);
}
@ -640,19 +639,19 @@ void TrialWaveFunction::completeUpdates()
}
}
void TrialWaveFunction::flex_completeUpdates(const std::vector<TrialWaveFunction*>& WF_list) const
void TrialWaveFunction::flex_completeUpdates(const std::vector<TrialWaveFunction*>& wf_list) const
{
if (WF_list.size() > 1)
if (wf_list.size() > 1)
{
for (int i = 0, ii = ACCEPT_TIMER; i < Z.size(); i++, ii += TIMER_SKIP)
{
ScopedTimer local_timer(myTimers[ii]);
std::vector<WaveFunctionComponent*> WFC_list(extractWFCPtrList(WF_list, i));
Z[i]->mw_completeUpdates(WFC_list);
std::vector<WaveFunctionComponent*> wfc_list(extractWFCPtrList(wf_list, i));
Z[i]->mw_completeUpdates(wfc_list);
}
}
else if (WF_list.size() == 1)
WF_list[0]->completeUpdates();
else if (wf_list.size() == 1)
wf_list[0]->completeUpdates();
}
void TrialWaveFunction::checkInVariables(opt_variables_type& active)
@ -876,14 +875,33 @@ void TrialWaveFunction::evaluateRatios(VirtualParticleSet& VP, std::vector<Value
if (ct == ComputeType::ALL || (Z[i]->is_fermionic && ct == ComputeType::FERMIONIC) ||
(!Z[i]->is_fermionic && ct == ComputeType::NONFERMIONIC))
{
myTimers[ii]->start();
ScopedTimer local_timer(myTimers[ii]);
Z[i]->evaluateRatios(VP, t);
for (int j = 0; j < ratios.size(); ++j)
ratios[j] *= t[j];
myTimers[ii]->stop();
}
}
void TrialWaveFunction::flex_evaluateRatios(const RefVector<TrialWaveFunction>& wf_list, const RefVector<VirtualParticleSet>& vp_list, std::vector<std::vector<ValueType>>& ratios, ComputeType ct)
{
if (wf_list.size() > 1)
{
auto& wavefunction_components = wf_list[0].get().Z;
for (int i = 0, ii = NL_TIMER; i < wavefunction_components.size(); i++, ii += TIMER_SKIP)
if (ct == ComputeType::ALL || (wavefunction_components[i]->is_fermionic && ct == ComputeType::FERMIONIC) ||
(!wavefunction_components[i]->is_fermionic && ct == ComputeType::NONFERMIONIC))
{
ScopedTimer local_timer(wf_list[0].get().get_timers()[ii]);
const auto wfc_list(extractWFCRefList(wf_list, i));
wavefunction_components[i]->mw_evaluateRatios(wfc_list, vp_list, ratios);
}
}
else if (wf_list.size() == 1)
wf_list[0].get().evaluateRatios(vp_list[0], ratios[0], ct);
}
void TrialWaveFunction::evaluateDerivRatios(VirtualParticleSet& VP,
const opt_variables_type& optvars,
std::vector<ValueType>& ratios,

View File

@ -615,6 +615,20 @@ struct WaveFunctionComponent : public QMCTraits
*/
virtual void evaluateRatios(VirtualParticleSet& VP, std::vector<ValueType>& ratios);
/** evaluate ratios to evaluate the non-local PP multiple walkers
* @param wfc_list the list of WaveFunctionComponent references of the same component in a walker batch
* @param vp_list the list of VirtualParticleSet references in a walker batch
* @param ratios of all the virtual moves of all the walkers
*/
virtual void mw_evaluateRatios(const RefVector<WaveFunctionComponent>& wfc_list,
const RefVector<VirtualParticleSet>& vp_list,
std::vector<std::vector<ValueType>>& ratios)
{
#pragma omp parallel for
for (int iw = 0; iw < wfc_list.size(); iw++)
wfc_list[iw].get().evaluateRatios(vp_list[iw], ratios[iw]);
}
/** evaluate ratios to evaluate the non-local PP
* @param VP VirtualParticleSet
* @param ratios ratios with new positions VP.R[k] the VP.refPtcl