53 std::vector<HubbardSpecification>
hubbard;
105 std::vector<std::pair<std::string, Vector3D>>
band_path;
151 "'. Supported values: 'default', 'none', 'kerker', "
180 [[nodiscard]]
const std::vector<ScfIterationRecord>&
scf_history()
const {
314 auto timer_start = std::chrono::high_resolution_clock::now();
316 auto timer_repr = std::chrono::high_resolution_clock::now();
319 auto timer_charge = std::chrono::high_resolution_clock::now();
321 auto timer_wfc = std::chrono::high_resolution_clock::now();
335 std::chrono::duration<double, std::milli>(timer_repr - timer_start).count());
336 log::debug(
" charge_density+mixer: {:.1f} ms",
337 std::chrono::duration<double, std::milli>(timer_charge - timer_repr).count());
339 std::chrono::duration<double, std::milli>(timer_wfc - timer_charge).count());
345 auto timer_iter_start = std::chrono::high_resolution_clock::now();
350 auto timer_prep_end = std::chrono::high_resolution_clock::now();
353 auto timer_solve_end = std::chrono::high_resolution_clock::now();
356 auto timer_occupations_end = std::chrono::high_resolution_clock::now();
360 auto timer_density_end = std::chrono::high_resolution_clock::now();
362 auto timer_symm_end = std::chrono::high_resolution_clock::now();
396 Real diagonalization_error_estimate =
398 Real tighter_threshold =
402 tighter_threshold < threshold_used) {
403 log::info(
" Re-diagonalizing with tighter threshold "
404 "(dr2={:.2e} < tr2_min={:.2e})",
406 diagonalization_error_estimate);
432 auto timer_residual_end = std::chrono::high_resolution_clock::now();
434 auto log_iteration_timing = [&](
auto timer_mix_end,
auto timer_potential_end) {
437 std::chrono::duration<double, std::milli>(timer_prep_end - timer_iter_start)
440 std::chrono::duration<double, std::milli>(timer_solve_end - timer_prep_end)
443 " update_occupations: {:.1f} ms",
444 std::chrono::duration<double, std::milli>(timer_occupations_end - timer_solve_end)
447 " construct_density: {:.1f} ms",
448 std::chrono::duration<double, std::milli>(timer_density_end - timer_occupations_end)
451 std::chrono::duration<double, std::milli>(timer_symm_end - timer_density_end)
454 " deband+residual: {:.1f} ms",
455 std::chrono::duration<double, std::milli>(timer_residual_end - timer_symm_end)
458 std::chrono::duration<double, std::milli>(timer_mix_end - timer_residual_end)
461 " update_potential: {:.1f} ms",
462 std::chrono::duration<double, std::milli>(timer_potential_end - timer_mix_end)
465 " total_iteration: {:.1f} ms",
466 std::chrono::duration<double, std::milli>(timer_potential_end - timer_iter_start)
475 log_iteration_timing(timer_residual_end, timer_residual_end);
483 auto timer_mix_end = std::chrono::high_resolution_clock::now();
491 auto timer_pot_end = std::chrono::high_resolution_clock::now();
512 log_iteration_timing(timer_mix_end, timer_pot_end);
539 " iteration # {:3d} Etot = {:14.9f} Ry delta(E) = {:.2e} dr2 = {:.2e}",
569 log::info(
" non-self-consistent pass complete");
virtual void mix_density(const std::vector< std::vector< Real > > &input_density_for_mixing)=0
virtual void synchronize_smooth_density_from_mixed()
void load_effective_potential(std::vector< std::vector< Real > > effective_potential)
virtual void restore_density_at_convergence()=0
virtual void prepare_hamiltonian()
const std::vector< Complex > & total_potential_g() const
~KohnShamSCFIterator() override=default
const KohnShamSCFIteratorConfig & config() const
virtual void update_occupations()=0
const std::vector< Real > & charge_density_real() const
Real total_energy() const override
virtual void report_first_iteration_details()=0
std::unique_ptr< XCFunctional > exchange_correlation_
virtual Real compute_density_residual(const std::vector< std::vector< Real > > &input_density_for_mixing) const =0
Real diagonalization_threshold() const
void load_charge_density(std::vector< std::vector< Real > > charge_density)
Real total_energy_previous_
virtual void report_convergence_details()=0
std::vector< Complex > exchange_correlation_potential_g_
virtual void symmetrize_density()=0
virtual int number_of_kpoint_states() const =0
virtual void initiate_mixer()=0
std::vector< Complex > total_potential_g_
void perform_iteration() override
std::unique_ptr< Mixer > mixer_
std::string exchange_correlation_functional_
int methfessel_paxton_order_
std::unique_ptr< SmearingScheme > smearing_scheme_
Crystal & crystal_structure() const
virtual void set_diagonalization_tolerance(int iteration)=0
bool first_iteration_rediag_done_
const std::vector< Complex > & charge_density_g() const
Real diagonalizer_tolerance_
bool has_preloaded_charge_density_
virtual void initialize_representation()=0
virtual void solve_single_particle_states()=0
virtual Real compute_double_counting_correction() const =0
std::vector< std::vector< Real > > charge_density_real_
virtual const KohnShamEnergies & energies() const =0
virtual std::vector< std::vector< Real > > input_density_for_mixing() const =0
const std::vector< Complex > & exchange_correlation_potential_g() const
void initialize() override
Base implementation prints the SCF banner. Children call SCFIterator::initialize() last.
void report_non_convergence() override
virtual void snapshot_output_density()=0
virtual void compute_energy_components()
virtual void initialize_charge_density()=0
void log_iteration_energy(Real delta_energy)
Single source of truth for the per-iteration energy/convergence log line.
const std::vector< Real > & potential_for_spin(int spin_index) const
bool has_preloaded_effective_potential_
std::vector< Complex > charge_density_g_
KohnShamSCFIteratorConfig config_
virtual void initialize_single_particle_states()=0
const XCFunctional & exchange_correlation() const
void offer_starting_charge_density(std::vector< std::vector< Real > > charge_density)
void report_convergence() override
virtual Real compute_delta_escf_correction() const =0
void report_iteration() override
virtual void set_diagonalizer_tolerance(Real tolerance)=0
const std::vector< ScfIterationRecord > & scf_history() const
virtual int number_of_bands() const =0
const std::vector< Real > & real_space_potential() const
virtual KohnShamEnergies & energies_mutable()=0
std::vector< ScfIterationRecord > scf_history_
std::vector< std::vector< Real > > real_space_potential_
std::string mixing_preconditioning_
KohnShamSCFIterator(KohnShamSCFIteratorConfig config)
virtual void construct_density_from_states()=0
virtual void update_effective_potential()=0
bool preloaded_charge_density_is_a_starting_guess_
Set by offer_starting_charge_density(): a density that need not fit.
const std::vector< Real > & charge_density_for_spin(int spin_index) const
bool is_iteration_converged() const override
std::vector< std::vector< Complex > > total_potential_g_by_spin_
virtual Real number_of_electrons() const =0
Crystal * crystal_structure_
Real convergence_threshold_
virtual void initialize()
Base implementation prints the SCF banner. Children call SCFIterator::initialize() last.
int number_of_spin_components() const
static std::unique_ptr< XCFunctional > create(const std::string &name, int number_of_spin_components=1)
Abstract base class for XC functionals.
std::unique_ptr< Mixer > create(const std::string &mode, Real mixing_parameter=0.7, int history_depth=8)
Create a charge density mixer by name ("broyden", "linear", or "anderson").
bool is_supported(const std::string &name)
The names create() accepts, for validation and error messages.
void debug(spdlog::format_string_t< Args... > fmt, Args &&... args)
void warn(spdlog::format_string_t< Args... > fmt, Args &&... args)
void info(spdlog::format_string_t< Args... > fmt, Args &&... args)
constexpr double minimum_eigenvalue_tolerance
std::unique_ptr< SmearingScheme > create_smearing(const std::string &name, Real smearing_width=0.0, int methfessel_paxton_order=1)
Factory for smearing schemes.
Real total() const override
Return the total energy as the sum of all component fields.
Real double_counting_correction
std::vector< Real > starting_magnetization
std::string hubbard_projector_type
const KPointsGrid * kpoint_grid
std::vector< std::pair< std::string, Vector3D > > band_path
std::vector< Real > atomic_starting_magnetization
int davidson_basis_expansion_factor
Real wavefunction_energy_cutoff
std::vector< HubbardSpecification > hubbard
std::string mixing_preconditioning
std::string exchange_correlation_functional
std::string nonlocal_stress_derivative_method
int band_path_points_per_segment
std::vector< HubbardStartingEigenvalue > hubbard_starting_eigenvalues
First-iteration occupation-eigenvalue overrides; empty = no seeding.
std::string diagonalization_method
bool use_exact_wavefunction_grid
Real charge_density_energy_cutoff
std::string dispersion_correction
const execution::ExecutionPolicy * execution_policy
int methfessel_paxton_order
const PseudopotentialSet * pseudopotential_set
std::string representation_type
bool use_deterministic_fft_planning
int hubbard_fixed_occupation_iterations
Iterations for which the seeded occupation matrix is held; 0 = first iteration only.
One row per SCF iteration, in order; the source for per-iteration companion outputs.
void log_resident_checkpoint_debug(const std::string &label)
static ProfilingCounters & instance()
void release_unused_heap(const std::string &label)