ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
pulay_mixing.h
Go to the documentation of this file.
1#ifndef PULAY_MIXING_H_
2#define PULAY_MIXING_H_
3#include "mixing.h"
5
6namespace Base_Mixing
7{
19class Pulay_Mixing : public Mixing
20{
21 public:
23 {
24 this->mixing_ndim = mixing_ndim;
25 this->data_ndim = mixing_ndim;
26 this->coef = std::vector<double>(mixing_ndim);
28 }
30 {
31 this->mixing_beta = mixing_beta;
32 }
33 virtual ~Pulay_Mixing() override
34 {
35 if (F != nullptr)
36 free(F);
37 }
42 virtual void reset() override
43 {
44 this->start_F = 0;
45 this->address = nullptr;
46 }
47
59 virtual void push_data(Mixing_Data& mdata,
60 const double* data_in,
61 const double* data_out,
62 std::function<void(double*)> screen,
63 std::function<void(double*, const double*, const double*)> mix,
64 const bool& need_calcoef) override
65 {
66 this->tem_push_data(mdata, data_in, data_out, screen, mix, need_calcoef);
67 };
68 virtual void push_data(
69 Mixing_Data& mdata,
70 const std::complex<double>* data_in,
71 const std::complex<double>* data_out,
72 std::function<void(std::complex<double>*)> screen,
73 std::function<void(std::complex<double>*, const std::complex<double>*, const std::complex<double>*)> mix,
74 const bool& need_calcoef) override
75 {
76 this->tem_push_data(mdata, data_in, data_out, screen, mix, need_calcoef);
77 };
78
85 virtual void cal_coef(const Mixing_Data& mdata, std::function<double(double*, double*)> inner_product) override
86 {
87 tem_cal_coef(mdata, inner_product);
88 }
89 virtual void cal_coef(const Mixing_Data& mdata,
90 std::function<double(std::complex<double>*, std::complex<double>*)> inner_product) override
91 {
92 tem_cal_coef(mdata, inner_product);
93 }
94
95 private:
107 template <class FPTYPE>
108 void tem_push_data(Mixing_Data& mdata,
109 const FPTYPE* data_in,
110 const FPTYPE* data_out,
111 std::function<void(FPTYPE*)> screen,
112 std::function<void(FPTYPE*, const FPTYPE*, const FPTYPE*)> mix,
113 const bool& need_calcoef);
114
121 template <class FPTYPE>
122 void tem_cal_coef(const Mixing_Data& mdata, std::function<double(FPTYPE*, FPTYPE*)> inner_product);
123
124 // F = data_out - data_in
125 void* F = nullptr;
126 // binded mixing_data
128 // beta_ij = <F_i, F_j>
130 // mixing_ndim = data_ndim - 1
131 int mixing_ndim = -1;
132 // start index for F
133 int start_F = 0;
134};
135} // namespace Base_Mixing
136#endif
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
double mixing_beta
Definition mixing.h:113
int data_ndim
Definition mixing.h:117
std::vector< double > coef
Definition mixing.h:115
Pulay mixing method. Ref: Pulay P. Chemical Physics Letters, 1980, 73(2): 393-398.
Definition pulay_mixing.h:20
int mixing_ndim
Definition pulay_mixing.h:131
Pulay_Mixing(const int &mixing_ndim)
Definition pulay_mixing.h:22
virtual void cal_coef(const Mixing_Data &mdata, std::function< double(double *, double *)> inner_product) override
calculate coeficients for mixing
Definition pulay_mixing.h:85
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 pulay_mixing.cpp:24
void tem_cal_coef(const Mixing_Data &mdata, std::function< double(FPTYPE *, FPTYPE *)> inner_product)
calculate coeficients for mixing
Definition pulay_mixing.cpp:98
Pulay_Mixing(const int &mixing_ndim, const double &mixing_beta)
Definition pulay_mixing.h:29
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 pulay_mixing.h:59
ModuleBase::matrix beta
Definition pulay_mixing.h:129
void * F
Definition pulay_mixing.h:125
virtual ~Pulay_Mixing() override
Definition pulay_mixing.h:33
int start_F
Definition pulay_mixing.h:133
virtual void reset() override
reset mixing
Definition pulay_mixing.h:42
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 pulay_mixing.h:68
Mixing_Data * address
Definition pulay_mixing.h:127
virtual void cal_coef(const Mixing_Data &mdata, std::function< double(std::complex< double > *, std::complex< double > *)> inner_product) override
Definition pulay_mixing.h:89
Definition matrix.h:19
Definition broyden_mixing.cpp:9