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 pseudopot_cell_vnl* nlpp_in,
35 const UnitCell* ucell_in,
36 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in,
37 const K_Vectors* kv_in,
38 const ModulePW::PW_Basis_K* wfc_basis_in,
39 const Structure_Factor* sf_in,
40 const ModuleBase::matrix& wg,
41 const ModuleBase::matrix& ekb
42 );
43
44 // a more general constructor is in the following
46 const std::vector<int>& nproj, // number of projectors for each atom type
47 const std::vector<int>& lproj,
48 const ModuleBase::realArray& tab, // radials' spherical bessel transform
50 std::complex<FPTYPE>* vkb_buf,
51 const UnitCell* ucell_in,
52 const psi::Psi<std::complex<FPTYPE>, Device>* psi_in,
53 const K_Vectors* kv_in,
54 const ModulePW::PW_Basis_K* wfc_basis_in,
55 const Structure_Factor* sf_in,
56 const ModuleBase::matrix& wg,
57 const ModuleBase::matrix& ekb
58 );
59
61
65 void cal_becp(int ik, int npm, std::complex<FPTYPE>* becp_in = nullptr, const std::complex<FPTYPE>* ppsi_in = nullptr);
70 void cal_dbecp_s(int ik, int npm, int ipol, int jpol);
74 void cal_dbecp_f(int ik, int npm, int ipol);
75
76 void cal_force_dftu(
77 int ik,
78 int npm,
79 FPTYPE* force,
80 const int* orbital_corr,
81 const std::complex<FPTYPE>* vu,
82 const int size_vu,
83 const FPTYPE* h_wg
84 );
85
86 void cal_force_dspin(
87 int ik,
88 int npm,
89 FPTYPE* force,
90 const ModuleBase::Vector3<double>* lambda,
91 const FPTYPE* h_wg
92 );
93
94 // return stress(i,j) value
95 double cal_stress_dftu(
96 int ik,
97 int npm,
98 const int* orbital_corr,
99 const std::complex<FPTYPE>* vu,
100 const int size_vu,
101 const FPTYPE* h_wg
102 );
103
104 // return stress(i,j) value
105 double cal_stress_dspin(
106 int ik,
107 int npm,
108 const ModuleBase::Vector3<double>* lambda,
109 const FPTYPE* h_wg
110 );
111
112
113 std::complex<FPTYPE>* get_becp() const { return becp; }
114 std::complex<FPTYPE>* get_dbecp() const { return dbecp; }
115
116 private:
120 void allocate_memory(
121 const ModuleBase::matrix& wg,
122 const ModuleBase::matrix& ekb,
123 const std::vector<int>& nproj,
124 const std::vector<int>& nch
125 );
129 void delete_memory();
130
131 private:
133 const Structure_Factor* sf_ = nullptr;
134 const pseudopot_cell_vnl* nlpp_ = nullptr;
135 const UnitCell* ucell_ = nullptr;
137 const K_Vectors* kv_ = nullptr;
139
141 Device* ctx = {};
142 base_device::DEVICE_CPU* cpu_ctx = {};
144 int nkb = 0;
145 int nbands = 0;
146 int deeq_dims[4] = {0, 0, 0, 0}; // deeq can be something other than that in pseudopotentials
147 int deeq_nc_dims[4] = {0, 0, 0, 0};
148
149 int current_ik = -1;
150
151 int max_nh = 0;
152 int max_npw = 0;
153 int ntype = 0;
154 bool nondiagonal = false;
155 int pre_ik_s = -1;
156 int pre_ik_f = -1;
157
158 int* atom_nh = nullptr;
159 int* atom_na = nullptr;
160 std::vector<int> h_atom_nh;
161 std::vector<int> h_atom_na;
162 std::vector<int> nproj;
163
166 int* gcar_zero_indexes = nullptr;
167 int gcar_zero_counts[3] = {0, 0, 0};
168 std::complex<FPTYPE>* vkb_save = nullptr;
170 void transfer_gcar(int npw, int npw_max, const FPTYPE* gcar_in);
172 void save_vkb(int npw, int ipol);
174 void revert_vkb(int npw, int ipol);
176
179 const ModuleBase::matrix* nhtol = nullptr;
180 int lprojmax = -1;
181
182 FPTYPE* d_wg = nullptr;
183 FPTYPE* d_ekb = nullptr;
184 FPTYPE* gcar = nullptr;
185
186 FPTYPE* deeq = nullptr;
187 std::complex<FPTYPE>* deeq_nc = nullptr;
188
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:12
3 elements vector
Definition vector3.h:24
Definition matrix.h:18
double float array
Definition realarray.h:21
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:56
Definition structure_factor.h:10
Definition unitcell.h:15
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:201
std::vector< int > h_atom_nh
Definition onsite_proj_tools.h:160
const K_Vectors * kv_
Definition onsite_proj_tools.h:137
const Structure_Factor * sf_
pointers to access the data without memory arrangement
Definition onsite_proj_tools.h:133
int max_npw
Definition onsite_proj_tools.h:152
~Onsite_Proj_tools()
Definition onsite_proj_tools.cpp:163
double cal_stress_dspin(int ik, int npm, const ModuleBase::Vector3< double > *lambda, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:995
FPTYPE * d_wg
Definition onsite_proj_tools.h:182
FPTYPE * hd_vq_deri
Definition onsite_proj_tools.h:202
Device * ctx
the following variables are used for the calculation
Definition onsite_proj_tools.h:141
int * d_dvkb_indexes
Definition onsite_proj_tools.h:210
int ntype
Definition onsite_proj_tools.h:153
FPTYPE * d_g_plus_k
allocate global memory on GPU device only
Definition onsite_proj_tools.h:205
int pre_ik_f
Definition onsite_proj_tools.h:156
FPTYPE * d_pref
Definition onsite_proj_tools.h:206
const ModuleBase::realArray * tabtpr
pointers to access the data without memory arrangement
Definition onsite_proj_tools.h:178
const ModulePW::PW_Basis_K * wfc_basis_
Definition onsite_proj_tools.h:138
int * atom_na
Definition onsite_proj_tools.h:159
std::complex< FPTYPE > * ppcell_vkb
Definition onsite_proj_tools.h:193
double cal_stress_dftu(int ik, int npm, const int *orbital_corr, const std::complex< FPTYPE > *vu, const int size_vu, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:915
std::complex< FPTYPE > * deeq_nc
Definition onsite_proj_tools.h:187
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:677
FPTYPE * gcar
Definition onsite_proj_tools.h:184
int max_nh
Definition onsite_proj_tools.h:151
int lprojmax
Definition onsite_proj_tools.h:180
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:750
FPTYPE * deeq
Definition onsite_proj_tools.h:186
int pre_ik_s
Definition onsite_proj_tools.h:155
FPTYPE * d_vq_tab
Definition onsite_proj_tools.h:208
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:467
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:602
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:807
int * atom_nh
Definition onsite_proj_tools.h:158
const pseudopot_cell_vnl * nlpp_
Definition onsite_proj_tools.h:134
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:170
bool nondiagonal
Definition onsite_proj_tools.h:154
FPTYPE * kvec_c
Definition onsite_proj_tools.h:189
std::vector< int > h_atom_na
Definition onsite_proj_tools.h:161
FPTYPE * hd_ylm
allocate memory on CPU/GPU device
Definition onsite_proj_tools.h:199
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:713
void delete_memory()
delete the memory for the variables
Definition onsite_proj_tools.cpp:230
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:166
FPTYPE * d_gk
Definition onsite_proj_tools.h:207
int deeq_nc_dims[4]
Definition onsite_proj_tools.h:147
std::vector< FPTYPE > g_plus_k
Definition onsite_proj_tools.h:197
std::vector< int > nproj
Definition onsite_proj_tools.h:162
void cal_force_dspin(int ik, int npm, FPTYPE *force, const ModuleBase::Vector3< double > *lambda, const FPTYPE *h_wg)
Definition onsite_proj_tools.cpp:861
std::complex< FPTYPE > * vkb_save
Definition onsite_proj_tools.h:168
std::vector< int > dvkb_indexes
Definition onsite_proj_tools.h:209
int current_ik
Definition onsite_proj_tools.h:149
int deeq_dims[4]
Definition onsite_proj_tools.h:146
std::complex< FPTYPE > * get_becp() const
Definition onsite_proj_tools.h:113
const UnitCell * ucell_
Definition onsite_proj_tools.h:135
int nbands
Definition onsite_proj_tools.h:145
FPTYPE * qq_nt
Definition onsite_proj_tools.h:190
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:279
FPTYPE * d_ekb
Definition onsite_proj_tools.h:183
std::complex< FPTYPE > * get_dbecp() const
Definition onsite_proj_tools.h:114
const ModuleBase::matrix * nhtol
Definition onsite_proj_tools.h:179
std::complex< FPTYPE > * dbecp
becp and dbecp:
Definition onsite_proj_tools.h:214
std::complex< FPTYPE > * becp
Definition onsite_proj_tools.h:215
const psi::Psi< std::complex< FPTYPE >, Device > * psi_
Definition onsite_proj_tools.h:136
base_device::AbacusDevice_t device
Definition onsite_proj_tools.h:143
int gcar_zero_counts[3]
Definition onsite_proj_tools.h:167
FPTYPE * hd_ylm_deri
Definition onsite_proj_tools.h:200
int nkb
Definition onsite_proj_tools.h:144
std::complex< FPTYPE > * hd_sk
Definition onsite_proj_tools.h:203
base_device::DEVICE_CPU * cpu_ctx
Definition onsite_proj_tools.h:142
std::complex< FPTYPE > * d_pref_in
Definition onsite_proj_tools.h:211
Definition vnl_pw.h:21
Definition psi.h:37
AbacusDevice_t
Definition types.h:12
Definition hamilt.h:13
Definition math_kernel_op.h:216
Definition memory_op.h:115
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