ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
broyden_mixing.h
Go to the documentation of this file.
1#ifndef BROYDEN_MIXING_H_
2#define BROYDEN_MIXING_H_
3#include "mixing.h"
5
6namespace Base_Mixing
7{
25class Broyden_Mixing : public Mixing
26{
27 public:
29 {
30 this->mixing_ndim = mixing_ndim;
31 this->data_ndim = mixing_ndim + 1;
32 this->coef = std::vector<double>(mixing_ndim + 1);
34 }
36 {
37 this->mixing_beta = mixing_beta;
38 }
39 virtual ~Broyden_Mixing() override
40 {
41 if (F != nullptr)
42 free(F);
43 if (dF != nullptr)
44 free(dF);
45 };
50 virtual void reset() override
51 {
52 this->ndim_cal_dF = 0;
53 this->start_dF = -1;
54 this->address = nullptr;
55 }
56
57 // explicitly introduce push_data version of the base class
58 // that is not overridden in this class
60
72 virtual void push_data(Mixing_Data& mdata,
73 const double* data_in,
74 const double* data_out,
75 std::function<void(double*)> screen,
76 std::function<void(double*, const double*, const double*)> mix,
77 const bool& need_calcoef) override
78 {
79 this->tem_push_data(mdata, data_in, data_out, screen, mix, need_calcoef);
80 };
81 virtual void push_data(
82 Mixing_Data& mdata,
83 const std::complex<double>* data_in,
84 const std::complex<double>* data_out,
85 std::function<void(std::complex<double>*)> screen,
86 std::function<void(std::complex<double>*, const std::complex<double>*, const std::complex<double>*)> mix,
87 const bool& need_calcoef) override
88 {
89 this->tem_push_data(mdata, data_in, data_out, screen, mix, need_calcoef);
90 };
91
98 virtual void cal_coef(const Mixing_Data& mdata, std::function<double(double*, double*)> inner_product) override
99 {
100 tem_cal_coef(mdata, inner_product);
101 }
102 virtual void cal_coef(const Mixing_Data& mdata,
103 std::function<double(std::complex<double>*, std::complex<double>*)> inner_product) override
104 {
105 tem_cal_coef(mdata, inner_product);
106 }
107
108 private:
120 template <class FPTYPE>
121 void tem_push_data(Mixing_Data& mdata,
122 const FPTYPE* data_in,
123 const FPTYPE* data_out,
124 std::function<void(FPTYPE*)> screen,
125 std::function<void(FPTYPE*, const FPTYPE*, const FPTYPE*)> mix,
126 const bool& need_calcoef);
127
134 template <class FPTYPE>
135 void tem_cal_coef(const Mixing_Data& mdata, std::function<double(FPTYPE*, FPTYPE*)> inner_product);
136
137 private:
138 // F = data_out - data_in
139 void* F = nullptr;
140 // dF = F_{n+1} - F_n
141 void* dF = nullptr;
142 // binded mixing_data
144 // beta_ij = <dF_i, dF_j>
146 // mixing_ndim = data_ndim - 1
147 int mixing_ndim = -1;
148
149 // start index for dF
150 int start_dF = -1;
151 // get the index of i-th dF vector
152 int dFindex_move(const int& index)
153 {
154 return (start_dF + index + mixing_ndim) % mixing_ndim;
155 }
156 // the number of calculated dF
157 int ndim_cal_dF = 0;
158};
159} // namespace Base_Mixing
160#endif
Simplified modified broyden_mixing method. Ref: D.D. Johnson PRB 38, 12807 (1988) Here the weight w0 ...
Definition broyden_mixing.h:26
int start_dF
Definition broyden_mixing.h:150
int dFindex_move(const int &index)
Definition broyden_mixing.h:152
virtual void cal_coef(const Mixing_Data &mdata, std::function< double(std::complex< double > *, std::complex< double > *)> inner_product) override
Definition broyden_mixing.h:102
Broyden_Mixing(const int &mixing_ndim)
Definition broyden_mixing.h:28
virtual void reset() override
reset mixing
Definition broyden_mixing.h:50
void * F
Definition broyden_mixing.h:139
Mixing_Data * address
Definition broyden_mixing.h:143
virtual ~Broyden_Mixing() override
Definition broyden_mixing.h:39
virtual void cal_coef(const Mixing_Data &mdata, std::function< double(double *, double *)> inner_product) override
calculate coeficients for mixing
Definition broyden_mixing.h:98
virtual void push_data(Mixing_Data &mdata, const std::complex< double > *data_in, const std::complex< double > *data_out, std::function< void(std::complex< double > *)> screen, std::function< void(std::complex< double > *, const std::complex< double > *, const std::complex< double > *)> mix, const bool &need_calcoef) override
Definition broyden_mixing.h:81
int ndim_cal_dF
Definition broyden_mixing.h:157
virtual void push_data(Mixing_Data &mdata, const double *data_in, const double *data_out, std::function< void(double *)> screen, std::function< void(double *, const double *, const double *)> mix, const bool &need_calcoef) override
Definition broyden_mixing.h:72
void * dF
Definition broyden_mixing.h:141
void tem_push_data(Mixing_Data &mdata, const FPTYPE *data_in, const FPTYPE *data_out, std::function< void(FPTYPE *)> screen, std::function< void(FPTYPE *, const FPTYPE *, const FPTYPE *)> mix, const bool &need_calcoef)
Definition broyden_mixing.cpp:25
void tem_cal_coef(const Mixing_Data &mdata, std::function< double(FPTYPE *, FPTYPE *)> inner_product)
calculate coeficients for mixing
Definition broyden_mixing.cpp:105
ModuleBase::matrix beta
Definition broyden_mixing.h:145
int mixing_ndim
Definition broyden_mixing.h:147
Broyden_Mixing(const int &mixing_ndim, const double &mixing_beta)
Definition broyden_mixing.h:35
data for Mixing class
Definition mixing_data.h:14
Mixing class can mixing different steps of data to solver the iteration problem. For equation x = f(x...
Definition mixing.h:19
virtual void push_data(Mixing_Data &mdata, const double *data_in, const double *data_out, std::function< void(double *)> screen, std::function< void(double *, const double *, const double *)> mix, const bool &need_calcoef)=0
double mixing_beta
Definition mixing.h:113
int data_ndim
Definition mixing.h:117
std::vector< double > coef
Definition mixing.h:115
Definition matrix.h:19
Definition broyden_mixing.cpp:9