46 return number_of_spin_components_;
62 return total_energy_history_in_ry_;
78 owned_crystal_ = std::move(crystal);
83 auto timer_start = std::chrono::steady_clock::now();
85 auto timer_after_initialization = std::chrono::steady_clock::now();
87 auto timer_after_iteration = std::chrono::steady_clock::now();
89 auto timer_end = std::chrono::steady_clock::now();
91 auto duration_milliseconds = [](
auto start,
auto end) {
92 return std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count();
94 log::info(
" Timing: init={}ms iterate={}ms report={}ms total={}ms",
95 duration_milliseconds(timer_start, timer_after_initialization),
96 duration_milliseconds(timer_after_initialization, timer_after_iteration),
97 duration_milliseconds(timer_after_iteration, timer_end),
98 duration_milliseconds(timer_start, timer_end));
111 int number_of_spin_components_;
113 std::vector<Real> total_energy_history_in_ry_;
118 std::optional<Crystal> owned_crystal_;
129 total_energy_history_in_ry_.clear();
144 ++iteration_number) {
183 const std::string& prefix)
const {
184 (void)output_directory;
Crystal * crystal_structure_
virtual void report_non_convergence()=0
virtual void finalize()=0
Real convergence_threshold_
virtual Real total_energy() const =0
virtual ~SCFIterator()=default
virtual void report_iteration()=0
virtual void write_checkpoints(const std::string &output_directory, const std::string &prefix) const
virtual void initialize()
Base implementation prints the SCF banner. Children call SCFIterator::initialize() last.
SCFIterator(SCFIteratorConfig config)
virtual void perform_iteration()=0
virtual bool is_iteration_converged() const =0
virtual void report()
Report convergence or non-convergence after iterate() finishes.
int number_of_spin_components() const
void set_convergence_threshold(Real threshold)
Set the SCF convergence threshold (in Ry).
void set_owned_crystal(Crystal crystal)
Transfer ownership of a Crystal into this iterator.
const std::vector< Real > & total_energy_history_in_ry() const
virtual void iterate()
Main iteration loop.
bool is_converged() const
virtual void report_convergence()=0
void set_maximum_iterations(int maximum_iterations)
Set the maximum number of SCF iterations.
void section(const std::string &title)
void info(spdlog::format_string_t< Args... > fmt, Args &&... args)