ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
RI_2D_Comm.h
Go to the documentation of this file.
1//=======================
2// AUTHOR : Peize Lin
3// DATE : 2022-08-17
4//=======================
5
6#ifndef RI_2D_COMM_H
7#define RI_2D_COMM_H
8
11#include "source_cell/klist.h"
12
13#include <RI/global/Tensor.h>
14#include <RI/ri/Cell_Nearest.h>
15#include <array>
16#include <deque>
17#include <map>
18#include <mpi.h>
19#include <set>
20#include <tuple>
21#include <vector>
22
23namespace RI_2D_Comm
24{
25using TA = int;
26using Tcell = int;
27static const size_t Ndim = 3;
28using TC = std::array<Tcell, Ndim>;
29using TAC = std::pair<TA, TC>;
30
31// public:
32template <typename Tdata, typename Tmatrix>
33extern std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>> split_m2D_ktoR(
34 const UnitCell& ucell,
35 const K_Vectors& kv,
36 const std::vector<const Tmatrix*>& mks_2D,
37 const Parallel_2D& pv,
38 const int nspin,
39 const bool spgsym = false);
40
41template <typename Tdata, typename Tmatrix>
42extern std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>> split_m2D_ktoR_gamma(
43 const UnitCell& ucell,
44 const std::vector<const Tmatrix*>& mks_2D,
45 const Parallel_2D& pv,
46 const int nspin);
47
48template <typename Tdata, typename Tmatrix>
49extern std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>> split_m2D_ktoR_k(
50 const UnitCell& ucell,
51 const K_Vectors& kv,
52 const std::vector<const Tmatrix*>& mks_2D,
53 const Parallel_2D& pv,
54 const int nspin,
55 const bool spgsym = false);
56
57 // judge[is] = {s0, s1}
58 extern std::vector<std::tuple<std::set<TA>, std::set<TA>>>
59 get_2D_judge(const UnitCell& ucell, const Parallel_2D& pv);
60
61 template<typename Tdata, typename TK>
62 extern void add_Hexx(
63 const UnitCell& ucell,
64 const K_Vectors& kv,
65 const int ik,
66 const double alpha,
67 const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& Hs,
68 const Parallel_Orbitals& pv,
69 TK* hk);
70
71
72 template <typename Tdata, typename TK>
73 extern void add_Hexx_td(
74 const UnitCell& ucell,
75 const K_Vectors& kv,
76 const int ik,
77 const double alpha,
78 const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& Hs,
79 const Parallel_Orbitals& pv,
81 TK* hk);
82
83 template<typename Tdata, typename TR>
84 extern void add_HexxR(
85 const int current_spin,
86 const double alpha,
87 const std::vector<std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>>& Hs,
88 const Parallel_Orbitals& pv,
89 const int npol,
91 const RI::Cell_Nearest<int, int, 3, double, 3>* const cell_nearest = nullptr);
92
93 template<typename Tdata>
94 extern std::vector<std::vector<Tdata>> Hexxs_to_Hk(
95 const K_Vectors &kv,
96 const Parallel_Orbitals &pv,
97 const std::vector< std::map<TA, std::map<TAC, RI::Tensor<Tdata>>>> &Hexxs,
98 const int ik);
99 template<typename Tdata>
100 std::vector<std::vector<Tdata>> pulay_mixing(
101 const Parallel_Orbitals &pv,
102 std::deque<std::vector<std::vector<Tdata>>> &Hk_seq,
103 const std::vector<std::vector<Tdata>> &Hk_new,
104 const double mixing_beta,
105 const std::string mixing_mode);
106
107//private:
108 extern std::vector<int> get_ik_list(const K_Vectors &kv, const int is_k);
109 extern inline std::tuple<int,int,int> get_iat_iw_is_block(const UnitCell& ucell,const int& iwt);
110 extern inline int get_is_block(const int is_k, const int is_row_b, const int is_col_b);
111 extern inline std::tuple<int,int> split_is_block(const int is_b);
112 extern inline int get_iwt(const UnitCell& ucell, const int iat, const int iw_b, const int is_b);
113
114 template <typename TA, typename TAC, typename T>
115 extern std::map<TA, std::map<TAC, T>> comm_map2_first(const MPI_Comm& mpi_comm,
116 const std::map<TA, std::map<TAC, T>>& Ds_in,
117 const std::set<TA>& s0,
118 const std::set<TA>& s1);
119 template <typename TA, typename TAC, typename T, typename Tjudge>
120 extern std::map<TA, std::map<TAC, T>> comm_map2(const MPI_Comm& mpi_comm,
121 const std::map<TA, std::map<TAC, T>>& Ds_in,
122 const Tjudge& judge);
123 template <typename Tkey, typename Tvalue>
124 extern void set_value_add(Tkey&& key, Tvalue&& value, std::map<Tkey, Tvalue>& data);
125 template <typename Tkey0, typename Tkey1, typename Tvalue>
126 extern void set_value_add(std::tuple<Tkey0, Tkey1>&& key,
127 Tvalue&& value,
128 std::map<Tkey0, std::map<Tkey1, Tvalue>>& data);
129 template <typename Tkey, typename Tvalue>
130 extern void add_datas(std::map<Tkey, Tvalue>&& data_local, std::map<Tkey, Tvalue>& data_recv);
131 template <typename Tkey0, typename Tkey1, typename Tvalue>
132 extern void add_datas(std::map<Tkey0, std::map<Tkey1, Tvalue>>&& data_local,
133 std::map<Tkey0, std::map<Tkey1, Tvalue>>& data_recv);
134} // namespace RI_2D_Comm
135
136#include "RI_2D_Comm.hpp"
137
138#endif
Definition klist.h:12
3 elements vector
Definition vector3.h:24
This class packs the basic information of 2D-block-cyclic parallel distribution of an arbitrary matri...
Definition parallel_2d.h:12
Definition parallel_orbitals.h:9
Definition unitcell.h:15
Definition hcontainer.h:144
Definition RI_2D_Comm.h:24
std::vector< int > get_ik_list(const K_Vectors &kv, const int is_k)
Definition RI_2D_Comm.cpp:65
std::vector< std::vector< Tdata > > pulay_mixing(const Parallel_Orbitals &pv, std::deque< std::vector< std::vector< Tdata > > > &Hk_seq, const std::vector< std::vector< Tdata > > &Hk_new, const double mixing_beta, const std::string mixing_mode)
int get_is_block(const int is_k, const int is_row_b, const int is_col_b)
Definition RI_2D_Comm.hpp:396
std::map< TA, std::map< TAC, T > > comm_map2(const MPI_Comm &mpi_comm, const std::map< TA, std::map< TAC, T > > &Ds_in, const Tjudge &judge)
Definition RI_2D_Comm.hpp:507
std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > split_m2D_ktoR_gamma(const UnitCell &ucell, const std::vector< const Tmatrix * > &mks_2D, const Parallel_2D &pv, const int nspin)
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::pair< TA, TC > TAC
Definition RI_2D_Comm.h:29
std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > split_m2D_ktoR_k(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)
void set_value_add(Tkey &&key, Tvalue &&value, std::map< Tkey, Tvalue > &data)
Definition RI_2D_Comm.hpp:527
void add_Hexx_td(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, const ModuleBase::Vector3< double > &At, TK *hk)
Definition RI_2D_Comm.hpp:316
std::tuple< int, int > split_is_block(const int is_b)
Definition RI_2D_Comm.hpp:408
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:445
std::tuple< int, int, int > get_iat_iw_is_block(const UnitCell &ucell, const int &iwt)
Definition RI_2D_Comm.hpp:381
std::array< Tcell, Ndim > TC
Definition RI_2D_Comm.h:28
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
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:267
int get_iwt(const UnitCell &ucell, const int iat, const int iw_b, const int is_b)
Definition RI_2D_Comm.hpp:423
std::vector< std::tuple< std::set< TA >, std::set< TA > > > get_2D_judge(const UnitCell &ucell, const Parallel_2D &pv)
Definition RI_2D_Comm.cpp:15
void add_datas(std::map< Tkey, Tvalue > &&data_local, std::map< Tkey, Tvalue > &data_recv)
Definition RI_2D_Comm.hpp:546
std::vector< std::vector< Tdata > > Hexxs_to_Hk(const K_Vectors &kv, const Parallel_Orbitals &pv, const std::vector< std::map< TA, std::map< TAC, RI::Tensor< Tdata > > > > &Hexxs, const int ik)
int Tcell
Definition RI_2D_Comm.h:26