ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
plain_mixing.h
Go to the documentation of this file.
1#ifndef PLAIN_MIXING_H_
2#define PLAIN_MIXING_H_
3#include "mixing.h"
4
5namespace Base_Mixing
6{
11class Plain_Mixing : public Mixing
12{
13 public:
15 {
16 this->coef = std::vector<double>(1, 1.0);
17 }
19 {
20 this->mixing_beta = mixing_beta;
21 }
22 virtual ~Plain_Mixing() override{};
23
28 virtual void reset() override
29 {
30 return;
31 }
32
33 // explicitly introduce push_data version of the base class
34 // that is not overridden in this class
36
48 virtual void push_data(Mixing_Data& mdata,
49 const double* data_in,
50 const double* data_out,
51 std::function<void(double*)> screen,
52 std::function<void(double*, const double*, const double*)> mix,
53 const bool& need_calcoef) override
54 {
55 this->tem_push_data(mdata, data_in, data_out, screen, mix, need_calcoef);
56 };
57 virtual void push_data(
58 Mixing_Data& mdata,
59 const std::complex<double>* data_in,
60 const std::complex<double>* data_out,
61 std::function<void(std::complex<double>*)> screen,
62 std::function<void(std::complex<double>*, const std::complex<double>*, const std::complex<double>*)> mix,
63 const bool& need_calcoef) override
64 {
65 this->tem_push_data(mdata, data_in, data_out, screen, mix, need_calcoef);
66 };
67
74 virtual void cal_coef(const Mixing_Data& mdata, std::function<double(double*, double*)> inner_product) override
75 {
76 return;
77 }
78 virtual void cal_coef(const Mixing_Data& mdata,
79 std::function<double(std::complex<double>*, std::complex<double>*)> inner_product) override
80 {
81 return;
82 }
83
90 void plain_mix(double* data_new,
91 const double* data_in,
92 const double* data_out,
93 const int& length,
94 std::function<void(double*)> screen)
95 {
96 this->simple_mix(data_new, data_in, data_out, length, screen);
97 }
98 void plain_mix(std::complex<double>* data_new,
99 const std::complex<double>* data_in,
100 const std::complex<double>* data_out,
101 const int& length,
102 std::function<void(std::complex<double>*)> screen)
103 {
104 this->simple_mix(data_new, data_in, data_out, length, screen);
105 }
106
107 private:
119 template <class FPTYPE>
120 void tem_push_data(Mixing_Data& mdata,
121 const FPTYPE* data_in,
122 const FPTYPE* data_out,
123 std::function<void(FPTYPE*)> screen,
124 std::function<void(FPTYPE*, const FPTYPE*, const FPTYPE*)> mix,
125 const bool& need_calcoef);
126
133 template <class FPTYPE>
134 void simple_mix(FPTYPE* data_new,
135 const FPTYPE* data_in,
136 const FPTYPE* data_out,
137 const int& length,
138 std::function<void(FPTYPE*)> screen);
139};
140} // namespace Base_Mixing
141#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
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
std::vector< double > coef
Definition mixing.h:115
Plain mixing : rho_new = rho_in + mixing_beta * (rho_out - rho_in)
Definition plain_mixing.h:12
virtual void reset() override
reset mixing
Definition plain_mixing.h:28
virtual void cal_coef(const Mixing_Data &mdata, std::function< double(std::complex< double > *, std::complex< double > *)> inner_product) override
Definition plain_mixing.h:78
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 plain_mixing.cpp:23
virtual void cal_coef(const Mixing_Data &mdata, std::function< double(double *, double *)> inner_product) override
calculate coeficients for mixing
Definition plain_mixing.h:74
Plain_Mixing()
Definition plain_mixing.h:14
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 plain_mixing.h:57
void simple_mix(FPTYPE *data_new, const FPTYPE *data_in, const FPTYPE *data_out, const int &length, std::function< void(FPTYPE *)> screen)
Simple plain mixing data_new = data_in + mixing_beta * (data_out - data_in)
Definition plain_mixing.cpp:62
void plain_mix(std::complex< double > *data_new, const std::complex< double > *data_in, const std::complex< double > *data_out, const int &length, std::function< void(std::complex< double > *)> screen)
Definition plain_mixing.h:98
Plain_Mixing(const double &mixing_beta)
Definition plain_mixing.h:18
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 plain_mixing.h:48
virtual ~Plain_Mixing() override
Definition plain_mixing.h:22
void plain_mix(double *data_new, const double *data_in, const double *data_out, const int &length, std::function< void(double *)> screen)
Simple plain mixing data_new = data_in + mixing_beta * (data_out - data_in)
Definition plain_mixing.h:90
Definition broyden_mixing.cpp:9