6#include <unordered_map>
12#ifdef NF_WITH_MPI_SUPPORT
21#ifdef NF_WITH_MPI_SUPPORT
33using RankCommMap = std::vector<NodeCommMap>;
38using CommMap = std::vector<RankCommMap>;
51 using bufferType = mpi::FullDuplexCommBuffer;
56 Communicator() =
default;
61 ~Communicator() =
default;
70 Communicator(mpi::MPIEnvironment mpiEnviron, CommMap rankSendMap, CommMap rankReceiveMap)
71 : mpiEnviron_(mpiEnviron), sendMap_(rankSendMap), receiveMap_(rankReceiveMap)
74 mpiEnviron_.sizeRank() == rankSendMap.size(),
75 "Size of rankSendSize does not match MPI size."
78 mpiEnviron_.sizeRank() == rankReceiveMap.size(),
79 "Size of rankReceiveSize does not match MPI size."
89 template<
typename valueType>
90 void startComm(Field<valueType>& field,
const std::string& commName)
93 CommBuffer_.find(commName) == CommBuffer_.end() || (!CommBuffer_[commName]),
94 "There is already an ongoing communication for key " << commName <<
"."
97 CommBuffer_[commName] = findDuplexBuffer();
98 if (!CommBuffer_[commName])
100 CommBuffer_[commName] = createNewDuplexBuffer();
103 CommBuffer_[commName]->initComm<valueType>(commName);
104 for (
size_t rank = 0; rank < mpiEnviron_.sizeRank(); ++rank)
106 auto rankBuffer = CommBuffer_[commName]->getSend<valueType>(rank);
107 for (
size_t data = 0; data < sendMap_[rank].size(); ++data)
108 rankBuffer[data] = field(
static_cast<size_t>(sendMap_[rank][data].local_idx));
110 CommBuffer_[commName]->startComm();
118 bool isComplete(std::string commName);
126 template<
typename valueType>
127 void finaliseComm(Field<valueType>& field, std::string commName)
130 CommBuffer_.find(commName) != CommBuffer_.end() && CommBuffer_[commName],
131 "No communication associated with key: " << commName
134 CommBuffer_[commName]->waitComplete();
135 for (
size_t rank = 0; rank < mpiEnviron_.sizeRank(); ++rank)
137 auto rankBuffer = CommBuffer_[commName]->getReceive<valueType>(rank);
138 for (
size_t data = 0; data < receiveMap_[rank].size(); ++data)
139 field(
static_cast<size_t>(receiveMap_[rank][data].local_idx)) = rankBuffer[data];
141 CommBuffer_[commName]->finaliseComm();
142 CommBuffer_[commName] =
nullptr;
147 mpi::MPIEnvironment mpiEnviron_;
150 std::vector<bufferType> buffers;
151 std::unordered_map<std::string, bufferType*>
159 bufferType* findDuplexBuffer();
165 bufferType* createNewDuplexBuffer();
#define NF_DEBUG_ASSERT(condition, message)
Macro for asserting a condition and printing an error message if the condition is false (only in debu...