134 "Xpetra::MatrixUtils::shrinkMapGIDs: the non-overlapping map must not have more local ids than the overlapping map.")
138 "Xpetra::MatrixUtils::shrinkMapGIDs: the maximum GIDs of the overlapping and non-overlapping maps must be the same.")
147 std::vector<int> myGIDs(comm->getSize(),0);
148 std::vector<int> numGIDs(comm->getSize(),0);
150 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,comm->getSize(),&myGIDs[0],&numGIDs[0]);
151 size_t gidOffset = 0;
152 for(
int p = 0; p < comm->getRank(); p++) gidOffset += numGIDs[p];
155 std::map<const GlobalOrdinal, GlobalOrdinal> origGID2newGID;
158 origGID2newGID[nonOvlInput.
getGlobalElement(i)] = Teuchos::as<GlobalOrdinal>(i) + Teuchos::as<GlobalOrdinal>(gidOffset);
172 std::vector<int> myUnknownDofGIDs(comm->getSize(),0);
173 std::vector<int> numUnknownDofGIDs(comm->getSize(),0);
174 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.
size();
175 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,comm->getSize(),&myUnknownDofGIDs[0],&numUnknownDofGIDs[0]);
178 size_t cntUnknownDofGIDs = 0;
179 for(
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
180 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs,0);
181 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs,0);
183 size_t cntUnknownOffset = 0;
184 for(
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
185 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
186 lUnknownDofGIDs[k+cntUnknownOffset] = ovlUnknownStatusGids[k];
188 if(cntUnknownDofGIDs > 0)
189 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lUnknownDofGIDs[0],&gUnknownDofGIDs[0]);
190 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs,0);
191 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs,0);
193 for(
size_t k=0; k < gUnknownDofGIDs.size(); k++) {
194 GlobalOrdinal curgid = gUnknownDofGIDs[k];
196 lTranslatedDofGIDs[k] = origGID2newGID[curgid];
199 if(cntUnknownDofGIDs > 0)
200 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lTranslatedDofGIDs[0],&gTranslatedDofGIDs[0]);
202 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
203 origGID2newGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k+cntUnknownOffset];
208 ovlDomainMapArray.
push_back(origGID2newGID[gcid]);
243 std::map<const GlobalOrdinal, GlobalOrdinal> thyra2xpetraGID;
260 std::vector<int> myUnknownDofGIDs(comm->getSize(),0);
261 std::vector<int> numUnknownDofGIDs(comm->getSize(),0);
262 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.
size();
263 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,comm->getSize(),&myUnknownDofGIDs[0],&numUnknownDofGIDs[0]);
266 size_t cntUnknownDofGIDs = 0;
267 for(
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
268 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs,0);
269 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs,0);
271 size_t cntUnknownOffset = 0;
272 for(
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
273 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
274 lUnknownDofGIDs[k+cntUnknownOffset] = ovlUnknownStatusGids[k];
276 if(cntUnknownDofGIDs > 0)
277 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lUnknownDofGIDs[0],&gUnknownDofGIDs[0]);
278 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs,0);
279 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs,0);
281 for(
size_t k=0; k < gUnknownDofGIDs.size(); k++) {
282 GlobalOrdinal curgid = gUnknownDofGIDs[k];
284 lTranslatedDofGIDs[k] = thyra2xpetraGID[curgid];
287 if(cntUnknownDofGIDs > 0)
288 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lTranslatedDofGIDs[0],&gTranslatedDofGIDs[0]);
290 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.
size()); k++) {
291 thyra2xpetraGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k+cntUnknownOffset];
296 ovlDomainMapArray.
push_back(thyra2xpetraGID[gcid]);
324 if(rcpBlockedInput.
is_null() ==
true) {
327 std::vector<GlobalOrdinal> gids;
328 for(LocalOrdinal l = 0; l < Teuchos::as<LocalOrdinal>(rcpInput->getLocalNumElements()); ++l) {
329 GlobalOrdinal gid = rcpInput->getGlobalElement(l) + offset;
340 size_t numMaps = rcpBlockedInput->getNumMaps();
344 std::vector<GlobalOrdinal> gidOffsets(numMaps,0);
345 for(
size_t i = 1; i < numMaps; ++i) {
346 gidOffsets[i] = rcpBlockedInput->getMap(i-1,
true)->getMaxAllGlobalIndex() + gidOffsets[i-1] + 1;
349 std::vector<RCP<const Map> > mapsXpetra(rcpBlockedInput->getNumMaps(), Teuchos::null);
350 std::vector<RCP<const Map> > mapsThyra (rcpBlockedInput->getNumMaps(), Teuchos::null);
351 for (
size_t b = 0; b < rcpBlockedInput->getNumMaps(); ++b){
356 mapsXpetra[b] = subMapXpetra;
357 mapsThyra[b] = subMapThyra;