40 #ifndef TPETRA_DISTRIBUTOR_HPP
41 #define TPETRA_DISTRIBUTOR_HPP
43 #include "Tpetra_Details_DistributorActor.hpp"
44 #include "Tpetra_Details_DistributorPlan.hpp"
47 #include "Teuchos_as.hpp"
48 #include "Teuchos_Describable.hpp"
49 #include "Teuchos_ParameterListAcceptorDefaultBase.hpp"
50 #include "Teuchos_VerboseObject.hpp"
53 #include "KokkosCompat_View.hpp"
54 #include "Kokkos_Core.hpp"
55 #include "Kokkos_TeuchosCommAdapters.hpp"
58 #include <type_traits>
138 public Teuchos::Describable,
139 public Teuchos::ParameterListAcceptorDefaultBase {
152 explicit Distributor (
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm);
165 Distributor (
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm,
166 const Teuchos::RCP<Teuchos::FancyOStream>& out);
181 Distributor (
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm,
182 const Teuchos::RCP<Teuchos::ParameterList>& plist);
200 Distributor (
const Teuchos::RCP<
const Teuchos::Comm<int> >& comm,
201 const Teuchos::RCP<Teuchos::FancyOStream>& out,
202 const Teuchos::RCP<Teuchos::ParameterList>& plist);
259 size_t createFromSends (
const Teuchos::ArrayView<const int>& exportProcIDs);
294 template <
class Ordinal>
297 const Teuchos::ArrayView<const int>& remoteProcIDs,
298 Teuchos::Array<Ordinal>& exportIDs,
299 Teuchos::Array<int>& exportProcIDs);
310 const Teuchos::ArrayView<const int>& remoteProcIDs);
345 Teuchos::ArrayView<const int>
getProcsTo()
const;
370 return plan_.howInitialized();
387 Teuchos::RCP<Distributor>
getReverse(
bool create=
true)
const;
413 template <
class Packet>
417 const Teuchos::ArrayView<Packet> &imports);
440 template <
class Packet>
443 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
444 const Teuchos::ArrayView<Packet> &imports,
445 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
471 template <
class Packet>
473 doPosts (
const Teuchos::ArrayRCP<const Packet> &exports,
475 const Teuchos::ArrayRCP<Packet> &imports);
495 template <
class Packet>
497 doPosts (
const Teuchos::ArrayRCP<const Packet> &exports,
498 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
499 const Teuchos::ArrayRCP<Packet> &imports,
500 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
514 template <
class Packet>
518 const Teuchos::ArrayView<Packet> &imports);
524 template <
class Packet>
527 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
528 const Teuchos::ArrayView<Packet> &imports,
529 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
535 template <
class Packet>
539 const Teuchos::ArrayRCP<Packet> &imports);
545 template <
class Packet>
548 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
549 const Teuchos::ArrayRCP<Packet> &imports,
550 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
580 template <
class ExpView,
class ImpView>
581 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
583 const ExpView &exports,
585 const ImpView &imports);
608 template <
class ExpView,
class ImpView>
609 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
611 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
612 const ImpView &imports,
613 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
639 template <
class ExpView,
class ImpView>
640 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
641 doPosts (
const ExpView &exports,
643 const ImpView &imports);
663 template <
class ExpView,
class ImpView>
664 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
665 doPosts (
const ExpView &exports,
666 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
667 const ImpView &imports,
668 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
674 template <
class ExpView,
class ImpView>
675 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
678 const ImpView &imports);
684 template <
class ExpView,
class ImpView>
685 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
687 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
688 const ImpView &imports,
689 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
695 template <
class ExpView,
class ImpView>
696 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
699 const ImpView &imports);
705 template <
class ExpView,
class ImpView>
706 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
708 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
709 const ImpView &imports,
710 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID);
716 bytes_sent = lastRoundBytesSend_;
717 bytes_recvd = lastRoundBytesRecv_;
749 describe (Teuchos::FancyOStream& out,
750 const Teuchos::EVerbosityLevel verbLevel =
751 Teuchos::Describable::verbLevel_default)
const;
761 Details::DistributorActor actor_;
767 static bool getVerbose();
773 std::unique_ptr<std::string>
774 createPrefix(
const char methodName[])
const;
777 bool verbose_ = getVerbose();
784 mutable Teuchos::RCP<Distributor> reverseDistributor_;
787 size_t lastRoundBytesSend_;
790 size_t lastRoundBytesRecv_;
804 template <
class Ordinal>
805 void computeSends (
const Teuchos::ArrayView<const Ordinal> &remoteGIDs,
806 const Teuchos::ArrayView<const int> &remoteProcIDs,
807 Teuchos::Array<Ordinal> &exportGIDs,
808 Teuchos::Array<int> &exportProcIDs);
811 void createReverseDistributor()
const;
819 localDescribeToString (
const Teuchos::EVerbosityLevel vl)
const;
823 template <
class Packet>
827 const Teuchos::ArrayView<Packet>& imports)
830 using Teuchos::ArrayRCP;
831 typedef typename ArrayRCP<const Packet>::size_type size_type;
843 ArrayRCP<const Packet> exportsArcp (exports.getRawPtr (),
844 static_cast<size_type
> (0),
845 exports.size(),
false);
860 arcp<Packet> (imports.getRawPtr (), 0, imports.size (),
false));
863 lastRoundBytesSend_ = exports.size () *
sizeof (Packet);
864 lastRoundBytesRecv_ = imports.size () *
sizeof (Packet);
867 template <
class Packet>
870 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
871 const Teuchos::ArrayView<Packet> &imports,
872 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
875 using Teuchos::ArrayRCP;
888 typedef typename ArrayRCP<const Packet>::size_type size_type;
889 ArrayRCP<const Packet> exportsArcp (exports.getRawPtr (),
890 static_cast<size_type
> (0),
891 exports.size (),
false);
897 numExportPacketsPerLID,
898 arcp<Packet> (imports.getRawPtr (), 0, imports.size (),
false),
899 numImportPacketsPerLID);
902 lastRoundBytesSend_ = exports.size () *
sizeof (Packet);
903 lastRoundBytesRecv_ = imports.size () *
sizeof (Packet);
907 template <
class Packet>
909 doPosts (
const Teuchos::ArrayRCP<const Packet>& exports,
911 const Teuchos::ArrayRCP<Packet>& imports)
913 Kokkos::View<const Packet*, Kokkos::HostSpace> exportsView(exports.get(), exports.size());
914 Kokkos::View<Packet*, Kokkos::HostSpace> importsView(imports.get(), imports.size());
915 doPosts(exportsView, numPackets, importsView);
918 template <
class Packet>
920 doPosts (
const Teuchos::ArrayRCP<const Packet>& exports,
921 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
922 const Teuchos::ArrayRCP<Packet>& imports,
923 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
925 Kokkos::View<const Packet*, Kokkos::HostSpace> exportsView(exports.get(), exports.size());
926 Kokkos::View<Packet*, Kokkos::HostSpace> importsView(imports.get(), imports.size());
927 doPosts(exportsView, numExportPacketsPerLID, importsView, numImportPacketsPerLID);
930 template <
class Packet>
934 const Teuchos::ArrayView<Packet>& imports)
937 using Teuchos::ArrayRCP;
950 typedef typename ArrayRCP<const Packet>::size_type size_type;
951 ArrayRCP<const Packet> exportsArcp (exports.getRawPtr(), as<size_type> (0),
952 exports.size(),
false);
959 arcp<Packet> (imports.getRawPtr (), 0, imports.size (),
false));
962 lastRoundBytesSend_ = exports.size() *
sizeof(Packet);
963 lastRoundBytesRecv_ = imports.size() *
sizeof(Packet);
966 template <
class Packet>
969 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
970 const Teuchos::ArrayView<Packet> &imports,
971 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
975 using Teuchos::ArrayRCP;
988 typedef typename ArrayRCP<const Packet>::size_type size_type;
989 ArrayRCP<const Packet> exportsArcp (exports.getRawPtr (), as<size_type> (0),
990 exports.size (),
false);
992 numExportPacketsPerLID,
993 arcp<Packet> (imports.getRawPtr (), 0, imports.size (),
false),
994 numImportPacketsPerLID);
997 lastRoundBytesSend_ = exports.size() *
sizeof(Packet);
998 lastRoundBytesRecv_ = imports.size() *
sizeof(Packet);
1001 template <
class Packet>
1005 const Teuchos::ArrayRCP<Packet>& imports)
1008 TEUCHOS_TEST_FOR_EXCEPTION(
1009 ! plan_.getIndicesTo().is_null(), std::runtime_error,
1010 "Tpetra::Distributor::doReversePosts(3 args): Can only do reverse "
1011 "communication when original data are blocked by process.");
1012 if (reverseDistributor_.is_null ()) {
1013 createReverseDistributor ();
1015 reverseDistributor_->doPosts (exports, numPackets, imports);
1018 template <
class Packet>
1021 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
1022 const Teuchos::ArrayRCP<Packet>& imports,
1023 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
1026 TEUCHOS_TEST_FOR_EXCEPTION(
1027 ! plan_.getIndicesTo().is_null(), std::runtime_error,
1028 "Tpetra::Distributor::doReversePosts(3 args): Can only do reverse "
1029 "communication when original data are blocked by process.");
1030 if (reverseDistributor_.is_null ()) {
1031 createReverseDistributor ();
1033 reverseDistributor_->doPosts (exports, numExportPacketsPerLID,
1034 imports, numImportPacketsPerLID);
1037 template <
class ExpView,
class ImpView>
1038 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1040 doPostsAndWaits (
const ExpView& exports,
1042 const ImpView& imports)
1047 template <
class ExpView,
class ImpView>
1048 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1050 doPostsAndWaits(
const ExpView& exports,
1051 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
1052 const ImpView& imports,
1053 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
1055 actor_.
doPostsAndWaits(plan_, exports, numExportPacketsPerLID, imports, numImportPacketsPerLID);
1059 template <
class ExpView,
class ImpView>
1060 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1062 doPosts (
const ExpView &exports,
1064 const ImpView &imports)
1066 actor_.
doPosts(plan_, exports, numPackets, imports);
1069 template <
class ExpView,
class ImpView>
1070 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1072 doPosts (
const ExpView &exports,
1073 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
1074 const ImpView &imports,
1075 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
1077 actor_.
doPosts(plan_, exports, numExportPacketsPerLID, imports, numImportPacketsPerLID);
1080 template <
class ExpView,
class ImpView>
1081 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1083 doReversePostsAndWaits (
const ExpView& exports,
1085 const ImpView& imports)
1087 doReversePosts (exports, numPackets, imports);
1091 template <
class ExpView,
class ImpView>
1092 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1094 doReversePostsAndWaits (
const ExpView& exports,
1095 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
1096 const ImpView& imports,
1097 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
1099 doReversePosts (exports, numExportPacketsPerLID, imports,
1100 numImportPacketsPerLID);
1104 template <
class ExpView,
class ImpView>
1105 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1107 doReversePosts (
const ExpView &exports,
1109 const ImpView &imports)
1112 TEUCHOS_TEST_FOR_EXCEPTION(
1113 ! plan_.getIndicesTo().is_null(), std::runtime_error,
1114 "Tpetra::Distributor::doReversePosts(3 args): Can only do "
1115 "reverse communication when original data are blocked by process.");
1116 if (reverseDistributor_.is_null ()) {
1117 createReverseDistributor ();
1119 reverseDistributor_->doPosts (exports, numPackets, imports);
1122 template <
class ExpView,
class ImpView>
1123 typename std::enable_if<(Kokkos::Impl::is_view<ExpView>::value && Kokkos::Impl::is_view<ImpView>::value)>::type
1125 doReversePosts (
const ExpView &exports,
1126 const Teuchos::ArrayView<const size_t>& numExportPacketsPerLID,
1127 const ImpView &imports,
1128 const Teuchos::ArrayView<const size_t>& numImportPacketsPerLID)
1131 TEUCHOS_TEST_FOR_EXCEPTION(
1132 ! plan_.getIndicesTo().is_null(), std::runtime_error,
1133 "Tpetra::Distributor::doReversePosts(3 args): Can only do "
1134 "reverse communication when original data are blocked by process.");
1135 if (reverseDistributor_.is_null ()) {
1136 createReverseDistributor ();
1138 reverseDistributor_->doPosts (exports, numExportPacketsPerLID,
1139 imports, numImportPacketsPerLID);
1142 template <
class OrdinalType>
1144 computeSends(
const Teuchos::ArrayView<const OrdinalType>& importGIDs,
1145 const Teuchos::ArrayView<const int>& importProcIDs,
1146 Teuchos::Array<OrdinalType>& exportGIDs,
1147 Teuchos::Array<int>& exportProcIDs)
1156 using Teuchos::Array;
1157 using Teuchos::ArrayView;
1159 using size_type =
typename ArrayView<const OrdinalType>::size_type;
1160 const char errPrefix[] =
"Tpetra::Distributor::computeSends: ";
1161 const char suffix[] =
1162 " Please report this bug to the Tpetra developers.";
1164 const int myRank = plan_.getComm()->getRank ();
1166 TEUCHOS_TEST_FOR_EXCEPTION
1167 (importGIDs.size () != importProcIDs.size (),
1168 std::invalid_argument, errPrefix <<
"On Process " << myRank
1169 <<
": importProcIDs.size()=" << importProcIDs.size()
1170 <<
" != importGIDs.size()=" << importGIDs.size() <<
".");
1172 const size_type numImports = importProcIDs.size();
1173 Array<size_t> importObjs(2*numImports);
1175 for (size_type i = 0; i < numImports; ++i) {
1176 importObjs[2*i] =
static_cast<size_t>(importGIDs[i]);
1177 importObjs[2*i+1] =
static_cast<size_t>(myRank);
1186 const size_t numExportsAsSizeT =
1187 tempPlan.createFromSends(importProcIDs);
1188 const size_type numExports =
1189 static_cast<size_type
>(numExportsAsSizeT);
1190 TEUCHOS_TEST_FOR_EXCEPTION
1191 (numExports < 0, std::logic_error, errPrefix <<
1192 "tempPlan.createFromSends() returned numExports="
1193 << numExportsAsSizeT <<
" as a size_t, which overflows to "
1194 << numExports <<
" when cast to " <<
1195 Teuchos::TypeNameTraits<size_type>::name () <<
"." << suffix);
1196 TEUCHOS_TEST_FOR_EXCEPTION
1197 (size_type(tempPlan.getTotalReceiveLength()) != numExports,
1198 std::logic_error, errPrefix <<
"tempPlan.getTotalReceiveLength()="
1199 << tempPlan.getTotalReceiveLength () <<
" != numExports="
1200 << numExports <<
"." << suffix);
1202 if (numExports > 0) {
1203 exportGIDs.resize(numExports);
1204 exportProcIDs.resize(numExports);
1215 static_assert(
sizeof(
size_t) >=
sizeof(OrdinalType),
1216 "Tpetra::Distributor::computeSends: "
1217 "sizeof(size_t) < sizeof(OrdinalType).");
1219 TEUCHOS_TEST_FOR_EXCEPTION
1220 (tempPlan.getTotalReceiveLength () <
size_t(numExports),
1222 errPrefix <<
"tempPlan.getTotalReceiveLength()="
1223 << tempPlan.getTotalReceiveLength() <<
" < numExports="
1224 << numExports <<
"." << suffix);
1226 Array<size_t> exportObjs (tempPlan.getTotalReceiveLength () * 2);
1227 tempPlan.doPostsAndWaits<
size_t> (importObjs (), 2, exportObjs ());
1230 for (size_type i = 0; i < numExports; ++i) {
1231 exportGIDs[i] =
static_cast<OrdinalType
> (exportObjs[2*i]);
1232 exportProcIDs[i] =
static_cast<int> (exportObjs[2*i+1]);
1236 template <
class OrdinalType>
1238 createFromRecvs (
const Teuchos::ArrayView<const OrdinalType> &remoteGIDs,
1239 const Teuchos::ArrayView<const int> &remoteProcIDs,
1240 Teuchos::Array<OrdinalType> &exportGIDs,
1241 Teuchos::Array<int> &exportProcIDs)
1244 const char errPrefix[] =
"Tpetra::Distributor::createFromRecvs: ";
1245 const int myRank = plan_.getComm()->getRank();
1247 std::unique_ptr<std::string> prefix;
1249 prefix = createPrefix(
"createFromRecvs");
1250 std::ostringstream os;
1251 os << *prefix <<
"Start" << endl;
1252 std::cerr << os.str();
1257 using Teuchos::outArg;
1258 using Teuchos::REDUCE_MAX;
1259 using Teuchos::reduceAll;
1263 (remoteGIDs.size () != remoteProcIDs.size ()) ? myRank : -1;
1264 int maxErrProc = -1;
1265 reduceAll(*plan_.getComm(), REDUCE_MAX, errProc, outArg(maxErrProc));
1266 TEUCHOS_TEST_FOR_EXCEPTION
1267 (maxErrProc != -1, std::runtime_error, errPrefix <<
"Lists "
1268 "of remote IDs and remote process IDs must have the same "
1269 "size on all participating processes. Maximum process ID "
1270 "with error: " << maxErrProc <<
".");
1275 TEUCHOS_TEST_FOR_EXCEPTION
1276 (remoteGIDs.size() != remoteProcIDs.size(), std::runtime_error,
1277 errPrefix <<
"On Process " << myRank <<
": "
1278 "remoteGIDs.size()=" << remoteGIDs.size() <<
1279 " != remoteProcIDs.size()=" << remoteProcIDs.size() <<
".");
1282 computeSends(remoteGIDs, remoteProcIDs, exportGIDs, exportProcIDs);
1284 plan_.createFromRecvs(remoteProcIDs);
1287 std::ostringstream os;
1288 os << *prefix <<
"Done" << endl;
1289 std::cerr << os.str();
Declaration of Tpetra::Details::Behavior, a class that describes Tpetra's behavior.
Stand-alone utility functions and macros.
static bool debug()
Whether Tpetra is in debug mode.
Sets up and executes a communication plan for a Tpetra DistObject.
void doPostsAndWaits(const Teuchos::ArrayView< const Packet > &exports, size_t numPackets, const Teuchos::ArrayView< Packet > &imports)
Execute the (forward) communication plan.
void doReversePostsAndWaits(const Teuchos::ArrayView< const Packet > &exports, size_t numPackets, const Teuchos::ArrayView< Packet > &imports)
Execute the reverse communication plan.
size_t getMaxSendLength() const
Maximum number of values this process will send to another single process.
Teuchos::RCP< Distributor > getReverse(bool create=true) const
A reverse communication plan Distributor.
void createFromRecvs(const Teuchos::ArrayView< const Ordinal > &remoteIDs, const Teuchos::ArrayView< const int > &remoteProcIDs, Teuchos::Array< Ordinal > &exportIDs, Teuchos::Array< int > &exportProcIDs)
Set up Distributor using list of process ranks from which to receive.
Teuchos::ArrayView< const int > getProcsTo() const
Ranks of the processes to which this process will send values.
void doReversePosts(const Teuchos::ArrayRCP< const Packet > &exports, size_t numPackets, const Teuchos::ArrayRCP< Packet > &imports)
Post the data for a reverse plan, but do not execute the waits yet.
size_t getNumReceives() const
The number of processes from which we will receive data.
void doPosts(const Teuchos::ArrayRCP< const Packet > &exports, size_t numPackets, const Teuchos::ArrayRCP< Packet > &imports)
Post the data for a forward plan, but do not execute the waits yet.
void setParameterList(const Teuchos::RCP< Teuchos::ParameterList > &plist)
Set Distributor parameters.
size_t getTotalReceiveLength() const
Total number of values this process will receive from other processes.
virtual ~Distributor()=default
Destructor (virtual for memory safety).
bool hasSelfMessage() const
Whether the calling process will send or receive messages to itself.
void swap(Distributor &rhs)
Swap the contents of rhs with those of *this.
const Details::DistributorPlan & getPlan() const
Get this Distributor's DistributorPlan.
Teuchos::ArrayView< const size_t > getLengthsTo() const
Number of values this process will send to each process.
Teuchos::ArrayView< const int > getProcsFrom() const
Ranks of the processes sending values to this process.
Distributor(const Teuchos::RCP< const Teuchos::Comm< int > > &comm)
Construct using the specified communicator and default parameters.
std::string description() const
Return a one-line description of this object.
size_t createFromSends(const Teuchos::ArrayView< const int > &exportProcIDs)
Set up Distributor using list of process ranks to which this process will send.
void createFromSendsAndRecvs(const Teuchos::ArrayView< const int > &exportProcIDs, const Teuchos::ArrayView< const int > &remoteProcIDs)
Set up Distributor using list of process ranks to which to send, and list of process ranks from which...
Teuchos::RCP< const Teuchos::ParameterList > getValidParameters() const
List of valid Distributor parameters.
Teuchos::ArrayView< const size_t > getLengthsFrom() const
Number of values this process will receive from each process.
Details::EDistributorHowInitialized howInitialized() const
Return an enum indicating whether and how a Distributor was initialized.
size_t getNumSends() const
The number of processes to which we will send data.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Describe this object in a human-readable way to the given output stream.
void getLastDoStatistics(size_t &bytes_sent, size_t &bytes_recvd) const
Information on the last call to do/doReverse.
EDistributorHowInitialized
Enum indicating how and whether a Distributor was initialized.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
Teuchos::Array< std::string > distributorSendTypes()
Valid values for Distributor's "Send type" parameter.