PlayaMPISession.cpp
00001
00002
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
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
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
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
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
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 }