ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
rdmft.h
Go to the documentation of this file.
1//==========================================================
2// Author: Jingang Han
3// DATE : 2024-03-11
4//==========================================================
5#ifndef RDMFT_H
6#define RDMFT_H
7
10#include "source_psi/psi.h"
11#include "source_base/matrix.h"
12
20
24
25#ifdef __EXX
28// there are some operator reload to print data in different formats
29#endif
30
31#include <iostream>
32#include <type_traits>
33#include <complex>
34#include <vector>
35#include <iomanip>
36
38namespace rdmft
39{
40
41template <typename TK, typename TR>
42class RDMFT
43{
44
45 public:
46 RDMFT();
47 ~RDMFT();
48
49 const Parallel_Orbitals* ParaV = nullptr;
50
52
55
57 const K_Vectors* kv = nullptr;
58
59 int nk_total = 0;
61 int nspin = 1;
62 std::string XC_func_rdmft;
63
65 double alpha_power = 0.656;
66
72
76
78 double E_RDMFT[4] = {0.0};
79 double Etotal = 0.0;
80 // std::vector<double> E_RDMFT(4);
81
83 void init(Gint_Gamma& GG_in,
84 Gint_k& GK_in,
85 Parallel_Orbitals& ParaV_in,
86 UnitCell& ucell_in,
87 const Grid_Driver& gd_in,
88 K_Vectors& kv_in,
89 elecstate::ElecState& pelec_in,
90 LCAO_Orbitals& orb_in,
91 TwoCenterBundle& two_center_bundle_in,
92 std::string XC_func_rdmft_in,
93 double alpha_power_in);
94
96 void update_ion(UnitCell& ucell_in, ModulePW::PW_Basis& rho_basis_in,
98
100 // Or we can use rdmft_solver.wfc/occ_number directly when optimizing, so that the update_elec() function does not require parameters.
101 void update_elec(UnitCell& ucell, const ModuleBase::matrix& occ_number_in, const psi::Psi<TK>& wfc_in, const Charge* charge_in = nullptr);
102
104 double cal_E_grad_wfc_occ_num();
105
106 void cal_Energy(const int cal_type = 1);
107
109 void update_occNumber(const ModuleBase::matrix& occ_number_in);
110
112 void update_wg(const ModuleBase::matrix& wg_in);
113
115 double run(ModuleBase::matrix& E_gradient_occNum, psi::Psi<TK>& E_gradient_wfc);
116
117
118 protected:
119
121 void get_DM_XC(std::vector< std::vector<TK> >& DM_XC);
122
123 void cal_V_TV();
124
125 void cal_V_hartree();
126
128 void cal_V_XC(const UnitCell& ucell);
129
131 void cal_Hk_Hpsi();
132
134
135 private:
136
142 // hamilt::HContainer<TR>* HR_local = nullptr;
143
149
150 std::vector<TK> HK_XC;
151 std::vector< std::vector<TK> > DM_XC_pass;
152 // ModuleDirectMin::ProdStiefelVariable HK_RDMFT_pass;
153 // ModuleDirectMin::ProdStiefelVariable HK_XC_pass;
154
161
167
168 std::vector<TK> Eij_TV;
169 std::vector<TK> Eij_hartree;
170 std::vector<TK> Eij_XC;
171 std::vector<TK> Eij_exx_XC;
172
179
180#ifdef __EXX
181 Exx_LRI<double>* Vxc_fromRI_d = nullptr;
182 Exx_LRI<std::complex<double>>* Vxc_fromRI_c = nullptr;
184 bool exx_spacegroup_symmetry = false;
185#endif
186
187 double etxc = 0.0;
188 double vtxc = 0.0;
189 bool only_exx_type = false;
190 const int cal_E_type = 1; // cal_type = 2 just support XC-functional without exx
191
192 /****** these parameters are passed in from outside, don't need delete ******/
193 // GK and GG are used for multi-k grid integration and gamma only algorithms respectively
194 Gint_k* GK = nullptr;
195 Gint_Gamma* GG = nullptr;
196 Charge* charge = nullptr;
197
198 // update after ion step
199 const UnitCell* ucell = nullptr;
200 const Grid_Driver* gd = nullptr;
202 const ModuleBase::matrix* vloc = nullptr;
204 const LCAO_Orbitals* orb = nullptr;
206};
207
208}
209#endif
Definition charge.h:20
Definition Exx_LRI.h:51
Definition gint_gamma.h:23
Definition gint_k.h:13
Definition sltk_grid_driver.h:43
Definition klist.h:13
Definition ORB_read.h:19
Definition complexmatrix.h:14
Definition matrix.h:19
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
Definition symmetry_rotation.h:16
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
Definition parallel_orbitals.h:9
Definition two_center_bundle.h:11
Definition unitcell.h:16
Definition elecstate.h:15
Definition hcontainer.h:144
Definition hs_matrix_k.hpp:11
Definition operator_lcao.h:12
Definition psi.h:37
Definition rdmft.h:43
const Parallel_Orbitals * ParaV
Definition rdmft.h:49
hamilt::OperatorLCAO< TK, TR > * V_nonlocal
Definition rdmft.h:174
hamilt::OperatorLCAO< TK, TR > * V_ekinetic_potential
Definition rdmft.h:173
hamilt::OperatorLCAO< TK, TR > * V_hartree
Definition rdmft.h:176
psi::Psi< TK > H_wfc_XC
Definition rdmft.h:164
void update_wg(const ModuleBase::matrix &wg_in)
update occ_number for optimization algorithms that depend on Hamilton
Definition update_state_rdmft.cpp:192
void update_occNumber(const ModuleBase::matrix &occ_number_in)
update occ_number for optimization algorithms that depend on Hamilton
Definition update_state_rdmft.cpp:176
ModuleBase::matrix wfcHwfc_hartree
Definition rdmft.h:157
void cal_V_hartree()
Definition rdmft_pot.cpp:114
~RDMFT()
Definition rdmft.cpp:34
hamilt::HS_Matrix_K< TK > * hsk_hartree
Definition rdmft.h:146
ModuleBase::matrix occ_number
natrual occupation numbers and wavefunction
Definition rdmft.h:68
psi::Psi< TK > H_wfc_exx_XC
Definition rdmft.h:165
int nk_total
Definition rdmft.h:59
ModuleBase::matrix wg
Definition rdmft.h:70
ModuleBase::matrix occNum_wfcHamiltWfc
gradients of total energy with respect to the natural occupation numbers and wfc
Definition rdmft.h:74
void cal_Hk_Hpsi()
get the total Hamilton in k-space
Definition rdmft.cpp:190
hamilt::HContainer< TR > * HR_hartree
Definition rdmft.h:139
const ModuleBase::matrix * vloc
Definition rdmft.h:202
void cal_V_TV()
Definition rdmft_pot.cpp:50
Parallel_2D para_Eij
Definition rdmft.h:51
Gint_k * GK
Definition rdmft.h:194
int nbands_total
Definition rdmft.h:60
psi::Psi< TK > occNum_HamiltWfc
Definition rdmft.h:75
const UnitCell * ucell
Definition rdmft.h:199
RDMFT()
Definition rdmft.cpp:28
const ModulePW::PW_Basis * rho_basis
Definition rdmft.h:201
double run(ModuleBase::matrix &E_gradient_occNum, psi::Psi< TK > &E_gradient_wfc)
do all calculation after update occNum&wfc, get Etotal and the gradient of energy with respect to the...
Definition rdmft.cpp:414
ModuleBase::matrix wfcHwfc_exx_XC
Definition rdmft.h:159
const int cal_E_type
Definition rdmft.h:190
ModuleBase::matrix wfcHwfc_XC
Definition rdmft.h:158
const Grid_Driver * gd
Definition rdmft.h:200
ModuleBase::matrix wk_fun_occNum
Definition rdmft.h:71
psi::Psi< TK > H_wfc_dft_XC
Definition rdmft.h:166
std::vector< std::vector< TK > > DM_XC_pass
Definition rdmft.h:151
psi::Psi< TK > wfc
Definition rdmft.h:69
double cal_E_grad_wfc_occ_num()
obtain the gradient of total energy with respect to occupation number and wfc
Definition rdmft.cpp:269
const ModuleBase::ComplexMatrix * sf
Definition rdmft.h:203
double vtxc
Definition rdmft.h:188
double Etotal
Definition rdmft.h:79
std::string XC_func_rdmft
Definition rdmft.h:62
hamilt::OperatorLCAO< TK, TR > * V_dft_XC
Definition rdmft.h:178
ModuleBase::matrix Etotal_n_k
Definition rdmft.h:155
hamilt::OperatorLCAO< TK, TR > * V_local
Definition rdmft.h:175
hamilt::HContainer< TR > * HR_TV
Hamiltonian matrices in real space.
Definition rdmft.h:138
const TwoCenterBundle * two_center_bundle
Definition rdmft.h:205
void cal_Energy(const int cal_type=1)
Definition rdmft.cpp:295
int nspin
Definition rdmft.h:61
double alpha_power
0.656 for soilds, 0.525 for dissociation of H2, 0.55~0.58 for HEG
Definition rdmft.h:65
bool only_exx_type
Definition rdmft.h:189
ModuleBase::matrix wfcHwfc_dft_XC
Definition rdmft.h:160
void update_elec(UnitCell &ucell, const ModuleBase::matrix &occ_number_in, const psi::Psi< TK > &wfc_in, const Charge *charge_in=nullptr)
update in elec-step
Definition update_state_rdmft.cpp:51
void update_charge(UnitCell &ucell)
Definition update_state_rdmft.cpp:95
std::vector< TK > Eij_TV
Definition rdmft.h:168
hamilt::OperatorLCAO< TK, TR > * V_exx_XC
Definition rdmft.h:177
std::vector< TK > HK_XC
Definition rdmft.h:150
elecstate::ElecState * pelec
obain Ewald and this->pelec->pot
Definition rdmft.h:54
const LCAO_Orbitals * orb
Definition rdmft.h:204
hamilt::HS_Matrix_K< TK > * hsk_exx_XC
Definition rdmft.h:148
psi::Psi< TK > H_wfc_TV
Definition rdmft.h:162
std::vector< TK > Eij_exx_XC
Definition rdmft.h:171
hamilt::HContainer< TR > * HR_dft_XC
Definition rdmft.h:140
std::vector< TK > Eij_XC
Definition rdmft.h:170
void cal_V_XC(const UnitCell &ucell)
construct V_XC based on different XC_functional( i.e. RDMFT class member XC_func_rdmft)
Definition rdmft_pot.cpp:166
void get_DM_XC(std::vector< std::vector< TK > > &DM_XC)
get the special density matrix DM_XC(nk*nbasis_local*nbasis_local)
Definition rdmft_pot.cpp:26
hamilt::HS_Matrix_K< TK > * hsk_dft_XC
Definition rdmft.h:147
void update_ion(UnitCell &ucell_in, ModulePW::PW_Basis &rho_basis_in, ModuleBase::matrix &vloc_in, ModuleBase::ComplexMatrix &sf_in)
update in ion-step and get V_TV
Definition update_state_rdmft.cpp:20
Gint_Gamma * GG
Definition rdmft.h:195
const K_Vectors * kv
update after ion step
Definition rdmft.h:57
psi::Psi< TK > H_wfc_hartree
Definition rdmft.h:163
std::vector< TK > Eij_hartree
Definition rdmft.h:169
hamilt::HS_Matrix_K< TK > * hsk_TV
Hamiltonian matrices in reciprocal space.
Definition rdmft.h:145
double etxc
Definition rdmft.h:187
void init(Gint_Gamma &GG_in, Gint_k &GK_in, Parallel_Orbitals &ParaV_in, UnitCell &ucell_in, const Grid_Driver &gd_in, K_Vectors &kv_in, elecstate::ElecState &pelec_in, LCAO_Orbitals &orb_in, TwoCenterBundle &two_center_bundle_in, std::string XC_func_rdmft_in, double alpha_power_in)
initialization of rdmft calculation
Definition rdmft.cpp:58
double E_RDMFT[4]
E_RDMFT[4] stores ETV, Ehartree, Exc, Etotal.
Definition rdmft.h:78
hamilt::HContainer< TR > * HR_exx_XC
Definition rdmft.h:141
Charge * charge
Definition rdmft.h:196
ModuleBase::matrix wfcHwfc_TV
Definition rdmft.h:156
Reduced Density Matrix Functional Theory (RDMFT)
Definition rdmft.cpp:24