PlayaMPISession.cpp

00001 // @HEADER
00002 // @HEADER
00003 
00004 #include "PlayaMPISession.hpp"
00005 #include "PlayaMPIDataType.hpp"
00006 #include "PlayaMPIOp.hpp"
00007 #include "Teuchos_Assert.hpp"
00008 
00009 namespace Playa
00010 {
00011 using namespace Teuchos;
00012 
00013 int MPISession::rank_ = 0 ;
00014 int MPISession::nProc_ = 1 ;
00015 
00016 MPISession::MPISession(int* argc, char*** argv)
00017 {
00018   #ifdef HAVE_MPI
00019   /* initialize MPI */
00020   int mpiHasBeenStarted = 0;
00021   MPI_Initialized(& mpiHasBeenStarted);
00022   int mpierr = 0 ;
00023   if (!mpiHasBeenStarted)
00024     {
00025       mpierr = ::MPI_Init (argc, (char ***) argv);
00026       TEUCHOS_TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00027                          "Error code=" << mpierr 
00028                          << " detected in MPI_Init()");
00029     }
00030   
00031   /* find rank */
00032   mpierr = ::MPI_Comm_rank (MPI_COMM_WORLD, &rank_);
00033   TEUCHOS_TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00034                      "Error code=" << mpierr 
00035                      << " detected in MPI_Comm_rank()");
00036 
00037   /* find number of procs */
00038   mpierr = ::MPI_Comm_size (MPI_COMM_WORLD, &nProc_);
00039 
00040   TEUCHOS_TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00041                      "Error code=" << mpierr 
00042                      << " detected in MPI_Comm_size()");
00043 
00044   /* get machine name */
00045   int nameLen;
00046   char procName[MPI_MAX_PROCESSOR_NAME];
00047   mpierr = ::MPI_Get_processor_name(procName,&nameLen);
00048 
00049   TEUCHOS_TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00050                      "Error code=" << mpierr 
00051                      << " detected in MPI_Get_processor_name()");
00052 
00053   if (showStartupMessage())
00054     {
00055       std::cerr << "Playa::MPISession::init() started processor " 
00056            << procName << std::endl;
00057     }
00058   else
00059     {
00060 #else
00061   std::cerr << "Playa::MPISession::init() started serial run" << std::endl;
00062 #endif
00063 #ifdef HAVE_MPI
00064     }
00065 #endif
00066 }
00067 
00068 
00069 void MPISession::init(int* argc, char*** argv)
00070 {
00071   static RCP<MPISession> session = rcp(new MPISession(argc, argv));
00072 }
00073 
00074 void MPISession::init(int* argc, void*** argv)
00075 {
00076   MPISession::init(argc, (char***)argv);
00077 }
00078 
00079 void MPISession::finalize()
00080 {
00081   // nothing to do here
00082 }
00083 
00084 
00085 MPISession::~MPISession()
00086 {
00087 #ifdef HAVE_MPI
00088   int mpiHasBeenFinalized = 0;
00089   MPI_Finalized(& mpiHasBeenFinalized);
00090 
00091   if (!mpiHasBeenFinalized)
00092   {
00093 #define BROKEN_MPI_REGISTRIES
00094 #ifndef BROKEN_MPI_REGISTRIES
00095     MPIDataType::clearTypeRegistry();
00096     MPIOp::clearOpRegistry();
00097 #endif
00098     int mpierr = ::MPI_Finalize();
00099     
00100     TEUCHOS_TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00101       "Error code=" << mpierr << " detected in MPI_Finalize()");
00102   }
00103 #endif
00104 }
00105 
00106 }

doxygen