Loading...
Searching...
No Matches
init.hpp
Go to the documentation of this file.
1#pragma once
2
3/**
4 * RealSpaceMixer — base class for mixers that operate on real-space densities.
5 *
6 * Dispatches per-spin mixing to the `mix_one_component()` virtual hook.
7 * The concrete implementation (AndersonMixer) lives in anderson.hpp.
8 */
9
10#include <functional>
11#include <vector>
12
14
15namespace q3 {
16
17/// Mixer operating on real-space charge density vectors.
18class RealSpaceMixer : public Mixer {
19 public:
20 using Mixer::Mixer;
21
22 void initialize(const MixerEnvironment& environment) override {
23 global_reduce_ = environment.global_reduce;
24 }
25
26 void mix(const std::vector<std::vector<Real>>& input_density,
27 std::vector<std::vector<Real>>& output_density,
28 int number_of_spin_components) override {
29 for (int spin_index = 0; spin_index < number_of_spin_components; ++spin_index) {
30 output_density[spin_index] =
31 mix_one_component(input_density[spin_index], output_density[spin_index]);
32 }
33 }
34
35 /**
36 * Mix one spin component to produce the next input density.
37 * @param input_density density used to build the potential (rho_in).
38 * @param output_density density from diagonalization/sum_band (rho_out).
39 * @return mixed density for the next iteration.
40 */
41 virtual std::vector<Real> mix_one_component(const std::vector<Real>& input_density,
42 const std::vector<Real>& output_density) = 0;
43
44 using Preconditioner = std::function<void(std::vector<Real>&)>;
45 void set_preconditioner(Preconditioner preconditioner) {
46 preconditioner_ = std::move(preconditioner);
47 }
48 void set_global_reduce(std::function<void(std::vector<Real>&)> global_reduce) {
49 global_reduce_ = std::move(global_reduce);
50 }
51
52 protected:
54 std::function<void(std::vector<Real>&)> global_reduce_;
55};
56
57} // namespace q3
Abstract base class for all charge density mixers.
Definition init.hpp:46
Mixer(Real mixing_parameter, int history_depth)
Definition init.hpp:48
Mixer operating on real-space charge density vectors.
Definition init.hpp:18
void set_preconditioner(Preconditioner preconditioner)
Definition init.hpp:45
std::function< void(std::vector< Real > &)> global_reduce_
Definition init.hpp:54
std::function< void(std::vector< Real > &)> Preconditioner
Definition init.hpp:44
virtual std::vector< Real > mix_one_component(const std::vector< Real > &input_density, const std::vector< Real > &output_density)=0
void initialize(const MixerEnvironment &environment) override
Supply the representation context the mixer needs before the first mix().
Definition init.hpp:22
void set_global_reduce(std::function< void(std::vector< Real > &)> global_reduce)
Definition init.hpp:48
void mix(const std::vector< std::vector< Real > > &input_density, std::vector< std::vector< Real > > &output_density, int number_of_spin_components) override
Definition init.hpp:26
Preconditioner preconditioner_
Definition init.hpp:53
std::function< void(std::vector< Real > &)> global_reduce
Definition init.hpp:42