54 #ifdef HAVE_TEUCHOS_MPI
58 #ifdef HAVE_TEUCHOS_QD
59 # include <qd/dd_real.h>
65 template <
typename Packet>
66 ostream &
operator<< ( ostream& os,
const pair<Packet, Packet>& arg)
68 os <<
"(" << arg.first <<
"," << arg.second <<
")";
79 template<
typename Packet>
83 typedef std::pair<typename PST::magnitudeType, typename PST::magnitudeType>
magnitudeType;
88 static inline magnitudeType magnitude(std::pair<Packet,Packet> a) {
return std::pair<Packet,Packet>( PST::magnitude(a.first), PST::magnitude(a.second) ); }
89 static inline std::pair<Packet,Packet>
zero() {
return std::pair<Packet,Packet>(PST::zero(),PST::zero()); }
90 static inline std::pair<Packet,Packet>
one() {
return std::pair<Packet,Packet>(PST::one(), PST::one()); }
91 static inline std::pair<Packet,Packet>
conjugate(std::pair<Packet,Packet> x) {
return std::pair<Packet,Packet>(PST::conjugate(x.first), PST::conjugate(x.second) ); }
92 static inline std::pair<Packet,Packet>
real(std::pair<Packet,Packet> x) {
return std::pair<Packet,Packet>(PST::real(x.first), PST::real(x.second) ); }
93 static inline std::pair<Packet,Packet>
imag(std::pair<Packet,Packet> x) {
return std::pair<Packet,Packet>(PST::imag(x.first), PST::imag(x.second) ); }
94 static inline bool isnaninf(std::pair<Packet,Packet> x) {
return PST::isnaninf(x.first) || PST::isnaninf(x.second); }
95 static inline void seedrandom(
unsigned int s) { PST::seedrandom(s); }
96 static inline std::pair<Packet,Packet>
random() {
return std::pair<Packet,Packet>( PST::random(), PST::random() ); }
98 static inline std::pair<Packet,Packet>
squareroot(std::pair<Packet,Packet> x) {
return std::pair<Packet,Packet>(PST::squareroot(x.first), PST::squareroot(x.second)); }
99 static inline std::pair<Packet,Packet>
pow(std::pair<Packet,Packet> x, std::pair<Packet,Packet> y) {
return std::pair<Packet,Packet>( PST::pow(x.first,y.first), PST::pow(x.second,y.second) ); }
102 template<
class Packet,
class ConvertToPacket>
105 static std::pair<Packet,Packet>
convert(
const ConvertToPacket t )
107 return std::pair<Packet,Packet>(t,t);
109 static std::pair<Packet,Packet>
safeConvert(
const ConvertToPacket t )
111 return std::pair<Packet,Packet>(t,t);
130 using Teuchos::outArg;
136 double errorTolSlack = 1e+1;
148 "test-mpi",
"test-serial", &testMpi,
149 "Test MPI (if available) or force test of serial. In a serial build,"
150 " this option is ignored and a serial comm is always used." );
153 "error-tol-slack", &errorTolSlack,
154 "Slack off of machine epsilon used to check test results" );
159 template<
class Ordinal>
160 RCP<const Comm<Ordinal> > getDefaultComm()
163 return DefaultComm<Ordinal>::getComm();
171 RCP<const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
172 out <<
"comm = " << Teuchos::describe(*comm);
177 #ifdef HAVE_TEUCHOS_MPI
182 ECHO(MPI_Comm rawMpiComm = MPI_COMM_WORLD);
183 ECHO(
const RCP<
const Comm<int> > comm =
184 Teuchos::createMpiComm<int>(Teuchos::opaqueWrapper(rawMpiComm)));
185 out <<
"comm = " << Teuchos::describe(*comm);
186 ECHO(MPI_Comm rawMpiComm2 = Teuchos::getRawMpiComm<int>(*comm));
191 #endif // HAVE_TEUCHOS_MPI
197 using Teuchos::broadcast;
201 using Teuchos::rcpFromRef;
202 using Teuchos::outArg;
209 using Teuchos::arcpClone;
210 using Teuchos::rcp_dynamic_cast;
217 RCP<const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
218 const Ordinal numProcs =
size(*comm);
219 const Ordinal procRank =
rank(*comm);
227 out <<
"\nThis is Teuchos::SerialComm which does not support readySend!\n";
231 PT::seedrandom(as<unsigned int>(procRank));
232 Packet origSendData = PT::random();
233 Packet origRecvData = PT::random();
234 broadcast<Ordinal, Packet>( *comm, 0,
outArg(origSendData) );
236 Packet sendData = origSendData;
237 Packet recvData = origRecvData;
239 RCP<Teuchos::CommRequest<Ordinal> > recvRequest;
244 recvRequest = ireceive<Ordinal, Packet>(
246 rcp(&recvData,
false),
252 if (procRank == numProcs-1) {
255 readySend<Ordinal, Packet>(
284 int globalSuccess_int = -1;
293 using Teuchos::broadcast;
297 using Teuchos::rcpFromRef;
298 using Teuchos::outArg;
305 using Teuchos::arcpClone;
306 using Teuchos::rcp_dynamic_cast;
312 RCP<const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
313 const Ordinal numProcs =
size(*comm);
314 const Ordinal procRank =
rank(*comm);
322 out <<
"\nThis is Teuchos::SerialComm which does not support readySend!\n";
326 const int dataLen = 3;
328 const ArrayRCP<Packet> origSendData = arcp<Packet>(dataLen);
329 const ArrayRCP<Packet> origRecvData = arcp<Packet>(dataLen);
330 PT::seedrandom(as<unsigned int>(procRank));
331 for (
int j = 0; j < dataLen; ++j) {
332 origSendData[j] = PT::random();
333 origRecvData[j] = PT::random();
335 broadcast<Ordinal, Packet>( *comm, 0, origSendData() );
337 const ArrayRCP<Packet> sendData = arcpClone<Packet>(origSendData());
338 const ArrayRCP<Packet> recvData = arcpClone<Packet>(origRecvData());
340 RCP<Teuchos::CommRequest<Ordinal> > recvRequest;
352 recvRequest = ireceive<Ordinal, Packet>(
354 recvData.persistingView(0, dataLen),
358 else if (procRank == numProcs-1) {
360 recvRequest = ireceive<Ordinal, Packet>(
362 recvData.persistingView(0, dataLen),
371 readySend<Ordinal, Packet>(
377 else if (procRank == numProcs-1) {
387 else if (procRank == numProcs-1) {
390 readySend<Ordinal, Packet>(
402 if (procRank == 0 || procRank == numProcs-1) {
413 int globalSuccess_int = -1;
422 using Teuchos::rcpFromRef;
423 using Teuchos::outArg;
428 using Teuchos::rcp_dynamic_cast;
434 RCP<const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
435 const Ordinal numProcs =
size(*comm);
436 const Ordinal procRank =
rank(*comm);
444 out <<
"\nThis is Teuchos::SerialComm which does not yet support isend/ireceive!\n";
449 Packet orig_input_data = PT::random();
452 const Packet orig_output_data = as<Packet>(-1);
454 const Packet input_data = orig_input_data;
455 Packet output_data = orig_output_data;
457 RCP<Teuchos::CommRequest<Ordinal> > recvRequest;
458 RCP<Teuchos::CommRequest<Ordinal> > sendRequest;
460 out <<
"Exchanging messages" << endl;
465 sendRequest = isend<Ordinal, Packet>(
466 *comm,
Teuchos::rcp(
new Packet(input_data)), numProcs-1);
468 if (procRank == numProcs-1) {
470 recvRequest = ireceive<Ordinal, Packet>(
474 out <<
"Waiting for messages" << endl;
479 if (procRank == numProcs-1) {
486 out <<
"Testing message correctness" << endl;
488 if (procRank == numProcs-1) {
497 int globalSuccess_int = -1;
506 using Teuchos::rcpFromRef;
507 using Teuchos::outArg;
509 using Teuchos::arcpClone;
514 using Teuchos::broadcast;
516 using Teuchos::rcp_dynamic_cast;
523 RCP<const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
524 const Ordinal numProcs =
size(*comm);
525 const Ordinal procRank =
rank(*comm);
533 out <<
"\nThis is Teuchos::SerialComm which does not yet support isend/ireceive!\n";
537 const int numSendRecv = 4;
538 const int sendLen = 3;
540 cerr <<
"Creating data" << endl;
542 const ArrayRCP<Packet> origInputData = arcp<Packet>(numSendRecv*sendLen);
543 const ArrayRCP<Packet> origOutputData = arcp<Packet>(numSendRecv*sendLen);
546 for (
int i = 0; i < numSendRecv; ++i, offset += sendLen) {
547 const ArrayRCP<Packet> origInputData_i =
548 origInputData.persistingView(offset, sendLen);
549 const ArrayRCP<Packet> origOutputData_i =
550 origOutputData.persistingView(offset, sendLen);
551 for (
int j = 0; j < sendLen; ++j) {
552 origInputData_i[j] = PT::random();
553 origOutputData_i[j] = PT::random();
557 cerr <<
"Broadcasting data" << endl;
558 broadcast<Ordinal, Packet>( *comm, 0, origInputData() );
560 const ArrayRCP<Packet> inputData = arcpClone<Packet>(origInputData());
561 const ArrayRCP<Packet> outputData = arcpClone<Packet>(origOutputData());
563 Array<RCP<Teuchos::CommRequest<Ordinal> > > recvRequests;
564 Array<RCP<Teuchos::CommRequest<Ordinal> > > sendRequests;
566 cerr <<
"Exchanging data" << endl;
573 for (
int i = 0; i < numSendRecv; ++i, offset += sendLen) {
574 sendRequests.push_back(
575 isend<Ordinal, Packet>(
577 arcpClone<Packet>(inputData(offset, sendLen)),
585 if (procRank == numProcs-1) {
588 for (
int i = 0; i < numSendRecv; ++i, offset += sendLen) {
589 recvRequests.push_back(
590 ireceive<Ordinal, Packet>(
591 *comm, outputData.persistingView(offset, sendLen), 0
597 cerr <<
"Waiting on messages" << endl;
600 waitAll( *comm, sendRequests() );
602 if (procRank == numProcs-1) {
603 waitAll( *comm, recvRequests() );
606 cerr <<
"Testing received data" << endl;
608 if (!sendRequests.empty()) {
609 for (
int i = 0; i < numSendRecv; ++i) {
614 if (!recvRequests.empty()) {
615 for (
int i = 0; i < numSendRecv; ++i) {
621 if (procRank == numProcs-1) {
630 int globalSuccess_int = -1;
638 RCP< const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
639 int initialRank = comm->getRank();
640 int initialSize = comm->getSize();
642 RCP< const Comm<Ordinal> > newComm = comm->duplicate();
650 RCP< const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
651 int initialRank = comm->getRank();
652 int initialSize = comm->getSize();
657 RCP< const Comm<Ordinal> > newComm = comm->split(initialRank % 2, 0);
660 int halfSize = initialSize / 2;
661 int newSize = newComm->getSize();
662 int newRank = newComm->getRank();
663 if (initialSize % 2 == 0) {
667 TEST_EQUALITY(newSize, initialRank % 2 == 0 ? halfSize + 1 : halfSize);
672 RCP< const Comm<Ordinal> > shouldBeNull = comm->split(-1, 0);
680 template<
typename ValueType>
681 class MonotoneSequence
683 ValueType currentValue_;
685 typedef ValueType value_type;
687 MonotoneSequence(
const value_type& initialValue) : currentValue_(initialValue)
690 value_type operator()()
692 return currentValue_++;
701 RCP< const Comm<Ordinal> > comm = getDefaultComm<Ordinal>();
702 int initialRank = comm->getRank();
703 int initialSize = comm->getSize();
706 std::vector< int > ranks(initialSize);
707 std::generate(ranks.begin(), ranks.end(), MonotoneSequence<int>(0));
708 std::reverse(ranks.begin(), ranks.end());
709 RCP< const Comm<Ordinal> > newComm = comm->createSubcommunicator(ranks);
711 int expectedNewRank = initialSize - initialRank - 1;
715 std::vector<int> rank0Only(1, 0);
716 RCP< const Comm<Ordinal> > rank0Comm = comm->createSubcommunicator(rank0Only);
718 if (initialRank == 0) {
726 #ifdef HAVE_TEUCHOS_MPI
731 using Teuchos::tuple;
using Teuchos::inoutArg;
735 const int comm_size = defaultComm->getSize();
736 const int comm_rank = defaultComm->getRank();
745 defaultComm->createSubcommunicator(tuple<int>(0, 1)());
747 if (comm_rank <= 1) {
749 const int masterComm_size = masterComm->getSize();
750 (void) masterComm_size;
751 const int masterComm_rank = masterComm->getRank();
755 masterComm->createSubcommunicator(tuple<int>(0, 1)());
757 masterComm->createSubcommunicator(tuple<int>(0)());
761 masterComm->createSubcommunicator(tuple<int>(0, 1)());
764 int my_tag = Teuchos::rcp_dynamic_cast<
const Teuchos::MpiComm<int> >(
769 if (masterComm_rank == 0) { tag1 = my_tag; }
770 masterComm->barrier();
771 Teuchos::broadcast( *masterComm, 0,
inoutArg(tag1) );
774 if (masterComm_rank == 1) { tag2 = my_tag; }
775 masterComm->barrier();
776 Teuchos::broadcast( *masterComm, 1,
inoutArg(tag2) );
786 #endif // HAVE_TEUCHOS_MPI
794 #ifdef HAVE_TEUCHOS_COMPLEX
795 # define UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(TEST_GROUP, TEST_NAME, ORDINAL)\
796 typedef std::complex<float> ComplexFloat; \
797 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT(TEST_GROUP, TEST_NAME, ORDINAL, ComplexFloat)
798 # define UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(TEST_GROUP, TEST_NAME, ORDINAL)\
799 typedef std::complex<double> ComplexDouble; \
800 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT(TEST_GROUP, TEST_NAME, ORDINAL, ComplexDouble)
802 # define UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(TEST_GROUP, TEST_NAME, ORDINAL)
803 # define UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(TEST_GROUP, TEST_NAME, ORDINAL)
807 #define UNIT_TEST_GROUP_ORDINAL_PACKET( ORDINAL, PACKET ) \
808 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, NonblockingSendReceive, ORDINAL, PACKET ) \
809 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, NonblockingSendReceiveSet, ORDINAL, PACKET ) \
810 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, ReadySend1, ORDINAL, PACKET ) \
811 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, ReadySend, ORDINAL, PACKET )
813 #ifdef HAVE_TEUCHOS_QD
814 # define UNIT_TEST_GROUP_ORDINAL_QD(ORDINAL) \
815 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, dd_real) \
816 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, qd_real)
818 # define UNIT_TEST_GROUP_ORDINAL_QD(ORDINAL)
821 #define UNIT_TEST_GROUP_ORDINAL_PAIROFPACKETS( ORDINAL, PAIROFPACKETS ) \
822 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, NonblockingSendReceive, ORDINAL, PAIROFPACKETS ) \
823 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, NonblockingSendReceiveSet, ORDINAL, PAIROFPACKETS ) \
824 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, ReadySend1, ORDINAL, PAIROFPACKETS ) \
825 TEUCHOS_UNIT_TEST_TEMPLATE_2_INSTANT( DefaultMpiComm, ReadySend, ORDINAL, PAIROFPACKETS )
827 #define UNIT_TEST_GROUP_ORDINAL_SUBCOMMUNICATORS( ORDINAL ) \
828 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( DefaultMpiComm, duplicate, ORDINAL ) \
829 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( DefaultMpiComm, split, ORDINAL ) \
830 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( DefaultMpiComm, createSubcommunicator, ORDINAL )
833 typedef std::pair<short, short> PairOfShorts;
834 typedef std::pair<int,int> PairOfInts;
835 typedef std::pair<float,float> PairOfFloats;
836 typedef std::pair<double,double> PairOfDoubles;
844 #ifdef FAST_DEVELOPMENT_UNIT_TEST_BUILD
846 # define UNIT_TEST_GROUP_ORDINAL( ORDINAL ) \
847 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, double) \
848 UNIT_TEST_GROUP_ORDINAL_PAIROFPACKETS(ORDINAL, PairOfDoubles) \
852 #else // FAST_DEVELOPMENT_UNIT_TEST_BUILD
854 # define UNIT_TEST_GROUP_ORDINAL( ORDINAL ) \
855 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( DefaultMpiComm, basic, ORDINAL ) \
856 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, short) \
857 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, int) \
858 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, float) \
859 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, double) \
860 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(DefaultMpiComm, NonblockingSendReceive, ORDINAL) \
861 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(DefaultMpiComm, ReadySend1, ORDINAL) \
862 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(DefaultMpiComm, ReadySend, ORDINAL) \
863 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(DefaultMpiComm, NonblockingSendReceive, ORDINAL) \
864 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(DefaultMpiComm, ReadySend1, ORDINAL) \
865 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(DefaultMpiComm, ReadySend, ORDINAL) \
866 UNIT_TEST_GROUP_ORDINAL_SUBCOMMUNICATORS(ORDINAL)
868 # define UNIT_TEST_GROUP_ORDINAL_WITH_PAIRS_AND_QD( ORDINAL ) \
869 TEUCHOS_UNIT_TEST_TEMPLATE_1_INSTANT( DefaultMpiComm, basic, ORDINAL ) \
870 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, short) \
871 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, int) \
872 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, float) \
873 UNIT_TEST_GROUP_ORDINAL_PACKET(ORDINAL, double) \
874 UNIT_TEST_GROUP_ORDINAL_QD(ORDINAL) \
875 UNIT_TEST_GROUP_ORDINAL_PAIROFPACKETS(ORDINAL, PairOfShorts) \
876 UNIT_TEST_GROUP_ORDINAL_PAIROFPACKETS(ORDINAL, PairOfInts) \
877 UNIT_TEST_GROUP_ORDINAL_PAIROFPACKETS(ORDINAL, PairOfFloats) \
878 UNIT_TEST_GROUP_ORDINAL_PAIROFPACKETS(ORDINAL, PairOfDoubles) \
879 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(DefaultMpiComm, NonblockingSendReceive, ORDINAL) \
880 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(DefaultMpiComm, ReadySend1, ORDINAL) \
881 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_FLOAT(DefaultMpiComm, ReadySend, ORDINAL) \
882 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(DefaultMpiComm, NonblockingSendReceive, ORDINAL) \
883 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(DefaultMpiComm, ReadySend1, ORDINAL) \
884 UNIT_TEST_TEMPLATE_2_INSTANT_COMPLEX_DOUBLE(DefaultMpiComm, ReadySend, ORDINAL)
886 typedef short int ShortInt;
889 typedef long int LongInt;
892 typedef long long int LongLongInt;
895 #endif // FAST_DEVELOPMENT_UNIT_TEST_BUILD