95 "Xpetra::MatrixUtils::shrinkMapGIDs: the non-overlapping map must not have more local ids than the overlapping map.")
99 "Xpetra::MatrixUtils::shrinkMapGIDs: the maximum GIDs of the overlapping and non-overlapping maps must be the same.")
108 std::vector<int> myGIDs(comm->getSize(), 0);
109 std::vector<int> numGIDs(comm->getSize(), 0);
111 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, comm->getSize(), &myGIDs[0], &numGIDs[0]);
112 size_t gidOffset = 0;
113 for (
int p = 0; p < comm->getRank(); p++) gidOffset += numGIDs[p];
116 std::map<const GlobalOrdinal, GlobalOrdinal> origGID2newGID;
132 std::vector<int> myUnknownDofGIDs(comm->getSize(), 0);
133 std::vector<int> numUnknownDofGIDs(comm->getSize(), 0);
134 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.
size();
135 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, comm->getSize(), &myUnknownDofGIDs[0], &numUnknownDofGIDs[0]);
138 size_t cntUnknownDofGIDs = 0;
139 for (
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
140 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs, 0);
141 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs, 0);
143 size_t cntUnknownOffset = 0;
144 for (
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
145 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
146 lUnknownDofGIDs[k + cntUnknownOffset] = ovlUnknownStatusGids[k];
148 if (cntUnknownDofGIDs > 0)
149 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX,
Teuchos::as<int>(cntUnknownDofGIDs), &lUnknownDofGIDs[0], &gUnknownDofGIDs[0]);
150 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs, 0);
151 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs, 0);
153 for (
size_t k = 0; k < gUnknownDofGIDs.size(); k++) {
154 GlobalOrdinal curgid = gUnknownDofGIDs[k];
156 lTranslatedDofGIDs[k] = origGID2newGID[curgid];
159 if (cntUnknownDofGIDs > 0)
160 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX,
Teuchos::as<int>(cntUnknownDofGIDs), &lTranslatedDofGIDs[0], &gTranslatedDofGIDs[0]);
162 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
163 origGID2newGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k + cntUnknownOffset];
165 Teuchos::Array<GlobalOrdinal> ovlDomainMapArray;
168 ovlDomainMapArray.
push_back(origGID2newGID[gcid]);
170 RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > ovlDomainMap =
202 std::map<const GlobalOrdinal, GlobalOrdinal> thyra2xpetraGID;
219 std::vector<int> myUnknownDofGIDs(comm->getSize(), 0);
220 std::vector<int> numUnknownDofGIDs(comm->getSize(), 0);
221 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.
size();
222 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, comm->getSize(), &myUnknownDofGIDs[0], &numUnknownDofGIDs[0]);
225 size_t cntUnknownDofGIDs = 0;
226 for (
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
227 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs, 0);
228 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs, 0);
230 size_t cntUnknownOffset = 0;
231 for (
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
232 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
233 lUnknownDofGIDs[k + cntUnknownOffset] = ovlUnknownStatusGids[k];
235 if (cntUnknownDofGIDs > 0)
236 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX,
Teuchos::as<int>(cntUnknownDofGIDs), &lUnknownDofGIDs[0], &gUnknownDofGIDs[0]);
237 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs, 0);
238 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs, 0);
240 for (
size_t k = 0; k < gUnknownDofGIDs.size(); k++) {
241 GlobalOrdinal curgid = gUnknownDofGIDs[k];
243 lTranslatedDofGIDs[k] = thyra2xpetraGID[curgid];
246 if (cntUnknownDofGIDs > 0)
247 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX,
Teuchos::as<int>(cntUnknownDofGIDs), &lTranslatedDofGIDs[0], &gTranslatedDofGIDs[0]);
249 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
250 thyra2xpetraGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k + cntUnknownOffset];
255 ovlDomainMapArray.
push_back(thyra2xpetraGID[gcid]);
281 if (rcpBlockedInput.
is_null() ==
true) {
283 std::vector<GlobalOrdinal> gids;
284 for (LocalOrdinal l = 0; l < Teuchos::as<LocalOrdinal>(rcpInput->getLocalNumElements()); ++l) {
285 GlobalOrdinal gid = rcpInput->getGlobalElement(l) + offset;
296 size_t numMaps = rcpBlockedInput->getNumMaps();
300 std::vector<GlobalOrdinal> gidOffsets(numMaps, 0);
301 for (
size_t i = 1; i < numMaps; ++i) {
302 gidOffsets[i] = rcpBlockedInput->getMap(i - 1,
true)->getMaxAllGlobalIndex() + gidOffsets[i - 1] + 1;
305 std::vector<RCP<const Map> > mapsXpetra(rcpBlockedInput->getNumMaps(), Teuchos::null);
306 std::vector<RCP<const Map> > mapsThyra(rcpBlockedInput->getNumMaps(), Teuchos::null);
307 for (
size_t b = 0; b < rcpBlockedInput->getNumMaps(); ++b) {
312 mapsXpetra[b] = subMapXpetra;
313 mapsThyra[b] = subMapThyra;