47 #ifndef PACKAGES_XPETRA_SUP_MAP_UTILS_HPP_ 48 #define PACKAGES_XPETRA_SUP_MAP_UTILS_HPP_ 63 template <
class LocalOrdinal,
67 #undef XPETRA_MAPUTILS_SHORT 89 std::vector<GlobalOrdinal> gids;
90 for(
size_t tt = 0; tt<subMaps.size(); ++tt) {
91 Teuchos::RCP<const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > subMap = subMaps[tt];
92 for(LocalOrdinal l = 0; l < Teuchos::as<LocalOrdinal>(subMap->getNodeNumElements()); ++l) {
93 GlobalOrdinal gid = subMap->getGlobalElement(l);
98 const GlobalOrdinal INVALID = Teuchos::OrdinalTraits<Xpetra::global_size_t>::invalid();
101 Teuchos::ArrayView<GlobalOrdinal> gidsView(&gids[0], gids.size());
121 static Teuchos::RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> >
shrinkMapGIDs(
127 RCP<
const Teuchos::Comm<int> > comm = input.
getComm();
134 std::vector<int> myGIDs(comm->getSize(),0);
135 std::vector<int> numGIDs(comm->getSize(),0);
137 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,comm->getSize(),&myGIDs[0],&numGIDs[0]);
138 size_t gidOffset = 0;
139 for(
int p = 0; p < comm->getRank(); p++) gidOffset += numGIDs[p];
142 std::map<const GlobalOrdinal, GlobalOrdinal> origGID2newGID;
144 origGID2newGID[nonOvlInput.
getGlobalElement(i)] = Teuchos::as<GlobalOrdinal>(i) + Teuchos::as<GlobalOrdinal>(gidOffset);
147 Teuchos::Array<GlobalOrdinal> ovlUnknownStatusGids;
148 Teuchos::Array<GlobalOrdinal> ovlFoundStatusGids;
153 ovlUnknownStatusGids.push_back(gcid);
158 std::vector<int> myUnknownDofGIDs(comm->getSize(),0);
159 std::vector<int> numUnknownDofGIDs(comm->getSize(),0);
160 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.size();
161 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,comm->getSize(),&myUnknownDofGIDs[0],&numUnknownDofGIDs[0]);
164 size_t cntUnknownDofGIDs = 0;
165 for(
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
166 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs,0);
167 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs,0);
169 size_t cntUnknownOffset = 0;
170 for(
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
171 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
172 lUnknownDofGIDs[k+cntUnknownOffset] = ovlUnknownStatusGids[k];
174 if(cntUnknownDofGIDs > 0)
175 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lUnknownDofGIDs[0],&gUnknownDofGIDs[0]);
176 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs,0);
177 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs,0);
179 for(
size_t k=0; k < gUnknownDofGIDs.size(); k++) {
180 GlobalOrdinal curgid = gUnknownDofGIDs[k];
182 lTranslatedDofGIDs[k] = origGID2newGID[curgid];
185 if(cntUnknownDofGIDs > 0)
186 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lTranslatedDofGIDs[0],&gTranslatedDofGIDs[0]);
188 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
189 origGID2newGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k+cntUnknownOffset];
191 Teuchos::Array<GlobalOrdinal> ovlDomainMapArray;
194 ovlDomainMapArray.push_back(origGID2newGID[gcid]);
196 RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > ovlDomainMap =
198 (nonOvlInput.
lib(),Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(),ovlDomainMapArray(),0,comm);
226 RCP< const Teuchos::Comm<int> > comm = input.
getComm();
229 std::map<const GlobalOrdinal, GlobalOrdinal> thyra2xpetraGID;
236 Teuchos::Array<GlobalOrdinal> ovlUnknownStatusGids;
241 ovlUnknownStatusGids.push_back(gcid);
246 std::vector<int> myUnknownDofGIDs(comm->getSize(),0);
247 std::vector<int> numUnknownDofGIDs(comm->getSize(),0);
248 myUnknownDofGIDs[comm->getRank()] = ovlUnknownStatusGids.size();
249 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,comm->getSize(),&myUnknownDofGIDs[0],&numUnknownDofGIDs[0]);
252 size_t cntUnknownDofGIDs = 0;
253 for(
int p = 0; p < comm->getSize(); p++) cntUnknownDofGIDs += numUnknownDofGIDs[p];
254 std::vector<GlobalOrdinal> lUnknownDofGIDs(cntUnknownDofGIDs,0);
255 std::vector<GlobalOrdinal> gUnknownDofGIDs(cntUnknownDofGIDs,0);
257 size_t cntUnknownOffset = 0;
258 for(
int p = 0; p < comm->getRank(); p++) cntUnknownOffset += numUnknownDofGIDs[p];
259 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
260 lUnknownDofGIDs[k+cntUnknownOffset] = ovlUnknownStatusGids[k];
262 if(cntUnknownDofGIDs > 0)
263 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lUnknownDofGIDs[0],&gUnknownDofGIDs[0]);
264 std::vector<GlobalOrdinal> lTranslatedDofGIDs(cntUnknownDofGIDs,0);
265 std::vector<GlobalOrdinal> gTranslatedDofGIDs(cntUnknownDofGIDs,0);
267 for(
size_t k=0; k < gUnknownDofGIDs.size(); k++) {
268 GlobalOrdinal curgid = gUnknownDofGIDs[k];
270 lTranslatedDofGIDs[k] = thyra2xpetraGID[curgid];
273 if(cntUnknownDofGIDs > 0)
274 Teuchos::reduceAll(*comm,Teuchos::REDUCE_MAX,Teuchos::as<int>(cntUnknownDofGIDs),&lTranslatedDofGIDs[0],&gTranslatedDofGIDs[0]);
276 for(
size_t k=0; k < Teuchos::as<size_t>(ovlUnknownStatusGids.size()); k++) {
277 thyra2xpetraGID[ovlUnknownStatusGids[k]] = gTranslatedDofGIDs[k+cntUnknownOffset];
279 Teuchos::Array<GlobalOrdinal> ovlDomainMapArray;
282 ovlDomainMapArray.push_back(thyra2xpetraGID[gcid]);
284 RCP<Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node> > ovlDomainMap =
286 (nonOvlInput.
lib(),Teuchos::OrdinalTraits<GlobalOrdinal>::invalid(),ovlDomainMapArray(),0,comm);
288 TEUCHOS_TEST_FOR_EXCEPTION(input.
getNodeNumElements() != ovlDomainMap->getNodeNumElements(),
Xpetra::Exceptions::Incompatible,
"Xpetra::MatrixUtils::transformThyra2XpetraGIDs: the number of local Thyra reference GIDs (overlapping) and local Xpetra GIDs (overlapping) must be the same!");
299 #define XPETRA_MAPUTILS_SHORT 301 #endif // PACKAGES_XPETRA_SUP_MAP_UTILS_HPP_
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const =0
Get this Map's Comm object.
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, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
virtual size_t getNodeNumElements() 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< 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...
Exception throws to report incompatible objects (like maps).
virtual UnderlyingLib lib() const =0
Get the library used by this object (Tpetra or Epetra?)