-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgint_rho.cpp
109 lines (101 loc) · 2.68 KB
/
gint_rho.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
#include "module_base/global_function.h"
#include "module_base/global_variable.h"
#include "gint_k.h"
#include "module_basis/module_ao/ORB_read.h"
#include "grid_technique.h"
#include "module_base/ylm.h"
#include "module_hamilt_pw/hamilt_pwdft/global.h"
#include "module_base/blas_connector.h"
#include "module_base/timer.h"
#include "gint_tools.h"
void Gint::gint_kernel_rho(
const int na_grid,
const int grid_index,
const double delta_r,
int* vindex,
const int LD_pool,
Gint_inout *inout)
{
//prepare block information
int * block_iw, * block_index, * block_size;
bool** cal_flag;
Gint_Tools::get_block_info(*this->gridt, this->bxyz, na_grid, grid_index, block_iw, block_index, block_size, cal_flag);
//evaluate psi on grids
Gint_Tools::Array_Pool<double> psir_ylm(this->bxyz, LD_pool);
Gint_Tools::cal_psir_ylm(*this->gridt,
this->bxyz, na_grid, grid_index, delta_r,
block_index, block_size,
cal_flag,
psir_ylm.ptr_2D);
for(int is=0; is<GlobalV::NSPIN; ++is)
{
Gint_Tools::Array_Pool<double> psir_DM(this->bxyz, LD_pool);
ModuleBase::GlobalFunc::ZEROS(psir_DM.ptr_1D, this->bxyz*LD_pool);
if(GlobalV::GAMMA_ONLY_LOCAL)
{
if (GlobalV::CALCULATION == "get_pchg")
{
Gint_Tools::mult_psi_DM(
*this->gridt, this->bxyz, na_grid, LD_pool,
block_iw, block_size,
block_index, cal_flag,
psir_ylm.ptr_2D,
psir_DM.ptr_2D,
inout->DM[is], inout->if_symm);
}
else
{
Gint_Tools::mult_psi_DM_new(
*this->gridt, this->bxyz, grid_index, na_grid, LD_pool,
block_iw, block_size,
block_index, cal_flag,
psir_ylm.ptr_2D,
psir_DM.ptr_2D,
this->DMRGint[is], inout->if_symm);
}
}
else
{
//calculating g_mu(r) = sum_nu rho_mu,nu psi_nu(r)
Gint_Tools::mult_psi_DMR(
*this->gridt, this->bxyz, grid_index, na_grid,
block_index, block_size,
cal_flag,
psir_ylm.ptr_2D,
psir_DM.ptr_2D,
inout->DM_R[is],
this->DMRGint[is],
inout->if_symm);
}
//do sum_mu g_mu(r)psi_mu(r) to get electron density on grid
this->cal_meshball_rho(
na_grid, block_index,
vindex, psir_ylm.ptr_2D,
psir_DM.ptr_2D, inout->rho[is]);
}
delete[] block_iw;
delete[] block_index;
delete[] block_size;
for(int ib=0; ib<this->bxyz; ++ib)
{
delete[] cal_flag[ib];
}
delete[] cal_flag;
}
void Gint::cal_meshball_rho(
const int na_grid,
int* block_index,
int* vindex,
double** psir_ylm,
double** psir_DMR,
double* rho)
{
const int inc = 1;
// sum over mu to get density on grid
for(int ib=0; ib<this->bxyz; ++ib)
{
double r=ddot_(&block_index[na_grid], psir_ylm[ib], &inc, psir_DMR[ib], &inc);
const int grid = vindex[ib];
rho[ grid ] += r;
}
}