13 #ifdef HAVE_TEUCHOS_MPI
15 #endif // HAVE_TEUCHOS_MPI
19 template<
class PacketType>
27 typedef PacketType packet_type;
32 out <<
"Testing Teuchos::scatter<int, "
33 << TypeNameTraits<packet_type>::name ()
34 <<
"> with root = " << root << endl;
38 int gblSuccess = lclSuccess;
40 #ifdef HAVE_TEUCHOS_MPI
41 using Teuchos::MpiComm;
42 int errCode = MPI_SUCCESS;
44 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
46 (mpiComm == NULL, std::logic_error,
"Building with MPI, but default "
47 "communicator is not a Teuchos::MpiComm!");
48 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
49 #endif // HAVE_TEUCHOS_MPI
53 const int myRank = comm.
getRank ();
54 const int numProcs = comm.
getSize ();
55 const int sendCount = 10;
56 const int recvCount = 10;
58 out <<
"Initializing receive buffer (on all processes)" << endl;
62 for (
int i = 0; i < recvCount; ++i) {
66 out <<
"Filling send buffer (on root process only)" << endl;
73 sendBuf.
resize (sendCount * numProcs);
78 for (
int p = 0; p < numProcs; ++p) {
79 for (
int k = 0; k < sendCount; ++k) {
80 const packet_type val =
static_cast<packet_type
> (p+1) *
81 (ONE + static_cast<packet_type> (k));
82 sendBuf[p*sendCount + k] = val;
85 }
catch (std::exception& e) {
86 std::cerr <<
"Root process " << root <<
" threw an exception: "
92 #ifdef HAVE_TEUCHOS_MPI
96 gblSuccess = lclSuccess;
97 errCode = MPI_Bcast (&gblSuccess, 1, MPI_INT, root, rawMpiComm);
99 (errCode != MPI_SUCCESS, std::logic_error,
"MPI_Bcast failed!");
101 (gblSuccess != 1, std::logic_error,
"Filling the send buffer failed on "
102 "the root (" << root <<
") process! This probably indicates a bug in "
104 #endif // HAVE_TEUCHOS_MPI
107 out <<
"About to invoke scatter" << endl;
108 scatter<int, packet_type> (sendBuf.
getRawPtr (), sendCount,
111 out <<
"Done with scatter" << endl;
114 for (
int k = 0; k < recvCount; ++k) {
115 const packet_type expectedVal =
static_cast<packet_type
> (myRank+1) *
116 (ONE + static_cast<packet_type> (k));
119 lclSuccess = success ? 1 : 0;
120 gblSuccess = lclSuccess;
130 #ifdef HAVE_TEUCHOS_MPI
131 errCode = MPI_Allreduce (&lclSuccess, &gblSuccess, 1,
132 MPI_INT, MPI_MIN, rawMpiComm);
134 (errCode != MPI_SUCCESS, std::logic_error,
"MPI_Allreduce failed!");
135 #else // HAVE_TEUCHOS_MPI
137 (comm.
getSize () != 1, std::logic_error,
"Not building with MPI, but "
138 "communicator has size = " << comm.
getSize () <<
" != 1. We don't know "
139 "how to test this case.");
141 (comm.
getRank () != root, std::logic_error,
"Not building with MPI, but "
142 "the one process of rank " << comm.
getRank () <<
" is not the root "
143 "process of rank " << root <<
". We don't know how to test this case.");
144 #endif // HAVE_TEUCHOS_MPI
146 return gblSuccess == 1;
155 typedef PacketType packet_type;
158 out <<
"Testing Teuchos::scatter" << endl;
162 const int numProcs = comm->getSize ();
166 for (
int root = 0; root < numProcs; ++root) {
167 out <<
"Test for root = " << root << endl;
168 const bool curSuccess = testScatter<packet_type> (success, out, root, *comm);
170 success = success && curSuccess;
174 out <<
"Done with test!" << endl;
virtual int getSize() const =0
Returns the number of processes that make up this communicator.
virtual int getRank() const =0
Returns the rank of this process.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
#define TEUCHOS_UNIT_TEST_TEMPLATE_1_DECL(TEST_GROUP, TEST_NAME, TYPE)
Macro for defining a templated unit test with one template parameter.
Teuchos header file which uses auto-configuration information to include necessary C++ headers...
#define TEST_EQUALITY(v1, v2)
Assert the equality of v1 and v2.
T * getRawPtr()
Return a raw pointer to beginning of array or NULL if unsized.
static Teuchos::RCP< const Comm< OrdinalType > > getComm()
Return the default global communicator.
Tabbing class for helping to create formated, indented output for a basic_FancyOStream object...
bool testScatter(bool &success, std::ostream &out, const int root, const Teuchos::Comm< int > &comm)
Implementation of Teuchos wrappers for MPI.
#define TEST_EQUALITY_CONST(v1, v2)
Assert the equality of v1 and constant v2.
void resize(size_type new_size, const value_type &x=value_type())
Default traits class that just returns typeid(T).name().
static T zero()
Returns representation of zero for this scalar type.
TEUCHOSCOMM_LIB_DLL_EXPORT void scatter(const int sendBuf[], const int sendCount, int recvBuf[], const int recvCount, const int root, const Comm< int > &comm)
#define TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT(TEST_GROUP, TEST_NAME, TYPE)
Instantiate a templated unit test with one template parameter.
Smart reference counting pointer class for automatic garbage collection.
static T one()
Returns representation of one for this scalar type.
Replacement for std::vector that is compatible with the Teuchos Memory Management classes...