47 ArrayRCP<const GO> decompEntries;
48 if (decomposition->getLocalLength() > 0)
49 decompEntries = decomposition->getData(0);
51 auto rowMap = decomposition->getMap();
52 auto comm = rowMap->getComm();
53 const auto myRank = comm->getRank();
56 myGIDs.reserve(decomposition->getLocalLength());
61 typedef std::map<GO, Array<GO> > map_type;
63 for (LO i = 0; i < decompEntries.size(); i++) {
64 GO
id = decompEntries[i];
65 GO GID = rowMap->getGlobalElement(i);
68 myGIDs.push_back(GID);
70 sendMap[id].push_back(GID);
72 decompEntries = Teuchos::null;
74 int numSend = sendMap.size(), numRecv;
77 Array<GO> myParts(numSend), myPart(1);
80 for (
typename map_type::const_iterator it = sendMap.begin(); it != sendMap.end(); it++)
81 myParts[cnt++] = it->first;
83 const GO numLocalKept = myGIDs.size();
89 Kokkos::View<int*, Kokkos::HostSpace> mySends(
"mySends", comm->getSize());
90 for (
typename map_type::const_iterator it = sendMap.begin(); it != sendMap.end(); it++)
91 mySends(it->first) = 1;
92 Kokkos::View<int*, Kokkos::HostSpace> numRecvsOnEachProc;
93 if (comm->getRank() == root)
94 numRecvsOnEachProc = Kokkos::View<int*, Kokkos::HostSpace>(
"numRecvsOnEachProc", comm->getSize());
95 Teuchos::reduce<int, int>(mySends.data(), numRecvsOnEachProc.data(), comm->getSize(), Teuchos::REDUCE_SUM, root, *comm);
96 Teuchos::scatter<int, int>(numRecvsOnEachProc.data(), 1, &numRecv, 1, root, *comm);
99 RCP<const Teuchos::MpiComm<int> > tmpic = rcp_dynamic_cast<const Teuchos::MpiComm<int> >(comm);
100 TEUCHOS_TEST_FOR_EXCEPTION(tmpic == Teuchos::null,
Exceptions::RuntimeError,
"Cannot cast base Teuchos::Comm to Teuchos::MpiComm object.");
101 RCP<const Teuchos::OpaqueWrapper<MPI_Comm> > rawMpiComm = tmpic->getRawMpiComm();
104 MPI_Datatype MpiType = Teuchos::Details::MpiTypeTraits<GO>::getType();
108 Array<MPI_Request> sendReqs(numSend);
110 for (
typename map_type::iterator it = sendMap.begin(); it != sendMap.end(); it++)
111 MPI_Isend(
static_cast<void*
>(it->second.getRawPtr()), it->second.size(), MpiType, Teuchos::as<GO>(it->first), msgTag, *rawMpiComm, &sendReqs[cnt++]);
114 size_t totalGIDs = myGIDs.size();
115 for (
int i = 0; i < numRecv; i++) {
117 MPI_Probe(MPI_ANY_SOURCE, msgTag, *rawMpiComm, &status);
120 int fromRank = status.MPI_SOURCE, count;
121 MPI_Get_count(&status, MpiType, &count);
123 recvMap[fromRank].resize(count);
124 MPI_Recv(
static_cast<void*
>(recvMap[fromRank].getRawPtr()), count, MpiType, fromRank, msgTag, *rawMpiComm, &status);
131 Array<MPI_Status> sendStatuses(numSend);
132 MPI_Waitall(numSend, sendReqs.getRawPtr(), sendStatuses.getRawPtr());
136 myGIDs.reserve(totalGIDs);
137 for (
typename map_type::const_iterator it = recvMap.begin(); it != recvMap.end(); it++) {
138 int offset = myGIDs.size(), len = it->second.size();
140 myGIDs.resize(offset + len);
141 memcpy(myGIDs.getRawPtr() + offset, it->second.getRawPtr(), len *
sizeof(GO));
146 std::sort(myGIDs.begin(), myGIDs.end());
148 return std::make_tuple(myGIDs, numLocalKept);