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
9// #include "source_estate/fp_energy.h"
11
12//a forward declaration of UnitCell
13class UnitCell;
14
15// Electron Charge Density
16class Charge
17{
18
19 public:
20
21 Charge();
22 ~Charge();
23
24 //==========================================================
25 // MEMBER VARIABLES :
26 // init_chg : "atomic" or "file"
27 // NAME : total number of electrons
28 // NAME : rho (nspin,ncxyz), the charge density in real space
29 // NAME : rho_save (nspin,ncxyz), for charge mixing
30 // NAME : rhog, charge density in G space
31 // NAME : rhog_save, chage density in G space
32 // NAME : rho_core [nrxx], the core charge in real space
33 // NAME : rhog_core [ngm], the core charge in reciprocal space
34 //==========================================================
35
36 double **rho = nullptr;
37 double **rho_save = nullptr;
38
39 std::complex<double> **rhog = nullptr;
40 std::complex<double> **rhog_save = nullptr;
41
42 double **kin_r = nullptr; // kinetic energy density in real space, for meta-GGA
43 double **kin_r_save = nullptr; // kinetic energy density in real space, for meta-GGA
44 const Parallel_Grid* pgrid = nullptr;
45
46 private:
47
48 //temporary
49 double *_space_rho = nullptr;
50 double *_space_rho_save = nullptr;
51 std::complex<double> *_space_rhog = nullptr;
52 std::complex<double> *_space_rhog_save = nullptr;
53 double *_space_kin_r = nullptr;
54 double *_space_kin_r_save = nullptr;
55
56 public:
57
58 double **nhat = nullptr; //compensation charge for PAW
59 double **nhat_save = nullptr; //compensation charge for PAW
60 // wenfei 2023-09-05
61
62 double *rho_core = nullptr;
63 std::complex<double> *rhog_core = nullptr;
64
65 int prenspin = 1;
66
67 void set_rhopw(ModulePW::PW_Basis* rhopw_in);
68
79 void init_rho(const UnitCell& ucell,
80 const Parallel_Grid& pgrid,
81 const ModuleBase::ComplexMatrix& strucFac,
83 const void* klist = nullptr,
84 const void* wfcpw = nullptr);
85
86 // mohan add 2025-12-02
87 bool kin_density();
88
89 void allocate(const int &nspin_in, const bool kin_den);
90
91 void atomic_rho(const int spin_number_need,
92 const double& omega,
93 double** rho_in,
94 const ModuleBase::ComplexMatrix& strucFac,
95 const UnitCell& ucell) const;
96
97 void set_rho_core(const UnitCell& ucell,
98 const ModuleBase::ComplexMatrix& structure_factor,
99 const bool* numeric);
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:
130 void init_chgmpi();
131
136 void rho_mpi();
137
142 void kin_r_mpi();
143
151 void reduce_diff_pools(double* array_rho) const;
152
153 void set_omega(double* omega_in){this->omega_ = omega_in;};
154
155 // mohan add 2021-02-20
156 int nrxx=0; // number of r vectors in this processor
157 int nxyz = 0; // total number of r vectors
158 int ngmc=0; // number of g vectors in this processor
159 int nspin=0; // number of spins
160 ModulePW::PW_Basis* rhopw = nullptr;// When double_grid is used, rhopw = rhodpw (dense grid)
161 bool cal_elf = false; // whether to calculate electron localization function (ELF)
162
163 private:
164
165 void destroy(); // free arrays liuyu 2023-03-12
166
167 double* omega_ = nullptr; // omega for non-linear core correction
168
170
171 bool allocate_rho_final_scf; // LiuXh add 20180606
172
173#ifdef __MPI
174 int *rec = nullptr; //The number of elements each process should receive into the receive buffer.
175 int *dis = nullptr; //The displacement (relative to recvbuf) for each process in the receive buffer.
176#endif
177
178};
179
180#endif // charge
Definition charge.h:17
double ** rho
Definition charge.h:36
int * dis
Definition charge.h:175
double * _space_kin_r
Definition charge.h:53
void save_rho_before_sum_band()
Definition charge.cpp:658
~Charge()
Definition charge.cpp:42
double ** nhat_save
Definition charge.h:59
int * rec
Definition charge.h:174
double * _space_kin_r_save
Definition charge.h:54
bool allocate_rho_final_scf
Definition charge.h:171
double sum_rho() const
Definition charge.cpp:184
void set_rho_core(const UnitCell &ucell, const ModuleBase::ComplexMatrix &structure_factor, const bool *numeric)
Definition charge_init.cpp:277
std::complex< double > ** rhog_save
Definition charge.h:40
bool cal_elf
Definition charge.h:161
std::complex< double > ** rhog
Definition charge.h:39
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:28
void kin_r_mpi()
Sum kin_r at different pools (k-point/band parallelism). Only used when GlobalV::KPAR * bndpar > 1.
Definition charge_mpi.cpp:142
void init_final_scf()
Definition charge.cpp:724
void check_rho()
Definition charge.cpp:688
std::complex< double > * rhog_core
Definition charge.h:63
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:245
double ** kin_r
Definition charge.h:42
void allocate(const int &nspin_in, const bool kin_den)
Definition charge.cpp:93
double * _space_rho
Definition charge.h:49
void set_omega(double *omega_in)
Definition charge.h:153
void renormalize_rho()
Definition charge.cpp:217
void init_chgmpi()
init some arrays for mpi_inter_pools, rho_mpi
Definition charge_mpi.cpp:10
std::complex< double > * _space_rhog_save
Definition charge.h:52
bool kin_density()
Definition charge.cpp:57
void rho_mpi()
Sum rho at different pools (k-point parallelism). Only used when GlobalV::KPAR > 1.
Definition charge_mpi.cpp:120
const Parallel_Grid * pgrid
Definition charge.h:44
int ngmc
Definition charge.h:158
double ** kin_r_save
Definition charge.h:43
double ** rho_save
Definition charge.h:37
double cal_rho2ne(const double *rho_in) const
Definition charge.cpp:671
int nrxx
Definition charge.h:156
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:380
double ** nhat
Definition charge.h:58
double * _space_rho_save
Definition charge.h:50
int prenspin
Definition charge.h:65
std::complex< double > * _space_rhog
Definition charge.h:51
double * rho_core
Definition charge.h:62
ModulePW::PW_Basis * rhopw
Definition charge.h:160
void destroy()
Definition charge.cpp:69
double * omega_
Definition charge.h:167
int nxyz
Definition charge.h:157
bool allocate_rho
Definition charge.h:169
int nspin
Definition charge.h:159
void init_rho(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:23
Definition complexmatrix.h:13
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:15
Definition parallel_grid.h:7
Definition unitcell.h:15