@@ -157,14 +157,24 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
157157 throw UniformCommunicateError (" Failed to find the wavefunction named \" " + name + " \" !" );
158158 };
159159
160+ auto getHam = [&hamiltonian_pool](const std::string& name) -> QMCHamiltonian& {
161+ if (auto ham_optional = hamiltonian_pool.getHamiltonian (name); ham_optional)
162+ return *ham_optional;
163+ else if (name.empty ())
164+ throw UniformCommunicateError (" Failed to find a hamiltonian! Please specify the name of hamiltonian using a "
165+ " qmcsystem node in the driver input." );
166+ else
167+ throw UniformCommunicateError (" Failed to find the hamiltonian named \" " + name + " \" !" );
168+ };
169+
160170 if (das.new_run_type == QMCRunType::CSVMC )
161171 { // CSVMC requires multiple pairs of Psi and Ham
162172 std::vector<TrialWaveFunction*> multi_psi;
163173 std::vector<QMCHamiltonian*> multi_ham;
164174 for (const auto & name_pair : PsiHamNamePairReader::readMultiplePairs (cur))
165175 {
166176 multi_psi.emplace_back (&getPsi (name_pair.first ));
167- multi_ham.emplace_back (hamiltonian_pool. getHamiltonian (name_pair.second ));
177+ multi_ham.emplace_back (& getHam (name_pair.second ));
168178 }
169179 new_driver = std::make_unique<CSVMC >(project_data_, qmc_system, std::move (multi_psi), std::move (multi_ham), comm);
170180 new_driver->setUpdateMode (das.what_to_do [UPDATE_MODE ]);
@@ -175,7 +185,7 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
175185 // get primaryPsi
176186 auto & primaryPsi = getPsi (one_pair ? one_pair->first : " " );
177187 // get primaryH
178- QMCHamiltonian* primaryH = hamiltonian_pool. getPrimary ( );
188+ auto & primaryH = getHam (one_pair ? one_pair-> second : " " );
179189
180190 auto makeEstimatorManager =
181191 [&](const std::optional<EstimatorManagerInput>& global_emi,
@@ -193,15 +203,15 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
193203 return {};
194204 };
195205
196- auto estimator_manager = std::make_unique<EstimatorManagerNew>(* primaryH, comm);
206+ auto estimator_manager = std::make_unique<EstimatorManagerNew>(primaryH, comm);
197207 estimator_manager->constructEstimators (makeEstimatorManagerInput (global_emi, driver_emi), qmc_system, primaryPsi,
198- * primaryH, particle_pool.getPool ());
208+ primaryH, particle_pool.getPool ());
199209 return estimator_manager;
200210 };
201211
202212 if (das.new_run_type == QMCRunType::VMC )
203213 {
204- new_driver = std::make_unique<VMC >(project_data_, qmc_system, primaryPsi, * primaryH,
214+ new_driver = std::make_unique<VMC >(project_data_, qmc_system, primaryPsi, primaryH,
205215 RandomNumberControl::getChildren (), comm, das.enable_profiling );
206216 new_driver->setUpdateMode (das.what_to_do [UPDATE_MODE ]);
207217 }
@@ -234,15 +244,15 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
234244 std::make_unique<VMCBatched>(project_data_, std::move (qmcdriver_input),
235245 makeEstimatorManager (emi, qmcdriver_input.get_estimator_manager_input ()),
236246 std::move (vmcdriver_input), qmc_system,
237- MCPopulation (comm->size (), comm->rank (), qmc_system, primaryPsi, * primaryH),
247+ MCPopulation (comm->size (), comm->rank (), qmc_system, primaryPsi, primaryH),
238248 RandomNumberControl::getChildrenRefs (), qmc_system.getSampleStack (), comm);
239249
240250 new_driver->setUpdateMode (1 );
241251 }
242252 else if (das.new_run_type == QMCRunType::DMC )
243253 {
244254 DMCFactory fac (das.what_to_do [UPDATE_MODE ], das.what_to_do [GPU_MODE ], cur);
245- new_driver = fac.create (project_data_, qmc_system, primaryPsi, * primaryH, comm, das.enable_profiling );
255+ new_driver = fac.create (project_data_, qmc_system, primaryPsi, primaryH, comm, das.enable_profiling );
246256 }
247257 else if (das.new_run_type == QMCRunType::DMC_BATCH )
248258 {
@@ -267,13 +277,13 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
267277 std::make_unique<DMCBatched>(project_data_, std::move (qmcdriver_input),
268278 makeEstimatorManager (emi, qmcdriver_input.get_estimator_manager_input ()),
269279 std::move (dmcdriver_input), qmc_system,
270- MCPopulation (comm->size (), comm->rank (), qmc_system, primaryPsi, * primaryH),
280+ MCPopulation (comm->size (), comm->rank (), qmc_system, primaryPsi, primaryH),
271281 RandomNumberControl::getChildrenRefs (), comm);
272282 }
273283 else if (das.new_run_type == QMCRunType::RMC )
274284 {
275285 RMCFactory fac (das.what_to_do [UPDATE_MODE ], cur);
276- new_driver = fac.create (project_data_, qmc_system, primaryPsi, * primaryH, comm);
286+ new_driver = fac.create (project_data_, qmc_system, primaryPsi, primaryH, comm);
277287 }
278288 else if (das.new_run_type == QMCRunType::LINEAR_OPTIMIZE )
279289 {
@@ -283,8 +293,8 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
283293 " full precision build instead." );
284294#endif
285295 QMCFixedSampleLinearOptimize* opt =
286- new QMCFixedSampleLinearOptimize (project_data_, qmc_system, primaryPsi, * primaryH, comm);
287- // ZeroVarianceOptimize *opt = new ZeroVarianceOptimize(qmc_system,primaryPsi,* primaryH );
296+ new QMCFixedSampleLinearOptimize (project_data_, qmc_system, primaryPsi, primaryH, comm);
297+ // ZeroVarianceOptimize *opt = new ZeroVarianceOptimize(qmc_system,primaryPsi,primaryH );
288298 opt->setWaveFunctionNode (wavefunction_pool.getWaveFunctionNode (" psi0" ));
289299 new_driver.reset (opt);
290300 }
@@ -319,7 +329,7 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
319329 auto opt = std::make_unique<QMCFixedSampleLinearOptimizeBatched>(project_data_, std::move (qmcdriver_input),
320330 std::move (vmcdriver_input), qmc_system,
321331 MCPopulation (comm->size (), comm->rank (),
322- qmc_system, primaryPsi, * primaryH),
332+ qmc_system, primaryPsi, primaryH),
323333 RandomNumberControl::getChildrenRefs (),
324334 qmc_system.getSampleStack (), comm);
325335 opt->setWaveFunctionNode (wavefunction_pool.getWaveFunctionNode (" psi0" ));
@@ -329,7 +339,7 @@ std::unique_ptr<QMCDriverInterface> QMCDriverFactory::createQMCDriver(xmlNodePtr
329339 {
330340 app_log () << " Testing wavefunctions." << std::endl;
331341 QMCDriverInterface* temp_ptr =
332- new WaveFunctionTester (project_data_, qmc_system, primaryPsi, * primaryH, particle_pool, comm);
342+ new WaveFunctionTester (project_data_, qmc_system, primaryPsi, primaryH, particle_pool, comm);
333343 new_driver.reset (temp_ptr);
334344 }
335345 else
0 commit comments