73 if (iteration_budget < 2) {
74 throw std::runtime_error(
75 "VerificationFlavor: 'max_iterations' is " + std::to_string(iteration_budget) +
76 "; a restart needs at least 2 iterations, since a single energy cannot show "
77 "whether the density moved.");
81 const std::string checkpoint_path = save_directory +
"/effective-potential.q3cp";
87 if (!checkpoint.
load(checkpoint_path, snapshot)) {
88 throw std::runtime_error(
"VerificationFlavor: failed to load checkpoint at '" +
90 "'. Place the submitted checkpoint there before verifying.");
93 throw std::runtime_error(
"VerificationFlavor: checkpoint at '" + checkpoint_path +
94 "' contains no charge density; there is nothing to restart "
98 log::info(
"Verification: restarting from '{}' for {} iterations",
114 auto* planewave_iterator =
116 if (!planewave_iterator) {
117 throw std::runtime_error(
118 "VerificationFlavor: expected a planewave pseudopotential iterator.");
126 generated::Results results =
new_results(
"verification");
133 const std::vector<Real>& energies_in_ry = iterator->total_energy_history_in_ry();
134 results.runtime_log.converged =
static_cast<int>(energies_in_ry.size()) == iteration_budget;
136 set_fermi_energy(results, planewave_iterator->quantum_system().fermi_energy());
137 if (!energies_in_ry.empty()) {
139 generated::ConvergenceElectronic{
140 generated::ConvergenceElectronicNameEnum::CONVERGENCE_ELECTRONIC,
141 generated::ConvergenceElectronicUnitsEnum::RY,
142 {std::vector<double>(energies_in_ry.begin(), energies_in_ry.end())}});
145 log::info(
"Verification: {} iterations, energy drift {:.3e} Ry",
146 energies_in_ry.size(),
147 energy_drift_in_ry(energies_in_ry));