Teuchos Package Browser (Single Doxygen Collection) Version of the Day
GlobalMPISession_UnitTests.cpp
Go to the documentation of this file.
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 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 // @HEADER
00041 
00042 #include "Teuchos_GlobalMPISession.hpp"
00043 #include "Teuchos_Array.hpp"
00044 
00045 #ifdef HAVE_MPI
00046 #  include "mpi.h"
00047 #endif
00048 
00049 #include "Teuchos_UnitTestHarness.hpp"
00050 
00051 
00052 //
00053 // Unit tests for GlobalMPISession
00054 //
00055 // NOTE: Becuase this class is used to implement the parallel reduction
00056 // feature of the unit test harness, we can't use that feature here and we
00057 // have to do the global reductions across processes ourselves.
00058 //
00059 
00060 
00061 namespace Teuchos {
00062 
00063 
00064 void globalReduceSuccess(bool &success, FancyOStream &out)
00065 {
00066 #ifdef HAVE_MPI
00067   int globalSumSuccessInt = -1;
00068   int localSuccessInt = (success ? 0 : 1);
00069   MPI_Allreduce(&localSuccessInt, &globalSumSuccessInt, 1,
00070     MPI_INT, MPI_SUM, MPI_COMM_WORLD); 
00071   TEST_EQUALITY_CONST(globalSumSuccessInt, 0);
00072 #endif
00073 }
00074 
00075 
00076 TEUCHOS_UNIT_TEST( GlobalMPISession, basic ) {
00077 #ifdef HAVE_MPI
00078   TEST_ASSERT(GlobalMPISession::mpiIsInitialized());
00079   int numProcs = -1;
00080   ECHO(::MPI_Comm_size(MPI_COMM_WORLD, &numProcs));
00081   TEST_EQUALITY(GlobalMPISession::getNProc(), numProcs);
00082   int procRank = -1;
00083   ECHO(::MPI_Comm_rank(MPI_COMM_WORLD, &procRank));
00084   TEST_EQUALITY(GlobalMPISession::getRank(), procRank);
00085 #else // HAVE_MPI
00086   TEST_ASSERT(!GlobalMPISession::mpiIsInitialized());
00087   TEST_EQUALITY_CONST(GlobalMPISession::getNProc(), 1);
00088   TEST_EQUALITY_CONST(GlobalMPISession::getRank(), 0);
00089 #endif // HAVE_MPI
00090   TEST_ASSERT(!GlobalMPISession::mpiIsFinalized());
00091   globalReduceSuccess(success, out);
00092 }
00093 
00094 
00095 TEUCHOS_UNIT_TEST( GlobalMPISession, barrier ) {
00096   out << "*** Just make sure the basic barrier does not hang or something.\n";
00097   ECHO(GlobalMPISession::barrier());
00098   globalReduceSuccess(success, out);
00099 }
00100 
00101 
00102 TEUCHOS_UNIT_TEST( GlobalMPISession, sum ) {
00103   ECHO(const int globalSum = GlobalMPISession::sum(GlobalMPISession::getRank()+1));
00104   ECHO(const int n = GlobalMPISession::getNProc());
00105   TEST_EQUALITY(globalSum, (n*(n+1))/2);
00106   globalReduceSuccess(success, out);
00107 }
00108 
00109 
00110 TEUCHOS_UNIT_TEST( GlobalMPISession, allGather )
00111 {
00112   const int numProcs = GlobalMPISession::getNProc();
00113   const int procRank = GlobalMPISession::getRank();
00114   {
00115     Array<int> allInts;
00116     ECHO(allInts.resize(numProcs-1));
00117     TEST_THROW(GlobalMPISession::allGather(procRank+1, allInts()), std::out_of_range);
00118     ECHO(allInts.resize(numProcs+1));
00119     TEST_THROW(GlobalMPISession::allGather(procRank+1, allInts()), std::out_of_range);
00120   }
00121   {
00122     Array<int> allInts_expected(numProcs);
00123     for (int k = 0; k < numProcs; ++k) {
00124       allInts_expected[k] = k+1;
00125     }
00126     Array<int> allInts(numProcs);
00127     ECHO(GlobalMPISession::allGather(procRank+1, allInts()));
00128     TEST_EQUALITY(allInts, allInts_expected);
00129   }
00130 }
00131 
00132 
00133 } // namespace Teuchos
00134 
00135 
00136 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines