ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
elecstate.h
Go to the documentation of this file.
1#ifndef ELECSTATE_H
2#define ELECSTATE_H
3
4#include "fp_energy.h"
5#include "source_cell/klist.h"
8#include "source_psi/psi.h"
10
11namespace elecstate
12{
13
15{
16 public:
18 {
19 }
21 {
22 this->charge = charge_in;
23 this->charge->set_rhopw(rhopw_in);
24 this->bigpw = bigpw_in;
26 }
27 virtual ~ElecState()
28 {
29 if (this->pot != nullptr)
30 {
31 delete this->pot;
32 this->pot = nullptr;
33 }
34 }
35 void init_ks(Charge* chg_in, // pointer for class Charge
36 const K_Vectors* klist_in,
37 int nk_in, // number of k points
38 ModulePW::PW_Basis* rhopw_in,
39 const ModulePW::PW_Basis_Big* bigpw_in);
40
41 // return current electronic density rho, as a input for constructing Hamiltonian
42 virtual const double* getRho(int spin) const;
43
44 // calculate electronic charge density on grid points or density matrix in real space
45 // the consequence charge density rho saved into rho_out, preparing for charge mixing.
46 virtual void psiToRho(const psi::Psi<std::complex<double>>& psi)
47 {
48 return;
49 }
50 virtual void psiToRho(const psi::Psi<double>& psi)
51 {
52 return;
53 }
54 // virtual void updateRhoK(const psi::Psi<std::complex<double>> &psi) = 0;
55 // virtual void updateRhoK(const psi::Psi<double> &psi)=0
56 virtual void cal_tau(const psi::Psi<std::complex<double>>& psi)
57 {
58 return;
59 }
60 virtual void cal_tau(const psi::Psi<double>& psi)
61 {
62 return;
63 }
64 virtual void cal_tau(const psi::Psi<std::complex<float>>& psi)
65 {
66 return;
67 }
68
69 // update charge density for next scf step
70 // in this function, 1. input rho for construct Hamilt and 2. calculated rho from Psi will mix to 3. new charge
71 // density rho among these rho,
72 // 1. input rho would be store to file for restart
73 // 2. calculated rho should be near with input rho when convergence has achieved
74 // 3. new rho should be input rho for next scf step.
75 virtual void getNewRho()
76 {
77 return;
78 }
79
80
81
82 // use occupied weights from INPUT and skip calculate_weights
83 // mohan updated on 2024-06-08
84
85
86 // if nupdown is not 0(TWO_EFERMI case),
87 // nelec_spin will be fixed and weights will be constrained
88 void init_nelec_spin();
89 // used to record number of electrons per spin index
90 // for NSPIN=2, it will record number of spin up and number of spin down
91 // for NSPIN=4, it will record total number, magnetization for x, y, z direction
92 std::vector<double> nelec_spin;
93
94 virtual void print_psi(const psi::Psi<double>& psi_in, const int istep = -1)
95 {
96 return;
97 }
98 virtual void print_psi(const psi::Psi<std::complex<double>>& psi_in, const int istep = -1)
99 {
100 return;
101 }
102
112 void init_scf(const int istep,
113 const UnitCell& ucell,
114 const Parallel_Grid& pgrid,
115 const ModuleBase::ComplexMatrix& strucfac,
116 const bool* numeric,
118 const void* wfcpw = nullptr);
119 std::string classname = "elecstate";
120
121 int iter = 0;
122 double omega = 0.0;
123 Potential* pot = nullptr;
124 Charge* charge = nullptr;
125 const K_Vectors* klist = nullptr;
126 const ModulePW::PW_Basis_Big* bigpw = nullptr;
127
128 public: // something aboud energies. See elecstate_energy.cpp
129 void cal_bandgap();
130 void cal_bandgap_updw();
131
132 double cal_delta_eband(const UnitCell& ucell) const;
133 double cal_delta_escf() const;
134
136 bool vnew_exist = false;
137 void cal_converged();
138 void cal_energies(const int type);
139 void set_exx(const double& Eexx);
140 void set_exx(const std::complex<double>& Eexx);
141
142 double get_hartree_energy();
143 double get_etot_efield();
144 double get_etot_gatefield();
145
146 double get_solvent_model_Ael();
147 double get_solvent_model_Acav();
148
150 {
151 return 0.0;
152 }
153
154 double get_dftu_energy();
155 double get_local_pp_energy();
156
159
160 // below defines the bandgap:
161
162 double bandgap = 0.0;
163 double bandgap_up = 0.0;
164 double bandgap_dw = 0.0;
165
168
169 public:
170
171 bool skip_weights = false;
172};
173
174} // namespace elecstate
175#endif
Definition charge.h:20
void set_rhopw(ModulePW::PW_Basis *rhopw_in)
Definition charge.cpp:51
Definition klist.h:13
Definition complexmatrix.h:14
Definition matrix.h:19
Definition pw_basis_big.h:16
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
const System_para & globalv
Definition parameter.h:30
Definition unitcell.h:16
Definition elecstate.h:15
const ModulePW::PW_Basis_Big * bigpw
bigpw will be removed later
Definition elecstate.h:126
virtual void cal_tau(const psi::Psi< double > &psi)
Definition elecstate.h:60
fenergy f_en
energies contribute to the total free energy
Definition elecstate.h:157
void cal_bandgap()
calculate band gap
Definition elecstate_energy.cpp:12
void init_scf(const int istep, const UnitCell &ucell, const Parallel_Grid &pgrid, const ModuleBase::ComplexMatrix &strucfac, const bool *numeric, ModuleSymmetry::Symmetry &symm, const void *wfcpw=nullptr)
Init rho_core, init rho, renormalize rho, init pot.
Definition elecstate.cpp:30
double get_etot_efield()
Definition elecstate_energy_terms.cpp:17
virtual const double * getRho(int spin) const
Definition elecstate.cpp:13
const K_Vectors * klist
pointer to k points lists
Definition elecstate.h:125
virtual void cal_tau(const psi::Psi< std::complex< float > > &psi)
Definition elecstate.h:64
double bandgap_up
spin up bandgap
Definition elecstate.h:163
virtual void print_psi(const psi::Psi< double > &psi_in, const int istep=-1)
Definition elecstate.h:94
std::string classname
Definition elecstate.h:119
Potential * pot
pointer to potential
Definition elecstate.h:123
double omega
volume
Definition elecstate.h:122
virtual double get_spin_constrain_energy()
Definition elecstate.h:149
double get_dftu_energy()
Definition elecstate_energy_terms.cpp:37
virtual void psiToRho(const psi::Psi< std::complex< double > > &psi)
Definition elecstate.h:46
void init_ks(Charge *chg_in, const K_Vectors *klist_in, int nk_in, ModulePW::PW_Basis *rhopw_in, const ModulePW::PW_Basis_Big *bigpw_in)
Definition elecstate.cpp:57
virtual void cal_tau(const psi::Psi< std::complex< double > > &psi)
Definition elecstate.h:56
ModuleBase::matrix vnew
Definition elecstate.h:135
double bandgap_dw
spin down bandgap
Definition elecstate.h:164
ModuleBase::matrix wg
occupation weight for each k-point and band
Definition elecstate.h:167
double get_hartree_energy()
Definition elecstate_energy_terms.cpp:12
double get_local_pp_energy()
Definition elecstate_energy_terms.cpp:42
double cal_delta_escf() const
calculate descf
Definition elecstate_energy.cpp:168
double bandgap
bandgap = E_{lumo} - E_{homo}
Definition elecstate.h:162
double cal_delta_eband(const UnitCell &ucell) const
calculate deband
Definition elecstate_energy.cpp:89
Charge * charge
pointer to charge density
Definition elecstate.h:124
void cal_energies(const int type)
calculate energies
Definition elecstate_energy.cpp:255
void init_nelec_spin()
Definition elecstate.cpp:20
ElecState(Charge *charge_in, ModulePW::PW_Basis *rhopw_in, ModulePW::PW_Basis_Big *bigpw_in)
Definition elecstate.h:20
virtual void print_psi(const psi::Psi< std::complex< double > > &psi_in, const int istep=-1)
Definition elecstate.h:98
double get_solvent_model_Acav()
Definition elecstate_energy_terms.cpp:32
double get_solvent_model_Ael()
Definition elecstate_energy_terms.cpp:27
void set_exx(const std::complex< double > &Eexx)
ElecState()
Definition elecstate.h:17
bool skip_weights
Definition elecstate.h:171
efermi eferm
fermi energies
Definition elecstate.h:158
std::vector< double > nelec_spin
Definition elecstate.h:92
virtual void getNewRho()
Definition elecstate.h:75
void set_exx(const double &Eexx)
calculation if converged
Definition elecstate_exx.cpp:8
bool vnew_exist
Definition elecstate.h:136
virtual ~ElecState()
Definition elecstate.h:27
ModuleBase::matrix ekb
band energy at each k point, each band.
Definition elecstate.h:166
int iter
scf iteration
Definition elecstate.h:121
void cal_bandgap_updw()
calculate spin up & down band gap
Definition elecstate_energy.cpp:42
double get_etot_gatefield()
Definition elecstate_energy_terms.cpp:22
void cal_converged()
calculation if converged
Definition elecstate_energy.cpp:237
virtual void psiToRho(const psi::Psi< double > &psi)
Definition elecstate.h:50
Definition potential_new.h:48
Definition psi.h:37
This file contains all energies about first-principle calculations.
Definition cal_dm.h:10
Definition exx_lip.h:23
Parameter PARAM
Definition parameter.cpp:3
bool two_fermi
true if "nupdown" is set
Definition system_parameter.h:24
Fermi energies.
Definition fp_energy.h:63
bool two_efermi
Definition fp_energy.h:67
Definition fp_energy.h:17