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 void MPISession::init(int* argc, void*** 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 void MPISession::finalize()
00069 {
00070 #ifdef HAVE_MPI
00071 MPIDataType::clearTypeRegistry();
00072 MPIOp::clearOpRegistry();
00073
00074 int mpierr = ::MPI_Finalize();
00075
00076 TEUCHOS_TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00077 "Error code=" << mpierr << " detected in MPI_Finalize()");
00078 #endif
00079 }
00080
00081
00082 }