ABACUS develop
Atomic-orbital Based Ab-initio Computation at UStc
Loading...
Searching...
No Matches
transfer.h
Go to the documentation of this file.
1#ifndef HCONTAINERTRANSFER_H
2#define HCONTAINERTRANSFER_H
3
4#include <unordered_map>
5#include <vector>
6
8#include "./hcontainer.h"
9
10#ifdef __MPI
11namespace hamilt
12{
13
14template <typename T>
16{
17 public:
18 HTransPara(int n_processes, HContainer<T>* hr_in);
20
30 void cal_orb_indexes(int irank, std::vector<int>* orb_indexes = nullptr);
31
37 void receive_ap_indexes(int irank, const int* ap_indexes_in = nullptr, const long& size_ap_indexes_in = 0);
38
43 void send_orb_indexes(int irank, MPI_Request* request = nullptr);
44
49 void send_data(int irank, MPI_Request* request = nullptr);
50
55 void receive_data(int irank, const T* values = nullptr);
56
61 void pack_data(int irank, T* values = nullptr);
62
63 long get_max_size() const;
64 void get_value_size(int* out) const;
65
66 private:
67 std::vector<std::vector<int>> ap_indexes;
68 HContainer<T>* hr = nullptr;
69
70 // temporary variables
71 std::vector<std::vector<int>> atom_i_index;
72
73 const Parallel_Orbitals* paraV = nullptr;
74
75 // unpack BaseMatrix-values from ith rank
76 void unpack_data(int irank, const T* values);
77
78 // size of data of all BaseMatrixes
79 std::vector<long> size_values;
80};
81
82template <typename T>
84{
85 public:
86 HTransSerial(int n_processes, HContainer<T>* hr_in);
88
94 void cal_ap_indexes(int irank, std::vector<int>* ap_indexes = nullptr);
95
100 void send_ap_indexes(int irank, MPI_Request* request = nullptr);
101
106 void receive_orb_indexes(int irank, const int* orb_indexes_in = nullptr, const long& size_orb_indexes_in = 0);
107
112 void send_data(int irank, MPI_Request* request = nullptr);
113
118 void receive_data(int irank, const T* values = nullptr);
119
124 void pack_data(int irank, T* values = nullptr);
125
126 long get_max_size() const;
127 void get_value_size(int* out) const;
128
129 private:
130 std::vector<std::vector<int>> orb_indexes;
131 HContainer<T>* hr = nullptr;
132
137 void unpack_data(int irank, const T* values);
138
139 // temporary variables
140 std::vector<std::unordered_map<int, int>> orb_col_indexes;
141 std::vector<std::unordered_map<int, int>> orb_row_indexes;
142
143 // size of data of all BaseMatrixes
144 std::vector<long> size_values;
145};
146
147} // namespace hamilt
148
152template <typename T>
154
155template <>
156struct MPITraits<int>
157{
158 static MPI_Datatype datatype()
159 {
160 return MPI_INT;
161 }
162};
163
164template <>
165struct MPITraits<double>
166{
167 static MPI_Datatype datatype()
168 {
169 return MPI_DOUBLE;
170 }
171};
172
173template <>
174struct MPITraits<std::complex<double>>
175{
176 static MPI_Datatype datatype()
177 {
178 return MPI_DOUBLE_COMPLEX;
179 }
180};
181
182#endif // __MPI
183
184#endif // HCONTAINERTRANSFER_H
Definition parallel_orbitals.h:9
Definition hcontainer.h:144
Definition transfer.h:16
std::vector< long > size_values
Definition transfer.h:79
std::vector< std::vector< int > > atom_i_index
Definition transfer.h:71
void pack_data(int irank, T *values=nullptr)
pack BaseMatrix-values for ith rank
Definition transfer.cpp:197
void send_data(int irank, MPI_Request *request=nullptr)
pack data in this->hr, and send to ith rank
Definition transfer.cpp:160
void cal_orb_indexes(int irank, std::vector< int > *orb_indexes=nullptr)
calculate Orbital indexes and will be send to irank the format of the return value is: [size_i,...
Definition transfer.cpp:36
const Parallel_Orbitals * paraV
Definition transfer.h:73
HContainer< T > * hr
Definition transfer.h:68
std::vector< std::vector< int > > ap_indexes
Definition transfer.h:67
void receive_ap_indexes(int irank, const int *ap_indexes_in=nullptr, const long &size_ap_indexes_in=0)
receive AtomPair_indexes from the ith rank save to this->ap_indexes[irank]
Definition transfer.cpp:92
void receive_data(int irank, const T *values=nullptr)
receive data from ith rank, save them to this->hr
Definition transfer.cpp:175
void unpack_data(int irank, const T *values)
Definition transfer.cpp:239
~HTransPara()
Definition transfer.cpp:30
long get_max_size() const
Definition transfer.cpp:284
void send_orb_indexes(int irank, MPI_Request *request=nullptr)
pack data in this->hr, and send to ith rank
Definition transfer.cpp:142
void get_value_size(int *out) const
Definition transfer.cpp:290
Definition transfer.h:84
long get_max_size() const
Definition transfer.cpp:651
HContainer< T > * hr
Definition transfer.h:131
void send_ap_indexes(int irank, MPI_Request *request=nullptr)
calculate AtomPair_indexes of hr_in and send to the ith rank
Definition transfer.cpp:380
void pack_data(int irank, T *values=nullptr)
pack BaseMatrix-values for ith rank
Definition transfer.cpp:489
std::vector< std::vector< int > > orb_indexes
Definition transfer.h:130
void get_value_size(int *out) const
Definition transfer.cpp:656
void receive_data(int irank, const T *values=nullptr)
receive data from ith rank, save them to this->hr
Definition transfer.cpp:467
void receive_orb_indexes(int irank, const int *orb_indexes_in=nullptr, const long &size_orb_indexes_in=0)
receive Orbital_indexes from the ith rank save to this->orb_indexes[irank]
Definition transfer.cpp:399
void send_data(int irank, MPI_Request *request=nullptr)
pack data in this->hr, and send to ith rank
Definition transfer.cpp:452
std::vector< long > size_values
Definition transfer.h:144
std::vector< std::unordered_map< int, int > > orb_col_indexes
Definition transfer.h:140
void cal_ap_indexes(int irank, std::vector< int > *ap_indexes=nullptr)
calculate AtomPair indexes and will be send to irank called in plan_indexes
Definition transfer.cpp:319
void unpack_data(int irank, const T *values)
unpack BaseMatrix-values from ith rank
Definition transfer.cpp:570
std::vector< std::unordered_map< int, int > > orb_row_indexes
Definition transfer.h:141
~HTransSerial()
Definition transfer.cpp:314
std::complex< double > complex
Definition diago_cusolver.cpp:13
#define T
Definition exp.cpp:237
Definition hamilt.h:12
static MPI_Datatype datatype()
Definition transfer.h:167
static MPI_Datatype datatype()
Definition transfer.h:158
static MPI_Datatype datatype()
Definition transfer.h:176
Struct to get MPI_datatype.
Definition transfer.h:153