ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
density_matrix.h
Go to the documentation of this file.
1#ifndef DENSITY_MATRIX_H
2#define DENSITY_MATRIX_H
3
4#include <string>
5
9
10namespace elecstate
11{
17template<typename T> struct ShiftRealComplex
18{
19 using type = void;
20};
21
22template<>
23struct ShiftRealComplex<double>
24{
25 using type = std::complex<double>;
26};
27
28template<>
29struct ShiftRealComplex<std::complex<double>>
30{
31 using type = double;
32};
33
34template <typename TK, typename TR>
36{
38
39 public:
44
54 DensityMatrix(const Parallel_Orbitals* _paraV, const int nspin, const std::vector<ModuleBase::Vector3<double>>& kvec_d, const int nk);
55
62 DensityMatrix(const Parallel_Orbitals* _paraV, const int nspin);
63
69 void init_DMR(const Grid_Driver* GridD_in, const UnitCell* ucell);
70
76 void init_DMR(Record_adj& ra, const UnitCell* ucell);
77
83 void init_DMR(const hamilt::HContainer<TR>& _DMR_in);
84
90 // the old input type ``:HContainer<complex<double>` causes redefination error if TR = complex<double>
91 void init_DMR(const hamilt::HContainer<TRShift>& _DMR_in);
92
101 void set_DMK(const int ispin, const int ik, const int i, const int j, const TK value);
102
106 void set_DMK_zero();
107
116 TK get_DMK(const int ispin, const int ik, const int i, const int j) const;
117
121 int get_DMK_nks() const;
122 int get_DMK_size() const;
123
127 int get_DMK_nrow() const;
128
132 int get_DMK_ncol() const;
133
139 hamilt::HContainer<TR>* get_DMR_pointer(const int ispin) const;
140
145 const std::vector<hamilt::HContainer<TR>*>& get_DMR_vector() const {return this->_DMR;}
146 std::vector<hamilt::HContainer<TR>*>& get_DMR_vector() {return this->_DMR;}
147
148 const std::vector<std::vector<TR>>& get_DMR_save() const {return this->_DMR_save;}
149 std::vector<std::vector<TR>>& get_DMR_save() {return this->_DMR_save;}
150
156 TK* get_DMK_pointer(const int ik) const;
157
161 const std::vector<std::vector<TK>>& get_DMK_vector() const {return this->_DMK;}
162 std::vector<std::vector<TK>>& get_DMK_vector() {return this->_DMK;}
163
168 void set_DMK_pointer(const int ik, TK* DMK_in);
169
173 const Parallel_Orbitals* get_paraV_pointer() const {return this->_paraV;}
174
175 const std::vector<ModuleBase::Vector3<double>>& get_kvec_d() const { return this->_kvec_d; }
176
182 void cal_DMR(const int ik_in = -1);
183
189 void cal_DMR_td(const UnitCell& ucell, const ModuleBase::Vector3<double> At, const int ik_in = -1);
190
196 void cal_DMR_full(hamilt::HContainer<std::complex<double>>* dmR_out) const;
197
202 void switch_dmr(const int mode);
203
210 void write_DMK(const std::string directory, const int ispin, const int ik);
211
218 void read_DMK(const std::string directory, const int ispin, const int ik);
219
223 void save_DMR();
224
225 std::vector<ModuleBase::ComplexMatrix> EDMK; // for TD-DFT
226
227#ifdef __PEXSI
232 std::vector<TK*> pexsi_EDM;
233#endif
234
235 private:
241 std::vector<hamilt::HContainer<TR>*> _DMR;
242 std::vector<std::vector<TR>> _DMR_save;
243
249 std::vector<hamilt::HContainer<TR>*> _DMR_grid;
250
256 // std::vector<ModuleBase::ComplexMatrix> _DMK;
257 std::vector<std::vector<TK>> _DMK;
258
262 const std::vector<ModuleBase::Vector3<double>> _kvec_d;
263
267 const Parallel_Orbitals* _paraV = nullptr;
268
274 int _nspin = 1;
275
281 int _nk = 0;
282
284 std::vector<TR> dmr_origin_;
285 TR* dmr_tmp_ = nullptr;
286
287};
288
289} // namespace elecstate
290
291#endif
Definition sltk_grid_driver.h:43
3 elements vector
Definition vector3.h:22
Definition parallel_orbitals.h:9
Definition record_adj.h:11
Definition unitcell.h:16
Definition density_matrix.h:36
void cal_DMR_full(hamilt::HContainer< std::complex< double > > *dmR_out) const
calculate complex density matrix DMR with both real and imaginary part for noncollinear-spin calculat...
const std::vector< std::vector< TK > > & get_DMK_vector() const
get pointer vector of DMK
Definition density_matrix.h:161
std::vector< hamilt::HContainer< TR > * > _DMR_grid
HContainer for density matrix in real space for gird parallelization vector.size() = 1 for non-polari...
Definition density_matrix.h:249
void write_DMK(const std::string directory, const int ispin, const int ik)
write density matrix dm(ik) into *.dmk
const Parallel_Orbitals * get_paraV_pointer() const
get pointer of paraV
Definition density_matrix.h:173
void cal_DMR(const int ik_in=-1)
calculate density matrix DMR from dm(k) using blas::axpy if ik_in < 0, calculate all k-points if ik_i...
int _nspin
spin-polarization index (1 - none spin and SOC ; 2 - spin polarization) Attention: this is not as sam...
Definition density_matrix.h:274
const std::vector< ModuleBase::Vector3< double > > & get_kvec_d() const
Definition density_matrix.h:175
const std::vector< hamilt::HContainer< TR > * > & get_DMR_vector() const
get pointer vector of DMR
Definition density_matrix.h:145
std::vector< hamilt::HContainer< TR > * > _DMR
HContainer for density matrix in real space for 2D parallelization vector.size() = 1 for non-polariza...
Definition density_matrix.h:241
int _nk
real number of k-points _nk is not equal to _kv->get_nks() when spin-polarization is considered _nk =...
Definition density_matrix.h:281
int get_DMK_ncol() const
get number of columns of density matrix dm(k)
Definition density_matrix_io.cpp:277
std::vector< std::vector< TK > > _DMK
density matrix in k space, which is a vector[ik] DMK should be a [_nspin][_nk][i][j] matrix,...
Definition density_matrix.h:257
std::vector< std::vector< TR > > _DMR_save
Definition density_matrix.h:242
void set_DMK(const int ispin, const int ik, const int i, const int j, const TK value)
set _DMK element directly
Definition density_matrix_io.cpp:216
std::vector< ModuleBase::ComplexMatrix > EDMK
Definition density_matrix.h:225
void save_DMR()
save _DMR into _DMR_save
Definition density_matrix_io.cpp:286
void cal_DMR_td(const UnitCell &ucell, const ModuleBase::Vector3< double > At, const int ik_in=-1)
calculate density matrix DMR with additional vector potential phase, used for hybrid gauge tddft if i...
~DensityMatrix()
Destructor of class DensityMatrix.
Definition density_matrix.cpp:19
std::vector< std::vector< TR > > & get_DMR_save()
Definition density_matrix.h:149
void set_DMK_zero()
set _DMK element to zero
Definition density_matrix_io.cpp:228
TK * get_DMK_pointer(const int ik) const
get pointer of DMK
Definition density_matrix_io.cpp:196
hamilt::HContainer< TR > * get_DMR_pointer(const int ispin) const
get pointer of DMR
Definition density_matrix_io.cpp:186
TR * dmr_tmp_
Definition density_matrix.h:285
std::vector< TR > dmr_origin_
temporary pointers for switch DMR, only used with nspin=2
Definition density_matrix.h:284
std::vector< std::vector< TK > > & get_DMK_vector()
Definition density_matrix.h:162
void read_DMK(const std::string directory, const int ispin, const int ik)
read *.dmk into density matrix dm(ik)
Definition density_matrix_io.cpp:323
void init_DMR(const Grid_Driver *GridD_in, const UnitCell *ucell)
initialize density matrix DMR from UnitCell
Definition density_matrix_io.cpp:15
void set_DMK_pointer(const int ik, TK *DMK_in)
set _DMK using a input TK* pointer please make sure the size of TK* is correct
Definition density_matrix_io.cpp:206
int get_DMK_nks() const
get total number of k-points of density matrix dm(k)
Definition density_matrix_io.cpp:250
int get_DMK_nrow() const
get number of rows of density matrix dm(k)
Definition density_matrix_io.cpp:268
std::vector< hamilt::HContainer< TR > * > & get_DMR_vector()
Definition density_matrix.h:146
const std::vector< ModuleBase::Vector3< double > > _kvec_d
K_Vectors object, which is used to get k-point information.
Definition density_matrix.h:262
const Parallel_Orbitals * _paraV
Parallel_Orbitals object, which contain all information of 2D block cyclic distribution.
Definition density_matrix.h:267
TK get_DMK(const int ispin, const int ik, const int i, const int j) const
get a matrix element of density matrix dm(k)
Definition density_matrix_io.cpp:239
typename ShiftRealComplex< TR >::type TRShift
Definition density_matrix.h:37
int get_DMK_size() const
Definition density_matrix_io.cpp:259
const std::vector< std::vector< TR > > & get_DMR_save() const
Definition density_matrix.h:148
void switch_dmr(const int mode)
(Only nspin=2) switch DMR to total density matrix or magnetization density matrix
Definition density_matrix.cpp:563
Definition hcontainer.h:144
std::complex< double > complex
Definition diago_cusolver.cpp:13
Definition cal_dm.h:10
std::complex< double > type
Definition density_matrix.h:25
double type
Definition density_matrix.h:31
DensityMatrix Class <TK,TR> = <double,double> for Gamma-only calculation <TK,TR> = <std::complex<doub...
Definition density_matrix.h:18
void type
Definition density_matrix.h:19