ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
op_exx_pw.h
Go to the documentation of this file.
1#ifndef OPEXXPW_H
2#define OPEXXPW_H
3
4#include "operator_pw.h"
10#include "source_cell/klist.h"
12#include "source_psi/psi.h"
14
15#include <memory>
16#include <utility>
17#include <vector>
18
19namespace hamilt
20{
21
22template <typename T, typename Device>
23class OperatorEXXPW : public OperatorPW<T, Device>
24{
25 private:
26 using Real = typename GetTypeReal<T>::type;
27
28 public:
29 OperatorEXXPW(const int* isk_in,
30 const ModulePW::PW_Basis_K* wfcpw_in,
31 const ModulePW::PW_Basis* rhopw_in,
32 K_Vectors* kv_in,
33 const UnitCell* ucell);
34
35 template <typename T_in, typename Device_in = Device>
36 explicit OperatorEXXPW(const OperatorEXXPW<T_in, Device_in> *op_exx);
37
38 virtual ~OperatorEXXPW();
39
40 virtual void act(const int nbands,
41 const int nbasis,
42 const int npol,
43 const T *tmpsi_in,
44 T *tmhpsi,
45 const int ngk_ik = 0,
46 const bool is_first_node = false) const override;
47
48 double cal_exx_energy(psi::Psi<T, Device> *psi_) const;
49
50 void set_psi(psi::Psi<T, Device> &psi_in) const { psi = psi_in; }
51
52 void set_wg(const ModuleBase::matrix *wg_in) { wg = wg_in; }
53
54 void construct_ace() const;
55
56 bool first_iter = true;
57
58 static std::vector<Real> fock_div, erfc_div;
59
60 private:
61 const int* isk = nullptr;
62 const ModulePW::PW_Basis_K* wfcpw = nullptr;
63 const ModulePW::PW_Basis* rhopw = nullptr;
64 ModulePW::PW_Basis* rhopw_dev = nullptr; // for device
65 const UnitCell *ucell = nullptr;
67
68 std::vector<int> get_q_points(const int ik) const;
69 const T *get_pw(const int m, const int iq) const;
70
71 void multiply_potential(T *density_recip, int ik, int iq) const;
72
73 void act_op(const int nbands,
74 const int nbasis,
75 const int npol,
76 const T *tmpsi_in,
77 T *tmhpsi,
78 const int ngk_ik = 0,
79 const bool is_first_node = false) const;
80
81 void act_op_kpar(const int nbands,
82 const int nbasis,
83 const int npol,
84 const T *tmpsi_in,
85 T *tmhpsi,
86 const int ngk_ik = 0,
87 const bool is_first_node = false) const;
88
89 void act_op_ace(const int nbands,
90 const int nbasis,
91 const int npol,
92 const T *tmpsi_in,
93 T *tmhpsi,
94 const int ngk_ik = 0,
95 const bool is_first_node = false) const;
96
97 double cal_exx_energy_op(psi::Psi<T, Device> *psi_) const;
98
99 double cal_exx_energy_ace(psi::Psi<T, Device> *psi_) const;
100
101 void cal_density_recip(const T* psi_nk_real, const T* psi_mq_real, double omega) const;
102
103 void rho_recip2real(const T* rho_recip, T* rho_real, bool add = false, Real factor = 1.0) const;
104
105 mutable int cnt = 0;
106
107 mutable bool potential_got = false;
108
109 // pws
110// mutable std::vector<std::unique_ptr<T[]>> pws;
111
112 // k vectors
113 K_Vectors *kv = nullptr;
114
115 // psi
118
119 // real space memory
120 T *psi_nk_real = nullptr;
121 T *psi_mq_real = nullptr;
122 T *density_real = nullptr;
123 T *h_psi_real = nullptr;
124 // density recip space memory
125 T *density_recip = nullptr;
126 // h_psi recip space memory
127 T *h_psi_recip = nullptr;
128 Real *pot = nullptr;
129
130 // Lin Lin's ACE memory, 10.1021/acs.jctc.6b00092
131 mutable T* h_psi_ace = nullptr; // H \Psi, W in the paper
132 mutable T* psi_h_psi_ace = nullptr; // \Psi^{\dagger} H \Psi, M in the paper
133 mutable T* L_ace = nullptr; // cholesky(-M).L, L in the paper
134 mutable std::vector<T*> Xi_ace_k; // L^{-1} (H \Psi)^{\dagger}, \Xi in the paper
135// mutable T* Xi_ace = nullptr; // L^{-1} (H \Psi)^{\dagger}, \Xi in the paper
136
137 mutable std::map<int, std::vector<int>> q_points;
138
139 // occupational number
141
142// mutable bool update_psi = false;
143
144 Device *ctx = {};
145 base_device::DEVICE_CPU* cpu_ctx = {};
147
167
169
170};
171
172template <typename Real, typename Device>
173void get_exx_potential(const K_Vectors* kv,
174 const ModulePW::PW_Basis_K* wfcpw,
175 ModulePW::PW_Basis* rhopw_dev,
176 Real* pot,
177 double tpiba,
178 bool gamma_extrapolation,
179 double ucell_omega,
180 int ik,
181 int iq,
182 bool is_stress = false);
183
184template <typename Real, typename Device>
186 const ModulePW::PW_Basis_K* wfcpw,
187 ModulePW::PW_Basis* rhopw_dev,
188 Real* pot,
189 double tpiba,
190 bool gamma_extrapolation,
191 double ucell_omega,
192 int ik,
193 int iq);
194
196 double erfc_omega,
197 const K_Vectors* kv,
198 const ModulePW::PW_Basis_K* wfcpw,
199 ModulePW::PW_Basis* rhopw_dev,
200 double tpiba,
201 bool gamma_extrapolation,
202 double ucell_omega);
203
204} // namespace hamilt
205
206#endif // OPEXXPW_H
Definition klist.h:13
Definition matrix.h:19
Special pw_basis class. It includes different k-points.
Definition pw_basis_k.h:57
A class which can convert a function of "r" to the corresponding linear superposition of plane waves ...
Definition pw_basis.h:56
Definition unitcell.h:17
Definition op_exx_pw.h:24
psi::Psi< T, Device > psi
Definition op_exx_pw.h:116
bool first_iter
Definition op_exx_pw.h:56
T * h_psi_real
Definition op_exx_pw.h:123
void multiply_potential(T *density_recip, int ik, int iq) const
Definition op_exx_pw.cpp:439
const int * isk
Definition op_exx_pw.h:61
void set_wg(const ModuleBase::matrix *wg_in)
Definition op_exx_pw.h:52
T * density_recip
Definition op_exx_pw.h:125
T * density_real
Definition op_exx_pw.h:122
ModulePW::PW_Basis * rhopw_dev
Definition op_exx_pw.h:64
Real tpiba
Definition op_exx_pw.h:66
int cnt
Definition op_exx_pw.h:105
void cal_density_recip(const T *psi_nk_real, const T *psi_mq_real, double omega) const
double cal_exx_energy_op(psi::Psi< T, Device > *psi_) const
Definition op_exx_pw.cpp:498
std::map< int, std::vector< int > > q_points
Definition op_exx_pw.h:137
base_device::AbacusDevice_t device
Definition op_exx_pw.h:146
T * psi_nk_real
Definition op_exx_pw.h:120
const ModuleBase::matrix * wg
Definition op_exx_pw.h:117
virtual ~OperatorEXXPW()
Definition op_exx_pw.cpp:126
void rho_recip2real(const T *rho_recip, T *rho_real, bool add=false, Real factor=1.0) const
const ModuleBase::matrix * p_wg
Definition op_exx_pw.h:140
Device * ctx
Definition op_exx_pw.h:144
void construct_ace() const
Definition exx_pw_ace.cpp:71
void act_op(const int nbands, const int nbasis, const int npol, const T *tmpsi_in, T *tmhpsi, const int ngk_ik=0, const bool is_first_node=false) const
Definition op_exx_pw.cpp:194
const T * get_pw(const int m, const int iq) const
Definition op_exx_pw.cpp:453
double cal_exx_energy_ace(psi::Psi< T, Device > *psi_) const
Definition exx_pw_ace.cpp:282
typename ct::PsiToContainer< Device >::type ct_Device
Definition op_exx_pw.h:148
static std::vector< Real > erfc_div
Definition op_exx_pw.h:58
const ModulePW::PW_Basis_K * wfcpw
Definition op_exx_pw.h:62
T * h_psi_recip
Definition op_exx_pw.h:127
static std::vector< Real > fock_div
Definition op_exx_pw.h:58
std::vector< T * > Xi_ace_k
Definition op_exx_pw.h:134
const ModulePW::PW_Basis * rhopw
Definition op_exx_pw.h:63
void set_psi(psi::Psi< T, Device > &psi_in) const
Definition op_exx_pw.h:50
void act_op_ace(const int nbands, const int nbasis, const int npol, const T *tmpsi_in, T *tmhpsi, const int ngk_ik=0, const bool is_first_node=false) const
Definition exx_pw_ace.cpp:8
T * h_psi_ace
Definition op_exx_pw.h:131
bool gamma_extrapolation
Definition op_exx_pw.h:168
double cal_exx_energy(psi::Psi< T, Device > *psi_) const
Definition op_exx_pw.cpp:485
Real * pot
Definition op_exx_pw.h:128
base_device::DEVICE_CPU * cpu_ctx
Definition op_exx_pw.h:145
std::vector< int > get_q_points(const int ik) const
Definition op_exx_pw.cpp:393
K_Vectors * kv
Definition op_exx_pw.h:113
T * psi_mq_real
Definition op_exx_pw.h:121
T * psi_h_psi_ace
Definition op_exx_pw.h:132
typename GetTypeReal< T >::type Real
Definition op_exx_pw.h:26
T * L_ace
Definition op_exx_pw.h:133
bool potential_got
Definition op_exx_pw.h:107
const UnitCell * ucell
Definition op_exx_pw.h:65
void act_op_kpar(const int nbands, const int nbasis, const int npol, const T *tmpsi_in, T *tmhpsi, const int ngk_ik=0, const bool is_first_node=false) const
Definition op_exx_pw.cpp:290
virtual void act(const int nbands, const int nbasis, const int npol, const T *tmpsi_in, T *tmhpsi, const int ngk_ik=0, const bool is_first_node=false) const override
Definition op_exx_pw.cpp:168
Definition operator_pw.h:8
int ik
Definition operator.h:101
virtual void add(Operator *next)
bool is_first_node
Definition operator.h:109
Definition psi.h:37
#define T
Definition exp.cpp:237
Coulomb_Type
Definition conv_coulomb_pot_k.h:10
AbacusDevice_t
Definition types.h:12
Definition hamilt.h:12
void get_exx_stress_potential(const K_Vectors *kv, const ModulePW::PW_Basis_K *wfcpw, ModulePW::PW_Basis *rhopw_dev, Real *pot, double tpiba, bool gamma_extrapolation, double ucell_omega, int ik, int iq)
Definition exx_pw_pot.cpp:209
void get_exx_potential(const K_Vectors *kv, const ModulePW::PW_Basis_K *wfcpw, ModulePW::PW_Basis *rhopw_dev, Real *pot, double tpiba, bool gamma_extrapolation, double ucell_omega, int ik, int iq, bool is_stress)
Definition exx_pw_pot.cpp:8
double exx_divergence(Conv_Coulomb_Pot_K::Coulomb_Type coulomb_type, double erfc_omega, const K_Vectors *kv, const ModulePW::PW_Basis_K *wfcpw, ModulePW::PW_Basis *rhopw_dev, double tpiba, bool gamma_extrapolation, double ucell_omega)
Definition exx_pw_pot.cpp:385
Definition exx_lip.h:23
T type
Definition macros.h:8
Definition math_kernel_op.h:132
Definition math_kernel_op.h:168
Definition math_kernel_op.h:217
Definition math_kernel_op.h:151
Definition memory_op.h:115
Definition memory_op.h:17
Definition memory_op.h:31
Definition tensor_types.h:113
Definition lapack.h:36
Definition lapack.h:25