Teuchos - Trilinos Tools Package Version of the Day
Teuchos_MPISession.cpp
00001 // @HEADER
00002 // ***********************************************************************
00003 //
00004 //                    Teuchos: Common Tools Package
00005 //                 Copyright (2004) Sandia Corporation
00006 //
00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive
00008 // license for use of this work by or on behalf of the U.S. Government.
00009 //
00010 // This library is free software; you can redistribute it and/or modify
00011 // it under the terms of the GNU Lesser General Public License as
00012 // published by the Free Software Foundation; either version 2.1 of the
00013 // License, or (at your option) any later version.
00014 //
00015 // This library is distributed in the hope that it will be useful, but
00016 // WITHOUT ANY WARRANTY; without even the implied warranty of
00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00018 // Lesser General Public License for more details.
00019 //
00020 // You should have received a copy of the GNU Lesser General Public
00021 // License along with this library; if not, write to the Free Software
00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
00023 // USA
00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00025 //
00026 // ***********************************************************************
00027 // @HEADER
00028 
00029 #include "Teuchos_MPISession.hpp"
00030 #include "Teuchos_TestForException.hpp"
00031 
00032 using namespace Teuchos;
00033 
00034 int MPISession::rank_ = 0 ;
00035 int MPISession::nProc_ = 1 ;
00036 
00037 void MPISession::init(int* argc, void*** argv)
00038 {
00039 #ifdef HAVE_MPI
00040   /* initialize MPI */
00041   int mpiHasBeenStarted = 0;
00042   MPI_Initialized(& mpiHasBeenStarted);
00043   int mpierr = 0 ;
00044   if (!mpiHasBeenStarted)
00045     {
00046       mpierr = ::MPI_Init (argc, (char ***) argv);
00047       TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00048                          "Error code=" << mpierr 
00049                          << " detected in MPI_Init()");
00050     }
00051   
00052   /* find rank */
00053   mpierr = ::MPI_Comm_rank (MPI_COMM_WORLD, &rank_);
00054   TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00055                      "Error code=" << mpierr 
00056                      << " detected in MPI_Comm_rank()");
00057 
00058   /* find number of procs */
00059   mpierr = ::MPI_Comm_size (MPI_COMM_WORLD, &nProc_);
00060 
00061   TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00062                      "Error code=" << mpierr 
00063                      << " detected in MPI_Comm_size()");
00064 
00065   /* get machine name */
00066   int nameLen;
00067   char procName[MPI_MAX_PROCESSOR_NAME];
00068   mpierr = ::MPI_Get_processor_name(procName,&nameLen);
00069 
00070   TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00071                      "Error code=" << mpierr 
00072                      << " detected in MPI_Get_processor_name()");
00073 
00074   if (showStartupMessage())
00075     {
00076       std::cerr << "Teuchos::MPISession::init() started processor " 
00077            << procName << std::endl;
00078     }
00079   else
00080     {
00081 #else
00082   std::cerr << "Teuchos::MPISession::init() started serial run" << std::endl;
00083 #endif
00084 #ifdef HAVE_MPI
00085     }
00086 #endif
00087 }
00088 
00089 void MPISession::finalize()
00090 {
00091 #ifdef HAVE_MPI
00092   int mpierr = ::MPI_Finalize();
00093 
00094   TEST_FOR_EXCEPTION(mpierr != 0, std::runtime_error,
00095                      "Error code=" << mpierr << " detected in MPI_Finalize()");
00096 #endif
00097 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines