22 _addressDirectory =
".";
40 std::string
const &requesterName,
41 std::string
const &tag,
55 res = MPI_Open_port(MPI_INFO_NULL, sm.
data());
68 res = MPI_Comm_accept(
const_cast<char *
>(
_portName.c_str()), MPI_INFO_NULL, 0, MPI_COMM_SELF, &
communicator);
73 int requesterRank = -1;
74 MPI_Recv(&requesterRank, 1, MPI_INT, 0, 42,
communicator, MPI_STATUS_IGNORE);
76 int requesterCommunicatorSize = -1;
77 MPI_Recv(&requesterCommunicatorSize, 1, MPI_INT, 0, 42,
communicator, MPI_STATUS_IGNORE);
79 MPI_Send(&acceptorRank, 1, MPI_INT, 0, 42,
communicator);
82 if (peerCurrent == 0) {
83 peerCount = requesterCommunicatorSize;
87 "Requester communicator size is {} which is invalid.", requesterCommunicatorSize);
89 "Current requester size from rank {} is {} but should be {}", requesterRank, requesterCommunicatorSize, peerCount);
91 "Rank {} has already been connected. Duplicate requests are not allowed.", requesterRank);
95 }
while (++peerCurrent < peerCount);
97 res = MPI_Close_port(
const_cast<char *
>(
_portName.c_str()));
106 std::string
const &requesterName,
107 std::string
const &tag,
109 int requesterCommunicatorSize)
111 PRECICE_TRACE(acceptorName, requesterName, acceptorRank, requesterCommunicatorSize);
112 PRECICE_ASSERT(requesterCommunicatorSize >= 0,
"Requester communicator size has to be positive.");
119 res = MPI_Open_port(MPI_INFO_NULL, sm.
data());
127 for (
int connection = 0; connection < requesterCommunicatorSize; ++connection) {
129 res = MPI_Comm_accept(
const_cast<char *
>(
_portName.c_str()), MPI_INFO_NULL, 0, MPI_COMM_SELF, &
communicator);
134 int requesterRank = -1;
135 MPI_Recv(&requesterRank, 1, MPI_INT, 0, 42,
communicator, MPI_STATUS_IGNORE);
143 res = MPI_Close_port(
const_cast<char *
>(
_portName.c_str()));
152 std::string
const &requesterName,
153 std::string
const &tag,
155 int requesterCommunicatorSize)
174 MPI_Send(&requesterRank, 1, MPI_INT, 0, 42,
communicator);
176 MPI_Send(&requesterCommunicatorSize, 1, MPI_INT, 0, 42,
communicator);
178 int acceptorRank = -1;
179 MPI_Recv(&acceptorRank, 1, MPI_INT, 0, 42,
communicator, MPI_STATUS_IGNORE);
190 std::string
const &requesterName,
191 std::string
const &tag,
192 std::set<int>
const &acceptorRanks,
196 PRECICE_TRACE(acceptorName, requesterName, acceptorRanks, requesterRank);
201 for (
int acceptorRank : acceptorRanks) {
212 MPI_Send(&requesterRank, 1, MPI_INT, 0, 42,
communicator);
224 if (not isConnected())
230 "MPI_Comm_disconnect failed with message: {}", res.
message());
240 std::string
const &requesterName)
242 using namespace std::filesystem;
244 PRECICE_DEBUG(
"Creating connection exchange directory {}", dir.generic_string());
246 create_directories(dir);
247 }
catch (
const std::filesystem::filesystem_error &e) {
248 PRECICE_WARN(
"Creating directory for connection info failed with: {}", e.what());
253 std::string
const &requesterName)
255 using namespace std::filesystem;
257 PRECICE_DEBUG(
"Removing connection exchange directory {}", dir.generic_string());
260 }
catch (
const std::filesystem::filesystem_error &e) {
261 PRECICE_WARN(
"Cleaning up connection info failed with: {}", e.what());
#define PRECICE_WARN_IF(condition,...)
#define PRECICE_WARN(...)
#define PRECICE_DEBUG(...)
#define PRECICE_TRACE(...)
#define PRECICE_CHECK(check,...)
#define PRECICE_ASSERT(...)
Reads the connection info for the given participant/rank information.
std::string read() const
Reads the info from the connection info file. Will block, if the the file is not present.
Writes the connection info for the given participant/rank information.
void write(std::string_view info) const
Write the string info, e.g. IP:port to the connection info file.
void closeConnection() override
void acceptConnection(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int rankOffset=0) override
void prepareEstablishment(std::string const &acceptorName, std::string const &requesterName) override
void acceptConnectionAsServer(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int acceptorRank, int requesterCommunicatorSize) override
void requestConnectionAsClient(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, std::set< int > const &acceptorRanks, int requesterRank) override
void cleanupEstablishment(std::string const &acceptorName, std::string const &requesterName) override
std::map< int, MPI_Comm > _communicators
Remote rank -> communicator map.
~MPIPortsCommunication() override
MPIPortsCommunication(std::string addressDirectory=".")
std::string _portName
Name of the port used for connection.
MPI_Comm & communicator(Rank rank) override
Returns the communicator.
std::string _addressDirectory
Rank rank(int rank) override
size_t getRemoteCommunicatorSize() override
void requestConnection(std::string const &acceptorName, std::string const &requesterName, std::string const &tag, int requesterRank, int requesterCommunicatorSize) override
Utility class to build a string from C functions with output pointers and static maximum length.
std::string localDirectory(std::string_view acceptorName, std::string_view requesterName, std::string_view addressDirectory)
contains the data communication abstraction layer.
void setRankOffset(Rank rankOffset)
Set rank offset.
std::string message() const