ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
charge_mixing.h
Go to the documentation of this file.
1#ifndef CHARGE_MIXING_H
2#define CHARGE_MIXING_H
3#include "charge.h"
7
9{
19
20 public:
23
39 void set_mixing(const std::string& mixing_mode_in,
40 const double& mixing_beta_in,
41 const int& mixing_ndim_in,
42 const double& mixing_gg0_in,
43 const bool& mixing_tau_in,
44 const double& mixing_beta_mag_in,
45 const double& mixing_gg0_mag_in,
46 const double& mixing_gg0_min_in,
47 const double& mixing_angle_in,
48 const bool& mixing_dmr_in,
49 double& omega_in,
50 double& tpiba_in);
51
57 void init_mixing();
58
63 void allocate_mixing_dmr(const int nnr);
64
69 void mix_rho(Charge* chr);
70
76 void mix_dmr(elecstate::DensityMatrix<std::complex<double>, double>* DM);
77
82 double get_drho(Charge* chr, const double nelec);
83 double get_dkin(Charge* chr, const double nelec);
84
88 void mix_reset();
89
95 void set_rhopw(ModulePW::PW_Basis* rhopw_in, ModulePW::PW_Basis* rhodpw_in);
96
97 // extracting parameters normally these parameters will not be used outside charge mixing
98 // while Exx is using them as well as some other places
99 const std::string& get_mixing_mode() const {return mixing_mode;}
100 double get_mixing_beta() const {return mixing_beta;}
101 int get_mixing_ndim() const {return mixing_ndim;}
102 double get_mixing_gg0() const {return mixing_gg0;}
104
105 // for mixing restart
106 int mixing_restart_step = 0; //which step to restart mixing during SCF, always equal to scf_namx except for the mixing restart
107 int mixing_restart_count = 0; // the number of restart mixing during SCF. Do not set mixing_restart_count as bool since I want to keep some flexibility in the future
108 int mixing_restart_last = 0; // the label of mixing restart step, store the step number of the last mixing restart
109
110 // to calculate the slope of drho curve during SCF, which is used to determine if SCF oscillate
111 bool if_scf_oscillate(const int iteration, const double drho, const int iternum_used, const double threshold);
112
113 private:
114
115 // mixing_data
122
123 //======================================
124 // private mixing parameters
125 //======================================
126 std::string mixing_mode = "broyden";
127 double mixing_beta = 0.8;
128 double mixing_beta_mag = 1.6;
129 int mixing_ndim = 8;
130 double mixing_gg0 = 0.0;
131 bool mixing_tau = false;
132 double mixing_gg0_mag = 0.0;
133 double mixing_gg0_min = 0.1;
134 double mixing_angle = 0.0;
135 bool mixing_dmr = false;
136 double* omega = nullptr;
137 double* tpiba = nullptr;
138 double* tpiba2 = nullptr;
139 std::vector<double> _drho_history;
140
141 bool new_e_iteration = true;
142
145
150 void mix_rho_recip(Charge* chr);
151
156 void mix_rho_real(Charge* chr);
157
162 void Kerker_screen_recip(std::complex<double>* rhog);
163
168 void Kerker_screen_real(double* rho);
169
177 double inner_product_recip_rho(std::complex<double>* rho1, std::complex<double>* rho2);
178 double inner_product_recip_simple(std::complex<double>* rho1, std::complex<double>* rho2);
179 double inner_product_recip_hartree(std::complex<double>* rho1, std::complex<double>* rho2);
180
185 double inner_product_real(double* rho1, double* rho2);
186
194 void divide_data(std::complex<double>* data_d, std::complex<double>*& data_s, std::complex<double>*& data_hf);
202 void combine_data(std::complex<double>* data_d, std::complex<double>*& data_s, std::complex<double>*& data_hf);
210 void clean_data(std::complex<double>*& data_s, std::complex<double>*& data_hf);
211};
212
213#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
Plain mixing : rho_new = rho_in + mixing_beta * (rho_out - rho_in)
Definition plain_mixing.h:12
Definition charge_mixing.h:9
Base_Mixing::Mixing_Data rho_mdata
Mixing data for charge density.
Definition charge_mixing.h:117
Base_Mixing::Mixing_Data nhat_mdata
Mixing data for compensation density.
Definition charge_mixing.h:119
void clean_data(std::complex< double > *&data_s, std::complex< double > *&data_hf)
clean smooth and high frequency parts
Definition charge_mixing_uspp.cpp:60
double * tpiba2
2*pi/beta^2 for non-linear core correction
Definition charge_mixing.h:138
int mixing_restart_step
Definition charge_mixing.h:106
double mixing_beta_mag
mixing beta for magnetism
Definition charge_mixing.h:128
double get_dkin(Charge *chr, const double nelec)
Definition charge_mixing_residual.cpp:73
void set_rhopw(ModulePW::PW_Basis *rhopw_in, ModulePW::PW_Basis *rhodpw_in)
Set the smooth and dense grids.
Definition charge_mixing.cpp:181
void set_mixing(const std::string &mixing_mode_in, const double &mixing_beta_in, const int &mixing_ndim_in, const double &mixing_gg0_in, const bool &mixing_tau_in, const double &mixing_beta_mag_in, const double &mixing_gg0_mag_in, const double &mixing_gg0_min_in, const double &mixing_angle_in, const bool &mixing_dmr_in, double &omega_in, double &tpiba_in)
Set all private mixing paramters.
Definition charge_mixing.cpp:19
double inner_product_recip_rho(std::complex< double > *rho1, std::complex< double > *rho2)
Inner product of two complex vectors.
Definition charge_mixing_residual.cpp:111
double get_drho(Charge *chr, const double nelec)
Get the drho between rho and rho_save, similar for get_dkin.
Definition charge_mixing_residual.cpp:8
bool new_e_iteration
Definition charge_mixing.h:141
void mix_reset()
reset mixing, actually we only call init_mixing() to reset mixing instead of this function
Definition charge_mixing.cpp:187
double * tpiba
2*pi/beta for non-linear core correction
Definition charge_mixing.h:137
void mix_rho_real(Charge *chr)
charge mixing for real space
Definition charge_mixing_rho.cpp:299
double inner_product_recip_hartree(std::complex< double > *rho1, std::complex< double > *rho2)
Definition charge_mixing_residual.cpp:283
~Charge_Mixing()
Definition charge_mixing.cpp:13
void divide_data(std::complex< double > *data_d, std::complex< double > *&data_s, std::complex< double > *&data_hf)
divide rho/tau to smooth and high frequency parts
Definition charge_mixing_uspp.cpp:4
Base_Mixing::Mixing * mixing
Mixing object to mix charge density, kinetic energy density and compensation density.
Definition charge_mixing.h:116
void Kerker_screen_recip(std::complex< double > *rhog)
Kerker screen method for reciprocal space.
Definition charge_mixing_preconditioner.cpp:7
Base_Mixing::Plain_Mixing * mixing_highf
The high_frequency part is mixed by plain mixing method.
Definition charge_mixing.h:121
void combine_data(std::complex< double > *data_d, std::complex< double > *&data_s, std::complex< double > *&data_hf)
gather smooth and high frequency parts to rho/tau
Definition charge_mixing_uspp.cpp:32
int mixing_restart_last
Definition charge_mixing.h:108
double get_mixing_gg0() const
Definition charge_mixing.h:102
double mixing_gg0_mag
mixing gg0 for Kerker screen for magnetism
Definition charge_mixing.h:132
int get_mixing_ndim() const
Definition charge_mixing.h:101
void mix_rho(Charge *chr)
charge mixing
Definition charge_mixing_rho.cpp:500
double * omega
omega for non-linear core correction
Definition charge_mixing.h:136
int mixing_restart_count
Definition charge_mixing.h:107
double mixing_angle
mixing angle for nspin=4
Definition charge_mixing.h:134
std::string mixing_mode
mixing mode: "plain", "broyden", "pulay"
Definition charge_mixing.h:126
Charge_Mixing()
Definition charge_mixing.cpp:9
ModulePW::PW_Basis * rhodpw
dense grid, same as rhopw for ncpp.
Definition charge_mixing.h:144
bool if_scf_oscillate(const int iteration, const double drho, const int iternum_used, const double threshold)
Definition charge_mixing.cpp:198
double inner_product_recip_simple(std::complex< double > *rho1, std::complex< double > *rho2)
Definition charge_mixing_residual.cpp:256
void Kerker_screen_real(double *rho)
Kerker screen method for real space.
Definition charge_mixing_preconditioner.cpp:62
double mixing_beta
mixing beta for density
Definition charge_mixing.h:127
void allocate_mixing_dmr(const int nnr)
allocate memory of dmr_mdata
Definition charge_mixing_dmr.cpp:6
std::vector< double > _drho_history
history of drho used to determine the oscillation, size is scf_nmax
Definition charge_mixing.h:139
bool mixing_tau
whether to use tau mixing
Definition charge_mixing.h:131
Base_Mixing::Mixing * get_mixing() const
Definition charge_mixing.h:103
void mix_dmr(elecstate::DensityMatrix< double, double > *DM)
density matrix mixing, only for LCAO
Definition charge_mixing_dmr.cpp:31
int mixing_ndim
mixing ndim for broyden and pulay
Definition charge_mixing.h:129
Base_Mixing::Mixing_Data dmr_mdata
Mixing data for real space density matrix.
Definition charge_mixing.h:120
double get_mixing_beta() const
Definition charge_mixing.h:100
ModulePW::PW_Basis * rhopw
smooth grid
Definition charge_mixing.h:143
void init_mixing()
initialize mixing, including constructing mixing and allocating memory for mixing data
Definition charge_mixing.cpp:96
double mixing_gg0_min
minimum kerker coefficient
Definition charge_mixing.h:133
double mixing_gg0
mixing gg0 for Kerker screen
Definition charge_mixing.h:130
bool mixing_dmr
whether to mixing real space density matrix
Definition charge_mixing.h:135
const std::string & get_mixing_mode() const
Definition charge_mixing.h:99
double inner_product_real(double *rho1, double *rho2)
Inner product of two double vectors.
Definition charge_mixing_residual.cpp:457
void close_kerker_gg0()
Definition charge_mixing.h:52
Base_Mixing::Mixing_Data tau_mdata
Mixing data for kinetic energy density.
Definition charge_mixing.h:118
void mix_rho_recip(Charge *chr)
charge mixing for reciprocal space
Definition charge_mixing_rho.cpp:6
Definition charge.h:20
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
Definition density_matrix.h:36
#define threshold
Definition sph_bessel_recursive_test.cpp:4