8#include <unordered_map>
14#ifdef NF_WITH_MPI_SUPPORT
23#ifdef NF_WITH_MPI_SUPPORT
35using RankCommMap = std::vector<NodeCommMap>;
40using CommMap = std::vector<RankCommMap>;
53 using bufferType = mpi::FullDuplexCommBuffer;
58 Communicator() =
default;
63 ~Communicator() =
default;
72 Communicator(mpi::MPIEnvironment mpiEnviron, CommMap rankSendMap, CommMap rankReceiveMap)
73 : mpiEnviron_(mpiEnviron), sendMap_(rankSendMap), receiveMap_(rankReceiveMap)
76 mpiEnviron_.sizeRank() == rankSendMap.size(),
77 "Size of rankSendSize does not match MPI size."
80 mpiEnviron_.sizeRank() == rankReceiveMap.size(),
81 "Size of rankReceiveSize does not match MPI size."
91 template<
typename valueType>
92 void startComm(Vector<valueType>& field,
const std::string& commName)
95 CommBuffer_.find(commName) == CommBuffer_.end() || (!CommBuffer_[commName]),
96 "There is already an ongoing communication for key " << commName <<
"."
99 CommBuffer_[commName] = findDuplexBuffer();
100 if (!CommBuffer_[commName])
102 CommBuffer_[commName] = createNewDuplexBuffer();
105 CommBuffer_[commName]->initComm<valueType>(commName);
106 for (
size_t rank = 0; rank < mpiEnviron_.sizeRank(); ++rank)
108 auto rankBuffer = CommBuffer_[commName]->getSend<valueType>(rank);
109 for (
size_t data = 0; data < sendMap_[rank].size(); ++data)
110 rankBuffer[data] = field(
static_cast<size_t>(sendMap_[rank][data].local_idx));
112 CommBuffer_[commName]->startComm();
120 bool isComplete(std::string commName);
128 template<
typename valueType>
129 void finaliseComm(Vector<valueType>& field, std::string commName)
132 CommBuffer_.find(commName) != CommBuffer_.end() && CommBuffer_[commName],
133 "No communication associated with key: " << commName
136 CommBuffer_[commName]->waitComplete();
137 for (
size_t rank = 0; rank < mpiEnviron_.sizeRank(); ++rank)
139 auto rankBuffer = CommBuffer_[commName]->getReceive<valueType>(rank);
140 for (
size_t data = 0; data < receiveMap_[rank].size(); ++data)
141 field(
static_cast<size_t>(receiveMap_[rank][data].local_idx)) = rankBuffer[data];
143 CommBuffer_[commName]->finaliseComm();
144 CommBuffer_[commName] =
nullptr;
149 mpi::MPIEnvironment mpiEnviron_;
152 std::vector<bufferType> buffers;
153 std::unordered_map<std::string, bufferType*>
161 bufferType* findDuplexBuffer();
167 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...