ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
charge.h
Go to the documentation of this file.
1#ifndef CHARGE_H
2#define CHARGE_H
3
12
13//a forward declaration of UnitCell
14class UnitCell;
15
16//==========================================================
17// Electron Charge Density
18//==========================================================
19class Charge
20{
21
22 public:
23 Charge();
24 ~Charge();
25
26 //==========================================================
27 // MEMBER VARIABLES :
28 // init_chg : "atomic" or "file"
29 // NAME : total number of electrons
30 // NAME : rho (nspin,ncxyz), the charge density in real space
31 // NAME : rho_save (nspin,ncxyz), for charge mixing
32 // NAME : rhog, charge density in G space
33 // NAME : rhog_save, chage density in G space
34 // NAME : rho_core [nrxx], the core charge in real space
35 // NAME : rhog_core [ngm], the core charge in reciprocal space
36 //==========================================================
37
38 double **rho = nullptr;
39 double **rho_save = nullptr;
40
41 std::complex<double> **rhog = nullptr;
42 std::complex<double> **rhog_save = nullptr;
43
44 double **kin_r = nullptr; // kinetic energy density in real space, for meta-GGA
45 double **kin_r_save = nullptr; // kinetic energy density in real space, for meta-GGA
46 // wenfei 2021-07-28
47 const Parallel_Grid* pgrid = nullptr;
48 private:
49
50 //temporary
51 double *_space_rho = nullptr;
52 double *_space_rho_save = nullptr;
53 std::complex<double> *_space_rhog = nullptr;
54 std::complex<double> *_space_rhog_save = nullptr;
55 double *_space_kin_r = nullptr;
56 double *_space_kin_r_save = nullptr;
57
58 public:
59 double **nhat = nullptr; //compensation charge for PAW
60 double **nhat_save = nullptr; //compensation charge for PAW
61 // wenfei 2023-09-05
62
63 double *rho_core = nullptr;
64 std::complex<double> *rhog_core = nullptr;
65
66 int prenspin = 1;
67
68 void set_rhopw(ModulePW::PW_Basis* rhopw_in);
69
80 void init_rho(elecstate::efermi& eferm_iout,
81 const UnitCell& ucell,
82 const Parallel_Grid& pgrid,
83 const ModuleBase::ComplexMatrix& strucFac,
85 const void* klist = nullptr,
86 const void* wfcpw = nullptr);
87
88 void allocate(const int &nspin_in);
89
90 void atomic_rho(const int spin_number_need,
91 const double& omega,
92 double** rho_in,
93 const ModuleBase::ComplexMatrix& strucFac,
94 const UnitCell& ucell) const;
95
96 void set_rho_core(const UnitCell& ucell,
97 const ModuleBase::ComplexMatrix& structure_factor,
98 const bool* numeric);
99 void set_rho_core_paw();
100
101 void renormalize_rho();
102
103 double sum_rho() const;
104
106
107 // for non-linear core correction
109 (
110 const bool &numeric,
111 const double omega,
112 const double tpiba2,
113 const int mesh,
114 const double *r,
115 const double *rab,
116 const double *rhoc,
117 double *rhocg
118 ) const;
119
120 double cal_rho2ne(const double *rho_in) const;
121
122 void check_rho(); // to check whether the charge density is normal
123
124 void init_final_scf(); //LiuXh add 20180619
125
126 public:
131 void init_chgmpi();
132
137 void rho_mpi();
138
146 void reduce_diff_pools(double* array_rho) const;
147
148 void set_omega(double* omega_in){this->omega_ = omega_in;};
149
150 // mohan add 2021-02-20
151 int nrxx=0; // number of r vectors in this processor
152 int nxyz = 0; // total number of r vectors
153 int ngmc=0; // number of g vectors in this processor
154 int nspin=0; // number of spins
155 ModulePW::PW_Basis* rhopw = nullptr;// When double_grid is used, rhopw = rhodpw (dense grid)
156 bool cal_elf = false; // whether to calculate electron localization function (ELF)
157 private:
158
159 void destroy(); // free arrays liuyu 2023-03-12
160
161 double* omega_ = nullptr; // omega for non-linear core correction
162
164
165 bool allocate_rho_final_scf; // LiuXh add 20180606
166#ifdef __MPI
167 private:
168 int *rec = nullptr; //The number of elements each process should receive into the receive buffer.
169 int *dis = nullptr; //The displacement (relative to recvbuf) for each process in the receive buffer.
170#endif
171
172};
173
174#endif // charge
Definition charge.h:20
double ** rho
Definition charge.h:38
int * dis
Definition charge.h:169
double * _space_kin_r
Definition charge.h:55
void save_rho_before_sum_band()
Definition charge.cpp:622
~Charge()
Definition charge.cpp:42
double ** nhat_save
Definition charge.h:60
int * rec
Definition charge.h:168
double * _space_kin_r_save
Definition charge.h:56
bool allocate_rho_final_scf
Definition charge.h:165
double sum_rho() const
Definition charge.cpp:164
void set_rho_core(const UnitCell &ucell, const ModuleBase::ComplexMatrix &structure_factor, const bool *numeric)
Definition charge_init.cpp:264
std::complex< double > ** rhog_save
Definition charge.h:42
bool cal_elf
Definition charge.h:156
std::complex< double > ** rhog
Definition charge.h:41
void reduce_diff_pools(double *array_rho) const
Reduce among different pools If NPROC_IN_POOLs are all the same, use GlobalV::KP_WORLD else,...
Definition charge_mpi.cpp:27
void init_final_scf()
Definition charge.cpp:686
void check_rho()
Definition charge.cpp:650
std::complex< double > * rhog_core
Definition charge.h:64
void set_rhopw(ModulePW::PW_Basis *rhopw_in)
Definition charge.cpp:51
Charge()
Definition charge.cpp:36
void atomic_rho(const int spin_number_need, const double &omega, double **rho_in, const ModuleBase::ComplexMatrix &strucFac, const UnitCell &ucell) const
Definition charge.cpp:225
double ** kin_r
Definition charge.h:44
double * _space_rho
Definition charge.h:51
void set_omega(double *omega_in)
Definition charge.h:148
void renormalize_rho()
Definition charge.cpp:197
void init_chgmpi()
init some arrays for mpi_inter_pools, rho_mpi
Definition charge_mpi.cpp:9
std::complex< double > * _space_rhog_save
Definition charge.h:54
void rho_mpi()
Sum rho at different pools (k-point parallelism). Only used when GlobalV::KPAR > 1.
Definition charge_mpi.cpp:119
void allocate(const int &nspin_in)
Definition charge.cpp:80
void init_rho(elecstate::efermi &eferm_iout, const UnitCell &ucell, const Parallel_Grid &pgrid, const ModuleBase::ComplexMatrix &strucFac, ModuleSymmetry::Symmetry &symm, const void *klist=nullptr, const void *wfcpw=nullptr)
Init charge density from file or atomic pseudo-wave-functions.
Definition charge_init.cpp:21
const Parallel_Grid * pgrid
Definition charge.h:47
int ngmc
Definition charge.h:153
double ** kin_r_save
Definition charge.h:45
double ** rho_save
Definition charge.h:39
double cal_rho2ne(const double *rho_in) const
Definition charge.cpp:635
int nrxx
Definition charge.h:151
void non_linear_core_correction(const bool &numeric, const double omega, const double tpiba2, const int mesh, const double *r, const double *rab, const double *rhoc, double *rhocg) const
Definition charge_init.cpp:372
double ** nhat
Definition charge.h:59
double * _space_rho_save
Definition charge.h:52
int prenspin
Definition charge.h:66
std::complex< double > * _space_rhog
Definition charge.h:53
double * rho_core
Definition charge.h:63
ModulePW::PW_Basis * rhopw
Definition charge.h:155
void destroy()
Definition charge.cpp:56
double * omega_
Definition charge.h:161
void set_rho_core_paw()
Definition charge_init.cpp:365
int nxyz
Definition charge.h:152
bool allocate_rho
Definition charge.h:163
int nspin
Definition charge.h:154
Definition complexmatrix.h:14
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
Definition symmetry.h:16
Definition parallel_grid.h:8
Definition unitcell.h:16
This file contains all energies about first-principle calculations.
Fermi energies.
Definition fp_energy.h:63