16#include <RI/global/Tensor.h>
21template <
typename Tdata>
42 static constexpr std::size_t
Ndim = 3;
43 using TC = std::array<Tcell, Ndim>;
44 using TAC = std::pair<TA, TC>;
46 using TK = std::array<int, 1>;
47 using TAK = std::pair<TA, TK>;
52 const MPI_Comm& mpi_comm_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,
57 std::shared_ptr<ORB_gaunt_table> MGT_in,
58 const double &ccp_rmesh_times_in,
59 const double &kmesh_times_in);
61 void init_ions(
const UnitCell& ucell,
const std::array<Tcell, Ndim>& period_Vs_NAO);
63 double get_singular_chi(
const UnitCell& ucell,
const std::vector<std::map<std::string,std::string>>& param_list,
const double& qdiv);
65 inline std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>>
cal_Vq(
68 std::map<
TA, std::map<
TAC, RI::Tensor<Tdata>>>& Vs_in);
69 inline std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>,
Ndim>>>
cal_dVq(
72 std::map<
TA, std::map<
TAC, std::array<RI::Tensor<Tdata>,
Ndim>>>& dVs_in);
74 inline std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>
cal_Vs(
const UnitCell& ucell,
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(
80 std::map<
TA, std::map<
TAC, std::array<RI::Tensor<Tdata>,
Ndim>>>& dVs_in);
87 std::vector<ModuleBase::Vector3<double>>
kvec_c;
91 std::array<Tcell, Ndim>
nmp;
94 std::vector<std::vector<std::vector<double>>>
multipole;
101 std::map<Conv_Coulomb_Pot_K::Coulomb_Type, std::vector<std::map<std::string,std::string>>>
coulomb_param;
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;
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(
141 const std::vector<TA>&
list_A0,
142 const std::vector<TAC>&
list_A1);
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);
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>
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);
161 template <
typename Tresult>
163 = std::function<Tresult(
const int& lp_max,
167 inline std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>>
cal_Vq_gauss(
172 const int& shift_for_mpi);
173 inline std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>,
Ndim>>>
cal_dVq_gauss(
178 const int& shift_for_mpi);
179 template <
typename Tresult>
183 const int& shift_for_mpi,
186 inline std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>>
cal_Vq_minus_gauss(
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);
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);
196 template <
typename Tout,
typename Tin>
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);
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>
207 template <
typename Tout,
typename Tin>
212 std::map<
TA, std::map<TAC, Tin>>& Vs_dVs_minus_gauss_in,
216 template <
typename Tout,
typename Tin>
220 std::map<
TA, std::map<TAK, Tin>>& Vq);
222 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>
init_gauss(
223 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& orb_in);
225 inline double cal_V_Rcut(
const int it0,
const int it1);
226 inline double get_Rcut_max(
const int it0,
const int it1);
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 > > ¶m_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
3 elements vector
Definition vector3.h:24
double float array
Definition realarray.h:21
const Input_para & inp
Definition parameter.h:26
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