|
Teuchos Package Browser (Single Doxygen Collection)
Version of the Day
|
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
1.7.6.1