ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
ewald_Vq.h
Go to the documentation of this file.
1//=======================
2// AUTHOR : jiyy
3// DATE : 2024-03-08
4//=======================
5
6#ifndef EWALD_VQ_H
7#define EWALD_VQ_H
8
9#include "LRI_CV.h"
10#include "gaussian_abfs.h"
12#include "source_cell/klist.h"
15
16#include <RI/global/Tensor.h>
17#include <array>
18#include <map>
19#include <mpi.h>
20
21template <typename Tdata>
23{
24 public:
25 Ewald_Vq();
26 ~Ewald_Vq();
39 private:
40 using TA = int;
41 using Tcell = int;
42 static constexpr std::size_t Ndim = 3;
43 using TC = std::array<Tcell, Ndim>;
44 using TAC = std::pair<TA, TC>;
45
46 using TK = std::array<int, 1>;
47 using TAK = std::pair<TA, TK>;
48
49 public:
50 void init(const UnitCell& ucell,
51 const LCAO_Orbitals& orb,
52 const MPI_Comm& mpi_comm_in,
53 const K_Vectors* kv_in,
54 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& lcaos_in,
55 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& abfs_in,
56 const std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> &coulomb_param_in,
57 std::shared_ptr<ORB_gaunt_table> MGT_in,
58 const double &ccp_rmesh_times_in,
59 const double &kmesh_times_in);
60
61 void init_ions(const UnitCell& ucell, const std::array<Tcell, Ndim>& period_Vs_NAO);
62
63 double get_singular_chi(const UnitCell& ucell, const std::vector<std::map<std::string,std::string>>& param_list, const double& qdiv);
64
65 inline std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>> cal_Vq(
66 const UnitCell& ucell,
67 const double& chi,
68 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>& Vs_in); // return Vq [0, Nk)
69 inline std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>> cal_dVq(
70 const UnitCell& ucell,
71 const double& chi,
72 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_in); // return Vq [0, Nk)
73
74 inline std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> cal_Vs(const UnitCell& ucell,
75 const double& chi,
76 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>& Vs_in);
77 inline std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> cal_dVs(
78 const UnitCell& ucell,
79 const double& chi,
80 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_in);
81
82 private:
86 const K_Vectors* p_kv = nullptr;
87 std::vector<ModuleBase::Vector3<double>> kvec_c;
88 // std::vector<double> wk;
89 MPI_Comm mpi_comm;
91 std::array<Tcell, Ndim> nmp;
92 const double ewald_lambda = 1.0;
93
94 std::vector<std::vector<std::vector<double>>> multipole;
96
97 std::vector<double> lcaos_rcut;
98 std::vector<double> g_lcaos_rcut;
99 std::vector<double> g_abfs_ccp_rcut;
100
101 std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>> coulomb_param;
102 const int nspin0 = std::map<int, int>{{1, 1}, {2, 2}, {4, 1}}.at(PARAM.inp.nspin);
103 int nks0;
104 std::vector<TA> atoms_vec;
105
106 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> g_lcaos;
107 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> g_abfs;
108 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> g_abfs_ccp;
109
110 /*
111 MPI distribute
112 distribute_atoms_periods:
113 - list_A0 / list_A1 : {ia0, {ia1, R}} ; range -> [-Rmax, Rmax)
114 - list_A0_k / list_A1_k : {ia0, {ia1, ik}} ; range -> [-Nk/2, Nk/2)
115
116 distribute_atoms:
117 - list_A0_pair_R / list_A1_pair_R : {ia0, ia1} for R ; range -> [-Rmax,
118 Rmax)
119 - list_A0_pair_k / list_A1_pair_k : {ia0, ia1} for k ; range -> [-Nk/2,
120 Nk/2)
121 - list_A0_pair_R_period / list_A1_pair_R_period : {ia0, ia1} for R ; range
122 -> match with kmesh
123 */
124 std::vector<TA> list_A0;
125 std::vector<TAC> list_A1;
126 std::vector<TA> list_A0_k;
127 std::vector<TAK> list_A1_k;
128 std::vector<TA> list_A0_pair_R;
129 std::vector<TAC> list_A1_pair_R;
130 std::vector<TA> list_A0_pair_R_period;
131 std::vector<TAC> list_A1_pair_R_period;
132 std::vector<TA> list_A0_pair_k;
133 std::vector<TAK> list_A1_pair_k;
134
135 private:
136 inline std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> cal_Vs_gauss(const UnitCell& ucell,
137 const std::vector<TA>& list_A0,
138 const std::vector<TAC>& list_A1);
139 inline std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> cal_dVs_gauss(
140 const UnitCell& ucell,
141 const std::vector<TA>& list_A0,
142 const std::vector<TAC>& list_A1);
143
144 inline std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> cal_Vs_minus_gauss(
145 const UnitCell& ucell,
146 const std::vector<TA>& list_A0,
147 const std::vector<TAC>& list_A1,
148 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>& Vs_in);
149 inline std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> cal_dVs_minus_gauss(
150 const UnitCell& ucell,
151 const std::vector<TA>& list_A0,
152 const std::vector<TAC>& list_A1,
153 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_in);
154 template <typename Tresult>
155 std::map<TA, std::map<TAC, Tresult>> set_Vs_dVs_minus_gauss(const UnitCell& ucell,
156 const std::vector<TA>& list_A0,
157 const std::vector<TAC>& list_A1,
158 std::map<TA, std::map<TAC, Tresult>>& Vs_dVs_in,
159 std::map<TA, std::map<TAC, Tresult>>& Vs_dVs_gauss_in);
160
161 template <typename Tresult>
163 = std::function<Tresult(const int& lp_max,
164 const int& lq_max, // Maximum L for which to calculate interaction.
165 const size_t& ik,
166 const ModuleBase::Vector3<double>& tau)>;
167 inline std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>> cal_Vq_gauss(
168 const UnitCell& ucell,
169 const std::vector<TA>& list_A0_k,
170 const std::vector<TAK>& list_A1_k,
171 const double& chi,
172 const int& shift_for_mpi); // return Vq [-Nk/2, Nk/2)
173 inline std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>> cal_dVq_gauss(
174 const UnitCell& ucell,
175 const std::vector<TA>& list_A0_k,
176 const std::vector<TAK>& list_A1_k,
177 const double& chi,
178 const int& shift_for_mpi); // return dVq [-Nk/2, Nk/2)
179 template <typename Tresult>
180 std::map<TA, std::map<TAK, Tresult>> set_Vq_dVq_gauss(const UnitCell& ucell,
181 const std::vector<TA>& list_A0_k,
182 const std::vector<TAK>& list_A1_k,
183 const int& shift_for_mpi,
184 const T_func_DPget_Vq_dVq<Tresult>& func_DPget_Vq_dVq);
185
186 inline std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>> cal_Vq_minus_gauss(
187 const UnitCell& ucell,
188 const std::vector<TA>& list_A0,
189 const std::vector<TAC>& list_A1,
190 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>& Vs_minus_gauss); // return Vq [0, Nk)
191 inline std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>> cal_dVq_minus_gauss(
192 const UnitCell& ucell,
193 const std::vector<TA>& list_A0,
194 const std::vector<TAC>& list_A1,
195 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_minus_gauss); // return Vq [0, Nk)
196 template <typename Tout, typename Tin>
197 std::map<TA, std::map<TAK, Tout>> set_Vq_dVq_minus_gauss(const UnitCell& ucell,
198 const std::vector<TA>& list_A0,
199 const std::vector<TAC>& list_A1,
200 std::map<TA, std::map<TAC, Tin>>& Vs_dVs_minus_gauss);
201
202 template <typename Tout, typename Tin>
204 = std::function<std::map<TA, std::map<TAK, Tout>>(std::map<TA, std::map<TAC, Tin>>& Vs_dVs_minus_gauss)>;
205 template <typename Tout>
206 using T_func_DPcal_Vq_dVq_gauss = std::function<std::map<TA, std::map<TAK, Tout>>(const int& shift_for_mpi)>;
207 template <typename Tout, typename Tin>
208 std::map<TA, std::map<TAK, Tout>> set_Vq_dVq(
209 const UnitCell& ucell,
210 const std::vector<TA>& list_A0_pair_k,
211 const std::vector<TAK>& list_A1_pair_k,
212 std::map<TA, std::map<TAC, Tin>>& Vs_dVs_minus_gauss_in,
213 const T_func_DPcal_Vq_dVq_minus_gauss<Tout, Tin>& func_cal_Vq_dVq_minus_gauss,
214 const T_func_DPcal_Vq_dVq_gauss<Tout>& func_cal_Vq_dVq_gauss); // return Vq [0, Nk)
215
216 template <typename Tout, typename Tin>
217 std::map<TA, std::map<TAC, Tout>> set_Vs_dVs(const UnitCell& ucell,
218 const std::vector<TA>& list_A0_pair_R,
219 const std::vector<TAC>& list_A1_pair_R,
220 std::map<TA, std::map<TAK, Tin>>& Vq);
221
222 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> init_gauss(
223 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& orb_in);
224
225 inline double cal_V_Rcut(const int it0, const int it1);
226 inline double get_Rcut_max(const int it0, const int it1);
227};
228#include "ewald_Vq.hpp"
229
230#endif
Definition ewald_Vq.h:23
std::vector< double > g_lcaos_rcut
Definition ewald_Vq.h:98
double cal_V_Rcut(const int it0, const int it1)
Definition ewald_Vq.hpp:228
std::array< int, 1 > TK
Definition ewald_Vq.h:46
std::array< Tcell, Ndim > nmp
Definition ewald_Vq.h:91
Gaussian_Abfs gaussian_abfs
Definition ewald_Vq.h:85
double ccp_rmesh_times
Definition ewald_Vq.h:83
ModuleBase::realArray gaunt
Definition ewald_Vq.h:90
std::map< TA, std::map< TAK, RI::Tensor< std::complex< double > > > > cal_Vq(const UnitCell &ucell, const double &chi, std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > &Vs_in)
Definition ewald_Vq.hpp:583
std::vector< TA > list_A0_pair_R_period
Definition ewald_Vq.h:130
std::vector< TAC > list_A1_pair_R
Definition ewald_Vq.h:129
std::map< TA, std::map< TAC, Tout > > set_Vs_dVs(const UnitCell &ucell, const std::vector< TA > &list_A0_pair_R, const std::vector< TAC > &list_A1_pair_R, std::map< TA, std::map< TAK, Tin > > &Vq)
std::map< TA, std::map< TAK, Tout > > set_Vq_dVq_minus_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1, std::map< TA, std::map< TAC, Tin > > &Vs_dVs_minus_gauss)
std::vector< double > lcaos_rcut
Definition ewald_Vq.h:97
std::vector< ModuleBase::Vector3< double > > kvec_c
Definition ewald_Vq.h:87
void init(const UnitCell &ucell, const LCAO_Orbitals &orb, const MPI_Comm &mpi_comm_in, const K_Vectors *kv_in, std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > &lcaos_in, std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > &abfs_in, const std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > &coulomb_param_in, std::shared_ptr< ORB_gaunt_table > MGT_in, const double &ccp_rmesh_times_in, const double &kmesh_times_in)
Definition ewald_Vq.hpp:34
const int nspin0
Definition ewald_Vq.h:102
double get_singular_chi(const UnitCell &ucell, const std::vector< std::map< std::string, std::string > > &param_list, const double &qdiv)
Definition ewald_Vq.hpp:132
std::vector< double > g_abfs_ccp_rcut
Definition ewald_Vq.h:99
std::map< TA, std::map< TAC, Tresult > > set_Vs_dVs_minus_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1, std::map< TA, std::map< TAC, Tresult > > &Vs_dVs_in, std::map< TA, std::map< TAC, Tresult > > &Vs_dVs_gauss_in)
std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > g_abfs
Definition ewald_Vq.h:107
double get_Rcut_max(const int it0, const int it1)
Definition ewald_Vq.hpp:234
std::map< TA, std::map< TAK, std::array< RI::Tensor< std::complex< double > >, Ndim > > > cal_dVq(const UnitCell &ucell, const double &chi, std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > &dVs_in)
Definition ewald_Vq.hpp:623
void init_ions(const UnitCell &ucell, const std::array< Tcell, Ndim > &period_Vs_NAO)
Definition ewald_Vq.hpp:83
int Tcell
Definition ewald_Vq.h:41
LRI_CV< Tdata > cv
Definition ewald_Vq.h:84
std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > cal_dVs_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1)
Definition ewald_Vq.hpp:175
std::map< TA, std::map< TAK, Tout > > set_Vq_dVq(const UnitCell &ucell, const std::vector< TA > &list_A0_pair_k, const std::vector< TAK > &list_A1_pair_k, std::map< TA, std::map< TAC, Tin > > &Vs_dVs_minus_gauss_in, const T_func_DPcal_Vq_dVq_minus_gauss< Tout, Tin > &func_cal_Vq_dVq_minus_gauss, const T_func_DPcal_Vq_dVq_gauss< Tout > &func_cal_Vq_dVq_gauss)
std::pair< TA, TC > TAC
Definition ewald_Vq.h:44
std::function< Tresult(const int &lp_max, const int &lq_max, const size_t &ik, const ModuleBase::Vector3< double > &tau)> T_func_DPget_Vq_dVq
Definition ewald_Vq.h:166
std::function< std::map< TA, std::map< TAK, Tout > >(std::map< TA, std::map< TAC, Tin > > &Vs_dVs_minus_gauss)> T_func_DPcal_Vq_dVq_minus_gauss
Definition ewald_Vq.h:204
ModuleBase::Element_Basis_Index::IndexLNM index_abfs
Definition ewald_Vq.h:95
std::vector< TA > list_A0_pair_k
Definition ewald_Vq.h:132
std::vector< std::vector< std::vector< double > > > multipole
Definition ewald_Vq.h:94
const double ewald_lambda
Definition ewald_Vq.h:92
std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > cal_Vs_minus_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1, std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > &Vs_in)
Definition ewald_Vq.hpp:192
std::vector< TAC > list_A1_pair_R_period
Definition ewald_Vq.h:131
std::function< std::map< TA, std::map< TAK, Tout > >(const int &shift_for_mpi)> T_func_DPcal_Vq_dVq_gauss
Definition ewald_Vq.h:206
std::array< Tcell, Ndim > TC
Definition ewald_Vq.h:43
std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > cal_dVs(const UnitCell &ucell, const double &chi, std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > &dVs_in)
Definition ewald_Vq.hpp:807
std::map< TA, std::map< TAK, std::array< RI::Tensor< std::complex< double > >, Ndim > > > cal_dVq_minus_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1, std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > &dVs_minus_gauss)
Definition ewald_Vq.hpp:469
const K_Vectors * p_kv
Definition ewald_Vq.h:86
std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > cal_Vs(const UnitCell &ucell, const double &chi, std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > &Vs_in)
Definition ewald_Vq.hpp:788
std::vector< TA > atoms_vec
Definition ewald_Vq.h:104
std::map< TA, std::map< TAK, Tresult > > set_Vq_dVq_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0_k, const std::vector< TAK > &list_A1_k, const int &shift_for_mpi, const T_func_DPget_Vq_dVq< Tresult > &func_DPget_Vq_dVq)
std::vector< TAC > list_A1
Definition ewald_Vq.h:125
std::vector< TA > list_A0_k
Definition ewald_Vq.h:126
std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > coulomb_param
Definition ewald_Vq.h:101
std::map< TA, std::map< TAK, RI::Tensor< std::complex< double > > > > cal_Vq_minus_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1, std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > &Vs_minus_gauss)
Definition ewald_Vq.hpp:452
static constexpr std::size_t Ndim
Definition ewald_Vq.h:42
int nks0
Definition ewald_Vq.h:103
int TA
The Ewald summation decomposes the bare Coulomb interaction into two components: the short-range cont...
Definition ewald_Vq.h:40
Ewald_Vq()
Definition ewald_Vq.hpp:28
std::pair< TA, TK > TAK
Definition ewald_Vq.h:47
~Ewald_Vq()
Definition ewald_Vq.hpp:31
std::map< TA, std::map< TAK, RI::Tensor< std::complex< double > > > > cal_Vq_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0_k, const std::vector< TAK > &list_A1_k, const double &chi, const int &shift_for_mpi)
Definition ewald_Vq.hpp:326
std::vector< TA > list_A0
Definition ewald_Vq.h:124
std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > init_gauss(std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > &orb_in)
Definition ewald_Vq.hpp:920
std::vector< TAK > list_A1_pair_k
Definition ewald_Vq.h:133
MPI_Comm mpi_comm
Definition ewald_Vq.h:89
std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > cal_dVs_minus_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1, std::map< TA, std::map< TAC, std::array< RI::Tensor< Tdata >, Ndim > > > &dVs_in)
Definition ewald_Vq.hpp:210
std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > g_abfs_ccp
Definition ewald_Vq.h:108
std::map< TA, std::map< TAK, std::array< RI::Tensor< std::complex< double > >, Ndim > > > cal_dVq_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0_k, const std::vector< TAK > &list_A1_k, const double &chi, const int &shift_for_mpi)
Definition ewald_Vq.hpp:351
std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > cal_Vs_gauss(const UnitCell &ucell, const std::vector< TA > &list_A0, const std::vector< TAC > &list_A1)
Definition ewald_Vq.hpp:160
std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > g_lcaos
Definition ewald_Vq.h:106
std::vector< TA > list_A0_pair_R
Definition ewald_Vq.h:128
std::vector< TAK > list_A1_k
Definition ewald_Vq.h:127
Definition gaussian_abfs.h:19
Definition klist.h:12
Definition ORB_read.h:18
Definition LRI_CV.h:25
3 elements vector
Definition vector3.h:24
double float array
Definition realarray.h:21
const Input_para & inp
Definition parameter.h:26
Definition unitcell.h:15
Coulomb_Type
Definition conv_coulomb_pot_k.h:10
std::vector< Index_T > IndexLNM
Definition element_basis_index.h:42
Parameter PARAM
Definition parameter.cpp:3
int nspin
LDA ; LSDA ; non-linear spin.
Definition input_parameter.h:88