ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
onsite_proj_tools.h
Go to the documentation of this file.
1#ifndef MODULEHAMILTPW_ONSITEPROJTOOLS_H
2#define MODULEHAMILTPW_ONSITEPROJTOOLS_H
3
6#include "source_cell/klist.h"
11#include "source_psi/psi.h"
12
13#include <complex>
14
15namespace hamilt
16{
17
29template <typename FPTYPE, typename Device>
31{
32 public:
34 const UnitCell* ucell_in,
35 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in,
36 const K_Vectors* kv_in,
37 const ModulePW::PW_Basis_K* wfc_basis_in,
38 const Structure_Factor* sf_in,
39 const ModuleBase::matrix& wg,
40 const ModuleBase::matrix& ekb);
41
42 // a more general constructor is in the following
43 Onsite_Proj_tools(const std::vector<int>& nproj, // number of projectors for each atom type
44 const std::vector<int>& lproj,
45 const ModuleBase::realArray& tab, // radials' spherical bessel transform
47 std::complex<FPTYPE>* vkb_buf,
48 const UnitCell* ucell_in,
49 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in,
50 const K_Vectors* kv_in,
51 const ModulePW::PW_Basis_K* wfc_basis_in,
52 const Structure_Factor* sf_in,
53 const ModuleBase::matrix& wg,
54 const ModuleBase::matrix& ekb);
55
57
61 void cal_becp(int ik, int npm, std::complex<FPTYPE>* becp_in = nullptr, const std::complex<FPTYPE>* ppsi_in = nullptr);
66 void cal_dbecp_s(int ik, int npm, int ipol, int jpol);
70 void cal_dbecp_f(int ik, int npm, int ipol);
71
72 void cal_force_dftu(int ik, int npm, FPTYPE* force, const int* orbital_corr, const std::complex<FPTYPE>* vu, const int size_vu, const FPTYPE* h_wg);
73 void cal_force_dspin(int ik, int npm, FPTYPE* force, const ModuleBase::Vector3<double>* lambda, const FPTYPE* h_wg);
74 void cal_stress_dftu(int ik, int npm, FPTYPE* stress, const int* orbital_corr, const std::complex<FPTYPE>* vu, const int size_vu, const FPTYPE* h_wg);
75 void cal_stress_dspin(int ik, int npm, FPTYPE* stress, const ModuleBase::Vector3<double>* lambda, const FPTYPE* h_wg);
76
77
78 std::complex<FPTYPE>* get_becp() { return becp; }
79 std::complex<FPTYPE>* get_dbecp() { return dbecp; }
80
81 private:
85 void allocate_memory(const ModuleBase::matrix& wg,
86 const ModuleBase::matrix& ekb,
87 const std::vector<int>& nproj,
88 const std::vector<int>& nch);
92 void delete_memory();
93
94 private:
102
104 Device* ctx = {};
105 base_device::DEVICE_CPU* cpu_ctx = {};
107 int nkb;
109 int deeq_dims[4] = {0, 0, 0, 0}; // deeq can be something other than that in pseudopotentials
110 int deeq_nc_dims[4] = {0, 0, 0, 0};
111
112 int current_ik = -1;
113
114 int max_nh = 0;
115 int max_npw = 0;
116 int ntype;
118 int pre_ik_s = -1;
119 int pre_ik_f = -1;
120
121 int* atom_nh = nullptr;
122 int* atom_na = nullptr;
123 std::vector<int> h_atom_nh;
124 std::vector<int> h_atom_na;
125 std::vector<int> nproj;
126
129 int* gcar_zero_indexes = nullptr;
130 int gcar_zero_counts[3] = {0, 0, 0};
131 std::complex<FPTYPE>* vkb_save = nullptr;
133 void transfer_gcar(int npw, int npw_max, const FPTYPE* gcar_in);
135 void save_vkb(int npw, int ipol);
137 void revert_vkb(int npw, int ipol);
139
142 const ModuleBase::matrix* nhtol = nullptr;
143 int lprojmax = -1;
144
145 FPTYPE* d_wg = nullptr;
146 FPTYPE* d_ekb = nullptr;
147 FPTYPE* gcar = nullptr;
148
149 FPTYPE* deeq = nullptr;
150 std::complex<FPTYPE>* deeq_nc = nullptr;
151
152 FPTYPE* kvec_c = nullptr;
153 FPTYPE* qq_nt = nullptr;
156 std::complex<FPTYPE>* ppcell_vkb = nullptr;
160 std::vector<FPTYPE> g_plus_k;
162 FPTYPE* hd_ylm = nullptr; // (lmax + 1) * (lmax + 1) * npw
163 FPTYPE* hd_ylm_deri = nullptr; // 3 * (lmax + 1) * (lmax + 1) * npw
164 FPTYPE* hd_vq = nullptr; // this->ucell->atoms[it].ncpp.nbeta * npw
165 FPTYPE* hd_vq_deri = nullptr; // this->ucell->atoms[it].ncpp.nbeta * npw
166 std::complex<FPTYPE>* hd_sk = nullptr; // this->ucell->nat * npw
168 FPTYPE* d_g_plus_k = nullptr; // npw * 5
169 FPTYPE* d_pref = nullptr; // this->ucell->atoms[it].ncpp.nh
170 FPTYPE* d_gk = nullptr; // this->ucell->atoms[it].ncpp.nh * npw
171 FPTYPE* d_vq_tab = nullptr; // this->ucell->atoms[it].ncpp.nbeta * npw
172 std::vector<int> dvkb_indexes; // this->ucell->atoms[it].ncpp.nh * 4
173 int* d_dvkb_indexes = nullptr; // this->ucell->atoms[it].ncpp.nh * 4
174 std::complex<FPTYPE>* d_pref_in = nullptr; // this->ucell->atoms[it].ncpp.nh
175
177 std::complex<FPTYPE>* dbecp = nullptr; // nbands * nkb (for stress) or nbands * nkb * 3 (for force)
178 std::complex<FPTYPE>* becp = nullptr; // nbands * nkb
179
184
191 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, Device, base_device::DEVICE_CPU>;
193 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, base_device::DEVICE_CPU, Device>;
194
202
206
209
212};
213
214} // namespace hamilt
215
216#endif
Definition klist.h:13
3 elements vector
Definition vector3.h:22
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
Definition structure_factor.h:11
Definition unitcell.h:16
Nonlocal pseudopotential tools in plane wave basis set. used for calculating force and stress for dif...
Definition onsite_proj_tools.h:31
FPTYPE * hd_vq
Definition onsite_proj_tools.h:164
std::vector< int > h_atom_nh
Definition onsite_proj_tools.h:123
const K_Vectors * kv_
Definition onsite_proj_tools.h:100
const Structure_Factor * sf_
pointers to access the data without memory arrangement
Definition onsite_proj_tools.h:96
int max_npw
Definition onsite_proj_tools.h:115
~Onsite_Proj_tools()
Definition onsite_proj_tools.cpp:162
void cal_stress_dspin(int ik, int npm, FPTYPE *stress, const ModuleBase::Vector3< double > *lambda, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:964
FPTYPE * d_wg
Definition onsite_proj_tools.h:145
FPTYPE * hd_vq_deri
Definition onsite_proj_tools.h:165
Device * ctx
the following variables are used for the calculation
Definition onsite_proj_tools.h:104
int * d_dvkb_indexes
Definition onsite_proj_tools.h:173
int ntype
Definition onsite_proj_tools.h:116
void cal_stress_dftu(int ik, int npm, FPTYPE *stress, const int *orbital_corr, const std::complex< FPTYPE > *vu, const int size_vu, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:914
FPTYPE * d_g_plus_k
allocate global memory on GPU device only
Definition onsite_proj_tools.h:168
int pre_ik_f
Definition onsite_proj_tools.h:119
FPTYPE * d_pref
Definition onsite_proj_tools.h:169
const ModuleBase::realArray * tabtpr
pointers to access the data without memory arrangement
Definition onsite_proj_tools.h:141
const ModulePW::PW_Basis_K * wfc_basis_
Definition onsite_proj_tools.h:101
int * atom_na
Definition onsite_proj_tools.h:122
std::complex< FPTYPE > * ppcell_vkb
Definition onsite_proj_tools.h:156
std::complex< FPTYPE > * get_dbecp()
Definition onsite_proj_tools.h:79
std::complex< FPTYPE > * deeq_nc
Definition onsite_proj_tools.h:150
void save_vkb(int npw, int ipol)
save the 0-value dvkbs for calculating the dbecp_i in the force calculation
Definition onsite_proj_tools.cpp:676
FPTYPE * gcar
Definition onsite_proj_tools.h:147
int max_nh
Definition onsite_proj_tools.h:114
int lprojmax
Definition onsite_proj_tools.h:143
void transfer_gcar(int npw, int npw_max, const FPTYPE *gcar_in)
count zero gcar indexes and prepare zero_indexes, do gcar_y /= gcar_x, gcar_z /= gcar_y
Definition onsite_proj_tools.cpp:749
FPTYPE * deeq
Definition onsite_proj_tools.h:149
int pre_ik_s
Definition onsite_proj_tools.h:118
FPTYPE * d_vq_tab
Definition onsite_proj_tools.h:171
void cal_dbecp_s(int ik, int npm, int ipol, int jpol)
calculate the dbecp_{ij} = <psi|\partial beta/\partial varepsilon_{ij}> for all beta functions stress...
Definition onsite_proj_tools.cpp:466
std::complex< FPTYPE > * get_becp()
Definition onsite_proj_tools.h:78
void cal_dbecp_f(int ik, int npm, int ipol)
calculate the dbecp_i = <psi|\partial beta/\partial \tau^I_i> for all beta functions
Definition onsite_proj_tools.cpp:601
void cal_force_dftu(int ik, int npm, FPTYPE *force, const int *orbital_corr, const std::complex< FPTYPE > *vu, const int size_vu, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:806
int * atom_nh
Definition onsite_proj_tools.h:121
const pseudopot_cell_vnl * nlpp_
Definition onsite_proj_tools.h:97
void allocate_memory(const ModuleBase::matrix &wg, const ModuleBase::matrix &ekb, const std::vector< int > &nproj, const std::vector< int > &nch)
allocate the memory for the variables
Definition onsite_proj_tools.cpp:169
bool nondiagonal
Definition onsite_proj_tools.h:117
FPTYPE * kvec_c
Definition onsite_proj_tools.h:152
std::vector< int > h_atom_na
Definition onsite_proj_tools.h:124
FPTYPE * hd_ylm
allocate memory on CPU/GPU device
Definition onsite_proj_tools.h:162
void revert_vkb(int npw, int ipol)
revert the 0-value dvkbs for calculating the dbecp_i in the force calculation
Definition onsite_proj_tools.cpp:712
void delete_memory()
delete the memory for the variables
Definition onsite_proj_tools.cpp:229
int * gcar_zero_indexes
the following variables are used for transfer gcar and reuse the values of vkb for force calculation
Definition onsite_proj_tools.h:129
FPTYPE * d_gk
Definition onsite_proj_tools.h:170
int deeq_nc_dims[4]
Definition onsite_proj_tools.h:110
std::vector< FPTYPE > g_plus_k
Definition onsite_proj_tools.h:160
std::vector< int > nproj
Definition onsite_proj_tools.h:125
void cal_force_dspin(int ik, int npm, FPTYPE *force, const ModuleBase::Vector3< double > *lambda, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:860
std::complex< FPTYPE > * vkb_save
Definition onsite_proj_tools.h:131
std::vector< int > dvkb_indexes
Definition onsite_proj_tools.h:172
int current_ik
Definition onsite_proj_tools.h:112
int deeq_dims[4]
Definition onsite_proj_tools.h:109
const UnitCell * ucell_
Definition onsite_proj_tools.h:98
int nbands
Definition onsite_proj_tools.h:108
FPTYPE * qq_nt
Definition onsite_proj_tools.h:153
void cal_becp(int ik, int npm, std::complex< FPTYPE > *becp_in=nullptr, const std::complex< FPTYPE > *ppsi_in=nullptr)
calculate the becp = <psi|beta> for all beta functions
Definition onsite_proj_tools.cpp:278
FPTYPE * d_ekb
Definition onsite_proj_tools.h:146
const ModuleBase::matrix * nhtol
Definition onsite_proj_tools.h:142
std::complex< FPTYPE > * dbecp
becp and dbecp:
Definition onsite_proj_tools.h:177
std::complex< FPTYPE > * becp
Definition onsite_proj_tools.h:178
const psi::Psi< std::complex< FPTYPE >, Device > * psi_
Definition onsite_proj_tools.h:99
base_device::AbacusDevice_t device
Definition onsite_proj_tools.h:106
int gcar_zero_counts[3]
Definition onsite_proj_tools.h:130
FPTYPE * hd_ylm_deri
Definition onsite_proj_tools.h:163
int nkb
Definition onsite_proj_tools.h:107
std::complex< FPTYPE > * hd_sk
Definition onsite_proj_tools.h:166
base_device::DEVICE_CPU * cpu_ctx
Definition onsite_proj_tools.h:105
std::complex< FPTYPE > * d_pref_in
Definition onsite_proj_tools.h:174
Definition VNL_in_pw.h:21
Definition psi.h:37
AbacusDevice_t
Definition types.h:12
Definition hamilt.h:12
Definition math_kernel_op.h:217
Definition memory_op.h:77
Definition memory_op.h:17
Definition memory_op.h:31
Definition stress_op.h:15
Definition stress_op.h:57
Definition stress_op.h:181
Definition stress_op.h:166
Definition stress_op.h:217
Definition stress_op.h:201