preCICE v3.2.0
Loading...
Searching...
No Matches
Communication.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <set>
4#include <stddef.h>
5#include <string>
6#include <vector>
7
8#include "boost/range/irange.hpp"
9#include "com/Request.hpp"
10#include "com/SharedPointer.hpp"
11#include "logging/Logger.hpp"
13#include "precice/span.hpp"
14
15namespace precice::com {
16
52
53public:
55
57 virtual ~Communication() = default;
58
61
63 virtual bool isConnected()
64 {
65 return _isConnected;
66 }
67
73 virtual size_t getRemoteCommunicatorSize() = 0;
74
83 {
84 return boost::irange<Rank>(0, static_cast<Rank>(getRemoteCommunicatorSize()));
85 }
86
101 virtual void acceptConnection(std::string const &acceptorName,
102 std::string const &requesterName,
103 std::string const &tag,
104 int acceptorRank,
105 int rankOffset = 0) = 0;
106
122 virtual void acceptConnectionAsServer(std::string const &acceptorName,
123 std::string const &requesterName,
124 std::string const &tag,
125 int acceptorRank,
126 int requesterCommunicatorSize) = 0;
127
143 virtual void requestConnection(std::string const &acceptorName,
144 std::string const &requesterName,
145 std::string const &tag,
146 int requesterRank,
147 int requesterCommunicatorSize) = 0;
148
163 virtual void requestConnectionAsClient(std::string const &acceptorName,
164 std::string const &requesterName,
165 std::string const &tag,
166 std::set<int> const &acceptorRanks,
167 int requesterRank) = 0;
168
177 void connectIntraComm(std::string const &participantName,
178 std::string const &tag,
179 int rank,
180 int size);
181
187 virtual void closeConnection() = 0;
188
195 virtual void prepareEstablishment(std::string const &acceptorName,
196 std::string const &requesterName) {}
197
204 virtual void cleanupEstablishment(std::string const &acceptorName,
205 std::string const &requesterName) {}
206
208
211
213 virtual void reduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive, Rank primaryRank);
215 virtual void reduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive);
216
217 virtual void reduceSum(int itemToSend, int &itemToReceive, Rank primaryRank);
218 virtual void reduceSum(int itemsToSend, int &itemsToReceive);
219
220 virtual void allreduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive, Rank primaryRank);
221 virtual void allreduceSum(precice::span<double const> itemsToSend, precice::span<double> itemsToReceive);
222
223 virtual void allreduceSum(double itemToSend, double &itemToReceive, Rank primaryRank);
224 virtual void allreduceSum(double itemToSend, double &itemToReceive);
225
226 virtual void allreduceSum(int itemToSend, int &itemToReceive, Rank primaryRank);
227 virtual void allreduceSum(int itemToSend, int &itemToReceive);
228
230
233
234 virtual void broadcast(precice::span<const int> itemsToSend);
235 virtual void broadcast(precice::span<int> itemsToReceive, Rank rankBroadcaster);
236
237 virtual void broadcast(int itemToSend);
238 virtual void broadcast(int &itemToReceive, Rank rankBroadcaster);
239
240 virtual void broadcast(precice::span<const double> itemsToSend);
241 virtual void broadcast(precice::span<double> itemsToReceive, Rank rankBroadcaster);
242
243 virtual void broadcast(double itemToSend);
244 virtual void broadcast(double &itemToReceive, Rank rankBroadcaster);
245
246 virtual void broadcast(bool itemToSend);
247 virtual void broadcast(bool &itemToReceive, Rank rankBroadcaster);
248
249 virtual void broadcast(std::vector<int> const &v);
250 virtual void broadcast(std::vector<int> &v, Rank rankBroadcaster);
251
252 virtual void broadcast(std::vector<double> const &v);
253 virtual void broadcast(std::vector<double> &v, Rank rankBroadcaster);
254
256
259
261 virtual void send(std::string const &itemToSend, Rank rankReceiver) = 0;
262
264 virtual void send(precice::span<const int> itemsToSend, Rank rankReceiver) = 0;
265
268 virtual PtrRequest aSend(precice::span<const int> itemsToSend, Rank rankReceiver) = 0;
269
271 virtual void send(precice::span<const double> itemsToSend, Rank rankReceiver) = 0;
272
275 virtual PtrRequest aSend(precice::span<const double> itemsToSend, Rank rankReceiver) = 0;
276
278 virtual void send(double itemToSend, Rank rankReceiver) = 0;
279
282 virtual PtrRequest aSend(const double &itemToSend, Rank rankReceiver) = 0;
283
285 virtual void send(int itemToSend, Rank rankReceiver) = 0;
286
289 virtual PtrRequest aSend(const int &itemToSend, Rank rankReceiver) = 0;
290
292 virtual void send(bool itemToSend, Rank rankReceiver) = 0;
293
296 virtual PtrRequest aSend(const bool &itemToSend, Rank rankReceiver) = 0;
297
299
302
304 virtual void receive(std::string &itemToReceive, Rank rankSender) = 0;
305
307 virtual void receive(precice::span<int> itemsToReceive, Rank rankSender) = 0;
308
310 virtual void receive(precice::span<double> itemsToReceive, Rank rankSender) = 0;
311
313 virtual PtrRequest aReceive(precice::span<double> itemsToReceive, int rankSender) = 0;
314
316 virtual void receive(double &itemToReceive, Rank rankSender) = 0;
317
319 virtual PtrRequest aReceive(double &itemToReceive, Rank rankSender) = 0;
320
322 virtual void receive(int &itemToReceive, Rank rankSender) = 0;
323
325 virtual PtrRequest aReceive(int &itemToReceive, Rank rankSender) = 0;
326
328 virtual void receive(bool &itemToReceive, Rank rankSender) = 0;
329
331 virtual PtrRequest aReceive(bool &itemToReceive, Rank rankSender) = 0;
332
334
337
342 template <typename T>
343 struct AsVectorTag {
344 };
345
347 void sendRange(precice::span<const double> itemsToSend, Rank rankReceiver);
348
350 void sendRange(precice::span<const int> itemsToSend, Rank rankReceiver);
351
354
357
359
361 void setRankOffset(Rank rankOffset)
362 {
363 _rankOffset = rankOffset;
364 }
365
366protected:
368 int _rankOffset = 0;
369
370 bool _isConnected = false;
371
373 virtual int adjustRank(Rank rank) const;
374
375private:
376 logging::Logger _log{"com::Communication"};
377};
378
380template <typename T>
381inline constexpr auto asVector = Communication::AsVectorTag<T>{};
382
389 std::string const &participantName,
390 std::string const &tag,
391 int rank,
392 int size,
393 com::Communication &left,
394 com::Communication &right);
395
396} // namespace precice::com
Interface for all interprocess communication classes.
virtual void receive(bool &itemToReceive, Rank rankSender)=0
Receives a bool from process with given rank.
virtual void cleanupEstablishment(std::string const &acceptorName, std::string const &requesterName)
Clean-up environment used to establish the communication.
virtual void receive(double &itemToReceive, Rank rankSender)=0
Receives a double from process with given rank.
virtual void receive(int &itemToReceive, Rank rankSender)=0
Receives an int from process with given rank.
virtual PtrRequest aSend(const double &itemToSend, Rank rankReceiver)=0
virtual PtrRequest aSend(precice::span< const int > itemsToSend, Rank rankReceiver)=0
virtual void receive(std::string &itemToReceive, Rank rankSender)=0
Receives a std::string from process with given rank.
virtual void requestConnectionAsClient(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, std::set< int > const &acceptorRanks, int requesterRank)=0
Connects to another communicator, which has to call acceptConnectionAsServer().
void setRankOffset(Rank rankOffset)
Set rank offset.
virtual void send(precice::span< const int > itemsToSend, Rank rankReceiver)=0
Sends an array of integer values.
std::vector< int > receiveRange(Rank rankSender, AsVectorTag< int >)
Receives a range of ints as a vector<int>
void connectIntraComm(std::string const &participantName, std::string const &tag, int rank, int size)
auto remoteCommunicatorRanks()
Returns a range over all valid remote ranks.
virtual void prepareEstablishment(std::string const &acceptorName, std::string const &requesterName)
Prepare environment used to establish the communication.
virtual void send(int itemToSend, Rank rankReceiver)=0
Sends an int to process with given rank.
virtual bool isConnected()
Returns true, if a connection to a remote participant has been setup.
virtual size_t getRemoteCommunicatorSize()=0
Returns the number of processes in the remote communicator.
virtual void acceptConnectionAsServer(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int requesterCommunicatorSize)=0
Accepts connection from another communicator, which has to call requestConnectionAsClient().
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().
Communication & operator=(Communication &&)=delete
virtual PtrRequest aReceive(double &itemToReceive, Rank rankSender)=0
Asynchronously receives a double from process with given rank.
int _rankOffset
Rank offset for primaries-secondary communication, since ranks are from 0 to size-2.
virtual PtrRequest aSend(precice::span< const double > itemsToSend, Rank rankReceiver)=0
virtual void send(precice::span< const double > itemsToSend, Rank rankReceiver)=0
Sends an array of double values.
virtual void send(bool itemToSend, Rank rankReceiver)=0
Sends a bool to process with given rank.
void sendRange(precice::span< const double > itemsToSend, Rank rankReceiver)
Sends a range of doubles (size + content)
virtual int adjustRank(Rank rank) const
Adjusts the given rank bases on the _rankOffset.
virtual ~Communication()=default
Destructor, empty.
virtual void receive(precice::span< int > itemsToReceive, Rank rankSender)=0
Receives an array of integer values.
virtual PtrRequest aReceive(bool &itemToReceive, Rank rankSender)=0
Asynchronously receives a bool from process with given rank.
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().
virtual void receive(precice::span< double > itemsToReceive, Rank rankSender)=0
Receives an array of double values.
virtual PtrRequest aReceive(precice::span< double > itemsToReceive, int rankSender)=0
Asynchronously receives an array of double values.
virtual void send(double itemToSend, Rank rankReceiver)=0
Sends a double to process with given rank.
virtual PtrRequest aSend(const int &itemToSend, Rank rankReceiver)=0
virtual void allreduceSum(precice::span< double const > itemsToSend, precice::span< double > itemsToReceive, Rank primaryRank)
virtual PtrRequest aSend(const bool &itemToSend, Rank rankReceiver)=0
virtual void send(std::string const &itemToSend, Rank rankReceiver)=0
Sends a std::string to process with given rank.
virtual void closeConnection()=0
Disconnects from communication space, i.e. participant.
virtual void reduceSum(precice::span< double const > itemsToSend, precice::span< double > itemsToReceive, Rank primaryRank)
Performs a reduce summation on the rank given by primaryRank.
virtual PtrRequest aReceive(int &itemToReceive, Rank rankSender)=0
Asynchronously receives an int from process with given rank.
virtual void broadcast(precice::span< const int > itemsToSend)
This class provides a lightweight logger.
Definition Logger.hpp:17
A C++ 11 implementation of the non-owning C++20 std::span type.
Definition span.hpp:284
contains the data communication abstraction layer.
constexpr auto asVector
Allows to use Communication::AsVectorTag in a less verbose way.
std::shared_ptr< Request > PtrRequest
void connectCircularComm(std::string const &participantName, std::string const &tag, int rank, int size, com::Communication &left, com::Communication &right)
int Rank
Definition Types.hpp:37