preCICE v3.2.0
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
Public Member Functions | Private Types | Private Member Functions | Private Attributes | List of all members
precice::com::SocketCommunication Class Reference

Implements Communication by using sockets. More...

#include <SocketCommunication.hpp>

Inheritance diagram for precice::com::SocketCommunication:
[legend]
Collaboration diagram for precice::com::SocketCommunication:
[legend]

Public Member Functions

 SocketCommunication (unsigned short portNumber=0, bool reuseAddress=false, std::string networkName=utils::networking::loopbackInterfaceName(), std::string addressDirectory=".")
 
 SocketCommunication (std::string const &addressDirectory)
 
 ~SocketCommunication () override
 
size_t getRemoteCommunicatorSize () override
 Returns the number of processes in the remote communicator.
 
void acceptConnection (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int rankOffset=0) override
 Accepts connection from another communicator, which has to call requestConnection().
 
void acceptConnectionAsServer (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int requesterCommunicatorSize) override
 Accepts connection from another communicator, which has to call requestConnectionAsClient().
 
void requestConnection (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int requesterRank, int requesterCommunicatorSize) override
 Connects to another communicator, which has to call acceptConnection().
 
void requestConnectionAsClient (std::string const &acceptorName, std::string const &requesterName, std::string const &tag, std::set< int > const &acceptorRanks, int requesterRank) override
 Connects to another communicator, which has to call acceptConnectionAsServer().
 
void closeConnection () override
 Disconnects from communication space, i.e. participant.
 
void send (std::string const &itemToSend, Rank rankReceiver) override
 Sends a std::string to process with given rank.
 
void send (precice::span< const int > itemsToSend, Rank rankReceiver) override
 Sends an array of integer values.
 
PtrRequest aSend (precice::span< const int > itemsToSend, Rank rankReceiver) override
 Asynchronously sends an array of integer values.
 
void send (precice::span< const double > itemsToSend, Rank rankReceiver) override
 Sends an array of double values.
 
PtrRequest aSend (precice::span< const double > itemsToSend, Rank rankReceiver) override
 Asynchronously sends an array of double values.
 
void send (double itemToSend, Rank rankReceiver) override
 Sends a double to process with given rank.
 
PtrRequest aSend (const double &itemToSend, Rank rankReceiver) override
 Asynchronously sends a double to process with given rank.
 
void send (int itemToSend, Rank rankReceiver) override
 Sends an int to process with given rank.
 
PtrRequest aSend (const int &itemToSend, Rank rankReceiver) override
 Asynchronously sends an int to process with given rank.
 
void send (bool itemToSend, Rank rankReceiver) override
 Sends a bool to process with given rank.
 
PtrRequest aSend (const bool &itemToSend, Rank rankReceiver) override
 Asynchronously sends a bool to process with given rank.
 
void receive (std::string &itemToReceive, Rank rankSender) override
 Receives a std::string from process with given rank.
 
void receive (precice::span< int > itemsToReceive, Rank rankSender) override
 Receives an array of integer values.
 
void receive (precice::span< double > itemsToReceive, Rank rankSender) override
 Receives an array of double values.
 
PtrRequest aReceive (precice::span< double > itemsToReceive, int rankSender) override
 Asynchronously receives an array of double values.
 
void receive (double &itemToReceive, Rank rankSender) override
 Receives a double from process with given rank.
 
PtrRequest aReceive (double &itemToReceive, Rank rankSender) override
 Asynchronously receives a double from process with given rank.
 
void receive (int &itemToReceive, Rank rankSender) override
 Receives an int from process with given rank.
 
PtrRequest aReceive (int &itemToReceive, Rank rankSender) override
 Asynchronously receives an int from process with given rank.
 
void receive (bool &itemToReceive, Rank rankSender) override
 Receives a bool from process with given rank.
 
PtrRequest aReceive (bool &itemToReceive, Rank rankSender) override
 Asynchronously receives a bool from process with given rank.
 
void prepareEstablishment (std::string const &acceptorName, std::string const &requesterName) override
 Prepare environment used to establish the communication.
 
void cleanupEstablishment (std::string const &acceptorName, std::string const &requesterName) override
 Clean-up environment used to establish the communication.
 
- Public Member Functions inherited from precice::com::Communication
Communicationoperator= (Communication &&)=delete
 
virtual ~Communication ()=default
 Destructor, empty.
 
void setRankOffset (Rank rankOffset)
 Set rank offset.
 
virtual bool isConnected ()
 Returns true, if a connection to a remote participant has been setup.
 
auto remoteCommunicatorRanks ()
 Returns a range over all valid remote ranks.
 
void connectIntraComm (std::string const &participantName, std::string const &tag, int rank, int size)
 
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 void reduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive)
 Performs a reduce summation on the primary rank, every other rank has to call reduceSum.
 
virtual void reduceSum (int itemToSend, int &itemToReceive, Rank primaryRank)
 
virtual void reduceSum (int itemsToSend, int &itemsToReceive)
 
virtual void allreduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive, Rank primaryRank)
 
virtual void allreduceSum (precice::span< double const > itemsToSend, precice::span< double > itemsToReceive)
 
virtual void allreduceSum (double itemToSend, double &itemToReceive, Rank primaryRank)
 
virtual void allreduceSum (double itemToSend, double &itemToReceive)
 
virtual void allreduceSum (int itemToSend, int &itemToReceive, Rank primaryRank)
 
virtual void allreduceSum (int itemToSend, int &itemToReceive)
 
virtual void broadcast (precice::span< const int > itemsToSend)
 
virtual void broadcast (precice::span< int > itemsToReceive, Rank rankBroadcaster)
 
virtual void broadcast (int itemToSend)
 
virtual void broadcast (int &itemToReceive, Rank rankBroadcaster)
 
virtual void broadcast (precice::span< const double > itemsToSend)
 
virtual void broadcast (precice::span< double > itemsToReceive, Rank rankBroadcaster)
 
virtual void broadcast (double itemToSend)
 
virtual void broadcast (double &itemToReceive, Rank rankBroadcaster)
 
virtual void broadcast (bool itemToSend)
 
virtual void broadcast (bool &itemToReceive, Rank rankBroadcaster)
 
virtual void broadcast (std::vector< int > const &v)
 
virtual void broadcast (std::vector< int > &v, Rank rankBroadcaster)
 
virtual void broadcast (std::vector< double > const &v)
 
virtual void broadcast (std::vector< double > &v, Rank rankBroadcaster)
 
void sendRange (precice::span< const double > itemsToSend, Rank rankReceiver)
 Sends a range of doubles (size + content)
 
void sendRange (precice::span< const int > itemsToSend, Rank rankReceiver)
 Sends a range of ints (size + content)
 
std::vector< int > receiveRange (Rank rankSender, AsVectorTag< int >)
 Receives a range of ints as a vector<int>
 
std::vector< double > receiveRange (Rank rankSender, AsVectorTag< double >)
 Receives a range of doubles as a vector<double>
 

Private Types

using IOContext = boost::asio::io_context
 
using Socket = boost::asio::ip::tcp::socket
 
using WorkGuard = boost::asio::executor_work_guard<IOContext::executor_type>
 

Private Member Functions

bool isClient ()
 
bool isServer ()
 
std::string getIpAddress ()
 

Private Attributes

logging::Logger _log {"com::SocketCommunication"}
 
unsigned short _portNumber
 Port used for socket connection.
 
bool _reuseAddress
 
std::string _networkName
 Name of network to communicate over.
 
std::string _addressDirectory
 Directory where IP address is exchanged by file.
 
std::shared_ptr< IOContext_ioContext
 
std::unique_ptr< WorkGuard_workGuard
 
std::thread _thread
 
std::map< int, std::shared_ptr< Socket > > _sockets
 Remote rank -> socket map.
 
SocketSendQueue _queue
 

Additional Inherited Members

- Protected Member Functions inherited from precice::com::Communication
virtual int adjustRank (Rank rank) const
 Adjusts the given rank bases on the _rankOffset.
 
- Protected Attributes inherited from precice::com::Communication
int _rankOffset = 0
 Rank offset for primaries-secondary communication, since ranks are from 0 to size-2.
 
bool _isConnected = false
 

Detailed Description

Implements Communication by using sockets.

Definition at line 20 of file SocketCommunication.hpp.

Member Typedef Documentation

◆ IOContext

using precice::com::SocketCommunication::IOContext = boost::asio::io_context
private

Definition at line 143 of file SocketCommunication.hpp.

◆ Socket

using precice::com::SocketCommunication::Socket = boost::asio::ip::tcp::socket
private

Definition at line 144 of file SocketCommunication.hpp.

◆ WorkGuard

using precice::com::SocketCommunication::WorkGuard = boost::asio::executor_work_guard<IOContext::executor_type>
private

Definition at line 145 of file SocketCommunication.hpp.

Constructor & Destructor Documentation

◆ SocketCommunication() [1/2]

precice::com::SocketCommunication::SocketCommunication ( unsigned short portNumber = 0,
bool reuseAddress = false,
std::string networkName = utils::networking::loopbackInterfaceName(),
std::string addressDirectory = "." )

Definition at line 22 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ SocketCommunication() [2/2]

precice::com::SocketCommunication::SocketCommunication ( std::string const & addressDirectory)
explicit

Definition at line 37 of file SocketCommunication.cpp.

◆ ~SocketCommunication()

precice::com::SocketCommunication::~SocketCommunication ( )
override

Definition at line 42 of file SocketCommunication.cpp.

Here is the call graph for this function:

Member Function Documentation

◆ acceptConnection()

void precice::com::SocketCommunication::acceptConnection ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
int acceptorRank,
int rankOffset = 0 )
overridevirtual

Accepts connection from another communicator, which has to call requestConnection().

Establishes a 1-to-N communication, whereas the acceptor's side is the "1". Contrary to acceptConnectionAsServer(), the other side needs to be a proper communicator with ranks from 0 to N-1. It is not necessary to know this "N" a-priori on the acceptor's side. This communication is used for the 1:1 communication between two primary ranks and for the intra-participant communication. For the last case, setRankOffset() has to be set.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.
[in]tagTag for establishing this connection
[in]acceptorRankRank of the accepting process, usually the calling one.

Implements precice::com::Communication.

Definition at line 55 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ acceptConnectionAsServer()

void precice::com::SocketCommunication::acceptConnectionAsServer ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
int acceptorRank,
int requesterCommunicatorSize )
overridevirtual

Accepts connection from another communicator, which has to call requestConnectionAsClient().

Establishes a 1-to-N communication, whereas the acceptor's side is the "1". Contrary to acceptConnection(), the other side can have arbitrary ranks. However, we need to know its size "N" a-priori. This communication is only used in PointToPointCommunication, i.e. for the M-to-N communication between two participants.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.
[in]tagTag for establishing this connection
[in]acceptorRankRank of accepting server, usually the rank of the current process.
[in]requesterCommunicatorSizeSize of the requester (N)

Implements precice::com::Communication.

Definition at line 139 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aReceive() [1/4]

PtrRequest precice::com::SocketCommunication::aReceive ( bool & itemToReceive,
Rank rankSender )
overridevirtual

Asynchronously receives a bool from process with given rank.

Implements precice::com::Communication.

Definition at line 697 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aReceive() [2/4]

PtrRequest precice::com::SocketCommunication::aReceive ( double & itemToReceive,
Rank rankSender )
overridevirtual

Asynchronously receives a double from process with given rank.

Implements precice::com::Communication.

Definition at line 635 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aReceive() [3/4]

PtrRequest precice::com::SocketCommunication::aReceive ( int & itemToReceive,
Rank rankSender )
overridevirtual

Asynchronously receives an int from process with given rank.

Implements precice::com::Communication.

Definition at line 656 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aReceive() [4/4]

PtrRequest precice::com::SocketCommunication::aReceive ( precice::span< double > itemsToReceive,
int rankSender )
overridevirtual

Asynchronously receives an array of double values.

Implements precice::com::Communication.

Definition at line 594 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aSend() [1/5]

PtrRequest precice::com::SocketCommunication::aSend ( const bool & itemToSend,
Rank rankReceiver )
overridevirtual

Asynchronously sends a bool to process with given rank.

Implements precice::com::Communication.

Definition at line 522 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aSend() [2/5]

PtrRequest precice::com::SocketCommunication::aSend ( const double & itemToSend,
Rank rankReceiver )
overridevirtual

Asynchronously sends a double to process with given rank.

Implements precice::com::Communication.

Definition at line 480 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aSend() [3/5]

PtrRequest precice::com::SocketCommunication::aSend ( const int & itemToSend,
Rank rankReceiver )
overridevirtual

Asynchronously sends an int to process with given rank.

Implements precice::com::Communication.

Definition at line 501 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aSend() [4/5]

PtrRequest precice::com::SocketCommunication::aSend ( precice::span< const double > itemsToSend,
Rank rankReceiver )
overridevirtual

Asynchronously sends an array of double values.

Implements precice::com::Communication.

Definition at line 445 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ aSend() [5/5]

PtrRequest precice::com::SocketCommunication::aSend ( precice::span< const int > itemsToSend,
Rank rankReceiver )
overridevirtual

Asynchronously sends an array of integer values.

Implements precice::com::Communication.

Definition at line 410 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ cleanupEstablishment()

void precice::com::SocketCommunication::cleanupEstablishment ( std::string const & acceptorName,
std::string const & requesterName )
overridevirtual

Clean-up environment used to establish the communication.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.

Reimplemented from precice::com::Communication.

Definition at line 397 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ closeConnection()

void precice::com::SocketCommunication::closeConnection ( )
overridevirtual

Disconnects from communication space, i.e. participant.

This method is called on destruction.

Implements precice::com::Communication.

Definition at line 323 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ getIpAddress()

std::string precice::com::SocketCommunication::getIpAddress ( )
private

Definition at line 772 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ getRemoteCommunicatorSize()

size_t precice::com::SocketCommunication::getRemoteCommunicatorSize ( )
overridevirtual

Returns the number of processes in the remote communicator.

Precondition
A connection to the remote participant has been set up.

Implements precice::com::Communication.

Definition at line 48 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ isClient()

bool precice::com::SocketCommunication::isClient ( )
private

◆ isServer()

bool precice::com::SocketCommunication::isServer ( )
private

◆ prepareEstablishment()

void precice::com::SocketCommunication::prepareEstablishment ( std::string const & acceptorName,
std::string const & requesterName )
overridevirtual

Prepare environment used to establish the communication.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to.

Reimplemented from precice::com::Communication.

Definition at line 384 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ receive() [1/6]

void precice::com::SocketCommunication::receive ( bool & itemToReceive,
Rank rankSender )
overridevirtual

Receives a bool from process with given rank.

Implements precice::com::Communication.

Definition at line 681 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ receive() [2/6]

void precice::com::SocketCommunication::receive ( double & itemToReceive,
Rank rankSender )
overridevirtual

Receives a double from process with given rank.

Implements precice::com::Communication.

Definition at line 619 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ receive() [3/6]

void precice::com::SocketCommunication::receive ( int & itemToReceive,
Rank rankSender )
overridevirtual

Receives an int from process with given rank.

Implements precice::com::Communication.

Definition at line 640 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ receive() [4/6]

void precice::com::SocketCommunication::receive ( precice::span< double > itemsToReceive,
Rank rankSender )
overridevirtual

Receives an array of double values.

Implements precice::com::Communication.

Definition at line 578 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ receive() [5/6]

void precice::com::SocketCommunication::receive ( precice::span< int > itemsToReceive,
Rank rankSender )
overridevirtual

Receives an array of integer values.

Implements precice::com::Communication.

Definition at line 562 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ receive() [6/6]

void precice::com::SocketCommunication::receive ( std::string & itemToReceive,
Rank rankSender )
overridevirtual

Receives a std::string from process with given rank.

Implements precice::com::Communication.

Definition at line 541 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ requestConnection()

void precice::com::SocketCommunication::requestConnection ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
int requesterRank,
int requesterCommunicatorSize )
overridevirtual

Connects to another communicator, which has to call acceptConnection().

Establishes a 1-to-N communication, whereas the requestor's side is the "N". Contrary to requestConnectionAsClient(), this side needs to be a proper communicator with ranks from 0 to N-1. All ranks need to call this function. This communication is used for the 1:1 communication between two primary ranks, and for the intra-participant communication.

Parameters
[in]acceptorNameName of remote participant to connect to.
[in]requesterNameName of calling participant.
[in]tagTag for establishing this connection
[in]requesterRankRank of the requester (has to go from 0 to N-1)
[in]requesterCommunicatorSizeSize of the requester (N)

Implements precice::com::Communication.

Definition at line 204 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ requestConnectionAsClient()

void precice::com::SocketCommunication::requestConnectionAsClient ( std::string const & acceptorName,
std::string const & requesterName,
std::string const & tag,
std::set< int > const & acceptorRanks,
int requesterRank )
overridevirtual

Connects to another communicator, which has to call acceptConnectionAsServer().

Establishes a 1-to-N communication, whereas the requestor's side is the "N". Contrary to requestConnection(), this side can have arbitrary ranks (e.g. 2,3,7). All ranks need to call this function. This communication is only used in PointToPointCommunication, i.e. for the M-to-N communication between two participants.

Parameters
[in]acceptorNameName of calling participant.
[in]requesterNameName of remote participant to connect to
[in]tagTag for establishing this connection
[in]acceptorRanksSet of ranks that accept a connection
[in]requesterRankRank that requests the connection, usually the caller's rank

Implements precice::com::Communication.

Definition at line 265 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ send() [1/6]

void precice::com::SocketCommunication::send ( bool itemToSend,
Rank rankReceiver )
overridevirtual

Sends a bool to process with given rank.

Implements precice::com::Communication.

Definition at line 506 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ send() [2/6]

void precice::com::SocketCommunication::send ( double itemToSend,
Rank rankReceiver )
overridevirtual

Sends a double to process with given rank.

Implements precice::com::Communication.

Definition at line 464 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ send() [3/6]

void precice::com::SocketCommunication::send ( int itemToSend,
Rank rankReceiver )
overridevirtual

Sends an int to process with given rank.

Implements precice::com::Communication.

Definition at line 485 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ send() [4/6]

void precice::com::SocketCommunication::send ( precice::span< const double > itemsToSend,
Rank rankReceiver )
overridevirtual

Sends an array of double values.

Implements precice::com::Communication.

Definition at line 429 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ send() [5/6]

void precice::com::SocketCommunication::send ( precice::span< const int > itemsToSend,
Rank rankReceiver )
overridevirtual

Sends an array of integer values.

Implements precice::com::Communication.

Definition at line 368 of file SocketCommunication.cpp.

Here is the call graph for this function:

◆ send() [6/6]

void precice::com::SocketCommunication::send ( std::string const & itemToSend,
Rank rankReceiver )
overridevirtual

Sends a std::string to process with given rank.

Implements precice::com::Communication.

Definition at line 350 of file SocketCommunication.cpp.

Here is the call graph for this function:

Member Data Documentation

◆ _addressDirectory

std::string precice::com::SocketCommunication::_addressDirectory
private

Directory where IP address is exchanged by file.

Definition at line 141 of file SocketCommunication.hpp.

◆ _ioContext

std::shared_ptr<IOContext> precice::com::SocketCommunication::_ioContext
private

Definition at line 147 of file SocketCommunication.hpp.

◆ _log

logging::Logger precice::com::SocketCommunication::_log {"com::SocketCommunication"}
private

Definition at line 130 of file SocketCommunication.hpp.

◆ _networkName

std::string precice::com::SocketCommunication::_networkName
private

Name of network to communicate over.

Definition at line 138 of file SocketCommunication.hpp.

◆ _portNumber

unsigned short precice::com::SocketCommunication::_portNumber
private

Port used for socket connection.

Definition at line 133 of file SocketCommunication.hpp.

◆ _queue

SocketSendQueue precice::com::SocketCommunication::_queue
private

Definition at line 154 of file SocketCommunication.hpp.

◆ _reuseAddress

bool precice::com::SocketCommunication::_reuseAddress
private

Definition at line 135 of file SocketCommunication.hpp.

◆ _sockets

std::map<int, std::shared_ptr<Socket> > precice::com::SocketCommunication::_sockets
private

Remote rank -> socket map.

Definition at line 152 of file SocketCommunication.hpp.

◆ _thread

std::thread precice::com::SocketCommunication::_thread
private

Definition at line 149 of file SocketCommunication.hpp.

◆ _workGuard

std::unique_ptr<WorkGuard> precice::com::SocketCommunication::_workGuard
private

Definition at line 148 of file SocketCommunication.hpp.


The documentation for this class was generated from the following files: