9#include <RI/comm/mix/Communicate_Tensors_Map_Judge.h>
10#include <RI/distribute/Distribute_Equally.h>
11#include <RI/global/Global_Func-1.h>
27template<
typename Tdata>
30template<
typename Tdata>
33template <
typename Tdata>
36 const MPI_Comm& mpi_comm_in,
38 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& lcaos_in,
39 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& abfs_in,
41 std::shared_ptr<ORB_gaunt_table> MGT_in,
42 const double &ccp_rmesh_times_in,
43 const double &kmesh_times_in)
48 this->mpi_comm = mpi_comm_in;
51 this->kvec_c.resize(this->nks0);
52 this->ccp_rmesh_times = ccp_rmesh_times_in;
53 this->coulomb_param = coulomb_param_in;
55 this->g_lcaos = this->init_gauss(lcaos_in);
56 this->g_abfs = this->init_gauss(abfs_in);
59 this->ccp_rmesh_times);
69 .set_orbitals(ucell, orb, this->g_lcaos, this->g_abfs, this->g_abfs_ccp, kmesh_times_in, MGT_in,
false);
70 this->gaunt.create(MGT_in->Gaunt_Coefficients.getBound1(),
71 MGT_in->Gaunt_Coefficients.getBound2(),
72 MGT_in->Gaunt_Coefficients.getBound3());
73 this->gaunt = MGT_in->Gaunt_Coefficients;
75 this->atoms_vec.resize(ucell.
nat);
76 std::iota(this->atoms_vec.begin(), this->atoms_vec.end(), 0);
77 this->nmp = {this->p_kv->nmp[0], this->p_kv->nmp[1], this->p_kv->nmp[2]};
82template <
typename Tdata>
88 const std::array<Tcell, Ndim> period_Vs
89 = LRI_CV_Tools::cal_latvec_range<Tcell>(1 + this->ccp_rmesh_times, ucell, this->g_lcaos_rcut);
91 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA, std::array<Tcell, Ndim>>>>> list_As_Vs
92 = RI::Distribute_Equally::distribute_atoms_periods(this->mpi_comm, this->atoms_vec, period_Vs, 2,
false);
94 this->list_A0 = list_As_Vs.first;
95 this->list_A1 = list_As_Vs.second[0];
97 const std::array<int, 1> Nks = {this->nks0};
98 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA, TK>>>> list_As_Vq
99 = RI::Distribute_Equally::distribute_atoms_periods(this->mpi_comm, this->atoms_vec, Nks, 2,
false);
100 this->list_A0_k = list_As_Vq.first;
101 this->list_A1_k = list_As_Vq.second[0];
103 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA, TC>>>> list_As_Vs_atoms
104 = RI::Distribute_Equally::distribute_atoms(this->mpi_comm, this->atoms_vec, period_Vs_NAO, 2,
false);
105 this->list_A0_pair_R = list_As_Vs_atoms.first;
106 this->list_A1_pair_R = list_As_Vs_atoms.second[0];
108 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA, TC>>>> list_As_Vs_atoms_period
109 = RI::Distribute_Equally::distribute_atoms(this->mpi_comm, this->atoms_vec, this->nmp, 2,
false);
110 this->list_A0_pair_R_period = list_As_Vs_atoms_period.first;
111 this->list_A1_pair_R_period = list_As_Vs_atoms_period.second[0];
113 const std::pair<std::vector<TA>, std::vector<std::vector<std::pair<TA, TK>>>> list_As_Vq_atoms
114 = RI::Distribute_Equally::distribute_atoms(this->mpi_comm, this->atoms_vec, Nks, 2,
false);
115 this->list_A0_pair_k = list_As_Vq_atoms.first;
116 this->list_A1_pair_k = list_As_Vq_atoms.second[0];
118 for (
size_t ik = 0; ik != this->nks0; ++ik)
119 this->kvec_c[ik] = this->p_kv->kvec_c_full[ik];
121 std::vector<ModuleBase::Vector3<double>> neg_kvec(this->nks0);
122 std::transform(this->kvec_c.begin(),
126 this->gaussian_abfs.init(ucell, 2 *
GlobalC::exx_info.info_ri.abfs_Lmax + 1, neg_kvec, ucell.
G, this->ewald_lambda);
131template <
typename Tdata>
138 for(
const auto &
param : param_list)
140 if(
param.at(
"singularity_correction") ==
"carrier")
144 else if(
param.at(
"singularity_correction") ==
"massidda")
150 throw std::domain_error(std::string(__FILE__) +
" line " + std::to_string(__LINE__)
151 +
": singularity_correction must be carrier or massidda");
159template <
typename Tdata>
161 -> std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>
166 std::map<std::string, bool> flags = {{
"writable_Vws",
true}};
167 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> Vs_gauss = this->cv.cal_Vs(ucell, list_A0, list_A1, flags);
174template <
typename Tdata>
176 -> std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>
181 std::map<std::string, bool> flags = {{
"writable_dVws",
true}};
183 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> dVs_gauss
184 = this->cv.cal_dVs(ucell, list_A0, list_A1, flags);
191template <
typename Tdata>
193 const std::vector<TA>& list_A0,
194 const std::vector<TAC>& list_A1,
195 std::map<
TA, std::map<
TAC, RI::Tensor<Tdata>>>& Vs_in)
196 -> std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>
201 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> Vs_gauss = this->cal_Vs_gauss(ucell, list_A0, list_A1);
202 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> Vs_minus_gauss
203 = this->set_Vs_dVs_minus_gauss(ucell, list_A0, list_A1, Vs_in, Vs_gauss);
206 return Vs_minus_gauss;
209template <
typename Tdata>
211 const std::vector<TA>& list_A0,
212 const std::vector<TAC>& list_A1,
213 std::map<
TA, std::map<
TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_in)
214 -> std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>
219 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> dVs_gauss = this->cal_dVs_gauss(list_A0, list_A1);
220 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> dVs_minus_gauss
221 = this->set_Vs_dVs_minus_gauss(ucell, list_A0, list_A1, dVs_in, dVs_gauss);
224 return dVs_minus_gauss;
227template <
typename Tdata>
230 return this->g_abfs_ccp_rcut.at(it0) + this->g_lcaos_rcut.at(it1);
233template <
typename Tdata>
236 double lcaos_rmax = this->lcaos_rcut.at(it0) * this->ccp_rmesh_times + this->lcaos_rcut.at(it1);
237 double g_lcaos_rmax = this->g_lcaos_rcut.at(it0) * this->ccp_rmesh_times + this->g_lcaos_rcut.at(it1);
238 return std::min(lcaos_rmax, g_lcaos_rmax);
241template <
typename Tdata>
242template <
typename Tresult>
244 const std::vector<TA>& list_A0,
245 const std::vector<TAC>& list_A1,
246 std::map<
TA, std::map<TAC, Tresult>>& Vs_dVs_in,
247 std::map<
TA, std::map<TAC, Tresult>>& Vs_dVs_gauss_in)
248 -> std::map<TA, std::map<TAC, Tresult>>
254 std::map<TA, std::map<TAC, Tresult>> pVs_dVs_gauss;
256 for (
size_t i0 = 0; i0 < list_A0.size(); ++i0)
258#pragma omp for schedule(dynamic) nowait
259 for (
size_t i1 = 0; i1 < list_A1.size(); ++i1)
261 const TA iat0 = list_A0[i0];
262 const int it0 = ucell.iat2it[iat0];
263 const int ia0 = ucell.iat2ia[iat0];
264 const TA iat1 = list_A1[i1].first;
265 const int it1 = ucell.iat2it[iat1];
266 const int ia1 = ucell.iat2ia[iat1];
267 const TC& cell1 = list_A1[i1].second;
272 const double Rcut = std::min(this->cal_V_Rcut(it0, it1), this->cal_V_Rcut(it1, it0));
275 if (R_delta.
norm() * ucell.lat0 < Rcut)
277 const size_t size0 = this->index_abfs[it0].count_size;
278 const size_t size1 = this->index_abfs[it1].count_size;
283 for (
int l0 = 0; l0 != this->g_abfs_ccp.at(it0).size(); ++l0)
285 for (
int l1 = 0; l1 != this->g_abfs.at(it1).size(); ++l1)
287 for (
size_t n0 = 0; n0 != this->g_abfs_ccp.at(it0).at(l0).size(); ++n0)
289 const double pA = this->multipole.at(it0).at(l0).at(n0);
290 for (
size_t n1 = 0; n1 != this->g_abfs.at(it1).at(l1).size(); ++n1)
292 const double pB = this->multipole.at(it1).at(l1).at(n1);
293 Tin_convert pp = RI::Global_Func::convert<Tin_convert>(pA * pB);
294 for (
size_t m0 = 0; m0 != 2 * l0 + 1; ++m0)
296 for (
size_t m1 = 0; m1 != 2 * l1 + 1; ++m1)
298 const size_t index0 = this->index_abfs.at(it0).at(l0).at(n0).at(m0);
299 const size_t index1 = this->index_abfs.at(it1).at(l1).at(n1).at(m1);
304 Vs_dVs_gauss_in.at(list_A0[i0]).at(list_A1[i1]),
314#pragma omp critical(Ewald_Vq_set_Vs_dVs_minus_gauss)
315 pVs_dVs_gauss[list_A0[i0]][list_A1[i1]] = data;
320 std::map<TA, std::map<TAC, Tresult>> Vs_dVs_minus_gauss =
LRI_CV_Tools::minus(Vs_dVs_in, pVs_dVs_gauss);
322 return Vs_dVs_minus_gauss;
325template <
typename Tdata>
327 const std::vector<TA>& list_A0_k,
328 const std::vector<TAK>& list_A1_k,
330 const int& shift_for_mpi)
331 -> std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>>
337 &this->gaussian_abfs,
338 std::placeholders::_1,
339 std::placeholders::_2,
340 std::placeholders::_3,
342 std::placeholders::_4,
344 auto Vq_gauss = this->set_Vq_dVq_gauss(ucell, list_A0_k, list_A1_k, shift_for_mpi, func_DPget_Vq);
350template <
typename Tdata>
352 const std::vector<TA>& list_A0_k,
353 const std::vector<TAK>& list_A1_k,
355 const int& shift_for_mpi)
356 -> std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>>
363 &this->gaussian_abfs,
364 std::placeholders::_1,
365 std::placeholders::_2,
366 std::placeholders::_3,
368 std::placeholders::_4,
371 using namespace RI::Array_Operator;
372 std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>> dVq_gauss;
373 auto res = this->set_Vq_dVq_gauss(ucell, list_A0_k, list_A1_k, shift_for_mpi, func_DPget_dVq);
375 for (
size_t i0 = 0; i0 < list_A0_k.size(); ++i0)
377 const TA iat0 = list_A0_k[i0];
378 const int it0 = ucell.iat2it[iat0];
379 for (
size_t i1 = 0; i1 < list_A1_k.size(); ++i1)
381 const TA iat1 = list_A1_k[i1].first;
382 const int it1 = ucell.iat2it[iat1];
385 const int ik = list_A1_k[i1].second[0];
386 const TAK index0 = std::make_pair(iat1,
TK{ik});
387 dVq_gauss[iat0][index0] = -res.at(list_A0_k[i0]).at(list_A1_k[i1]);
388 const TAK index1 = std::make_pair(iat0,
TK{ik});
389 dVq_gauss[iat1][index1] = res.at(list_A0_k[i0]).at(list_A1_k[i1]);
392 dVq_gauss[list_A0_k[i0]][list_A1_k[i1]] = res.at(list_A0_k[i0]).at(list_A1_k[i1]);
400template <
typename Tdata>
401template <
typename Tresult>
403 const std::vector<TA>& list_A0_k,
404 const std::vector<TAK>& list_A1_k,
405 const int& shift_for_mpi,
407 -> std::map<TA, std::map<TAK, Tresult>>
412 std::map<TA, std::map<TAK, Tresult>> Vq_dVq_gauss_out;
413 for(
const auto ¶m_list : this->coulomb_param)
415 std::complex<double> alpha;
416 for(
const auto &
param : param_list.second)
418 alpha = std::complex<double>(std::stod(
param.at(
"alpha")), 0);
421 for (
size_t i0 = 0; i0 < list_A0_k.size(); ++i0)
423#pragma omp for schedule(dynamic) nowait
424 for (
size_t i1 = 0; i1 < list_A1_k.size(); ++i1)
426 const TA iat0 = list_A0_k[i0];
427 const int it0 = ucell.iat2it[iat0];
428 const int ia0 = ucell.iat2ia[iat0];
431 const TA iat1 = list_A1_k[i1].first;
432 const int it1 = ucell.iat2it[iat1];
433 const int ia1 = ucell.iat2ia[iat1];
435 const size_t ik = list_A1_k[i1].second[0] + shift_for_mpi;
439 = func_DPget_Vq_dVq(this->g_abfs_ccp.at(it0).size() - 1, this->g_abfs.at(it1).size() - 1, ik, tau);
441#pragma omp critical(Ewald_Vq_set_Vq_dVq_gauss)
448 return Vq_dVq_gauss_out;
451template <
typename Tdata>
453 const std::vector<TA>& list_A0,
454 const std::vector<TAC>& list_A1,
455 std::map<
TA, std::map<
TAC, RI::Tensor<Tdata>>>& Vs_minus_gauss)
456 -> std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>>
462 = this->set_Vq_dVq_minus_gauss<RI::Tensor<std::complex<double>>>(ucell, list_A0, list_A1, Vs_minus_gauss);
465 return Vq_minus_gauss;
468template <
typename Tdata>
471 const std::vector<TA>& list_A0,
472 const std::vector<TAC>& list_A1,
473 std::map<
TA, std::map<
TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_minus_gauss)
474 -> std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>>
480 = this->set_Vq_dVq_minus_gauss<std::array<RI::Tensor<std::complex<double>>, Ndim>>(ucell,
486 return dVq_minus_gauss;
489template <
typename Tdata>
490template <
typename Tout,
typename Tin>
492 const std::vector<TA>& list_A0,
493 const std::vector<TAC>& list_A1,
494 std::map<
TA, std::map<TAC, Tin>>& Vs_dVs_minus_gauss)
495 -> std::map<TA, std::map<TAK, Tout>>
500 using namespace RI::Array_Operator;
502 std::map<TA, std::map<TAK, Tout>> datas;
508 std::map<TA, std::map<TAK, Tout>> local_datas;
510#pragma omp for schedule(dynamic) nowait
511 for (
size_t ik = 0; ik != this->nks0; ++ik)
513 for (
size_t i0 = 0; i0 < list_A0.size(); ++i0)
515 for (
size_t i1 = 0; i1 < list_A1.size(); ++i1)
517 const TA iat0 = list_A0[i0];
518 const int it0 = ucell.iat2it[iat0];
519 const int ia0 = ucell.iat2ia[iat0];
520 const TA iat1 = list_A1[i1].first;
521 const int it1 = ucell.iat2it[iat1];
522 const int ia1 = ucell.iat2ia[iat1];
523 const TC& cell1 = list_A1[i1].second;
527 const double Rcut = std::min(this->get_Rcut_max(it0, it1), this->get_Rcut_max(it1, it0));
531 if (R_delta.
norm() * ucell.lat0 < Rcut)
533 const std::complex<double> phase
539 LRI_CV_Tools::convert<Tin_convert>(std::move(Vs_dVs_minus_gauss.at(iat0).at(list_A1[i1]))));
541 const TAK index = std::make_pair(iat1,
TK{
static_cast<int>(ik)});
543 local_datas[iat0][index] = Vs_dVs_tmp;
545 local_datas[iat0][index] = local_datas.at(iat0).at(index) + Vs_dVs_tmp;
551#pragma omp critical(Ewald_Vq_set_Vq_dVq_minus_gauss)
553 for (
auto it0 = local_datas.begin(); it0 != local_datas.end(); ++it0)
555 const TA& key0 = it0->first;
556 std::map<TAK, Tout>& map1 = it0->second;
557 for (
auto it1 = map1.begin(); it1 != map1.end(); ++it1)
559 const TAK& key1 = it1->first;
560 Tout& value = it1->second;
563 datas[key0][key1] = value;
565 datas[key0][key1] = datas.at(key0).at(key1) + value;
582template <
typename Tdata>
585 std::map<
TA, std::map<
TAC, RI::Tensor<Tdata>>>& Vs_in)
586 -> std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>>
591 std::map<TA, std::map<TAC, RI::Tensor<Tdata>>> Vs_minus_gauss = this->cal_Vs_minus_gauss(ucell,
599 this->list_A0_pair_R,
600 this->list_A1_pair_R,
601 std::placeholders::_1);
609 std::placeholders::_1);
611 auto Vq = this->set_Vq_dVq(ucell,
612 this->list_A0_pair_k,
613 this->list_A1_pair_k,
615 func_cal_Vq_minus_gauss,
622template <
typename Tdata>
625 std::map<
TA, std::map<
TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_in)
626 -> std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>>
631 std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>> dVs_minus_gauss
632 = this->cal_dVs_minus_gauss(ucell,
637 std::array<RI::Tensor<Tdata>, Ndim>>
641 this->list_A0_pair_R,
642 this->list_A1_pair_R,
643 std::placeholders::_1);
651 std::placeholders::_1);
653 auto dVq = this->set_Vq_dVq(ucell,
654 this->list_A0_pair_k,
655 this->list_A1_pair_k,
657 func_cal_dVq_minus_gauss,
664template <
typename Tdata>
665template <
typename Tout,
typename Tin>
667 const std::vector<TA>& list_A0_pair_k,
668 const std::vector<TAK>& list_A1_pair_k,
669 std::map<
TA, std::map<TAC, Tin>>& Vs_dVs_minus_gauss_in,
672 -> std::map<TA, std::map<TAK, Tout>>
677 using namespace RI::Array_Operator;
679 std::map<TA, std::map<TAK, Tout>> Vq_dVq;
680 const int shift_for_mpi = std::floor(this->nks0 / 2.0);
683 std::set<TA> atoms00;
684 std::set<TA> atoms01;
685 for (
const auto& I: this->list_A0_pair_R)
689 for (
const auto& JR: this->list_A1_pair_R)
691 atoms01.insert(JR.first);
694 std::map<TA, std::map<TAC, Tin>> Vs_dVs_minus_gauss
696 std::map<TA, std::map<TAK, Tout>> Vq_dVq_minus_gauss = func_cal_Vq_dVq_minus_gauss(Vs_dVs_minus_gauss);
699 std::map<TA, std::map<TAK, Tout>> Vq_dVq_gauss_out = func_cal_Vq_dVq_gauss(shift_for_mpi);
701 std::set<TA> atoms10;
702 std::set<TA> atoms11;
703 for (
const auto& I: this->list_A0_pair_k)
707 for (
const auto& JR: this->list_A1_pair_k)
709 atoms11.insert(JR.first);
712 std::map<TA, std::map<TAK, Tout>> Vq_dVq_gauss
716 for (
size_t i0 = 0; i0 < list_A0_pair_k.size(); ++i0)
718#pragma omp for schedule(dynamic) nowait
719 for (
size_t i1 = 0; i1 < list_A1_pair_k.size(); ++i1)
721 const TA iat0 = list_A0_pair_k[i0];
722 const int it0 = ucell.iat2it[iat0];
723 const TA iat1 = list_A1_pair_k[i1].first;
724 const int it1 = ucell.iat2it[iat1];
725 const int ik = list_A1_pair_k[i1].second[0] + shift_for_mpi;
726 const TAK re_index = std::make_pair(iat1, std::array<int, 1>{ik});
731 auto it_outer = Vq_dVq_minus_gauss.find(list_A0_pair_k[i0]);
732 if (it_outer == Vq_dVq_minus_gauss.end())
735 auto it_inner = it_outer->second.find(re_index);
736 if (it_inner == it_outer->second.end())
739 const size_t size0 = this->index_abfs[it0].count_size;
740 const size_t size1 = this->index_abfs[it1].count_size;
743 for (
int l0 = 0; l0 != this->g_abfs_ccp.at(it0).size(); ++l0)
745 for (
int l1 = 0; l1 != this->g_abfs.at(it1).size(); ++l1)
747 for (
size_t n0 = 0; n0 != this->g_abfs_ccp.at(it0).at(l0).size(); ++n0)
749 const double pA = this->multipole.at(it0).at(l0).at(n0);
750 for (
size_t n1 = 0; n1 != this->g_abfs.at(it1).at(l1).size(); ++n1)
752 const double pB = this->multipole.at(it1).at(l1).at(n1);
753 Tin_convert frac = RI::Global_Func::convert<Tin_convert>(pA * pB);
754 for (
size_t m0 = 0; m0 != 2 * l0 + 1; ++m0)
756 const size_t index0 = this->index_abfs.at(it0).at(l0).at(n0).at(m0);
757 const size_t lm0 = l0 * l0 + m0;
758 for (
size_t m1 = 0; m1 != 2 * l1 + 1; ++m1)
760 const size_t index1 = this->index_abfs.at(it1).at(l1).at(n1).at(m1);
761 const size_t lm1 = l1 * l1 + m1;
766 Vq_dVq_gauss.at(list_A0_pair_k[i0]).at(list_A1_pair_k[i1]),
777#pragma omp critical(Ewald_Vq_set_Vq_dVq)
779 Vq_dVq[list_A0_pair_k[i0]][re_index] = Vq_dVq_minus_gauss.at(list_A0_pair_k[i0]).at(re_index) + data;
787template <
typename Tdata>
790 std::map<
TA, std::map<
TAC, RI::Tensor<Tdata>>>& Vs_in)
791 -> std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>
796 std::map<TA, std::map<TAK, RI::Tensor<std::complex<double>>>> Vq = this->cal_Vq(ucell, chi, Vs_in);
797 auto Vs = this->set_Vs_dVs<RI::Tensor<Tdata>>(ucell,
798 this->list_A0_pair_R_period,
799 this->list_A1_pair_R_period,
806template <
typename Tdata>
810 std::map<
TA, std::map<
TAC, std::array<RI::Tensor<Tdata>, Ndim>>>& dVs_in)
811 -> std::map<TA, std::map<TAC, std::array<RI::Tensor<Tdata>, Ndim>>>
816 std::map<TA, std::map<TAK, std::array<RI::Tensor<std::complex<double>>, Ndim>>> dVq
817 = this->cal_dVq(ucell, chi, dVs_in);
818 auto dVs = this->set_Vs_dVs<std::array<RI::Tensor<Tdata>, Ndim>>(ucell,
819 this->list_A0_pair_R_period,
820 this->list_A1_pair_R_period,
827template <
typename Tdata>
828template <
typename Tout,
typename Tin>
830 const std::vector<TA>& list_A0_pair_R,
831 const std::vector<TAC>& list_A1_pair_R,
832 std::map<
TA, std::map<TAK, Tin>>& Vq) -> std::map<TA, std::map<TAC, Tout>>
837 using namespace RI::Array_Operator;
840 const double cfrac = 1.0 / this->nks0;
841 std::map<TA, std::map<TAC, Tout>> datas;
846 std::map<TA, std::map<TAC, Tout>> local_datas;
848#pragma omp for schedule(dynamic) nowait
849 for (
size_t ik = 0; ik != this->nks0; ++ik)
851 for (
size_t i0 = 0; i0 < list_A0_pair_R.size(); ++i0)
853 for (
size_t i1 = 0; i1 < list_A1_pair_R.size(); ++i1)
855 const TA iat0 = list_A0_pair_R[i0];
856 const TA iat1 = list_A1_pair_R[i1].first;
857 const TC& cell1 = list_A1_pair_R[i1].second;
858 const std::complex<double> frac
863 const TAK index = std::make_pair(iat1, std::array<int, 1>{
static_cast<int>(ik)});
868 auto it_outer = Vq.find(iat0);
869 if (it_outer == Vq.end())
872 auto it_inner = it_outer->second.find(index);
873 if (it_inner == it_outer->second.end())
878 Tout Vq_tmp = LRI_CV_Tools::convert<Tin_convert>(
LRI_CV_Tools::mul2(frac, Vq.at(iat0).at(index)));
881 local_datas[iat0][list_A1_pair_R[i1]] = Vq_tmp;
883 local_datas[iat0][list_A1_pair_R[i1]]
884 = local_datas.at(iat0).at(list_A1_pair_R[i1]) + Vq_tmp;
889#pragma omp critical(Ewald_Vq_set_Vs_dVs)
891 for (
auto& outer_pair: local_datas)
893 TA key0 = outer_pair.first;
894 for (
auto& inner_pair: outer_pair.second)
896 TAC key1 = inner_pair.first;
897 Tout& value = inner_pair.second;
899 datas[key0][key1] = value;
901 datas[key0][key1] = datas.at(key0).at(key1) + value;
919template <
typename Tdata>
921 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>>& orb_in)
923 std::vector<std::vector<std::vector<Numerical_Orbital_Lm>>> gauss;
924 gauss.resize(orb_in.size());
925 for (
size_t T = 0;
T != orb_in.size(); ++
T)
927 gauss[
T].resize(orb_in[
T].size());
928 for (
size_t L = 0; L != orb_in[
T].size(); ++L)
930 gauss[
T][L].resize(orb_in[
T][L].size());
931 for (
size_t N = 0;
N != orb_in[
T][L].size(); ++
N)
933 gauss[
T][L][
N] = this->gaussian_abfs.Gauss(orb_in[
T][L][
N], this->ewald_lambda);
Definition abfs-vector3_order.h:16
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::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::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)
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
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::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)
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
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
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::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
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::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::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
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< 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::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::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
static std::vector< std::vector< std::vector< double > > > get_multipole(const std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > &orb_in)
Definition exx_abfs-construct_orbs.cpp:497
static std::vector< double > get_Rcut(const std::vector< std::vector< std::vector< Numerical_Orbital_Lm > > > &orb_in)
Definition exx_abfs-construct_orbs.cpp:524
RI::Tensor< std::complex< double > > get_Vq(const int &lp_max, const int &lq_max, const size_t &ik, const double &chi, const ModuleBase::Vector3< double > &tau, const ModuleBase::realArray &gaunt)
Definition gaussian_abfs.cpp:101
std::array< RI::Tensor< std::complex< double > >, 3 > get_dVq(const int &lp_max, const int &lq_max, const size_t &ik, const double &chi, const ModuleBase::Vector3< double > &tau, const ModuleBase::realArray &gaunt)
Definition gaussian_abfs.cpp:134
int get_nkstot_full() const
Definition klist.h:78
3 elements vector
Definition vector3.h:24
T norm(void) const
Get the norm of a Vector3.
Definition vector3.h:216
static void start(void)
Start total time calculation.
Definition timer.cpp:44
static void end(const std::string &class_name_in, const std::string &name_in)
Definition timer.cpp:109
int & nat
Definition unitcell.h:74
ModuleBase::Matrix3 & G
Definition unitcell.h:67
#define N
Definition exp.cpp:24
#define T
Definition exp.cpp:237
Parameter param
Definition io_system_variable_test.cpp:38
Coulomb_Type
Definition conv_coulomb_pot_k.h:10
T cal_orbs_ccp(const T &orbs, const std::map< Conv_Coulomb_Pot_K::Coulomb_Type, std::vector< std::map< std::string, std::string > > > &coulomb_param, const double rmesh_times)
Exx_Info exx_info
Definition exx_info.cpp:8
Range construct_range(const LCAO_Orbitals &orb)
Definition element_basis_index-ORB.cpp:10
IndexLNM construct_index(const Range &range)
Definition element_basis_index.cpp:12
std::vector< std::vector< NM > > Range
Definition element_basis_index.h:41
const double TWO_PI
Definition constants.h:21
const std::complex< double > IMAG_UNIT(0.0, 1.0)
void TITLE(const std::string &class_name, const std::string &function_name, const bool disable)
Definition tool_title.cpp:18
std::map< TA, std::map< TAC, T > > comm_map2_first(const MPI_Comm &mpi_comm, const std::map< TA, std::map< TAC, T > > &Ds_in, const std::set< TA > &s0, const std::set< TA > &s1)
Definition RI_2D_Comm.hpp:495
ModuleBase::Vector3< Tcell > array3_to_Vector3(const std::array< Tcell, 3 > &v)
Definition RI_Util.h:38
double cal_massidda(const UnitCell &ucell, const std::array< int, 3 > &nmp, const int &qdiv, const double &start_lambda, const int &niter, const double &eps)
Definition singular_value.cpp:167
double cal_carrier(const UnitCell &ucell, const std::vector< ModuleBase::Vector3< double > > &kvec_c, const int &qdiv, const double &qdense, const int &niter, const double &eps, const int &a_rate)
Definition singular_value.cpp:106