2222
2323namespace qmcplusplus
2424{
25- NonLocalECPComponent::NonLocalECPComponent ()
26- : lmax(0 ), nchannel(0 ), nknot(0 ), Rmax(-1 ), VP(nullptr ), do_randomize_grid_(true )
27- {}
25+ NonLocalECPComponent::NonLocalECPComponent () : lmax(0 ), nchannel(0 ), nknot(0 ), Rmax(-1 ), do_randomize_grid_(true ) {}
2826
2927// unfortunately we continue the sloppy use of the default copy constructor followed by reassigning pointers.
3028// This prevents use of smart pointers and concievably sets us up for trouble with double frees and the destructor.
@@ -33,35 +31,16 @@ NonLocalECPComponent::NonLocalECPComponent(const NonLocalECPComponent& nl_ecpc,
3331{
3432 for (int i = 0 ; i < nl_ecpc.nlpp_m .size (); ++i)
3533 nlpp_m[i] = nl_ecpc.nlpp_m [i]->makeClone ();
36- if (nl_ecpc.VP )
37- VP = new VirtualParticleSet (pset, nl_ecpc.VP ->getNumDistTables ());
3834}
3935
4036NonLocalECPComponent::~NonLocalECPComponent ()
4137{
4238 for (int ip = 0 ; ip < nlpp_m.size (); ip++)
4339 delete nlpp_m[ip];
44- if (VP)
45- delete VP;
4640}
4741
4842void NonLocalECPComponent::set_randomize_grid (bool do_randomize_grid) { do_randomize_grid_ = do_randomize_grid; }
4943
50- void NonLocalECPComponent::initVirtualParticle (const ParticleSet& qp)
51- {
52- assert (VP == 0 );
53- outputManager.pause ();
54- VP = new VirtualParticleSet (qp);
55- outputManager.resume ();
56- }
57-
58- void NonLocalECPComponent::deleteVirtualParticle ()
59- {
60- if (VP)
61- delete VP;
62- VP = nullptr ;
63- }
64-
6544void NonLocalECPComponent::add (int l, RadialPotentialType* pp)
6645{
6746 angpp_m.push_back (l);
@@ -128,6 +107,7 @@ void NonLocalECPComponent::print(std::ostream& os)
128107}
129108
130109NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOne (ParticleSet& W,
110+ const OptionalRef<VirtualParticleSet> vp,
131111 int iat,
132112 TrialWaveFunction& psi,
133113 int iel,
@@ -140,21 +120,22 @@ NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOne(ParticleSet& W,
140120
141121 const bool use_TMDLA = tmove_xy && use_DLA;
142122
143- if (VP )
123+ if (vp )
144124 {
125+ VirtualParticleSet& vp_set (*vp);
145126 // Compute ratios with VP
146- VP-> makeMoves (W, iel, deltaV, true , iat);
127+ vp_set. makeMoves (W, iel, deltaV, true , iat);
147128 if (use_TMDLA)
148129 {
149- psi.evaluateRatios (*VP , psiratio_det, TrialWaveFunction::ComputeType::FERMIONIC);
150- psi.evaluateRatios (*VP , psiratio, TrialWaveFunction::ComputeType::NONFERMIONIC);
130+ psi.evaluateRatios (vp_set , psiratio_det, TrialWaveFunction::ComputeType::FERMIONIC);
131+ psi.evaluateRatios (vp_set , psiratio, TrialWaveFunction::ComputeType::NONFERMIONIC);
151132 for (int j = 0 ; j < nknot; j++)
152133 psiratio[j] *= psiratio_det[j];
153134 }
154135 else if (use_DLA)
155- psi.evaluateRatios (*VP , psiratio, TrialWaveFunction::ComputeType::FERMIONIC);
136+ psi.evaluateRatios (vp_set , psiratio, TrialWaveFunction::ComputeType::FERMIONIC);
156137 else
157- psi.evaluateRatios (*VP , psiratio);
138+ psi.evaluateRatios (vp_set , psiratio);
158139 }
159140 else
160141 {
@@ -233,6 +214,7 @@ NonLocalECPComponent::RealType NonLocalECPComponent::calculatePotential(RealType
233214
234215void NonLocalECPComponent::mw_evaluateOne (const RefVectorWithLeader<NonLocalECPComponent>& ecp_component_list,
235216 const RefVectorWithLeader<ParticleSet>& p_list,
217+ const std::optional<const RefVectorWithLeader<VirtualParticleSet>> vp_list,
236218 const RefVectorWithLeader<TrialWaveFunction>& psi_list,
237219 const RefVector<const NLPPJob<RealType>>& joblist,
238220 std::vector<RealType>& pairpots,
@@ -243,16 +225,13 @@ void NonLocalECPComponent::mw_evaluateOne(const RefVectorWithLeader<NonLocalECPC
243225 const bool use_TMDLA = (!tmove_xy_all_list.empty ()) && use_DLA;
244226
245227 auto & ecp_component_leader = ecp_component_list.getLeader ();
246- if (ecp_component_leader. VP )
228+ if (vp_list )
247229 {
248230 // Compute ratios with VP
249- RefVectorWithLeader<VirtualParticleSet> vp_list (*ecp_component_leader.VP );
250- RefVectorWithLeader<const VirtualParticleSet> const_vp_list (*ecp_component_leader.VP );
231+ const auto & vp_set_list (*vp_list);
251232 RefVector<const std::vector<PosType>> deltaV_list;
252233 RefVector<std::vector<ValueType>> psiratios_list;
253234 RefVector<std::vector<ValueType>> psiratios_det_list;
254- vp_list.reserve (ecp_component_list.size ());
255- const_vp_list.reserve (ecp_component_list.size ());
256235 deltaV_list.reserve (ecp_component_list.size ());
257236 psiratios_list.reserve (ecp_component_list.size ());
258237 psiratios_det_list.reserve (ecp_component_list.size ());
@@ -264,16 +243,19 @@ void NonLocalECPComponent::mw_evaluateOne(const RefVectorWithLeader<NonLocalECPC
264243
265244 component.buildQuadraturePointDeltaPositions (job.ion_elec_dist , job.ion_elec_displ , component.deltaV );
266245
267- vp_list.push_back (*component.VP );
268- const_vp_list.push_back (*component.VP );
269246 deltaV_list.push_back (component.deltaV );
270247 psiratios_list.push_back (component.psiratio );
271248 psiratios_det_list.push_back (component.psiratio_det );
272249 }
273250
274- ResourceCollectionTeamLock<VirtualParticleSet> vp_res_lock (collection, vp_list);
251+ RefVectorWithLeader<const VirtualParticleSet> const_vp_list (vp_set_list.getLeader ());
252+ const_vp_list.reserve (vp_set_list.size ());
253+ for (VirtualParticleSet& vp_set : vp_set_list)
254+ const_vp_list.push_back (vp_set);
255+
256+ ResourceCollectionTeamLock<VirtualParticleSet> vp_res_lock (collection, vp_set_list);
275257
276- VirtualParticleSet::mw_makeMoves (vp_list , p_list, deltaV_list, joblist, true );
258+ VirtualParticleSet::mw_makeMoves (vp_set_list , p_list, deltaV_list, joblist, true );
277259
278260 if (use_TMDLA)
279261 {
@@ -341,6 +323,7 @@ void NonLocalECPComponent::mw_evaluateOne(const RefVectorWithLeader<NonLocalECPC
341323}
342324
343325NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOneWithForces (ParticleSet& W,
326+ const OptionalRef<VirtualParticleSet> vp,
344327 int iat,
345328 TrialWaveFunction& psi,
346329 int iel,
@@ -372,12 +355,13 @@ NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOneWithForces(Parti
372355 // term coming from dependence of quadrature grid on ion position.
373356 PosType gradwfnterm_ (0 );
374357
375- if (VP )
358+ if (vp )
376359 {
377360 APP_ABORT (" NonLocalECPComponent::evaluateOneWithForces(...): Forces not implemented with virtual particle moves\n " );
361+ VirtualParticleSet& vp_set (*vp);
378362 // Compute ratios with VP
379- VP-> makeMoves (W, iel, deltaV, true , iat);
380- psi.evaluateRatios (*VP , psiratio);
363+ vp_set. makeMoves (W, iel, deltaV, true , iat);
364+ psi.evaluateRatios (vp_set , psiratio);
381365 }
382366 else
383367 {
@@ -475,6 +459,7 @@ NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOneWithForces(Parti
475459}
476460
477461NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOneWithForces (ParticleSet& W,
462+ const OptionalRef<VirtualParticleSet> vp,
478463 ParticleSet& ions,
479464 int iat,
480465 TrialWaveFunction& psi,
@@ -522,12 +507,13 @@ NonLocalECPComponent::RealType NonLocalECPComponent::evaluateOneWithForces(Parti
522507 for (size_t j = 0 ; j < nknot; j++)
523508 pulay_quad[j].resize (ions.getTotalNum ());
524509
525- if (VP )
510+ if (vp )
526511 {
527512 APP_ABORT (" NonLocalECPComponent::evaluateOneWithForces(...): Forces not implemented with virtual particle moves\n " );
513+ VirtualParticleSet& vp_set (*vp);
528514 // Compute ratios with VP
529- VP-> makeMoves (W, iel, deltaV, true , iat);
530- psi.evaluateRatios (*VP , psiratio);
515+ vp_set. makeMoves (W, iel, deltaV, true , iat);
516+ psi.evaluateRatios (vp_set , psiratio);
531517 }
532518 else
533519 {
0 commit comments