ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
gint_tools.h
Go to the documentation of this file.
1//=========================================================
2// REFACTOR : Peize Lin, 2021.06.28
3//=========================================================
4#ifndef GINT_TOOLS_H
5#define GINT_TOOLS_H
6#include "grid_technique.h"
10
11#include <cstdlib>
12#include <utility> // for std::pair
13
14namespace Gint_Tools
15{
16enum class job_type
17{
18 vlocal,
19 rho,
20 force,
21 tau,
25};
26// Hamiltonian, electron density, force, kinetic energy density, Hamiltonian for mGGA
27} // namespace Gint_Tools
28
29// the class is used to pass input/output variables
30// into the unified interface gint
31// not sure if this is the best practice though ..
33{
34 public:
35 // input
36 double*** DM=nullptr;
37 const double* vl=nullptr;
38 const double* vofk=nullptr;
39 bool isforce=false;
40 bool isstress=false;
41 int ispin=0;
42 int nspin_rho=0; // usually, but not always, equal to global nspin
43 bool if_symm = false; // if true, use dsymv in gint_kernel_rho; if false, use dgemv.
44
45 // output
46 double** rho=nullptr;
50
51 // electron density and kin_r, multi-k
52 Gint_inout(double** rho_in, Gint_Tools::job_type job_in, const int& nspin_rho_in, bool if_symm_in = true)
53 {
54 rho = rho_in;
55 job = job_in;
56 nspin_rho = nspin_rho_in;
57 if_symm = if_symm_in;
58 }
59
60 // force
61 Gint_inout(const int ispin_in,
62 const double* vl_in,
63 bool isforce_in,
64 bool isstress_in,
65 ModuleBase::matrix* fvl_dphi_in,
66 ModuleBase::matrix* svl_dphi_in,
68 {
69 vl = vl_in;
70 isforce = isforce_in;
71 isstress = isstress_in;
72 fvl_dphi = fvl_dphi_in;
73 svl_dphi = svl_dphi_in;
74 job = job_in;
75 ispin = ispin_in;
76 }
77
78 // force (mGGA)
79 Gint_inout(const int ispin_in,
80 const double* vl_in,
81 const double* vofk_in,
82 const bool isforce_in,
83 const bool isstress_in,
84 ModuleBase::matrix* fvl_dphi_in,
85 ModuleBase::matrix* svl_dphi_in,
87 {
88 vl = vl_in;
89 vofk = vofk_in;
90 isforce = isforce_in;
91 isstress = isstress_in;
92 fvl_dphi = fvl_dphi_in;
93 svl_dphi = svl_dphi_in;
94 job = job_in;
95 ispin = ispin_in;
96 }
97
98 // vlocal, multi-k
99 Gint_inout(const double* vl_in, int ispin_in, Gint_Tools::job_type job_in)
100 {
101 vl = vl_in;
102 ispin = ispin_in;
103 job = job_in;
104 }
105
106 // mGGA vlocal, multi-k
107 Gint_inout(const double* vl_in, const double* vofk_in, int ispin_in, Gint_Tools::job_type job_in)
108 {
109 vl = vl_in;
110 vofk = vofk_in;
111 ispin = ispin_in;
112 job = job_in;
113 }
114
115 // vlocal, gamma point
116 Gint_inout(const double* vl_in, Gint_Tools::job_type job_in)
117 {
118 vl = vl_in;
119 job = job_in;
120 }
121
122 // mGGA vlocal, gamma point
123 Gint_inout(const double* vl_in, const double* vofk_in, Gint_Tools::job_type job_in)
124 {
125 vl = vl_in;
126 vofk = vofk_in;
127 job = job_in;
128 }
129};
130
131namespace Gint_Tools
132{
133// if exponent is an integer between 0 and 5 (the most common cases in gint),
134// pow_int is much faster than std::pow
135inline double pow_int(const double base, const int exp)
136{
137 switch (exp)
138 {
139 case 0:
140 return 1.0;
141 case 1:
142 return base;
143 case 2:
144 return base * base;
145 case 3:
146 return base * base * base;
147 case 4:
148 return base * base * base * base;
149 case 5:
150 return base * base * base * base * base;
151 default:
152 double result = std::pow(base, exp);
153 return result;
154 }
155}
156// vindex[pw.bxyz]
157
171void get_vindex(const int bxyz, const int bx, const int by,
172 const int bz, const int nplane,
173 const int start_ind,const int ncyz,int* vindex);
174
190void get_gint_vldr3(double* vldr3,
191 const double* const vlocal,
192 const int bxyz,
193 const int bx,
194 const int by,
195 const int bz,
196 const int nplane,
197 const int start_ind,
198 const int ncyz,
199 const double dv);
200
212void get_block_info(const Grid_Technique& gt, const int bxyz, const int na_grid, const int grid_index,
213 int* block_iw, int* block_index, int* block_size, bool** cal_flag);
214
215void init_orb(double& dr_uniform,
216 std::vector<double>& rcuts,
217 UnitCell& ucell,
218 const LCAO_Orbitals& orb,
219 std::vector<std::vector<double>>& psi_u,
220 std::vector<std::vector<double>>& dpsi_u,
221 std::vector<std::vector<double>>& d2psi_u);
222
223// psir_ylm[pw.bxyz][LD_pool]
224void cal_psir_ylm(const Grid_Technique& gt,
225 const int bxyz,
226 const int na_grid, // number of atoms on this grid
227 const int grid_index, // 1d index of FFT index (i,j,k)
228 const double delta_r, // delta_r of the uniform FFT grid
229 const int* const block_index, // count total number of atomis orbitals
230 const int* const block_size,
231 const bool* const* const cal_flag,
232 double* const* const psir_ylm); // whether the atom-grid distance is larger than cutoff
233
234// psir_ylm and dpsir_ylm, both[pw.bxyz][LD_pool]
235void cal_dpsir_ylm(
236 const Grid_Technique& gt,
237 const int bxyz,
238 const int na_grid, // number of atoms on this grid
239 const int grid_index, // 1d index of FFT index (i,j,k)
240 const double delta_r, // delta_r of the uniform FFT grid
241 const int* const block_index, // block_index[na_grid+1], count total number of atomis orbitals
242 const int* const block_size, // block_size[na_grid], number of columns of a band
243 const bool* const* const cal_flag, // cal_flag[bxyz][na_grid], whether the atom-grid distance is larger than cutoff
244 double* const* const psir_ylm,
245 double* const* const dpsir_ylm_x,
246 double* const* const dpsir_ylm_y,
247 double* const* const dpsir_ylm_z);
248
249// dpsir_ylm * (r-R), R is the atomic position
250void cal_dpsirr_ylm(
251 const Grid_Technique& gt, const int bxyz,
252 const int na_grid, // number of atoms on this grid
253 const int grid_index, // 1d index of FFT index (i,j,k)
254 const int* const block_index, // block_index[na_grid+1], count total number of atomis orbitals
255 const int* const block_size, // block_size[na_grid], number of columns of a band
256 const bool* const* const cal_flag, // cal_flag[bxyz][na_grid], whether the atom-grid distance is larger than cutoff
257 double* const* const dpsir_ylm_x, double* const* const dpsir_ylm_y, double* const* const dpsir_ylm_z,
258 double* const* const dpsir_ylm);
259
260void cal_ddpsir_ylm(
261 const Grid_Technique& gt,
262 const int bxyz,
263 const int na_grid, // number of atoms on this grid
264 const int grid_index, // 1d index of FFT index (i,j,k)
265 const double delta_r, // delta_r of the uniform FFT grid
266 const int* const block_index, // block_index[na_grid+1], count total number of atomis orbitals
267 const int* const block_size, // block_size[na_grid], number of columns of a band
268 const bool* const* const cal_flag, // cal_flag[bxyz][na_grid], whether the atom-grid distance is larger than cutoff
269 double* const* const ddpsir_ylm_xx,
270 double* const* const ddpsir_ylm_xy,
271 double* const* const ddpsir_ylm_xz,
272 double* const* const ddpsir_ylm_yy,
273 double* const* const ddpsir_ylm_yz,
274 double* const* const ddpsir_ylm_zz);
275
276// psir_ylm * vldr3
278 const int bxyz,
279 const int na_grid, // how many atoms on this (i,j,k) grid
280 const int LD_pool,
281 const int* const block_index, // block_index[na_grid+1], count total number of atomis orbitals
282 const bool* const* const cal_flag, // cal_flag[bxyz][na_grid], whether the atom-grid distance is larger than cutoff
283 const double* const vldr3, // vldr3[bxyz]
284 const double* const* const psir_ylm); // psir_ylm[bxyz][LD_pool]
285
286// sum_nu,R rho_mu,nu(R) psi_nu, for multi-k and gamma point
287void mult_psi_DMR(
288 const Grid_Technique& gt,
289 const int bxyz,
290 const int LD_pool,
291 const int &grid_index,
292 const int &na_grid,
293 const int*const block_index,
294 const int*const block_size,
295 const bool*const*const cal_flag,
296 const double*const*const psi,
297 double*const*const psi_DMR,
298 const hamilt::HContainer<double>*const DM,
299 const bool if_symm);
300
301
302// pair.first is the first index of the meshcell which is inside atoms ia1 and ia2.
303// pair.second is the number of meshcells which should be calculated in the following gemm.
304// If no meshcell is inside both ia1 and ia2, return [bxyz, 0].
305std::pair<int, int> cal_info(const int bxyz,
306 const int ia1,
307 const int ia2,
308 const bool* const* const cal_flag);
309
310} // namespace Gint_Tools
311#endif
Definition gint_tools.h:33
Gint_inout(const double *vl_in, int ispin_in, Gint_Tools::job_type job_in)
Definition gint_tools.h:99
ModuleBase::matrix * svl_dphi
Definition gint_tools.h:48
bool isforce
Definition gint_tools.h:39
int nspin_rho
Definition gint_tools.h:42
bool if_symm
Definition gint_tools.h:43
ModuleBase::matrix * fvl_dphi
Definition gint_tools.h:47
double *** DM
Definition gint_tools.h:36
Gint_inout(const double *vl_in, const double *vofk_in, Gint_Tools::job_type job_in)
Definition gint_tools.h:123
Gint_inout(const int ispin_in, const double *vl_in, const double *vofk_in, const bool isforce_in, const bool isstress_in, ModuleBase::matrix *fvl_dphi_in, ModuleBase::matrix *svl_dphi_in, Gint_Tools::job_type job_in)
Definition gint_tools.h:79
bool isstress
Definition gint_tools.h:40
const double * vofk
Definition gint_tools.h:38
Gint_Tools::job_type job
Definition gint_tools.h:49
const double * vl
Definition gint_tools.h:37
double ** rho
Definition gint_tools.h:46
int ispin
Definition gint_tools.h:41
Gint_inout(const int ispin_in, const double *vl_in, bool isforce_in, bool isstress_in, ModuleBase::matrix *fvl_dphi_in, ModuleBase::matrix *svl_dphi_in, Gint_Tools::job_type job_in)
Definition gint_tools.h:61
Gint_inout(const double *vl_in, Gint_Tools::job_type job_in)
Definition gint_tools.h:116
Gint_inout(double **rho_in, Gint_Tools::job_type job_in, const int &nspin_rho_in, bool if_symm_in=true)
Definition gint_tools.h:52
Gint_inout(const double *vl_in, const double *vofk_in, int ispin_in, Gint_Tools::job_type job_in)
Definition gint_tools.h:107
Definition grid_technique.h:18
Definition ORB_read.h:19
Array_Pool is a class designed for dynamically allocating a two-dimensional array with all its elemen...
Definition array_pool.h:16
Definition matrix.h:19
Definition unitcell.h:16
Definition hcontainer.h:144
Definition cal_ddpsir_ylm.cpp:4
void get_gint_vldr3(double *vldr3, const double *const vlocal, const int bxyz, const int bx, const int by, const int bz, const int nplane, const int start_ind, const int ncyz, const double dv)
Get the vldr3 form the grid index.
Definition gint_tools.cpp:41
void get_block_info(const Grid_Technique &gt, const int bxyz, const int na_grid, const int grid_index, int *block_iw, int *block_index, int *block_size, bool **cal_flag)
Get the information of a big grid index.
Definition gint_tools.cpp:62
void init_orb(double &dr_uniform, std::vector< double > &rcuts, UnitCell &ucell, const LCAO_Orbitals &orb, std::vector< std::vector< double > > &psi_u, std::vector< std::vector< double > > &dpsi_u, std::vector< std::vector< double > > &d2psi_u)
Definition init_orb.cpp:8
ModuleBase::Array_Pool< double > get_psir_vlbr3(const int bxyz, const int na_grid, const int LD_pool, const int *const block_index, const bool *const *const cal_flag, const double *const vldr3, const double *const *const psir_ylm)
Definition gint_tools.cpp:163
void cal_dpsir_ylm(const Grid_Technique &gt, const int bxyz, const int na_grid, const int grid_index, const double delta_r, const int *const block_index, const int *const block_size, const bool *const *const cal_flag, double *const *const psir_ylm, double *const *const dpsir_ylm_x, double *const *const dpsir_ylm_y, double *const *const dpsir_ylm_z)
Definition cal_dpsir_ylm.cpp:6
void mult_psi_DMR(const Grid_Technique &gt, const int bxyz, const int LD_pool, const int &grid_index, const int &na_grid, const int *const block_index, const int *const block_size, const bool *const *const cal_flag, const double *const *const psi, double *const *const psi_DMR, const hamilt::HContainer< double > *const DM, const bool if_symm)
Definition mult_psi_dmr.cpp:8
void cal_psir_ylm(const Grid_Technique &gt, const int bxyz, const int na_grid, const int grid_index, const double delta_r, const int *const block_index, const int *const block_size, const bool *const *const cal_flag, double *const *const psir_ylm)
Definition cal_psir_ylm.cpp:5
void cal_dpsirr_ylm(const Grid_Technique &gt, const int bxyz, const int na_grid, const int grid_index, const int *const block_index, const int *const block_size, const bool *const *const cal_flag, double *const *const dpsir_ylm_x, double *const *const dpsir_ylm_y, double *const *const dpsir_ylm_z, double *const *const dpsirr_ylm)
Definition gint_tools.cpp:103
std::pair< int, int > cal_info(const int bxyz, const int ia1, const int ia2, const bool *const *const cal_flag)
Definition gint_tools.cpp:197
double pow_int(const double base, const int exp)
Definition gint_tools.h:135
job_type
Definition gint_tools.h:17
void get_vindex(const int bxyz, const int bx, const int by, const int bz, const int nplane, const int start_ind, const int ncyz, int *vindex)
Get the vindex form the grid index.
Definition gint_tools.cpp:16
void cal_ddpsir_ylm(const Grid_Technique &gt, const int bxyz, const int na_grid, const int grid_index, const double delta_r, const int *const block_index, const int *const block_size, const bool *const *const cal_flag, double *const *const ddpsir_ylm_xx, double *const *const ddpsir_ylm_xy, double *const *const ddpsir_ylm_xz, double *const *const ddpsir_ylm_yy, double *const *const ddpsir_ylm_yz, double *const *const ddpsir_ylm_zz)
Definition cal_ddpsir_ylm.cpp:5
Definition allocator.h:6
Definition exx_lip.h:23