1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
/////////////////////////////////////////////////////////////
// //
// Copyright (c) 2003-2014 by The University of Queensland //
// Centre for Geoscience Computing //
// http://earth.uq.edu.au/centre-geoscience-computing //
// //
// Primary Business: Brisbane, Queensland, Australia //
// Licensed under the Open Software License version 3.0 //
// http://www.apache.org/licenses/LICENSE-2.0 //
// //
/////////////////////////////////////////////////////////////
#include "mpicmdbuf.h"
#include "console.h"
/*!
Constructor. Sets the MPI communicator to be used for broadcast operations and the rank of root process;
\param comm the MPI communicator
\param root the rank of the root process
*/
CMPILCmdBuffer::CMPILCmdBuffer(MPI_Comm comm,int root)
{
int rank;
m_comm=comm;
m_root=root;
MPI_Comm_rank(m_comm, &rank);
m_isroot=(rank==root);
}
/*!
Broadcast a command to all members of the communicator. If the calling process is not the root process, prints an error message and does nothing.
\param cmd the command
*/
void CMPILCmdBuffer::broadcast(int cmd)
{
if(m_isroot){
MPI_Bcast(&cmd,1,MPI_INT,m_root,m_comm);
} else {
console.Error() << "Error in CMPILCmdBuffer::broadcast : trying to broadcast from non-root process !\n";
}
}
/*!
receive broadcast and return the received command
*/
int CMPILCmdBuffer::receive()
{
int cmd;
MPI_Bcast(&cmd,1,MPI_INT,m_root,m_comm);
return cmd;
}
|