47 #ifndef PACKAGES_XPETRA_SUP_MAP_UTILS_HPP_
48 #define PACKAGES_XPETRA_SUP_MAP_UTILS_HPP_
53 #include "Xpetra_Map.hpp"
54 #include "Xpetra_MapFactory.hpp"
58 #ifndef DOXYGEN_SHOULD_SKIP_THIS
60 template <
class LO,
class GO,
class N>
71 template <
class LocalOrdinal,
73 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
75 #undef XPETRA_MAPUTILS_SHORT
97 std::vector<GlobalOrdinal> gids;
98 for (
size_t tt = 0; tt < subMaps.size(); ++tt) {
99 Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > subMap = subMaps[tt];
100 Teuchos::ArrayView<const GlobalOrdinal> subMapGids = subMap->getLocalElementList();
101 gids.insert(gids.end(), subMapGids.begin(), subMapGids.end());
104 const GlobalOrdinal INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
107 Teuchos::ArrayView<GlobalOrdinal> gidsView(&gids[0], gids.size());
127 static Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> >
132 "Xpetra::MatrixUtils::shrinkMapGIDs: the non-overlapping map must not have more local ids than the overlapping map.")
136 "Xpetra::MatrixUtils::shrinkMapGIDs: the maximum GIDs of the overlapping and non-overlapping maps must be the same.")
138 RCP<
const Teuchos::Comm<int> > comm = input.
getComm();
145 std::vector<int> myGIDs(comm->getSize(), 0);
146 std::vector<int> numGIDs(comm->getSize(), 0);
148 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, comm->getSize(), &myGIDs[0], &numGIDs[0]);
149 size_t gidOffset = 0;
150 for (
int p = 0; p < comm->getRank(); p++) gidOffset += numGIDs[p];
153 std::map<const GlobalOrdinal, GlobalOrdinal> origGID2newGID;
155 origGID2newGID[nonOvlInput.
getGlobalElement(i)] = Teuchos::as<GlobalOrdinal>(i) + Teuchos::as<GlobalOrdinal>(gidOffset);
158 Teuchos::Array<GlobalOrdinal> ovlUnknownStatusGids;
159 Teuchos::Array<GlobalOrdinal> ovlFoundStatusGids;
164 ovlUnknownStatusGids.push_back(gcid);
169 std::vector<int> myUnknownDofGIDs(comm->getSize(), 0);
170 std::vector<int> numUnknownDofGIDs(comm->getSize(), 0);
171 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.size();
172 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, comm->getSize(), &myUnknownDofGIDs[0], &numUnknownDofGIDs[0]);
175 size_t cntUnknownDofGIDs = 0;
176 for (
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
177 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs, 0);
178 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs, 0);
180 size_t cntUnknownOffset = 0;
181 for (
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
182 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
183 lUnknownDofGIDs[k + cntUnknownOffset] = ovlUnknownStatusGids[k];
185 if (cntUnknownDofGIDs > 0)
186 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, Teuchos::as<int>(cntUnknownDofGIDs), &lUnknownDofGIDs[0], &gUnknownDofGIDs[0]);
187 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs, 0);
188 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs, 0);
190 for (
size_t k = 0; k < gUnknownDofGIDs.size(); k++) {
191 GlobalOrdinal curgid = gUnknownDofGIDs[k];
193 lTranslatedDofGIDs[k] = origGID2newGID[curgid];
196 if (cntUnknownDofGIDs > 0)
197 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, Teuchos::as<int>(cntUnknownDofGIDs), &lTranslatedDofGIDs[0], &gTranslatedDofGIDs[0]);
199 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
200 origGID2newGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k + cntUnknownOffset];
202 Teuchos::Array<GlobalOrdinal> ovlDomainMapArray;
205 ovlDomainMapArray.push_back(origGID2newGID[gcid]);
207 RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > ovlDomainMap =
236 RCP<const Teuchos::Comm<int> > comm = input.
getComm();
239 std::map<const GlobalOrdinal, GlobalOrdinal> thyra2xpetraGID;
246 Teuchos::Array<GlobalOrdinal> ovlUnknownStatusGids;
251 ovlUnknownStatusGids.push_back(gcid);
256 std::vector<int> myUnknownDofGIDs(comm->getSize(), 0);
257 std::vector<int> numUnknownDofGIDs(comm->getSize(), 0);
258 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.size();
259 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, comm->getSize(), &myUnknownDofGIDs[0], &numUnknownDofGIDs[0]);
262 size_t cntUnknownDofGIDs = 0;
263 for (
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
264 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs, 0);
265 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs, 0);
267 size_t cntUnknownOffset = 0;
268 for (
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
269 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
270 lUnknownDofGIDs[k + cntUnknownOffset] = ovlUnknownStatusGids[k];
272 if (cntUnknownDofGIDs > 0)
273 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, Teuchos::as<int>(cntUnknownDofGIDs), &lUnknownDofGIDs[0], &gUnknownDofGIDs[0]);
274 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs, 0);
275 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs, 0);
277 for (
size_t k = 0; k < gUnknownDofGIDs.size(); k++) {
278 GlobalOrdinal curgid = gUnknownDofGIDs[k];
280 lTranslatedDofGIDs[k] = thyra2xpetraGID[curgid];
283 if (cntUnknownDofGIDs > 0)
284 Teuchos::reduceAll(*comm, Teuchos::REDUCE_MAX, Teuchos::as<int>(cntUnknownDofGIDs), &lTranslatedDofGIDs[0], &gTranslatedDofGIDs[0]);
286 for (
size_t k = 0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
287 thyra2xpetraGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k + cntUnknownOffset];
289 Teuchos::Array<GlobalOrdinal> ovlDomainMapArray;
292 ovlDomainMapArray.push_back(thyra2xpetraGID[gcid]);
294 RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > ovlDomainMap =
297 TEUCHOS_TEST_FOR_EXCEPTION(input.
getLocalNumElements() != ovlDomainMap->getLocalNumElements(),
Xpetra::Exceptions::Incompatible,
"Xpetra::MatrixUtils::transformThyra2XpetraGIDs: the number of local Thyra reference GIDs (overlapping) and local Xpetra GIDs (overlapping) must be the same!");
311 const GO INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
312 RCP<const Teuchos::Comm<int> > comm = input.
getComm();
314 RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > rcpInput = Teuchos::rcpFromRef(input);
318 if (rcpBlockedInput.is_null() ==
true) {
320 std::vector<GlobalOrdinal> gids;
321 for (LocalOrdinal l = 0; l < Teuchos::as<LocalOrdinal>(rcpInput->getLocalNumElements()); ++l) {
325 Teuchos::ArrayView<GO> gidsView(&gids[0], gids.size());
326 RCP<Map> fullMap =
MapFactory::Build(rcpInput->lib(), INVALID, gidsView, rcpInput->getIndexBase(), comm);
333 size_t numMaps = rcpBlockedInput->getNumMaps();
337 std::vector<GlobalOrdinal> gidOffsets(numMaps, 0);
338 for (
size_t i = 1; i < numMaps; ++i) {
339 gidOffsets[i] = rcpBlockedInput->getMap(i - 1,
true)->getMaxAllGlobalIndex() + gidOffsets[i - 1] + 1;
342 std::vector<RCP<const Map> > mapsXpetra(rcpBlockedInput->getNumMaps(), Teuchos::null);
343 std::vector<RCP<const Map> > mapsThyra(rcpBlockedInput->getNumMaps(), Teuchos::null);
344 for (
size_t b = 0; b < rcpBlockedInput->getNumMaps(); ++b) {
347 RCP<const Map> subMapThyra = rcpBlockedInput->getMap(b,
true);
349 mapsXpetra[b] = subMapXpetra;
350 mapsThyra[b] = subMapThyra;
360 #define XPETRA_MAPUTILS_SHORT
362 #endif // PACKAGES_XPETRA_SUP_MAP_UTILS_HPP_
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const =0
Get this Map's Comm object.
virtual size_t getLocalNumElements() const =0
The number of elements belonging to the calling process.
static Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > concatenateMaps(const std::vector< Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > > &subMaps)
Helper function to concatenate several maps.
virtual bool isNodeGlobalElement(GlobalOrdinal globalIndex) const =0
Whether the given global index is valid for this Map on this process.
static Teuchos::RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, const Teuchos::RCP< const Teuchos::Comm< int >> &comm, LocalGlobal lg=Xpetra::GloballyDistributed)
Map constructor with Xpetra-defined contiguous uniform distribution.
static Teuchos::RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > transformThyra2XpetraGIDs(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &input, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlInput, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlReferenceInput)
replace set of global ids by new global ids
virtual GlobalOrdinal getMaxAllGlobalIndex() const =0
The maximum global index over all processes in the communicator.
virtual GlobalOrdinal getGlobalElement(LocalOrdinal localIndex) const =0
The global index corresponding to the given local index.
static Teuchos::RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > shrinkMapGIDs(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &input, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlInput)
Helper function to shrink the GIDs and generate a standard map whith GIDs starting at 0...
virtual GlobalOrdinal getGlobalElement(LocalOrdinal localIndex) const
The global index corresponding to the given local index.
Exception throws to report incompatible objects (like maps).
static Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > transformThyra2XpetraGIDs(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &input, GlobalOrdinal offset)
replace set of global ids by new global ids
virtual UnderlyingLib lib() const =0
Get the library used by this object (Tpetra or Epetra?)