10#include "Teuchos_CommHelpers.hpp"
11#ifdef HAVE_TEUCHOS_MPI
12# include "Teuchos_Details_MpiCommRequest.hpp"
15#ifdef HAVE_TEUCHOSCORE_CXX11
21#ifdef HAVE_TEUCHOS_MPI
24std::string getMpiErrorString (
const int errCode) {
27 char errString [MPI_MAX_ERROR_STRING+1];
28 int errStringLen = MPI_MAX_ERROR_STRING;
29 (void) MPI_Error_string (errCode, errString, &errStringLen);
34 if (errString[errStringLen-1] !=
'\0') {
35 errString[errStringLen] =
'\0';
37 return std::string (errString);
55 const EReductionType reductType,
60#ifdef HAVE_TEUCHOS_MPI
61 using Teuchos::Details::MpiTypeTraits;
66 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
67 if (mpiComm == NULL) {
70 if (serialComm == NULL) {
73#ifdef HAVE_TEUCHOSCORE_CXX11
74 std::unique_ptr<ValueTypeReductionOp<int, T> >
76 std::auto_ptr<ValueTypeReductionOp<int, T> >
78 reductOp (createOp<int, T> (reductType));
79 reduceAll (comm, *reductOp, count, sendBuffer, globalReducts);
82 std::copy (sendBuffer, sendBuffer + count, globalReducts);
85 MPI_Op rawMpiOp = ::Teuchos::Details::getMpiOpForEReductionType (reductType);
86 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
88 MPI_Datatype rawMpiType = MpiTypeTraits<T>::getType (t);
90 int err = MPI_SUCCESS;
91 if (sendBuffer == globalReducts) {
95 err = MPI_Allreduce (MPI_IN_PLACE, globalReducts,
96 count, rawMpiType, rawMpiOp, rawMpiComm);
99 err = MPI_Allreduce (
const_cast<T*
> (sendBuffer), globalReducts,
100 count, rawMpiType, rawMpiOp, rawMpiComm);
105 "MPI_Allreduce failed with the following error: "
106 << ::Teuchos::Details::getMpiErrorString (err));
110 std::copy (sendBuffer, sendBuffer + count, globalReducts);
124gatherImpl (
const T sendBuf[],
131#ifdef HAVE_TEUCHOS_MPI
132 using Teuchos::Details::MpiTypeTraits;
137 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
138 if (mpiComm == NULL) {
141 if (serialComm == NULL) {
144 gather<int, T> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
147 std::copy (sendBuf, sendBuf + sendCount, recvBuf);
150 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
152 MPI_Datatype rawMpiType = MpiTypeTraits<T>::getType (t);
153 const int err = MPI_Gather (
const_cast<T*
> (sendBuf), sendCount, rawMpiType,
154 recvBuf, recvCount, rawMpiType,
159 "MPI_Gather failed with the following error: "
160 << ::Teuchos::Details::getMpiErrorString (err));
164 std::copy (sendBuf, sendBuf + sendCount, recvBuf);
178scatterImpl (
const T sendBuf[],
185#ifdef HAVE_TEUCHOS_MPI
186 using Teuchos::Details::MpiTypeTraits;
191 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
192 if (mpiComm == NULL) {
195 if (serialComm == NULL) {
198 scatter<int, T> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
201 std::copy (sendBuf, sendBuf + sendCount, recvBuf);
204 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
206 MPI_Datatype rawMpiType = MpiTypeTraits<T>::getType (t);
208 MPI_Scatter (
const_cast<T*
> (sendBuf), sendCount, rawMpiType,
209 recvBuf, recvCount, rawMpiType,
212 (err != MPI_SUCCESS, std::runtime_error,
213 "MPI_Scatter failed with the following error: "
214 << ::Teuchos::Details::getMpiErrorString (err));
219 std::copy (sendBuf, sendBuf + sendCount, recvBuf);
225scattervImpl (
const T sendBuf[],
226 const int sendCounts[],
233#ifdef HAVE_TEUCHOS_MPI
234 using Teuchos::Details::MpiTypeTraits;
239 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
240 if (mpiComm == NULL) {
243 if (serialComm == NULL) {
246 scatterv<int, T> (sendBuf, sendCounts, displs, recvBuf, recvCount, root, comm);
249 std::copy (sendBuf, sendBuf + sendCounts[0], recvBuf);
252 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
254 MPI_Datatype rawMpiType = MpiTypeTraits<T>::getType (t);
256 MPI_Scatterv (
const_cast<T*
> (sendBuf), sendCounts, displs, rawMpiType,
257 recvBuf, recvCount, rawMpiType,
260 (err != MPI_SUCCESS, std::runtime_error,
261 "MPI_Scatter failed with the following error: "
262 << ::Teuchos::Details::getMpiErrorString (err));
267 std::copy (sendBuf, sendBuf + sendCounts[0], recvBuf);
281reduceImpl (
const T sendBuf[],
284 const EReductionType reductType,
288#ifdef HAVE_TEUCHOS_MPI
289 using Teuchos::Details::MpiTypeTraits;
294 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
295 if (mpiComm == NULL) {
298 if (serialComm == NULL) {
304 std::copy (sendBuf, sendBuf + count, recvBuf);
307 MPI_Op rawMpiOp = ::Teuchos::Details::getMpiOpForEReductionType (reductType);
308 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
310 MPI_Datatype rawMpiType = MpiTypeTraits<T>::getType (t);
311 const int err = MPI_Reduce (
const_cast<T*
> (sendBuf), recvBuf, count,
312 rawMpiType, rawMpiOp, root, rawMpiComm);
314 (err != MPI_SUCCESS, std::runtime_error,
"MPI_Reduce failed with the "
315 "following error: " << ::Teuchos::Details::getMpiErrorString (err));
319 std::copy (sendBuf, sendBuf + count, recvBuf);
333gathervImpl (
const T sendBuf[],
336 const int recvCounts[],
341#ifdef HAVE_TEUCHOS_MPI
342 using Teuchos::Details::MpiTypeTraits;
347 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
348 if (mpiComm == NULL) {
351 if (serialComm == NULL) {
354 gatherv<int, T> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
358 recvCounts[0] > sendCount, std::invalid_argument,
359 "Teuchos::gatherv: If the input communicator contains only one "
360 "process, then you cannot receive more entries than you send. "
361 "You aim to receive " << recvCounts[0] <<
" entries, but to send "
362 << sendCount <<
" entries.");
366 std::copy (sendBuf, sendBuf + recvCounts[0], recvBuf + displs[0]);
369 MPI_Comm rawMpiComm = * (mpiComm->getRawMpiComm ());
371 MPI_Datatype rawMpiType = MpiTypeTraits<T>::getType (t);
372 const int err = MPI_Gatherv (
const_cast<T*
> (sendBuf),
376 const_cast<int*
> (recvCounts),
377 const_cast<int*
> (displs),
384 "MPI_Gatherv failed with the following error: "
385 << ::Teuchos::Details::getMpiErrorString (err));
390 recvCounts[0] > sendCount, std::invalid_argument,
391 "Teuchos::gatherv: If the input communicator contains only one "
392 "process, then you cannot receive more entries than you send. "
393 "You aim to receive " << recvCounts[0] <<
" entries, but to send "
394 << sendCount <<
" entries.");
398 std::copy (sendBuf, sendBuf + recvCounts[0], recvBuf + displs[0]);
407template<
typename Packet>
411 const int sourceRank)
413 TEUCHOS_COMM_TIME_MONITOR(
415 <<
"> ( value type )"
418 charRecvBuffer (recvBuffer.size (), recvBuffer.getRawPtr ());
420 comm.ireceive (charRecvBuffer.getCharBufferView (), sourceRank);
427template<
typename Packet>
430 const int sourceRank,
434 TEUCHOS_COMM_TIME_MONITOR(
436 <<
"> ( value type )"
439 charRecvBuffer (recvBuffer.size (), recvBuffer.getRawPtr ());
441 comm.ireceive (charRecvBuffer.getCharBufferView (), sourceRank, tag);
462 const int sourceRank)
464#ifdef HAVE_TEUCHOS_MPI
465 using Teuchos::Details::MpiTypeTraits;
470 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
471 if (mpiComm == NULL) {
474 if (serialComm == NULL) {
477 return ireceiveGeneral<T> (comm, recvBuffer, sourceRank);
483 "ireceiveImpl: Not implemented for a serial communicator.");
487 MPI_Comm rawComm = * (mpiComm->getRawMpiComm ());
489 MPI_Datatype rawType = MpiTypeTraits<T>::getType (t);
490 T* rawRecvBuf = recvBuffer.getRawPtr ();
491 const int count =
as<int> (recvBuffer.size ());
492 const int tag = mpiComm->getTag ();
493 MPI_Request rawRequest = MPI_REQUEST_NULL;
494 const int err = MPI_Irecv (rawRecvBuf, count, rawType, sourceRank, tag,
495 rawComm, &rawRequest);
497 err != MPI_SUCCESS, std::runtime_error,
498 "MPI_Irecv failed with the following error: "
499 << ::Teuchos::Details::getMpiErrorString (err));
510 "ireceiveImpl: Not implemented for a serial communicator.");
529 const int sourceRank,
533#ifdef HAVE_TEUCHOS_MPI
534 using Teuchos::Details::MpiTypeTraits;
539 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
540 if (mpiComm == NULL) {
543 if (serialComm == NULL) {
546 return ireceiveGeneral<T> (recvBuffer, sourceRank, tag, comm);
552 "ireceiveImpl: Not implemented for a serial communicator.");
556 MPI_Comm rawComm = * (mpiComm->getRawMpiComm ());
558 MPI_Datatype rawType = MpiTypeTraits<T>::getType (t);
559 T* rawRecvBuf = recvBuffer.getRawPtr ();
560 const int count =
as<int> (recvBuffer.size ());
561 MPI_Request rawRequest = MPI_REQUEST_NULL;
562 const int err = MPI_Irecv (rawRecvBuf, count, rawType, sourceRank, tag,
563 rawComm, &rawRequest);
565 err != MPI_SUCCESS, std::runtime_error,
566 "MPI_Irecv failed with the following error: "
567 << ::Teuchos::Details::getMpiErrorString (err));
578 "ireceiveImpl: Not implemented for a serial communicator.");
593 const T sendBuffer[],
596 TEUCHOS_COMM_TIME_MONITOR(
599 comm.send (charSendBuffer.getBytes (),
600 charSendBuffer.getCharBuffer (),
608sendGeneral (
const T sendBuffer[],
614 TEUCHOS_COMM_TIME_MONITOR(
617 comm.send (charSendBuffer.getBytes (),
618 charSendBuffer.getCharBuffer (),
638 const T sendBuffer[],
641#ifdef HAVE_TEUCHOS_MPI
642 using Teuchos::Details::MpiTypeTraits;
647 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
648 if (mpiComm == NULL) {
651 if (serialComm == NULL) {
654 sendGeneral<T> (comm, count, sendBuffer, destRank);
660 "sendImpl: Not implemented for a serial communicator.");
664 TEUCHOS_COMM_TIME_MONITOR(
666 MPI_Comm rawComm = * (mpiComm->getRawMpiComm ());
668 MPI_Datatype rawType = MpiTypeTraits<T>::getType (t);
669 T* rawBuf =
const_cast<T*
> (sendBuffer);
670 const int tag = mpiComm->getTag ();
671 const int err = MPI_Send (rawBuf, count, rawType, destRank, tag, rawComm);
675 "MPI_Send failed with the following error: "
676 << ::Teuchos::Details::getMpiErrorString (err));
682 "sendImpl: Not implemented for a serial communicator.");
690sendImpl (
const T sendBuffer[],
696#ifdef HAVE_TEUCHOS_MPI
697 using Teuchos::Details::MpiTypeTraits;
702 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
703 if (mpiComm == NULL) {
706 if (serialComm == NULL) {
709 sendGeneral<T> (sendBuffer, count, destRank, tag, comm);
715 "sendImpl: Not implemented for a serial communicator.");
719 TEUCHOS_COMM_TIME_MONITOR(
721 MPI_Comm rawComm = * (mpiComm->getRawMpiComm ());
723 MPI_Datatype rawType = MpiTypeTraits<T>::getType (t);
724 T* rawBuf =
const_cast<T*
> (sendBuffer);
725 const int err = MPI_Send (rawBuf, count, rawType, destRank, tag, rawComm);
729 "MPI_Send failed with the following error: "
730 << ::Teuchos::Details::getMpiErrorString (err));
736 "sendImpl: Not implemented for a serial communicator.");
751 TEUCHOS_COMM_TIME_MONITOR(
754 charSendBuffer (sendBuffer.size (), sendBuffer.getRawPtr ());
756 comm.isend (charSendBuffer.getCharBufferView (), destRank);
774 TEUCHOS_COMM_TIME_MONITOR(
777 charSendBuffer (sendBuffer.size (), sendBuffer.getRawPtr ());
779 comm.isend (charSendBuffer.getCharBufferView (), destRank, tag);
793#ifdef HAVE_TEUCHOS_MPI
794 using Teuchos::Details::MpiTypeTraits;
799 const MpiComm<int>* mpiComm =
dynamic_cast<const MpiComm<int>*
> (&comm);
800 if (mpiComm == NULL) {
803 if (serialComm == NULL) {
806 return isendGeneral<T> (sendBuffer, destRank, tag, comm);
810 true, std::logic_error,
811 "isendImpl: Not implemented for a serial communicator.");
815 TEUCHOS_COMM_TIME_MONITOR(
818 MPI_Comm rawComm = * (mpiComm->getRawMpiComm ());
820 MPI_Datatype rawType = MpiTypeTraits<T>::getType (t);
824 T* rawSendBuf =
const_cast<T*
> (sendBuffer.getRawPtr ());
825 const int count =
as<int> (sendBuffer.size ());
826 MPI_Request rawRequest = MPI_REQUEST_NULL;
827 const int err = MPI_Isend (rawSendBuf, count, rawType, destRank, tag,
828 rawComm, &rawRequest);
832 "MPI_Isend failed with the following error: "
833 << ::Teuchos::Details::getMpiErrorString (err));
843 "isendImpl: Not implemented for a serial communicator.");
860#ifdef HAVE_TEUCHOS_COMPLEX
865 const EReductionType reductType,
867 const std::complex<double> sendBuffer[],
868 std::complex<double> globalReducts[])
870 TEUCHOS_COMM_TIME_MONITOR(
871 "Teuchos::reduceAll<int, std::complex<double> > (" << count <<
", "
872 << toString (reductType) <<
")"
874 reduceAllImpl<std::complex<double> > (comm, reductType, count, sendBuffer, globalReducts);
881 const int sourceRank)
883 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, std::complex<double> >");
884 return ireceiveImpl<std::complex<double> > (comm, recvBuffer, sourceRank);
890 const int sourceRank,
894 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, std::complex<double> >");
895 return ireceiveImpl<std::complex<double> > (recvBuffer, sourceRank, tag, comm);
902 const std::complex<double> sendBuffer[],
905 sendImpl<std::complex<double> > (comm, count, sendBuffer, destRank);
916 sendImpl<std::complex<double> > (sendBuffer, count, destRank, tag, comm);
921isend (
const ArrayRCP<
const std::complex<double> >& sendBuffer,
926 return isendImpl<std::complex<double> > (sendBuffer, destRank, tag, comm);
933 const EReductionType reductType,
935 const std::complex<float> sendBuffer[],
936 std::complex<float> globalReducts[])
938 TEUCHOS_COMM_TIME_MONITOR(
939 "Teuchos::reduceAll<int, std::complex<float> > (" << count <<
", "
940 << toString (reductType) <<
")"
942 reduceAllImpl<std::complex<float> > (comm, reductType, count, sendBuffer, globalReducts);
949 const int sourceRank)
951 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, std::complex<float> >");
952 return ireceiveImpl<std::complex<float> > (comm, recvBuffer, sourceRank);
958 const int sourceRank,
962 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, std::complex<float> >");
963 return ireceiveImpl<std::complex<float> > (recvBuffer, sourceRank, tag, comm);
970 const std::complex<float> sendBuffer[],
973 return sendImpl<std::complex<float> > (comm, count, sendBuffer, destRank);
984 return sendImpl<std::complex<float> > (sendBuffer, count, destRank, tag, comm);
989isend (
const ArrayRCP<
const std::complex<float> >& sendBuffer,
994 return isendImpl<std::complex<float> > (sendBuffer, destRank, tag, comm);
1003 const EReductionType reductType,
1005 const double sendBuffer[],
1006 double globalReducts[])
1008 TEUCHOS_COMM_TIME_MONITOR(
1009 "Teuchos::reduceAll<int, double> (" << count <<
", "
1010 << toString (reductType) <<
")"
1012 reduceAllImpl<double> (comm, reductType, count, sendBuffer, globalReducts);
1019 const int sourceRank)
1021 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, double>");
1022 return ireceiveImpl<double> (comm, recvBuffer, sourceRank);
1028 const int sourceRank,
1032 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, double>");
1033 return ireceiveImpl<double> (recvBuffer, sourceRank, tag, comm);
1040 const double sendBuffer[],
1043 return sendImpl<double> (comm, count, sendBuffer, destRank);
1054 return sendImpl<double> (sendBuffer, count, destRank, tag, comm);
1064 return isendImpl<double> (sendBuffer, destRank, tag, comm);
1070 const int sendCount,
1072 const int recvCounts[],
1077 gathervImpl<double> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1085 const EReductionType reductType,
1087 const float sendBuffer[],
1088 float globalReducts[])
1090 TEUCHOS_COMM_TIME_MONITOR(
1091 "Teuchos::reduceAll<int, float> (" << count <<
", "
1092 << toString (reductType) <<
")"
1094 reduceAllImpl<float> (comm, reductType, count, sendBuffer, globalReducts);
1101 const int sourceRank)
1103 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, float>");
1104 return ireceiveImpl<float> (comm, recvBuffer, sourceRank);
1110 const int sourceRank,
1114 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, float>");
1115 return ireceiveImpl<float> (recvBuffer, sourceRank, tag, comm);
1122 const float sendBuffer[],
1125 return sendImpl<float> (comm, count, sendBuffer, destRank);
1136 return sendImpl<float> (sendBuffer, count, destRank, tag, comm);
1146 return isendImpl<float> (sendBuffer, destRank, tag, comm);
1152 const int sendCount,
1154 const int recvCounts[],
1159 gathervImpl<float> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1167 const int sendCount,
1168 long long recvBuf[],
1169 const int recvCount,
1173 gatherImpl<long long> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1179 const int sendCount,
1180 long long recvBuf[],
1181 const int recvCounts[],
1186 gathervImpl<long long> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1192 const EReductionType reductType,
1194 const long long sendBuffer[],
1195 long long globalReducts[])
1197 TEUCHOS_COMM_TIME_MONITOR(
1198 "Teuchos::reduceAll<int, long long> (" << count <<
", "
1199 << toString (reductType) <<
")"
1201 reduceAllImpl<long long> (comm, reductType, count, sendBuffer, globalReducts);
1208 const int sourceRank)
1210 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, long long>");
1211 return ireceiveImpl<long long> (comm, recvBuffer, sourceRank);
1217 const int sourceRank,
1221 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, long long>");
1222 return ireceiveImpl<long long> (recvBuffer, sourceRank, tag, comm);
1229 const long long sendBuffer[],
1232 return sendImpl<long long> (comm, count, sendBuffer, destRank);
1243 return sendImpl<long long> (sendBuffer, count, destRank, tag, comm);
1253 return isendImpl<long long> (sendBuffer, destRank, tag, comm);
1260 const int sendCount,
1261 unsigned long long recvBuf[],
1262 const int recvCount,
1266 gatherImpl<unsigned long long> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1272 const int sendCount,
1273 unsigned long long recvBuf[],
1274 const int recvCounts[],
1279 gathervImpl<unsigned long long> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1285 const EReductionType reductType,
1287 const unsigned long long sendBuffer[],
1288 unsigned long long globalReducts[])
1290 TEUCHOS_COMM_TIME_MONITOR(
1291 "Teuchos::reduceAll<int, unsigned long long> (" << count <<
", "
1292 << toString (reductType) <<
")"
1294 reduceAllImpl<unsigned long long> (comm, reductType, count, sendBuffer, globalReducts);
1301 const int sourceRank)
1303 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, unsigned long long>");
1304 return ireceiveImpl<unsigned long long> (comm, recvBuffer, sourceRank);
1310 const int sourceRank,
1314 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, unsigned long long>");
1315 return ireceiveImpl<unsigned long long> (recvBuffer, sourceRank, tag, comm);
1322 const unsigned long long sendBuffer[],
1325 return sendImpl<unsigned long long> (comm, count, sendBuffer, destRank);
1336 return sendImpl<unsigned long long> (sendBuffer, count, destRank, tag, comm);
1346 return isendImpl<unsigned long long> (sendBuffer, destRank, tag, comm);
1354 const int sendCount,
1356 const int recvCount,
1360 gatherImpl<long> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1366 const int sendCount,
1368 const int recvCounts[],
1373 gathervImpl<long> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1379 const EReductionType reductType,
1381 const long sendBuffer[],
1382 long globalReducts[])
1384 TEUCHOS_COMM_TIME_MONITOR(
1385 "Teuchos::reduceAll<int, long> (" << count <<
", "
1386 << toString (reductType) <<
")"
1388 reduceAllImpl<long> (comm, reductType, count, sendBuffer, globalReducts);
1395 const int sourceRank)
1397 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, long>");
1398 return ireceiveImpl<long> (comm, recvBuffer, sourceRank);
1404 const int sourceRank,
1408 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, long>");
1409 return ireceiveImpl<long> (recvBuffer, sourceRank, tag, comm);
1416 const long sendBuffer[],
1419 return sendImpl<long> (comm, count, sendBuffer, destRank);
1430 return sendImpl<long> (sendBuffer, count, destRank, tag, comm);
1440 return isendImpl<long> (sendBuffer, destRank, tag, comm);
1448 const int sendCount,
1449 unsigned long recvBuf[],
1450 const int recvCount,
1454 gatherImpl<unsigned long> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1460 const int sendCount,
1461 unsigned long recvBuf[],
1462 const int recvCounts[],
1467 gathervImpl<unsigned long> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1473 const EReductionType reductType,
1475 const unsigned long sendBuffer[],
1476 unsigned long globalReducts[])
1478 TEUCHOS_COMM_TIME_MONITOR(
1479 "Teuchos::reduceAll<int, unsigned long> (" << count <<
", "
1480 << toString (reductType) <<
")"
1482 reduceAllImpl<unsigned long> (comm, reductType, count, sendBuffer, globalReducts);
1489 const int sourceRank)
1491 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, unsigned long>");
1492 return ireceiveImpl<unsigned long> (comm, recvBuffer, sourceRank);
1498 const int sourceRank,
1502 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, unsigned long>");
1503 return ireceiveImpl<unsigned long> (recvBuffer, sourceRank, tag, comm);
1510 const unsigned long sendBuffer[],
1513 return sendImpl<unsigned long> (comm, count, sendBuffer, destRank);
1524 return sendImpl<unsigned long> (sendBuffer, count, destRank, tag, comm);
1534 return isendImpl<unsigned long> (sendBuffer, destRank, tag, comm);
1541 const int sendCount,
1543 const int recvCount,
1547 gatherImpl<int> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1553 const int sendCount,
1555 const int recvCounts[],
1560 gathervImpl<int> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1565scatter<int, int> (
const int sendBuf[],
1566 const int sendCount,
1568 const int recvCount,
1572 scatterImpl<int> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1577scatterv<int, double> (
const double sendBuf[],
1578 const int sendCount[],
1581 const int recvCount,
1585 scattervImpl<double> (sendBuf, sendCount, displs, recvBuf, recvCount, root, comm);
1590scatterv<int, float> (
const float sendBuf[],
1591 const int sendCounts[],
1594 const int recvCount,
1598 scattervImpl<float> (sendBuf, sendCounts, displs, recvBuf, recvCount, root, comm);
1606 const EReductionType reductType,
1610 TEUCHOS_COMM_TIME_MONITOR
1611 (
"Teuchos::reduce<int, int> (" << count <<
", " << toString (reductType)
1613 reduceImpl<int> (sendBuf, recvBuf, count, reductType, root, comm);
1620 const EReductionType reductType,
1624 TEUCHOS_COMM_TIME_MONITOR
1625 (
"Teuchos::reduce<int, int> (" << count <<
", " << toString (reductType)
1627 reduceImpl<long> (sendBuf, recvBuf, count, reductType, root, comm);
1633 unsigned long recvBuf[],
1635 const EReductionType reductType,
1639 TEUCHOS_COMM_TIME_MONITOR
1640 (
"Teuchos::reduce<int, int> (" << count <<
", " << toString (reductType)
1642 reduceImpl<unsigned long> (sendBuf, recvBuf, count, reductType, root, comm);
1648 unsigned long long recvBuf[],
1650 const EReductionType reductType,
1654 TEUCHOS_COMM_TIME_MONITOR
1655 (
"Teuchos::reduce<int, int> (" << count <<
", " << toString (reductType)
1657 reduceImpl<unsigned long long> (sendBuf, recvBuf, count, reductType, root, comm);
1665 const EReductionType reductType,
1669 TEUCHOS_COMM_TIME_MONITOR
1670 (
"Teuchos::reduce<int, int> (" << count <<
", " << toString (reductType)
1672 reduceImpl<double> (sendBuf, recvBuf, count, reductType, root, comm);
1677 const EReductionType reductType,
1679 const int sendBuffer[],
1680 int globalReducts[])
1682 TEUCHOS_COMM_TIME_MONITOR(
1683 "Teuchos::reduceAll<int, int> (" << count <<
", "
1684 << toString (reductType) <<
")"
1686 reduceAllImpl<int> (comm, reductType, count, sendBuffer, globalReducts);
1693 const int sourceRank)
1695 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, int>");
1696 return ireceiveImpl<int> (comm, recvBuffer, sourceRank);
1702 const int sourceRank,
1706 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, int>");
1707 return ireceiveImpl<int> (recvBuffer, sourceRank, tag, comm);
1714 const int sendBuffer[],
1717 return sendImpl<int> (comm, count, sendBuffer, destRank);
1728 return sendImpl<int> (sendBuffer, count, destRank, tag, comm);
1738 return isendImpl<int> (sendBuffer, destRank, tag, comm);
1745 const int sendCount,
1746 unsigned int recvBuf[],
1747 const int recvCount,
1751 gatherImpl<unsigned int> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1757 const int sendCount,
1758 unsigned int recvBuf[],
1759 const int recvCounts[],
1764 gathervImpl<unsigned int> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1770 const EReductionType reductType,
1772 const unsigned int sendBuffer[],
1773 unsigned int globalReducts[])
1775 TEUCHOS_COMM_TIME_MONITOR(
1776 "Teuchos::reduceAll<int, unsigned int> (" << count <<
", "
1777 << toString (reductType) <<
")"
1779 reduceAllImpl<unsigned int> (comm, reductType, count, sendBuffer, globalReducts);
1786 const int sourceRank)
1788 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, unsigned int>");
1789 return ireceiveImpl<unsigned int> (comm, recvBuffer, sourceRank);
1795 const int sourceRank,
1799 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, unsigned int>");
1800 return ireceiveImpl<unsigned int> (recvBuffer, sourceRank, tag, comm);
1807 const unsigned int sendBuffer[],
1810 return sendImpl<unsigned int> (comm, count, sendBuffer, destRank);
1821 return sendImpl<unsigned int> (sendBuffer, count, destRank, tag, comm);
1831 return isendImpl<unsigned int> (sendBuffer, destRank, tag, comm);
1839 const int sendCount,
1841 const int recvCount,
1845 gatherImpl<short> (sendBuf, sendCount, recvBuf, recvCount, root, comm);
1851 const int sendCount,
1853 const int recvCounts[],
1858 gathervImpl<short> (sendBuf, sendCount, recvBuf, recvCounts, displs, root, comm);
1864 const EReductionType reductType,
1866 const short sendBuffer[],
1867 short globalReducts[])
1869 TEUCHOS_COMM_TIME_MONITOR(
1870 "Teuchos::reduceAll<int, short> (" << count <<
", "
1871 << toString (reductType) <<
")"
1873 reduceAllImpl<short> (comm, reductType, count, sendBuffer, globalReducts);
1880 const int sourceRank)
1882 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, short>");
1883 return ireceiveImpl<short> (comm, recvBuffer, sourceRank);
1889 const int sourceRank,
1893 TEUCHOS_COMM_TIME_MONITOR(
"ireceive<int, short>");
1894 return ireceiveImpl<short> (recvBuffer, sourceRank, tag, comm);
1901 const short sendBuffer[],
1904 return sendImpl<short> (comm, count, sendBuffer, destRank);
1915 return sendImpl<short> (sendBuffer, count, destRank, tag, comm);
1925 return isendImpl<short> (sendBuffer, destRank, tag, comm);
1941 const EReductionType reductType,
1943 const char sendBuffer[],
1944 char globalReducts[])
1946 TEUCHOS_COMM_TIME_MONITOR(
1947 "Teuchos::reduceAll<int, char> (" << count <<
", "
1948 << toString (reductType) <<
")"
1950 reduceAllImpl<char> (comm, reductType, count, sendBuffer, globalReducts);
Declaration of Teuchos::Details::MpiTypeTraits (only if building with MPI).
Reference-counted smart pointer for managing arrays.
ArrayRCP< T2 > arcp_reinterpret_cast(const ArrayRCP< T1 > &p1)
Reinterpret cast of underlying ArrayRCP type from T1* to T2*.
void set_extra_data(const T1 &extra_data, const std::string &name, const Ptr< ArrayRCP< T2 > > &p, EPrePostDestruction destroy_when=POST_DESTROY, bool force_unique=true)
Set extra data associated with a ArrayRCP object.
ArrayRCP< T2 > arcp_const_cast(const ArrayRCP< T1 > &p1)
Const cast of underlying ArrayRCP type from const T* to T*.
Abstract interface for distributed-memory communication.
void reduce(const Packet sendBuf[], Packet recvBuf[], const Ordinal count, const EReductionType reductType, const Ordinal root, const Comm< Ordinal > &comm)
Wrapper for MPI_Reduce; reduction to one process, using a built-in reduction operator selected by enu...
void gather(const Packet sendBuf[], const Ordinal sendCount, Packet recvBuf[], const Ordinal recvCount, const int root, const Comm< Ordinal > &comm)
Gather values from each process to the root process.
void gatherv(const Packet sendBuf[], const Ordinal sendCount, Packet recvBuf[], const Ordinal recvCounts[], const Ordinal displs[], const int root, const Comm< Ordinal > &comm)
Gather arrays of possibly different lengths from each process to the root process.
void reduceAll(const Comm< Ordinal > &comm, const ValueTypeReductionOp< Ordinal, Packet > &reductOp, const Ordinal count, const Packet sendBuffer[], Packet globalReducts[])
Wrapper for MPI_Allreduce that takes a custom reduction operator.
Encapsulate how an array of const objects with value sematics is serialized into a const char[] array...
MPI implementation of CommRequest<int>.
Ptr< T > inOutArg(T &arg)
create a non-persisting (required or optional) input/output argument for a function call.
Smart reference counting pointer class for automatic garbage collection.
RCP< T2 > rcp_implicit_cast(const RCP< T1 > &p1)
Implicit cast of underlying RCP type from T1* to T2*.
Concrete serial communicator subclass.
static std::string name()
Encapsulate how an array of non-const objects with value sematics is serialized into a char[] array.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Macro for throwing an exception with breakpointing to ease debugging.
TypeTo as(const TypeFrom &t)
Convert from one value type to another.
The Teuchos namespace contains all of the classes, structs and enums used by Teuchos,...
RCP< CommRequest< Ordinal > > ireceive(const ArrayRCP< Packet > &recvBuffer, const int sourceRank, const int tag, const Comm< Ordinal > &comm)
Variant of ireceive that takes a tag argument (and restores the correct order of arguments).
void send(const Packet sendBuffer[], const Ordinal count, const int destRank, const int tag, const Comm< Ordinal > &comm)
Variant of send() that takes a tag (and restores the correct order of arguments).