77 return &this->processCommBuffs[i];
132 return &this->processComms[i];
141 template<
class T >
int packAllData( T *ptr,
int ( T :: *packFunc )(
ProcessCommunicator & ) );
150 template<
class T,
class P >
int packAllData( T *ptr, P *src,
int ( T :: *packFunc )( P *,
ProcessCommunicator & ) );
158 template<
class T >
int unpackAllData( T *ptr,
int ( T :: *unpackFunc )(
ProcessCommunicator & ) );
168 template<
class T,
class P >
int unpackAllData( T *ptr, P *src,
int ( T :: *unpackFunc )( P *,
ProcessCommunicator & ) );
174 int initExchange(
int tag);
181 int initSend(
int tag);
188 int initReceive(
int tag);
193 int finishExchange();
207 std :: string
errorInfo(
const char *func)
const;
210template<
class T >
int
216 result &= pc.packData(ptr, packFunc);
223template <
class T>
int
228 for (
auto &pc : processComms ) result &= pc.packData (ptr, src, packFunc);
233template<
class T,
class P >
int
238 for (
auto &pc : this->processComms ) {
239 result &= pc.packData(ptr, src, packFunc);
245template<
class T >
int
248 int num_recv = 0, result = 1, size =
processComms.size();
252 for (
int i = 0; i < size; i++ ) {
260 while ( num_recv-- ) {
263 bool received =
false;
264 for (
int i = 0; i < size; i++ ) {
268 #ifdef __VERBOSE_PARALLEL
269 OOFEM_LOG_DEBUG(
"[process rank %3d]: %-30s: Received data from partition %3d\n",
270 rank,
"Communicator :: unpackAllData", i);
287 #ifdef __VERBOSE_PARALLEL
291 MPI_Barrier(MPI_COMM_WORLD);
293 #ifdef __VERBOSE_PARALLEL
302template <
class T>
int
305 int num_recv = 0, result = 1, size = processComms.size();
309 for (
int i = 0; i < size; i++) {
311 if ( processComms[i].giveToRecvMap()->giveSize() || this->mode ==
CommMode_Dynamic) {
320 bool received =
false;
321 for (
int i = 0; i < size; i++ ) {
324 if ( processComms[i].receiveCompleted() ) {
326#ifdef __VERBOSE_PARALLEL
327 OOFEM_LOG_DEBUG(
"[process rank %3d]: %-30s: Received data from partition %3d\n",
328 rank,
"Communicator :: unpackAllData", i);
332 result &= processComms[i].unpackData (ptr, dest, unpackFunc);
342#ifdef __VERBOSE_PARALLEL
346 MPI_Barrier (MPI_COMM_WORLD);
348#ifdef __VERBOSE_PARALLEL
356template<
class T,
class P >
int
359 int num_recv = 0, result = 1, size =
processComms.size();
363 for (
int i = 0; i < size; i++ ) {
371 while ( num_recv-- ) {
374 bool received =
false;
375 for (
int i = 0; i < size; i++ ) {
379 #ifdef __VERBOSE_PARALLEL
380 OOFEM_LOG_DEBUG(
"[process rank %3d]: %-30s: Received data from partition %3d\n",
381 rank,
"Communicator :: unpackAllData", i);
385 result &=
processComms[i].unpackData(ptr, dest, unpackFunc);
398 #ifdef __VERBOSE_PARALLEL
402 MPI_Barrier(MPI_COMM_WORLD);
404 #ifdef __VERBOSE_PARALLEL
ProcessCommunicatorBuff * giveProcessCommunicatorBuff(int i)
CommunicatorBuff(int s, CommBuffType t=CBT_static)
std::vector< ProcessCommunicatorBuff > processCommBuffs
Array of process communicators.
EngngModel * engngModel
Engineering model.
CommunicatorMode mode
Mode.
std::vector< ProcessCommunicator > processComms
Array of process communicators.
ProcessCommunicator * giveProcessCommunicator(int i)
Communicator(EngngModel *emodel, CommunicatorBuff *buff, int rank, int size, CommunicatorMode mode=CommMode_Static)
virtual void setUpCommunicationMaps(EngngModel *pm)
virtual ~Communicator()
Destructor.
#define OOFEM_LOG_DEBUG(...)
std::string errorInfo(const char *func)
#define VERBOSEPARALLEL_PRINT(service, str, rank)