16#include <RI/global/Global_Func-2.h>
22inline RI::Tensor<double>
tensor_conj(
const RI::Tensor<double>& t) {
return t; }
23inline RI::Tensor<std::complex<double>>
tensor_conj(
const RI::Tensor<std::complex<double>>& t)
25 RI::Tensor<std::complex<double>> r(t.shape);
26 for (
int i = 0; i < t.data->size(); ++i) {
27 (*r.data)[i] = std::conj((*t.data)[i]);
31template<
typename Tdata,
typename Tmatrix>
34 const std::vector<const Tmatrix*>&mks_2D,
38-> std::vector<std::map<TA,std::map<TAC,RI::Tensor<Tdata>>>>
44 const std::map<int,int> nspin_k = {{1,1}, {2,2}, {4,1}};
45 const double SPIN_multiple = std::map<int, double>{ {1,0.5}, {2,1}, {4,1} }.at(nspin);
47 std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>> mRs_a2D(nspin);
48 for (
int is_k = 0; is_k < nspin_k.at(nspin); ++is_k)
53 RI::Tensor<Tdata> mR_2D;
55 for (
const int ik : ik_list)
57 auto set_mR_2D = [&mR_2D](
auto&& mk_frac) {
59 mR_2D = RI::Global_Func::convert<Tdata>(mk_frac);
62 = mR_2D + RI::Global_Func::convert<Tdata>(mk_frac);
65 using Tdata_m =
typename Tmatrix::value_type;
68 RI::Tensor<Tdata_m> mk_2D = RI_Util::Vector_to_Tensor<Tdata_m>(*mks_2D[ik], pv.get_col_size(), pv.get_row_size());
69 const Tdata_m frac = SPIN_multiple
70 * RI::Global_Func::convert<Tdata_m>(std::exp(
72 if (
static_cast<int>(std::round(SPIN_multiple * kv.wk[ik] * kv.get_nkstot_full())) == 2)
73 { set_mR_2D(mk_2D * (frac * 0.5) +
tensor_conj(mk_2D * (frac * 0.5))); }
74 else { set_mR_2D(mk_2D * frac); }
78 for (
auto& isym_kvd : kv.kstars[ik % ik_list.size()])
80 RI::Tensor<Tdata_m> mk_2D = RI_Util::Vector_to_Tensor<Tdata_m>(*mks_2D[ik_full + is_k * kv.get_nkstot_full()], pv.get_col_size(), pv.get_row_size());
81 const Tdata_m frac = SPIN_multiple
82 * RI::Global_Func::convert<Tdata_m>(std::exp(
84 set_mR_2D(mk_2D * frac);
89 for(
int iwt0_2D=0; iwt0_2D!=mR_2D.shape[0]; ++iwt0_2D)
91 const int iwt0 =ModuleBase::GlobalFunc::IS_COLUMN_MAJOR_KS_SOLVER(
PARAM.
inp.
ks_solver)
92 ? pv.local2global_col(iwt0_2D)
93 : pv.local2global_row(iwt0_2D);
94 int iat0, iw0_b, is0_b;
96 const int it0 = ucell.iat2it[iat0];
97 for(
int iwt1_2D=0; iwt1_2D!=mR_2D.shape[1]; ++iwt1_2D)
99 const int iwt1 =ModuleBase::GlobalFunc::IS_COLUMN_MAJOR_KS_SOLVER(
PARAM.
inp.
ks_solver)
100 ? pv.local2global_row(iwt1_2D)
101 : pv.local2global_col(iwt1_2D);
102 int iat1, iw1_b, is1_b;
104 const int it1 = ucell.iat2it[iat1];
107 RI::Tensor<Tdata> &mR_a2D = mRs_a2D[is_b][iat0][{iat1,cell}];
108 if (mR_a2D.empty()) {
109 mR_a2D = RI::Tensor<Tdata>(
110 {
static_cast<size_t>(ucell.atoms[it0].nw),
112 ucell.atoms[it1].nw)});
114 mR_a2D(iw0_b,iw1_b) = mR_2D(iwt0_2D, iwt1_2D);
124template<
typename Tdata,
typename TK>
130 const std::vector<std::map<
TA,std::map<
TAC,RI::Tensor<Tdata>>>> &Hs,
137 const std::map<int, std::vector<int>> is_list = {{1,{0}}, {2,{kv.
isk[ik]}}, {4,{0,1,2,3}}};
142 for(
const auto &Hs_tmpA : Hs[is_b])
144 const TA &iat0 = Hs_tmpA.first;
145 for(
const auto &Hs_tmpB : Hs_tmpA.second)
147 const TA &iat1 = Hs_tmpB.first.first;
148 const TC &cell1 = Hs_tmpB.first.second;
149 const std::complex<double> frac = alpha
151 const RI::Tensor<Tdata> &H = Hs_tmpB.second;
152 for(
size_t iw0_b=0; iw0_b<H.shape[0]; ++iw0_b)
158 for(
size_t iw1_b=0; iw1_b<H.shape[1]; ++iw1_b)
164 LCAO_domain::set_mat2d(iwt0, iwt1, RI::Global_Func::convert<TK>(H(iw0_b, iw1_b)) * RI::Global_Func::convert<TK>(frac), pv, hk);
173std::tuple<int,int,int>
176 const int iat = ucell.
iwt2iat[iwt];
177 const int iw = ucell.
iwt2iw[iwt];
181 return std::make_tuple(iat, iw, 0);
183 return std::make_tuple(iat, iw/2, iw%2);
185 throw std::invalid_argument(std::string(__FILE__)+
" line "+std::to_string(__LINE__));
195 case 4:
return is_row_b*2+is_col_b;
196 default:
throw std::invalid_argument(std::string(__FILE__)+
" line "+std::to_string(__LINE__));
206 return std::make_tuple(0, 0);
208 return std::make_tuple(is_b/2, is_b%2);
210 throw std::invalid_argument(std::string(__FILE__)+
" line "+std::to_string(__LINE__));
221 const int it = ucell.
iat2it[iat];
222 const int ia = ucell.
iat2ia[iat];
229 iw = iw_b*2+is_b;
break;
231 throw std::invalid_argument(std::string(__FILE__)+
" line "+std::to_string(__LINE__));
237template<
typename Tdata,
typename TR>
239 const int current_spin,
241 const std::vector<std::map<
TA, std::map<
TAC, RI::Tensor<Tdata>>>>& Hs,
245 const RI::Cell_Nearest<int, int, 3, double, 3>*
const cell_nearest)
249 const std::map<int, std::vector<int>> is_list = { {1,{0}}, {2,{current_spin}}, {4,{0,1,2,3}} };
252 int is0_b = 0, is1_b = 0;
254 for (
const auto& Hs_tmpA : Hs[is_hs])
256 const TA& iat0 = Hs_tmpA.first;
257 for (
const auto& Hs_tmpB : Hs_tmpA.second)
259 const TA& iat1 = Hs_tmpB.first.first;
260 const TC& cell = Hs_tmpB.first.second;
263 cell_nearest->get_cell_nearest_discrete(iat0, iat1, cell)
268 const RI::Tensor<Tdata>& HexxR = (Tdata)alpha * Hs_tmpB.second;
269 for (
int lw0_b = 0;lw0_b < row_indexes.size();lw0_b += npol)
271 const int& gw0 = row_indexes[lw0_b] / npol;
272 const int& lw0 = (npol == 2) ? (lw0_b + is0_b) : lw0_b;
273 for (
int lw1_b = 0;lw1_b < col_indexes.size();lw1_b += npol)
275 const int& gw1 = col_indexes[lw1_b] / npol;
276 const int& lw1 = (npol == 2) ? (lw1_b + is1_b) : lw1_b;
277 HlocR->
add_element(lw0, lw1, RI::Global_Func::convert<TR>(HexxR(gw0, gw1)));
RI::Tensor< double > tensor_conj(const RI::Tensor< double > &t)
Definition RI_2D_Comm.hpp:22
Definition abfs-vector3_order.h:16
std::vector< int > isk
ngk, number of plane waves for each k point
Definition klist.h:21
std::vector< ModuleBase::Vector3< double > > kvec_c
Definition klist.h:15
T x
Definition vector3.h:24
T y
Definition vector3.h:25
T z
Definition vector3.h:26
static void tick(const std::string &class_name_in, const std::string &name_in)
Use twice at a time: the first time, set start_flag to false; the second time, calculate the time dur...
Definition timer.cpp:57
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
int global2local_col(const int igc) const
get the local index of a global index (col)
Definition parallel_2d.h:51
int global2local_row(const int igr) const
get the local index of a global index (row)
Definition parallel_2d.h:45
Definition parallel_orbitals.h:9
std::vector< int > get_indexes_col() const
Definition parallel_orbitals.cpp:154
std::vector< int > get_indexes_row() const
gather global indexes of orbitals in this processor get_indexes_row() : global indexes (~NLOCAL) of r...
Definition parallel_orbitals.cpp:140
const Input_para & inp
Definition parameter.h:26
int *& iat2it
Definition unitcell.h:47
Tiait itiaiw2iwt(const Tiait &it, const Tiait &ia, const Tiait &iw) const
Definition unitcell.h:68
ModuleBase::Matrix3 & latvec
Definition unitcell.h:35
int *& iwt2iw
Definition unitcell.h:50
int *& iat2ia
Definition unitcell.h:48
int *& iwt2iat
Definition unitcell.h:49
Definition base_matrix.h:20
void add_element(int mu, int nu, const T &value)
add a single element to the matrix
Definition base_matrix.h:57
Definition hcontainer.h:144
BaseMatrix< T > * find_matrix(int i, int j, int rx, int ry, int rz)
find BaseMatrix with atom index atom_i and atom_j and R index (rx, ry, rz) This interface can be used...
Definition hcontainer.cpp:261
void set_mat2d(const int &global_ir, const int &global_ic, const T &v, const Parallel_Orbitals &pv, T *mat)
Definition LCAO_set_mat2d.cpp:13
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::vector< int > get_ik_list(const K_Vectors &kv, const int is_k)
Definition RI_2D_Comm.cpp:65
int get_is_block(const int is_k, const int is_row_b, const int is_col_b)
Definition RI_2D_Comm.hpp:189
std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > split_m2D_ktoR(const UnitCell &ucell, const K_Vectors &kv, const std::vector< const Tmatrix * > &mks_2D, const Parallel_2D &pv, const int nspin, const bool spgsym=false)
int TA
Definition RI_2D_Comm.h:25
std::array< Tcell, Ndim > TC
Definition RI_2D_Comm.h:28
std::tuple< int, int > split_is_block(const int is_b)
Definition RI_2D_Comm.hpp:201
void add_HexxR(const int current_spin, const double alpha, const std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > &Hs, const Parallel_Orbitals &pv, const int npol, hamilt::HContainer< TR > &HlocR, const RI::Cell_Nearest< int, int, 3, double, 3 > *const cell_nearest=nullptr)
Definition RI_2D_Comm.hpp:238
std::tuple< int, int, int > get_iat_iw_is_block(const UnitCell &ucell, const int &iwt)
Definition RI_2D_Comm.hpp:174
std::pair< TA, TC > TAC
Definition RI_2D_Comm.h:29
void add_Hexx(const UnitCell &ucell, const K_Vectors &kv, const int ik, const double alpha, const std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > &Hs, const Parallel_Orbitals &pv, TK *hk)
Definition RI_2D_Comm.hpp:125
int get_iwt(const UnitCell &ucell, const int iat, const int iw_b, const int is_b)
Definition RI_2D_Comm.hpp:216
std::array< int, 3 > get_Born_vonKarmen_period(const K_Vectors &kv)
Definition RI_Util.hpp:16
std::vector< std::array< Tcell, Ndim > > get_Born_von_Karmen_cells(const std::array< Tcell, Ndim > &Born_von_Karman_period)
Definition RI_Util.hpp:34
ModuleBase::Vector3< Tcell > array3_to_Vector3(const std::array< Tcell, 3 > &v)
Definition RI_Util.h:38
Parameter PARAM
Definition parameter.cpp:3
std::array< int, 3 > TC
Definition ri_cv_io_test.cpp:9