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
7#include "./hcontainer.h"
8
9#ifdef __MPI
10namespace hamilt
11{
12
13template <typename T>
15{
16 public:
17 HTransPara(int n_processes, HContainer<T>* hr_in);
19
29 void cal_orb_indexes(int irank, std::vector<int>* orb_indexes = nullptr);
30
36 void receive_ap_indexes(int irank, const int* ap_indexes_in = nullptr, const long& size_ap_indexes_in = 0);
37
42 void send_orb_indexes(int irank, MPI_Request* request = nullptr);
43
48 void send_data(int irank, MPI_Request* request = nullptr);
49
54 void receive_data(int irank, const T* values = nullptr);
55
60 void pack_data(int irank, T* values = nullptr);
61
62 long get_max_size() const;
63 void get_value_size(int* out) const;
64
65 private:
66 std::vector<std::vector<int>> ap_indexes;
67 HContainer<T>* hr = nullptr;
68
69 // temporary variables
70 std::vector<std::vector<int>> atom_i_index;
71
72 const Parallel_Orbitals* paraV = nullptr;
73
74 // unpack BaseMatrix-values from ith rank
75 void unpack_data(int irank, const T* values);
76
77 // size of data of all BaseMatrixes
78 std::vector<long> size_values;
79};
80
81template <typename T>
83{
84 public:
85 HTransSerial(int n_processes, HContainer<T>* hr_in);
87
93 void cal_ap_indexes(int irank, std::vector<int>* ap_indexes = nullptr);
94
99 void send_ap_indexes(int irank, MPI_Request* request = nullptr);
100
105 void receive_orb_indexes(int irank, const int* orb_indexes_in = nullptr, const long& size_orb_indexes_in = 0);
106
111 void send_data(int irank, MPI_Request* request = nullptr);
112
117 void receive_data(int irank, const T* values = nullptr);
118
123 void pack_data(int irank, T* values = nullptr);
124
125 long get_max_size() const;
126 void get_value_size(int* out) const;
127
128 private:
129 std::vector<std::vector<int>> orb_indexes;
130 HContainer<T>* hr = nullptr;
131
136 void unpack_data(int irank, const T* values);
137
138 // temporary variables
139 std::vector<std::unordered_map<int, int>> orb_col_indexes;
140 std::vector<std::unordered_map<int, int>> orb_row_indexes;
141
142 // size of data of all BaseMatrixes
143 std::vector<long> size_values;
144};
145
146} // namespace hamilt
147
151template <typename T>
153
154template <>
155struct MPITraits<int>
156{
157 static MPI_Datatype datatype()
158 {
159 return MPI_INT;
160 }
161};
162
163template <>
164struct MPITraits<double>
165{
166 static MPI_Datatype datatype()
167 {
168 return MPI_DOUBLE;
169 }
170};
171
172template <>
173struct MPITraits<std::complex<double>>
174{
175 static MPI_Datatype datatype()
176 {
177 return MPI_DOUBLE_COMPLEX;
178 }
179};
180
181#endif // __MPI
182
183#endif // HCONTAINERTRANSFER_H
Definition parallel_orbitals.h:9
Definition hcontainer.h:144
Definition transfer.h:15
std::vector< long > size_values
Definition transfer.h:78
std::vector< std::vector< int > > atom_i_index
Definition transfer.h:70
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:72
HContainer< T > * hr
Definition transfer.h:67
std::vector< std::vector< int > > ap_indexes
Definition transfer.h:66
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:83
long get_max_size() const
Definition transfer.cpp:651
HContainer< T > * hr
Definition transfer.h:130
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:129
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:143
std::vector< std::unordered_map< int, int > > orb_col_indexes
Definition transfer.h:139
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:140
~HTransSerial()
Definition transfer.cpp:314
std::complex< double > complex
Definition diago_cusolver.cpp:15
#define T
Definition exp.cpp:237
Definition hamilt.h:13
static MPI_Datatype datatype()
Definition transfer.h:166
static MPI_Datatype datatype()
Definition transfer.h:157
static MPI_Datatype datatype()
Definition transfer.h:175
Struct to get MPI_datatype.
Definition transfer.h:152