14void Communication::connectIntraComm(std::string
const &participantName,
15 std::string
const &tag,
22 std::string primaryName = participantName +
"Primary";
23 std::string secondaryName = participantName +
"Secondary";
25 constexpr Rank rankOffset = 1;
26 int secondaryRanksSize = size - rankOffset;
28 PRECICE_INFO(
"Connecting Primary rank to {} Secondary ranks", secondaryRanksSize);
33 int secondaryRank = rank - rankOffset;
34 PRECICE_INFO(
"Connecting Secondary rank #{} to Primary rank", secondaryRank);
35 requestConnection(primaryName, secondaryName, tag, secondaryRank, secondaryRanksSize);
47 std::copy(itemsToSend.
begin(), itemsToSend.
end(), itemsToReceive.
begin());
49 std::vector<double> received(itemsToReceive.
size());
54 for (
size_t i = 0; i < itemsToReceive.
size(); i++) {
55 itemsToReceive[i] += received[i];
60void Communication::reduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive,
Rank primaryRank)
65 auto request =
aSend(itemsToSend, primaryRank);
69void Communication::reduceSum(
int itemToSend,
int &itemToReceive)
73 itemToReceive = itemToSend;
79 itemToReceive += itemToSend;
83void Communication::reduceSum(
int itemToSend,
int &itemToReceive,
Rank primaryRank)
87 auto request =
aSend(itemToSend, primaryRank);
94void Communication::allreduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive)
102 std::vector<PtrRequest> requests;
113void Communication::allreduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive,
Rank primaryRank)
118 reduceSum(itemsToSend, itemsToReceive, primaryRank);
123void Communication::allreduceSum(
double itemToSend,
double &itemToReceive)
127 itemToReceive = itemToSend;
133 itemToReceive += itemToSend;
144void Communication::allreduceSum(
double itemToSend,
double &itemsToReceive,
Rank primaryRank)
148 auto request =
aSend(itemToSend, primaryRank);
154void Communication::allreduceSum(
int itemToSend,
int &itemToReceive)
158 itemToReceive = itemToSend;
164 itemToReceive += itemToSend;
175void Communication::allreduceSum(
int itemToSend,
int &itemToReceive,
Rank primaryRank)
179 auto request =
aSend(itemToSend, primaryRank);
185void Communication::broadcast(precice::span<const int> itemsToSend)
198void Communication::broadcast(precice::span<int> itemsToReceive,
Rank rankBroadcaster)
205void Communication::broadcast(
int itemToSend)
218void Communication::broadcast(
int &itemToReceive,
Rank rankBroadcaster)
224void Communication::broadcast(precice::span<const double> itemsToSend)
237void Communication::broadcast(precice::span<double> itemsToReceive,
244void Communication::broadcast(
double itemToSend)
257void Communication::broadcast(
double &itemToReceive,
Rank rankBroadcaster)
263void Communication::broadcast(
bool itemToSend)
266 int item = itemToSend;
270void Communication::broadcast(
bool &itemToReceive,
Rank rankBroadcaster)
275 itemToReceive = item;
278void Communication::broadcast(std::vector<int>
const &v)
284void Communication::broadcast(std::vector<int> &v,
Rank rankBroadcaster)
291 broadcast(precice::span<int>{v}, rankBroadcaster);
294void Communication::broadcast(std::vector<double>
const &v)
297 broadcast(precice::span<const double>{v});
300void Communication::broadcast(std::vector<double> &v,
Rank rankBroadcaster)
307 broadcast(precice::span<double>{v}, rankBroadcaster);
312 int size = itemsToSend.
size();
313 send(size, rankReceiver);
315 send(itemsToSend, rankReceiver);
321 int size = itemsToSend.
size();
322 send(size, rankReceiver);
324 send(itemsToSend, rankReceiver);
333 std::vector<int> result;
346 std::vector<double> result;
354int Communication::adjustRank(
Rank rank)
const
360 std::string
const &participantName,
361 std::string
const &tag,
364 com::Communication &left,
365 com::Communication &right)
375 const int prevProc = (rank - 1 + size) % size;
376 const int nextProc = (rank + 1) % size;
378 std::string prevName = participantName + std::to_string(prevProc);
379 std::string thisName = participantName + std::to_string(rank);
380 std::string nextName = participantName + std::to_string(nextProc);
381 if ((rank % 2) == 0) {
382 left.prepareEstablishment(prevName, thisName);
383 left.acceptConnection(prevName, thisName, tag, 0);
384 left.cleanupEstablishment(prevName, thisName);
386 right.requestConnection(thisName, nextName, tag, 0, 1);
388 right.requestConnection(thisName, nextName, tag, 0, 1);
390 left.prepareEstablishment(prevName, thisName);
391 left.acceptConnection(prevName, thisName, tag, 0);
392 left.cleanupEstablishment(prevName, thisName);
virtual void acceptConnection(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int rankOffset=0)=0
Accepts connection from another communicator, which has to call requestConnection().
virtual void requestConnection(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int requesterRank, int requesterCommunicatorSize)=0
Connects to another communicator, which has to call acceptConnection().