42 #ifndef TPETRA_DISTOBJECT_DEF_HPP 43 #define TPETRA_DISTOBJECT_DEF_HPP 53 #include "Tpetra_Distributor.hpp" 57 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
62 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 65 using Teuchos::TimeMonitor;
67 RCP<Time> doXferTimer =
68 TimeMonitor::lookupCounter (
"Tpetra::DistObject::doTransfer");
69 if (doXferTimer.is_null ()) {
71 TimeMonitor::getNewCounter (
"Tpetra::DistObject::doTransfer");
73 doXferTimer_ = doXferTimer;
75 RCP<Time> copyAndPermuteTimer =
76 TimeMonitor::lookupCounter (
"Tpetra::DistObject::copyAndPermute");
77 if (copyAndPermuteTimer.is_null ()) {
79 TimeMonitor::getNewCounter (
"Tpetra::DistObject::copyAndPermute");
81 copyAndPermuteTimer_ = copyAndPermuteTimer;
83 RCP<Time> packAndPrepareTimer =
84 TimeMonitor::lookupCounter (
"Tpetra::DistObject::packAndPrepare");
85 if (packAndPrepareTimer.is_null ()) {
87 TimeMonitor::getNewCounter (
"Tpetra::DistObject::packAndPrepare");
89 packAndPrepareTimer_ = packAndPrepareTimer;
91 RCP<Time> doPostsAndWaitsTimer =
92 TimeMonitor::lookupCounter (
"Tpetra::DistObject::doPostsAndWaits");
93 if (doPostsAndWaitsTimer.is_null ()) {
94 doPostsAndWaitsTimer =
95 TimeMonitor::getNewCounter (
"Tpetra::DistObject::doPostsAndWaits");
97 doPostsAndWaitsTimer_ = doPostsAndWaitsTimer;
99 RCP<Time> unpackAndCombineTimer =
100 TimeMonitor::lookupCounter (
"Tpetra::DistObject::unpackAndCombine");
101 if (unpackAndCombineTimer.is_null ()) {
102 unpackAndCombineTimer =
103 TimeMonitor::getNewCounter (
"Tpetra::DistObject::unpackAndCombine");
105 unpackAndCombineTimer_ = unpackAndCombineTimer;
106 #endif // HAVE_TPETRA_TRANSFER_TIMERS 109 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
115 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
120 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
125 using Teuchos::TypeNameTraits;
127 std::ostringstream os;
128 os <<
"\"Tpetra::DistObject\": {" 129 <<
"Packet: " << TypeNameTraits<packet_type>::name ()
130 <<
", LocalOrdinal: " << TypeNameTraits<local_ordinal_type>::name ()
131 <<
", GlobalOrdinal: " << TypeNameTraits<global_ordinal_type>::name ()
132 <<
", Node: " << TypeNameTraits<Node>::name ();
133 if (this->getObjectLabel () !=
"") {
134 os <<
"Label: \"" << this->getObjectLabel () <<
"\"";
140 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
144 const Teuchos::EVerbosityLevel verbLevel)
const 146 using Teuchos::rcpFromRef;
147 using Teuchos::TypeNameTraits;
149 const Teuchos::EVerbosityLevel vl = (verbLevel == Teuchos::VERB_DEFAULT) ?
150 Teuchos::VERB_LOW : verbLevel;
151 Teuchos::RCP<const Teuchos::Comm<int> > comm = this->
getMap ()->getComm ();
152 const int myRank = comm.is_null () ? 0 : comm->getRank ();
153 const int numProcs = comm.is_null () ? 1 : comm->getSize ();
155 if (vl != Teuchos::VERB_NONE) {
156 Teuchos::OSTab tab0 (out);
158 out <<
"\"Tpetra::DistObject\":" << endl;
160 Teuchos::OSTab tab1 (out);
162 out <<
"Template parameters:" << endl;
164 Teuchos::OSTab tab2 (out);
165 out <<
"Packet: " << TypeNameTraits<packet_type>::name () << endl
166 <<
"LocalOrdinal: " << TypeNameTraits<local_ordinal_type>::name () << endl
167 <<
"GlobalOrdinal: " << TypeNameTraits<global_ordinal_type>::name () << endl
168 <<
"Node: " << TypeNameTraits<node_type>::name () << endl;
170 if (this->getObjectLabel () !=
"") {
171 out <<
"Label: \"" << this->getObjectLabel () <<
"\"" << endl;
178 out <<
"Map:" << endl;
180 Teuchos::OSTab tab2 (out);
181 map_->describe (out, vl);
185 if (vl > Teuchos::VERB_LOW) {
186 for (
int p = 0; p < numProcs; ++p) {
188 out <<
"Process " << myRank <<
":" << endl;
189 Teuchos::OSTab tab2 (out);
190 out <<
"Export buffer size (in packets): " << exports_.size ()
192 <<
"Import buffer size (in packets): " << imports_.size ()
195 if (! comm.is_null ()) {
205 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
210 TEUCHOS_TEST_FOR_EXCEPTION(
true, std::logic_error,
211 "Tpetra::DistObject::removeEmptyProcessesInPlace: Not implemented");
243 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
251 std::invalid_argument,
"doImport: The target DistObject's Map is not " 252 "identical to the Import's target Map.");
253 #ifdef HAVE_TPETRA_DEBUG 256 TEUCHOS_TEST_FOR_EXCEPTION(
258 std::invalid_argument,
"doImport: The source is a DistObject, yet its " 259 "Map is not identical to the Import's source Map.");
261 #endif // HAVE_TPETRA_DEBUG 264 typedef Teuchos::ArrayView<const LocalOrdinal> view_type;
269 this->
doTransfer (source, CM, numSameIDs, permuteToLIDs, permuteFromLIDs,
274 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
281 TEUCHOS_TEST_FOR_EXCEPTION(
283 "doExport: The target DistObject's Map is not identical to the Export's " 285 #ifdef HAVE_TPETRA_DEBUG 288 TEUCHOS_TEST_FOR_EXCEPTION(
290 std::invalid_argument,
"doExport: The source is a DistObject, yet its " 291 "Map is not identical to the Export's source Map.");
293 #endif // HAVE_TPETRA_DEBUG 296 typedef ArrayView<const LocalOrdinal> view_type;
301 doTransfer (source, CM, numSameIDs, permuteToLIDs, permuteFromLIDs, remoteLIDs,
305 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
312 TEUCHOS_TEST_FOR_EXCEPTION(
314 "doImport (reverse mode): The target DistObject's Map is not identical " 315 "to the Export's source Map.");
316 #ifdef HAVE_TPETRA_DEBUG 319 TEUCHOS_TEST_FOR_EXCEPTION(
321 std::invalid_argument,
322 "doImport (reverse mode): The source is a DistObject, yet its " 323 "Map is not identical to the Export's target Map.");
325 #endif // HAVE_TPETRA_DEBUG 328 typedef ArrayView<const LocalOrdinal> view_type;
333 doTransfer (source, CM, numSameIDs, permuteToLIDs, permuteFromLIDs, remoteLIDs,
337 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
344 TEUCHOS_TEST_FOR_EXCEPTION(
346 "doExport (reverse mode): The target object's Map " 347 "is not identical to the Import's source Map.");
348 #ifdef HAVE_TPETRA_DEBUG 351 TEUCHOS_TEST_FOR_EXCEPTION(
353 std::invalid_argument,
354 "doExport (reverse mode): The source is a DistObject, yet its " 355 "Map is not identical to the Import's target Map.");
357 #endif // HAVE_TPETRA_DEBUG 360 typedef ArrayView<const LocalOrdinal> view_type;
365 doTransfer (source, CM, numSameIDs, permuteToLIDs, permuteFromLIDs, remoteLIDs,
369 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
373 return map_->isDistributed ();
376 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
383 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
389 const Teuchos::ArrayView<const LocalOrdinal>& permuteToLIDs_,
390 const Teuchos::ArrayView<const LocalOrdinal>& permuteFromLIDs_,
391 const Teuchos::ArrayView<const LocalOrdinal>& remoteLIDs_,
392 const Teuchos::ArrayView<const LocalOrdinal>& exportLIDs_,
397 doTransferNew(src, CM, numSameIDs, permuteToLIDs_, permuteFromLIDs_, remoteLIDs_, exportLIDs_, distor, revOp);
400 doTransferOld(src, CM, numSameIDs, permuteToLIDs_, permuteFromLIDs_, remoteLIDs_, exportLIDs_, distor, revOp);
404 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
410 const Teuchos::ArrayView<const LocalOrdinal>& permuteToLIDs,
411 const Teuchos::ArrayView<const LocalOrdinal>& permuteFromLIDs,
412 const Teuchos::ArrayView<const LocalOrdinal>& remoteLIDs,
413 const Teuchos::ArrayView<const LocalOrdinal>& exportLIDs,
417 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 418 Teuchos::TimeMonitor doXferMon (*doXferTimer_);
419 #endif // HAVE_TPETRA_TRANSFER_TIMERS 421 TEUCHOS_TEST_FOR_EXCEPTION(
423 "Tpetra::DistObject::doTransfer(): checkSizes() indicates that the " 424 "destination object is not a legal target for redistribution from the " 425 "source object. This probably means that they do not have the same " 426 "dimensions. For example, MultiVectors must have the same number of " 427 "rows and columns.");
428 KokkosClassic::ReadWriteOption rwo = KokkosClassic::ReadWrite;
430 const size_t numIDsToWrite = numSameIDs +
431 static_cast<size_t> (permuteToLIDs.size ()) +
432 static_cast<size_t> (remoteLIDs.size ());
433 if (numIDsToWrite == this->
getMap ()->getNodeNumElements ()) {
441 rwo = KokkosClassic::WriteOnly;
453 if (srcDistObj != NULL) {
471 if (numSameIDs + permuteToLIDs.size()) {
472 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 473 Teuchos::TimeMonitor copyAndPermuteMon (*copyAndPermuteTimer_);
474 #endif // HAVE_TPETRA_TRANSFER_TIMERS 494 if (constantNumPackets == 0) {
495 numExportPacketsPerLID_old_.resize (exportLIDs.size ());
496 numImportPacketsPerLID_old_.resize (remoteLIDs.size ());
500 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 501 Teuchos::TimeMonitor packAndPrepareMon (*packAndPrepareTimer_);
502 #endif // HAVE_TPETRA_TRANSFER_TIMERS 508 packAndPrepare (src, exportLIDs, exports_old_, numExportPacketsPerLID_old_ (),
509 constantNumPackets, distor);
517 if (srcDistObj != NULL) {
523 if (constantNumPackets != 0) {
528 const size_t rbufLen = remoteLIDs.size() * constantNumPackets;
529 if (static_cast<size_t> (imports_old_.size()) != rbufLen) {
530 imports_old_.resize (rbufLen);
535 bool needCommunication =
true;
537 needCommunication =
false;
546 else if (revOp == DoForward && srcDistObj != NULL &&
548 needCommunication =
false;
551 if (needCommunication) {
552 if (revOp == DoReverse) {
553 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 554 Teuchos::TimeMonitor doPostsAndWaitsMon (*doPostsAndWaitsTimer_);
555 #endif // HAVE_TPETRA_TRANSFER_TIMERS 556 if (constantNumPackets == 0) {
559 numImportPacketsPerLID_old_());
560 size_t totalImportPackets = 0;
561 for (
Array_size_type i = 0; i < numImportPacketsPerLID_old_.size(); ++i) {
562 totalImportPackets += numImportPacketsPerLID_old_[i];
564 imports_old_.resize(totalImportPackets);
566 numExportPacketsPerLID_old_(),
568 numImportPacketsPerLID_old_());
577 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 578 Teuchos::TimeMonitor doPostsAndWaitsMon (*doPostsAndWaitsTimer_);
579 #endif // HAVE_TPETRA_TRANSFER_TIMERS 580 if (constantNumPackets == 0) {
582 numImportPacketsPerLID_old_());
583 size_t totalImportPackets = 0;
584 for (
Array_size_type i = 0; i < numImportPacketsPerLID_old_.size(); ++i) {
585 totalImportPackets += numImportPacketsPerLID_old_[i];
587 imports_old_.resize(totalImportPackets);
589 numExportPacketsPerLID_old_(),
591 numImportPacketsPerLID_old_());
600 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 601 Teuchos::TimeMonitor unpackAndCombineMon (*unpackAndCombineTimer_);
602 #endif // HAVE_TPETRA_TRANSFER_TIMERS 603 unpackAndCombine (remoteLIDs, imports_old_(), numImportPacketsPerLID_old_(),
604 constantNumPackets, distor, CM);
612 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
618 const Teuchos::ArrayView<const LocalOrdinal>& permuteToLIDs_,
619 const Teuchos::ArrayView<const LocalOrdinal>& permuteFromLIDs_,
620 const Teuchos::ArrayView<const LocalOrdinal>& remoteLIDs_,
621 const Teuchos::ArrayView<const LocalOrdinal>& exportLIDs_,
625 using Kokkos::Compat::getArrayView;
626 using Kokkos::Compat::getConstArrayView;
627 using Kokkos::Compat::getKokkosViewDeepCopy;
628 using Kokkos::Compat::create_const_view;
630 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 631 Teuchos::TimeMonitor doXferMon (*doXferTimer_);
632 #endif // HAVE_TPETRA_TRANSFER_TIMERS 649 typedef Kokkos::View<const LocalOrdinal*, execution_space> lo_const_view_type;
650 lo_const_view_type permuteToLIDs =
651 getKokkosViewDeepCopy<execution_space> (permuteToLIDs_);
652 lo_const_view_type permuteFromLIDs =
653 getKokkosViewDeepCopy<execution_space> (permuteFromLIDs_);
654 lo_const_view_type remoteLIDs =
655 getKokkosViewDeepCopy<execution_space> (remoteLIDs_);
656 lo_const_view_type exportLIDs =
657 getKokkosViewDeepCopy<execution_space> (exportLIDs_);
659 TEUCHOS_TEST_FOR_EXCEPTION(
661 "Tpetra::DistObject::doTransfer(): checkSizes() indicates that the " 662 "destination object is not a legal target for redistribution from the " 663 "source object. This probably means that they do not have the same " 664 "dimensions. For example, MultiVectors must have the same number of " 665 "rows and columns.");
666 KokkosClassic::ReadWriteOption rwo = KokkosClassic::ReadWrite;
668 const size_t numIDsToWrite = numSameIDs +
669 static_cast<size_t> (permuteToLIDs.size ()) +
670 static_cast<size_t> (remoteLIDs.size ());
671 if (numIDsToWrite == this->
getMap ()->getNodeNumElements ()) {
679 rwo = KokkosClassic::WriteOnly;
696 if (srcDistObj != NULL) {
718 if (numSameIDs + permuteToLIDs.size()) {
719 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 720 Teuchos::TimeMonitor copyAndPermuteMon (*copyAndPermuteTimer_);
721 #endif // HAVE_TPETRA_TRANSFER_TIMERS 728 copyAndPermuteNew (src, numSameIDs, permuteToLIDs, permuteFromLIDs);
746 if (constantNumPackets == 0) {
750 Kokkos::Compat::realloc (numExportPacketsPerLID_, exportLIDs.size ());
751 Kokkos::Compat::realloc (numImportPacketsPerLID_, remoteLIDs.size ());
755 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 756 Teuchos::TimeMonitor packAndPrepareMon (*packAndPrepareTimer_);
757 #endif // HAVE_TPETRA_TRANSFER_TIMERS 763 packAndPrepareNew (src, exportLIDs, exports_, numExportPacketsPerLID_,
764 constantNumPackets, distor);
775 if (srcDistObj != NULL) {
781 if (constantNumPackets != 0) {
786 const size_t rbufLen = remoteLIDs.size() * constantNumPackets;
787 if (static_cast<size_t> (imports_.size()) != rbufLen) {
788 Kokkos::Compat::realloc (imports_, rbufLen);
798 typename Kokkos::View<size_t*,execution_space>::HostMirror host_numExportPacketsPerLID =
799 Kokkos::create_mirror_view (numExportPacketsPerLID_);
800 typename Kokkos::View<size_t*,execution_space>::HostMirror host_numImportPacketsPerLID =
801 Kokkos::create_mirror_view (numImportPacketsPerLID_);
807 bool needCommunication =
true;
809 needCommunication =
false;
818 else if (revOp == DoForward && srcDistObj != NULL &&
820 needCommunication =
false;
831 if (needCommunication) {
832 if (revOp == DoReverse) {
833 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 834 Teuchos::TimeMonitor doPostsAndWaitsMon (*doPostsAndWaitsTimer_);
835 #endif // HAVE_TPETRA_TRANSFER_TIMERS 836 if (constantNumPackets == 0) {
839 host_numImportPacketsPerLID);
840 size_t totalImportPackets = 0;
845 for (view_size_type i = 0; i < numImportPacketsPerLID_.size(); ++i) {
846 totalImportPackets += host_numImportPacketsPerLID[i];
849 Kokkos::Compat::realloc (imports_, totalImportPackets);
851 getArrayView (host_numExportPacketsPerLID),
853 getArrayView (host_numImportPacketsPerLID));
862 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 863 Teuchos::TimeMonitor doPostsAndWaitsMon (*doPostsAndWaitsTimer_);
864 #endif // HAVE_TPETRA_TRANSFER_TIMERS 865 if (constantNumPackets == 0) {
866 distor.
doPostsAndWaits (create_const_view (host_numExportPacketsPerLID), 1,
867 host_numImportPacketsPerLID);
868 size_t totalImportPackets = 0;
873 for (view_size_type i = 0; i < numImportPacketsPerLID_.size(); ++i) {
874 totalImportPackets += host_numImportPacketsPerLID[i];
877 Kokkos::Compat::realloc (imports_, totalImportPackets);
879 getArrayView (host_numExportPacketsPerLID),
881 getArrayView (host_numImportPacketsPerLID));
899 #ifdef HAVE_TPETRA_TRANSFER_TIMERS 900 Teuchos::TimeMonitor unpackAndCombineMon (*unpackAndCombineTimer_);
901 #endif // HAVE_TPETRA_TRANSFER_TIMERS 902 unpackAndCombineNew (remoteLIDs, imports_, numImportPacketsPerLID_,
903 constantNumPackets, distor, CM);
915 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
920 using Teuchos::FancyOStream;
921 using Teuchos::getFancyOStream;
923 using Teuchos::rcpFromRef;
926 RCP<FancyOStream> out = getFancyOStream (rcpFromRef (os));
927 this->
describe (*out, Teuchos::VERB_DEFAULT);
930 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
936 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
942 template <
class Packet,
class LocalOrdinal,
class GlobalOrdinal,
class Node, const
bool classic>
948 template<
class DistObjectType>
951 const Teuchos::RCP<
const Map<
typename DistObjectType::local_ordinal_type,
952 typename DistObjectType::global_ordinal_type,
953 typename DistObjectType::node_type> >& newMap)
955 input->removeEmptyProcessesInPlace (newMap);
956 if (newMap.is_null ()) {
957 input = Teuchos::null;
961 template<
class DistObjectType>
966 typedef typename DistObjectType::local_ordinal_type LO;
967 typedef typename DistObjectType::global_ordinal_type GO;
968 typedef typename DistObjectType::node_type NT;
971 RCP<const map_type> newMap = input->getMap ()->removeEmptyProcesses ();
972 removeEmptyProcessesInPlace<DistObjectType> (input, newMap);
976 #define TPETRA_DISTOBJECT_INSTANT(SCALAR, LO, GO, NODE) \ 977 template class DistObject< SCALAR , LO , GO , NODE >; 981 #define TPETRA_DISTOBJECT_INSTANT_CHAR(LO, GO, NODE) \ 982 template class DistObject< char , LO , GO , NODE >; 986 #endif // TPETRA_DISTOBJECT_DEF_HPP Communication plan for data redistribution from a uniquely-owned to a (possibly) multiply-owned distr...
Teuchos::RCP< const map_type > getSourceMap() const
The source Map used to construct this Export.
ArrayView< const LocalOrdinal > getExportLIDs() const
List of entries in the source Map that will be sent to other processes.
Namespace Tpetra contains the class and methods constituting the Tpetra library.
virtual std::string description() const
One-line descriptiion of this object.
ArrayView< const LocalOrdinal > getRemoteLIDs() const
List of entries in the target Map to receive from other processes.
size_t getNumSameIDs() const
Number of initial identical IDs.
virtual size_t constantNumberOfPackets() const
Whether the implementation's instance promises always to have a constant number of packets per LID...
virtual void doTransfer(const SrcDistObject &src, CombineMode CM, size_t numSameIDs, const Teuchos::ArrayView< const local_ordinal_type > &permuteToLIDs, const Teuchos::ArrayView< const local_ordinal_type > &permuteFromLIDs, const Teuchos::ArrayView< const local_ordinal_type > &remoteLIDs, const Teuchos::ArrayView< const local_ordinal_type > &exportLIDs, Distributor &distor, ReverseOption revOp)
Redistribute data across memory images.
virtual void removeEmptyProcessesInPlace(const Teuchos::RCP< const map_type > &newMap)
Remove processes which contain no elements in this object's Map.
ArrayView< const LocalOrdinal > getPermuteFromLIDs() const
List of local IDs in the source Map that are permuted.
void deep_copy(const LittleBlock< ST2, LO > &dst, const LittleBlock< ST1, LO > &src, typename std::enable_if< std::is_convertible< ST1, ST2 >::value &&!std::is_const< ST2 >::value, int >::type *=NULL)
Copy the LittleBlock src into the LittleBlock dst.
Teuchos_Ordinal Array_size_type
Size type for Teuchos Array objects.
virtual void releaseViews() const
Hook for releasing views.
ArrayView< const LocalOrdinal > getPermuteToLIDs() const
List of local IDs in the target Map that are permuted.
virtual void packAndPrepare(const SrcDistObject &source, const Teuchos::ArrayView< const local_ordinal_type > &exportLIDs, Teuchos::Array< packet_type > &exports, const Teuchos::ArrayView< size_t > &numPacketsPerLID, size_t &constantNumPackets, Distributor &distor)
Perform any packing or preparation required for communication.
virtual bool checkSizes(const SrcDistObject &source)=0
Compare the source and target (this) objects for compatibility.
Insert new values that don't currently exist.
void doPostsAndWaits(const ArrayView< const Packet > &exports, size_t numPackets, const ArrayView< Packet > &imports)
Execute the (forward) communication plan.
virtual void unpackAndCombine(const Teuchos::ArrayView< const local_ordinal_type > &importLIDs, const Teuchos::ArrayView< const packet_type > &imports, const Teuchos::ArrayView< size_t > &numPacketsPerLID, size_t constantNumPackets, Distributor &distor, CombineMode CM)
Perform any unpacking and combining after communication.
ArrayView< const LocalOrdinal > getPermuteFromLIDs() const
List of local IDs in the source Map that are permuted.
Communication plan for data redistribution from a (possibly) multiply-owned to a uniquely-owned distr...
Map< local_ordinal_type, global_ordinal_type, node_type > map_type
The type of the Map specialization to use with this class.
virtual void createViews() const
Hook for creating a const view.
Sets up and executes a communication plan for a Tpetra DistObject.
CombineMode
Rule for combining data in an Import or Export.
virtual ~DistObject()
Destructor (virtual for memory safety of derived classes).
Teuchos::RCP< const map_type > map_
The Map over which this object is distributed.
virtual void copyAndPermute(const SrcDistObject &source, size_t numSameIDs, const Teuchos::ArrayView< const local_ordinal_type > &permuteToLIDs, const Teuchos::ArrayView< const local_ordinal_type > &permuteFromLIDs)
Perform copies and permutations that are local to this process.
Teuchos::RCP< const map_type > getTargetMap() const
The target Map used to construct this Export.
bool isDistributed() const
Whether this is a globally distributed object.
ArrayView< const LocalOrdinal > getPermuteToLIDs() const
List of local IDs in the target Map that are permuted.
Abstract base class for objects that can be the source of an Import or Export operation.
Replace existing values with new values.
Replace old values with zero.
ReverseOption
Whether the data transfer should be performed in forward or reverse mode.
void print(std::ostream &os) const
Print this object to the given output stream.
ArrayView< const LocalOrdinal > getExportLIDs() const
List of entries in the source Map that will be sent to other processes.
DistObject(const Teuchos::RCP< const map_type > &map)
Constructor.
void doReversePostsAndWaits(const ArrayView< const Packet > &exports, size_t numPackets, const ArrayView< Packet > &imports)
Execute the reverse communication plan.
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print a descriptiion of this object to the given output stream.
virtual void createViewsNonConst(KokkosClassic::ReadWriteOption rwo)
Hook for creating a nonconst view.
Describes a parallel distribution of objects over processes.
virtual bool useNewInterface()
Whether lass (???) implements old or new interface.
ArrayView< const LocalOrdinal > getRemoteLIDs() const
List of entries in the target Map to receive from other processes.
Distributor & getDistributor() const
The Distributor that this Export object uses to move data.
size_t getNumSameIDs() const
Number of initial identical IDs.
void doExport(const SrcDistObject &source, const Export< LocalOrdinal, GlobalOrdinal, Node > &exporter, CombineMode CM)
Export data into this object using an Export object ("forward mode").
virtual Teuchos::RCP< const map_type > getMap() const
The Map describing the parallel distribution of this object.
Teuchos::RCP< const map_type > getSourceMap() const
The Source Map used to construct this Import object.
Distributor & getDistributor() const
The Distributor that this Import object uses to move data.
Base class for distributed Tpetra objects that support data redistribution.
Teuchos::RCP< const map_type > getTargetMap() const
The Target Map used to construct this Import object.
void doImport(const SrcDistObject &source, const Import< LocalOrdinal, GlobalOrdinal, Node > &importer, CombineMode CM)
Import data into this object using an Import object ("forward mode").