ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
VNL_in_pw.h
Go to the documentation of this file.
1#ifndef VNL_IN_PW_H
2#define VNL_IN_PW_H
3
11#include "source_psi/psi.h"
12#ifdef __LCAO
14#endif
15
16//==========================================================
17// Calculate the non-local pseudopotential in reciprocal
18// space using plane wave as basis set.
19//==========================================================
21{
22
23 public:
26 void init(const UnitCell& cell,
27 Structure_Factor* psf_in,
28 const ModulePW::PW_Basis_K* wfc_basis = nullptr,
29 const bool allocate_vkb = true);
30
31 double cell_factor = 0.0; // LiuXh add 20180619
32
33 int nkb = 0; // total number of beta functions considering all atoms
34
35 int lmaxkb = 0; // max angular momentum for non-local projectors
36
37 void init_vnl(UnitCell& cell, const ModulePW::PW_Basis* rho_basis);
38
39 void rescale_vnl(const double& omega_in);
40
41 template <typename FPTYPE, typename Device>
42 void getvnl(Device* ctx, const UnitCell& ucell, const int& ik, std::complex<FPTYPE>* vkb_in) const;
43
44 // void getvnl_alpha(const int &ik);
45
46 void init_vnl_alpha(const UnitCell& cell);
47
48 void initgradq_vnl(const UnitCell& cell);
49
50 void getgradq_vnl(const UnitCell& ucell, const int ik);
51
52 //===============================================================
53 // MEMBER VARIABLES :
54 // NAME : nqx(number of interpolation points)
55 // NAME : nqxq(size of interpolation table)
56 // NAME : nhm(max number of different beta functions per atom)
57 // NAME : lmaxq
58 // NAME : dq(space between points in the pseudopotential tab)
59 //===============================================================
60 // private:
61
62 int nhm = 0;
63 int nbetam = 0; // max number of beta functions
64
65 int lmaxq = 0;
66
67 ModuleBase::matrix indv; // indes linking atomic beta's to beta's in the solid
68 ModuleBase::matrix nhtol; // correspondence n <-> angular momentum l
69 ModuleBase::matrix nhtolm; // correspondence n <-> combined lm index for (l,m)
71
72 ModuleBase::realArray dvan; //(:,:,:), the D functions of the solid
73 ModuleBase::ComplexArray dvan_so; //(:,:,:), spin-orbit case, added by zhengdy-soc
74
75 ModuleBase::realArray tab; //(:,:,:), interpolation table for PPs: 4pi/sqrt(V) * \int betar(r)jl(qr)rdr
77 ModuleBase::realArray tab_at; //(:,:,:), interpolation table for atomic wfc
78 ModuleBase::realArray tab_dq; // 4pi/sqrt(V) * \int betar(r)*djl(qr)/d(qr)*r^2 dr
79
80 ModuleBase::realArray deeq; //(:,:,:,:), the integral of V_eff and Q_{nm}
81 bool multi_proj = false;
82 float* s_deeq = nullptr;
83 double* d_deeq = nullptr;
84 ModuleBase::ComplexArray deeq_nc; //(:,:,:,:), the spin-orbit case
85 std::complex<float>* c_deeq_nc = nullptr; // GPU array of deeq_nc
86 std::complex<double>* z_deeq_nc = nullptr; // GPU array of deeq_nc
87
88 // liuyu add 2023-10-03
89 // uspp
90 int* indv_ijkb0 = nullptr; // first beta (index in the solid) for each atom
91 ModuleBase::IntArray ijtoh; // correspondence beta indexes ih,jh -> composite index ijh
92 ModuleBase::realArray qq_at; // the integral of q functions in the solid (ONE PER ATOM)
93 ModuleBase::realArray qq_nt; // the integral of q functions in the solid (ONE PER NTYP) used to be the qq array
94 ModuleBase::ComplexArray qq_so; // Q_{nm} for spin-orbit case
95 ModuleBase::realArray ap; // the expansion coefficients
96 ModuleBase::IntArray lpx; // for each input limi,ljmj is the number of LM in the sum
97 ModuleBase::IntArray lpl; // for each input limi,ljmj points to the allowed LM
98 ModuleBase::realArray qrad; // radial FT of Q functions
99
100 float* s_qq_nt = nullptr;
101 double* d_qq_nt = nullptr;
102 std::complex<float>* c_qq_so = nullptr; // GPU array of qq_so
103 std::complex<double>* z_qq_so = nullptr; // GPU array of qq_so
104
105 mutable ModuleBase::ComplexMatrix vkb; // all beta functions in reciprocal space
106 mutable ModuleBase::ComplexArray gradvkb; // gradient of beta functions
107 std::complex<double>*** vkb1_alpha;
108 std::complex<double>*** vkb_alpha;
110
111 // other variables
112 std::complex<double> Cal_C(int alpha, int lu, int mu, int L, int M);
113
114 double CG(int l1, int m1, int l2, int m2, int L, int M);
115
116 void print_vnl(std::ofstream& ofs);
117
135 void radial_fft_q(const int ng,
136 const int ih,
137 const int jh,
138 const int itype,
139 const double* qnorm,
140 const ModuleBase::matrix ylm,
141 std::complex<double>* qg) const;
142 template <typename FPTYPE, typename Device>
143 void radial_fft_q(Device* ctx,
144 const int ng,
145 const int ih,
146 const int jh,
147 const int itype,
148 const FPTYPE* qnorm,
149 const FPTYPE* ylm,
150 std::complex<FPTYPE>* qg) const;
151
159 void cal_effective_D(const ModuleBase::matrix& veff, const ModulePW::PW_Basis* rho_basis, UnitCell& cell);
160#ifdef __LCAO
161 ORB_gaunt_table MGT;
162#endif
163
164 template <typename FPTYPE>
165 FPTYPE* get_nhtol_data() const;
166 template <typename FPTYPE>
167 FPTYPE* get_nhtolm_data() const;
168 template <typename FPTYPE>
169 FPTYPE* get_indv_data() const;
170 template <typename FPTYPE>
171 FPTYPE* get_tab_data() const;
172 template <typename FPTYPE>
173 FPTYPE* get_deeq_data() const;
174 template <typename FPTYPE>
175 FPTYPE* get_qq_nt_data() const;
176 template <typename FPTYPE>
177 std::complex<FPTYPE>* get_qq_so_data() const;
178 template <typename FPTYPE>
179 std::complex<FPTYPE>* get_vkb_data() const;
180 template <typename FPTYPE>
181 std::complex<FPTYPE>* get_deeq_nc_data() const;
182
183 void release_memory();
184
185 private:
186 bool memory_released = false;
187 float* s_nhtol = nullptr;
188 float* s_nhtolm = nullptr;
189 float* s_indv = nullptr;
190 float* s_tab = nullptr;
191 std::complex<float>* c_vkb = nullptr;
192
193 double* d_nhtol = nullptr;
194 double* d_nhtolm = nullptr;
195 double* d_indv = nullptr;
196 double* d_tab = nullptr;
197 std::complex<double>* z_vkb = nullptr;
198
199 const ModulePW::PW_Basis_K* wfcpw = nullptr;
200
202
203 double omega_old = 0;
204 bool use_gpu_ = false;
205
215 void compute_qrad(UnitCell& cell);
216
224 void newq(const ModuleBase::matrix& veff, const ModulePW::PW_Basis* rho_basis, UnitCell& cell);
225
232 void newd_so(const int& iat, UnitCell& cell);
233
240 void newd_nc(const int& iat, UnitCell& cell);
241};
242
243#endif // VNL_IN_PW
A basic type of data for complex array.
Definition complexarray.h:15
Definition complexmatrix.h:14
Integer array.
Definition intarray.h:20
Definition matrix.h:19
double float array
Definition realarray.h:21
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
Definition ORB_gaunt_table.h:9
Definition soc.h:47
Definition structure_factor.h:11
Definition unitcell.h:16
Definition VNL_in_pw.h:21
ModuleBase::matrix indv
Definition VNL_in_pw.h:67
double omega_old
Definition VNL_in_pw.h:203
double CG(int l1, int m1, int l2, int m2, int L, int M)
ModuleBase::ComplexArray gradvkb
Definition VNL_in_pw.h:106
int nhm
Definition VNL_in_pw.h:62
int * indv_ijkb0
Definition VNL_in_pw.h:90
float * s_qq_nt
Definition VNL_in_pw.h:100
ModuleBase::matrix nhtoj
Definition VNL_in_pw.h:70
Structure_Factor * psf
Definition VNL_in_pw.h:109
std::complex< double > * z_vkb
Definition VNL_in_pw.h:197
std::complex< float > * c_qq_so
Definition VNL_in_pw.h:102
int lmaxkb
Definition VNL_in_pw.h:35
const ModulePW::PW_Basis_K * wfcpw
Definition VNL_in_pw.h:199
float * s_deeq
Definition VNL_in_pw.h:82
ModuleBase::realArray ap
Definition VNL_in_pw.h:95
FPTYPE * get_nhtol_data() const
std::complex< FPTYPE > * get_deeq_nc_data() const
std::complex< float > * c_vkb
Definition VNL_in_pw.h:191
std::complex< FPTYPE > * get_qq_so_data() const
std::complex< double > *** vkb_alpha
Definition VNL_in_pw.h:108
ModuleBase::realArray deeq
Definition VNL_in_pw.h:80
ModuleBase::ComplexArray deeq_nc
Definition VNL_in_pw.h:84
ModuleBase::ComplexArray qq_so
Definition VNL_in_pw.h:94
std::complex< double > Cal_C(int alpha, int lu, int mu, int L, int M)
ModuleBase::realArray dvan
Definition VNL_in_pw.h:72
FPTYPE * get_indv_data() const
double * d_qq_nt
Definition VNL_in_pw.h:101
ModuleBase::realArray tab_dq
Definition VNL_in_pw.h:78
float * s_nhtolm
Definition VNL_in_pw.h:188
pseudopot_cell_vnl()
Definition klist_test.cpp:74
float * s_nhtol
Definition VNL_in_pw.h:187
void newd_so(const int &iat, UnitCell &cell)
calculate D functions in the soc case when tvanp is true
Definition VNL_in_pw.cpp:1519
int nbetam
Definition VNL_in_pw.h:63
void compute_qrad(UnitCell &cell)
Compute interpolation table qrad.
Definition VNL_in_pw.cpp:788
std::complex< float > * c_deeq_nc
Definition VNL_in_pw.h:85
double * d_indv
Definition VNL_in_pw.h:195
std::complex< double > *** vkb1_alpha
Definition VNL_in_pw.h:107
void print_vnl(std::ofstream &ofs)
Definition VNL_in_pw.cpp:1250
bool memory_released
Definition VNL_in_pw.h:186
double cell_factor
Definition VNL_in_pw.h:31
std::complex< double > * z_qq_so
Definition VNL_in_pw.h:103
FPTYPE * get_qq_nt_data() const
ModuleBase::ComplexMatrix vkb
Definition VNL_in_pw.h:105
void rescale_vnl(const double &omega_in)
Definition VNL_in_pw.cpp:1600
ModuleBase::IntArray lpl
Definition VNL_in_pw.h:97
void init_vnl_alpha(const UnitCell &cell)
Definition VNL_in_pw.cpp:1176
double * d_nhtolm
Definition VNL_in_pw.h:194
ModuleBase::IntArray ijtoh
Definition VNL_in_pw.h:91
int nkb
Definition VNL_in_pw.h:33
ModuleBase::realArray qq_at
Definition VNL_in_pw.h:92
void init(const UnitCell &cell, Structure_Factor *psf_in, const ModulePW::PW_Basis_K *wfc_basis=nullptr, const bool allocate_vkb=true)
Definition VNL_in_pw.cpp:74
std::complex< FPTYPE > * get_vkb_data() const
FPTYPE * get_nhtolm_data() const
void getvnl(Device *ctx, const UnitCell &ucell, const int &ik, std::complex< FPTYPE > *vkb_in) const
Definition VNL_in_pw.cpp:294
bool use_gpu_
Definition VNL_in_pw.h:204
int lmaxq
Definition VNL_in_pw.h:65
ModuleBase::realArray tab
Definition VNL_in_pw.h:75
bool multi_proj
Definition VNL_in_pw.h:81
ModuleBase::realArray qq_nt
Definition VNL_in_pw.h:93
ModuleBase::realArray tab_alpha
Definition VNL_in_pw.h:76
void init_vnl(UnitCell &cell, const ModulePW::PW_Basis *rho_basis)
Definition VNL_in_pw.cpp:426
FPTYPE * get_deeq_data() const
void radial_fft_q(const int ng, const int ih, const int jh, const int itype, const double *qnorm, const ModuleBase::matrix ylm, std::complex< double > *qg) const
Compute the radial Fourier transform of the Q functions.
Definition VNL_in_pw.cpp:841
ModuleBase::realArray tab_at
Definition VNL_in_pw.h:77
FPTYPE * get_tab_data() const
ModuleBase::ComplexArray dvan_so
Definition VNL_in_pw.h:73
ModuleBase::matrix nhtolm
Definition VNL_in_pw.h:69
ModuleBase::realArray qrad
Definition VNL_in_pw.h:98
~pseudopot_cell_vnl()
Definition klist_test.cpp:77
std::complex< double > * z_deeq_nc
Definition VNL_in_pw.h:86
void release_memory()
Definition VNL_in_pw.cpp:28
void getgradq_vnl(const UnitCell &ucell, const int ik)
Definition VNL_grad_pw.cpp:61
float * s_indv
Definition VNL_in_pw.h:189
void cal_effective_D(const ModuleBase::matrix &veff, const ModulePW::PW_Basis *rho_basis, UnitCell &cell)
calculate the effective coefficient matrix for non-local pseudopotential projectors
Definition VNL_in_pw.cpp:1256
double * d_nhtol
Definition VNL_in_pw.h:193
ModuleBase::IntArray lpx
Definition VNL_in_pw.h:96
void initgradq_vnl(const UnitCell &cell)
Definition VNL_grad_pw.cpp:9
void newq(const ModuleBase::matrix &veff, const ModulePW::PW_Basis *rho_basis, UnitCell &cell)
computes the integral of the effective potential with the Q function
Definition VNL_in_pw.cpp:1397
void newd_nc(const int &iat, UnitCell &cell)
calculate D functions in the noncolin case when tvanp is true
Definition VNL_in_pw.cpp:1572
double * d_tab
Definition VNL_in_pw.h:196
float * s_tab
Definition VNL_in_pw.h:190
Soc soc
Definition VNL_in_pw.h:201
double * d_deeq
Definition VNL_in_pw.h:83
ModuleBase::matrix nhtol
Definition VNL_in_pw.h:68