ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
fs_nonlocal_tools.h
Go to the documentation of this file.
1#ifndef W_ABACUS_DEVELOP_ABACUS_DEVELOP_SOURCE_source_pw_HAMILT_PWDFT_FS_NONLOCAL_TOOLS_H
2#define W_ABACUS_DEVELOP_ABACUS_DEVELOP_SOURCE_source_pw_HAMILT_PWDFT_FS_NONLOCAL_TOOLS_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 K_Vectors* kv_in,
36 const ModulePW::PW_Basis_K* wfc_basis_in,
37 const Structure_Factor* sf_in,
38 const ModuleBase::matrix& wg,
39 const ModuleBase::matrix* p_ekb);
41
46 void cal_vkb(const int& ik, const int& nbdall);
47
56 void cal_becp(const int& ik, const int& npm, const std::complex<FPTYPE>* ppsi, const int& nbd0 = 0);
57
59 void reduce_pool_becp(const int& npm);
60
69 void cal_vkb_deri_s(const int& ik, const int& nbdall, const int& ipol, const int& jpol);
70
80 void cal_dbecp_s(const int& ik, const int& npm, const std::complex<FPTYPE>* ppsi, const int& nbd0 = 0);
81
93 void cal_stress(const int& ik,
94 const int& npm,
95 const bool& occ,
96 const int& ipol,
97 const int& jpol,
98 FPTYPE* stress,
99 const int& nbd0 = 0);
100
108 void cal_vkb_deri_f(const int& ik, const int& nbdall, const int& ipol);
119 void cal_dbecp_f(const int& ik, const int& nbdall, const int& npm, const int& ipol, const std::complex<FPTYPE>* ppsi, const int& nbd0 = 0);
130 void cal_force(const int& ik, const int& nbdall, const int& npm, const bool& occ, FPTYPE* force, const int& nbd0 = 0);
131
133 void revert_vkb(const int& ik, const int& ipol);
134
135 private:
139 void allocate_memory(const ModuleBase::matrix& wg, const ModuleBase::matrix* p_ekb);
143 void delete_memory();
144
145 private:
152
154 Device* ctx = {};
155 base_device::DEVICE_CPU* cpu_ctx = {};
157 int nkb;
159
160 int max_nh = 0;
161 int max_npw = 0;
162 int ntype;
164 int pre_ik_s = -1;
165 int pre_ik_f = -1;
166
167 int* atom_nh = nullptr;
168 int* atom_na = nullptr;
169 std::vector<int> h_atom_nh;
170 std::vector<int> h_atom_na;
171
174 int* gcar_zero_indexes = nullptr;
175 int gcar_zero_counts[3] = {0, 0, 0};
176 std::complex<FPTYPE>* vkb_save = nullptr;
178 void transfer_gcar(const int& npw, const int& npw_max, const FPTYPE* gcar_in);
180 void save_vkb(const int& npw, const int& ipol);
182
184 FPTYPE* d_wg = nullptr;
185 FPTYPE* d_wk = nullptr;
186 FPTYPE* d_ekb = nullptr;
187 FPTYPE* gcar = nullptr;
188 FPTYPE* deeq = nullptr;
189 FPTYPE* kvec_c = nullptr;
190 FPTYPE* qq_nt = nullptr;
193 std::complex<FPTYPE>* ppcell_vkb = nullptr;
197 std::vector<FPTYPE> g_plus_k;
199 FPTYPE* hd_ylm = nullptr; // (lmax + 1) * (lmax + 1) * npw
200 FPTYPE* hd_ylm_deri = nullptr; // 3 * (lmax + 1) * (lmax + 1) * npw
201 FPTYPE* hd_vq = nullptr; // this->ucell->atoms[it].ncpp.nbeta * npw
202 FPTYPE* hd_vq_deri = nullptr; // this->ucell->atoms[it].ncpp.nbeta * npw
203 std::complex<FPTYPE>* hd_sk = nullptr; // this->ucell->nat * npw
205 FPTYPE* d_g_plus_k = nullptr; // npw * 5
206 FPTYPE* d_pref = nullptr; // this->ucell->atoms[it].ncpp.nh
207 FPTYPE* d_gk = nullptr; // this->ucell->atoms[it].ncpp.nh * npw
208 FPTYPE* d_vq_tab = nullptr; // this->ucell->atoms[it].ncpp.nbeta * npw
209 std::vector<int> dvkb_indexes; // this->ucell->atoms[it].ncpp.nh * 4
210 int* d_dvkb_indexes = nullptr; // this->ucell->atoms[it].ncpp.nh * 4
211 std::complex<FPTYPE>* d_pref_in = nullptr; // this->ucell->atoms[it].ncpp.nh
212
214 std::complex<FPTYPE>* dbecp = nullptr; // nbands * nkb (for stress) or nbands * nkb * 3 (for force)
215 std::complex<FPTYPE>* becp = nullptr; // nbands * nkb
216
221
228 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, Device, base_device::DEVICE_CPU>;
230 = base_device::memory::synchronize_memory_op<std::complex<FPTYPE>, base_device::DEVICE_CPU, Device>;
231
239
243
246
249};
250
251} // namespace hamilt
252
253#endif
Definition klist.h:13
Definition matrix.h:19
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 fs_nonlocal_tools.h:31
void cal_vkb(const int &ik, const int &nbdall)
calculate the projectors |beta>
Definition fs_nonlocal_tools.cpp:168
const ModulePW::PW_Basis_K * wfc_basis_
Definition fs_nonlocal_tools.h:151
FPTYPE * deeq
Definition fs_nonlocal_tools.h:188
FPTYPE * d_vq_tab
Definition fs_nonlocal_tools.h:208
const UnitCell * ucell_
Definition fs_nonlocal_tools.h:149
const K_Vectors * kv_
Definition fs_nonlocal_tools.h:150
base_device::AbacusDevice_t device
Definition fs_nonlocal_tools.h:156
std::vector< int > dvkb_indexes
Definition fs_nonlocal_tools.h:209
void allocate_memory(const ModuleBase::matrix &wg, const ModuleBase::matrix *p_ekb)
allocate the memory for the variables
Definition fs_nonlocal_tools.cpp:51
void reduce_pool_becp(const int &npm)
mpi_allreduce the becp in the pool
Definition fs_nonlocal_tools.cpp:290
FPTYPE * hd_vq_deri
Definition fs_nonlocal_tools.h:202
int * gcar_zero_indexes
the following variables are used for transfer gcar and reuse the values of vkb for force calculation
Definition fs_nonlocal_tools.h:174
FPTYPE * d_ekb
Definition fs_nonlocal_tools.h:186
std::complex< FPTYPE > * becp
Definition fs_nonlocal_tools.h:215
FPTYPE * hd_vq
Definition fs_nonlocal_tools.h:201
std::complex< FPTYPE > * ppcell_vkb
Definition fs_nonlocal_tools.h:193
const pseudopot_cell_vnl * nlpp_
Definition fs_nonlocal_tools.h:148
int nkb
Definition fs_nonlocal_tools.h:157
int max_npw
Definition fs_nonlocal_tools.h:161
std::vector< int > h_atom_na
Definition fs_nonlocal_tools.h:170
base_device::DEVICE_CPU * cpu_ctx
Definition fs_nonlocal_tools.h:155
void cal_dbecp_f(const int &ik, const int &nbdall, const int &npm, const int &ipol, const std::complex< FPTYPE > *ppsi, const int &nbd0=0)
calculate the dbecp_i = <psi|\partial beta/\partial \tau^I_i> for all beta functions
Definition fs_nonlocal_tools.cpp:570
int * atom_nh
Definition fs_nonlocal_tools.h:167
void save_vkb(const int &npw, const int &ipol)
save the 0-value dvkbs for calculating the dbecp_i in the force calculation
Definition fs_nonlocal_tools.cpp:606
FPTYPE * qq_nt
Definition fs_nonlocal_tools.h:190
void cal_force(const int &ik, const int &nbdall, const int &npm, const bool &occ, FPTYPE *force, const int &nbd0=0)
calculate the force^I_i = - \sum_{n,k}f_{nk} \sum_{lm,l'm'}D_{l,l'}^{I} becp * dbecp_i
Definition fs_nonlocal_tools.cpp:739
int pre_ik_f
Definition fs_nonlocal_tools.h:165
int nbands
Definition fs_nonlocal_tools.h:158
const Structure_Factor * sf_
pointers to access the data without memory arrangement
Definition fs_nonlocal_tools.h:147
~FS_Nonlocal_tools()
Definition fs_nonlocal_tools.cpp:44
int * d_dvkb_indexes
Definition fs_nonlocal_tools.h:210
void transfer_gcar(const int &npw, const 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 fs_nonlocal_tools.cpp:682
FPTYPE * d_g_plus_k
allocate global memory on GPU device only
Definition fs_nonlocal_tools.h:205
void revert_vkb(const int &ik, const int &ipol)
revert the 0-value dvkbs for calculating the dbecp_i in the force calculation
Definition fs_nonlocal_tools.cpp:643
FPTYPE * d_wg
pointers to access the data without memory arrangement
Definition fs_nonlocal_tools.h:184
std::vector< int > h_atom_nh
Definition fs_nonlocal_tools.h:169
FPTYPE * gcar
Definition fs_nonlocal_tools.h:187
FPTYPE * d_wk
Definition fs_nonlocal_tools.h:185
int max_nh
Definition fs_nonlocal_tools.h:160
bool nondiagonal
Definition fs_nonlocal_tools.h:163
std::vector< FPTYPE > g_plus_k
Definition fs_nonlocal_tools.h:197
FPTYPE * d_gk
Definition fs_nonlocal_tools.h:207
FPTYPE * hd_ylm_deri
Definition fs_nonlocal_tools.h:200
FPTYPE * kvec_c
Definition fs_nonlocal_tools.h:189
int * atom_na
Definition fs_nonlocal_tools.h:168
void delete_memory()
delete the memory for the variables
Definition fs_nonlocal_tools.cpp:125
int gcar_zero_counts[3]
Definition fs_nonlocal_tools.h:175
FPTYPE * hd_ylm
allocate memory on CPU/GPU device
Definition fs_nonlocal_tools.h:199
int ntype
Definition fs_nonlocal_tools.h:162
FPTYPE * d_pref
Definition fs_nonlocal_tools.h:206
std::complex< FPTYPE > * vkb_save
Definition fs_nonlocal_tools.h:176
void cal_vkb_deri_f(const int &ik, const int &nbdall, const int &ipol)
calculate vkb_deri
Definition fs_nonlocal_tools.cpp:533
int pre_ik_s
Definition fs_nonlocal_tools.h:164
std::complex< FPTYPE > * hd_sk
Definition fs_nonlocal_tools.h:203
std::complex< FPTYPE > * dbecp
becp and dbecp:
Definition fs_nonlocal_tools.h:214
void cal_vkb_deri_s(const int &ik, const int &nbdall, const int &ipol, const int &jpol)
calculate vkb_deri
Definition fs_nonlocal_tools.cpp:305
std::complex< FPTYPE > * d_pref_in
Definition fs_nonlocal_tools.h:211
void cal_stress(const int &ik, const int &npm, const bool &occ, const int &ipol, const int &jpol, FPTYPE *stress, const int &nbd0=0)
calculate stress
Definition fs_nonlocal_tools.cpp:452
void cal_dbecp_s(const int &ik, const int &npm, const std::complex< FPTYPE > *ppsi, const int &nbd0=0)
calculate the dbecp_{ij} = <psi|\partial beta/\partial varepsilon_{ij}> for all beta functions stress...
Definition fs_nonlocal_tools.cpp:422
Device * ctx
the following variables are used for the calculation
Definition fs_nonlocal_tools.h:154
void cal_becp(const int &ik, const int &npm, const std::complex< FPTYPE > *ppsi, const int &nbd0=0)
calculate the becp = <psi|beta> for all beta functions
Definition fs_nonlocal_tools.cpp:259
Definition VNL_in_pw.h:21
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