49 #ifndef XPETRA_STRIDEDMAP_DEF_HPP
50 #define XPETRA_STRIDEDMAP_DEF_HPP
57 #include "Xpetra_MapFactory.hpp"
63 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
64 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
69 GlobalOrdinal indexBase,
70 std::vector<size_t>& stridingInfo,
72 LocalOrdinal stridedBlockId,
76 : StridedMap(xlib, numGlobalElements, indexBase, stridingInfo, comm, stridedBlockId, offset, lg)
79 #endif // #ifdef TPETRA_ENABLE_DEPRECATED_CODE
82 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
83 StridedMap<LocalOrdinal, GlobalOrdinal, Node>::
86 GlobalOrdinal indexBase,
87 std::vector<size_t>& stridingInfo,
89 LocalOrdinal stridedBlockId,
92 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId), offset_(offset), indexBase_(indexBase)
100 "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
103 std::invalid_argument,
104 "StridedMap::StridedMap: numGlobalElements is invalid");
106 TEUCHOS_TEST_FOR_EXCEPTION(numGlobalElements % blkSize != 0,
108 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize "
109 "is not an integer multiple of numGlobalElements.");
111 if(stridedBlockId != -1)
113 TEUCHOS_TEST_FOR_EXCEPTION(stridingInfo.size() <
static_cast<size_t>(stridedBlockId),
115 "StridedTpetraMap::StridedTpetraMap: "
116 "stridedBlockId > stridingInfo.size()");
120 if(blkSize != 1 ||
offset_ != 0)
126 RCP<Map> nodeMap = MapFactory_t::Build(xlib, numGlobalNodes, indexBase, comm, lg);
130 size_t nStridedOffset = 0;
131 size_t nDofsPerNode = blkSize;
132 if(stridedBlockId > -1)
134 for(
int j = 0; j < stridedBlockId; j++)
140 numGlobalElements = numGlobalNodes * Teuchos::as<global_size_t>(nDofsPerNode);
142 size_t numLocalElements = numLocalNodes * Teuchos::as<size_t>(nDofsPerNode);
144 std::vector<GlobalOrdinal> dofgids(numLocalElements);
145 for(LocalOrdinal i = 0; i < Teuchos::as<LocalOrdinal>(numLocalNodes); i++)
147 GlobalOrdinal nodeGID = nodeMap->getGlobalElement(i);
149 for(
size_t j = 0; j < nDofsPerNode; j++)
152 + (nodeGID -
indexBase_) * Teuchos::as<GlobalOrdinal>(blkSize)
153 + Teuchos::as<GlobalOrdinal>(nStridedOffset + j);
157 map_ = MapFactory_t::Build(xlib, numGlobalElements, dofgids, indexBase, comm);
159 if(stridedBlockId == -1)
161 TEUCHOS_TEST_FOR_EXCEPTION(
getNodeNumElements() != Teuchos::as<size_t>(nodeMap->getNodeNumElements() * nDofsPerNode),
163 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
166 != Teuchos::as<size_t>(nodeMap->getGlobalNumElements() * nDofsPerNode),
168 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
172 size_t nDofsInStridedBlock = stridingInfo[ stridedBlockId ];
174 != Teuchos::as<size_t>(nodeMap->getNodeNumElements() * nDofsInStridedBlock),
176 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
179 != Teuchos::as<size_t>(nodeMap->getGlobalNumElements() * nDofsInStridedBlock),
181 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
186 map_ = MapFactory_t::Build(xlib, numGlobalElements, indexBase, comm, lg);
193 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
194 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
199 size_t numLocalElements,
200 GlobalOrdinal indexBase,
201 std::vector<size_t>& stridingInfo,
203 LocalOrdinal stridedBlockId,
204 GlobalOrdinal offset,
206 :
StridedMap(xlib, numGlobalElements, numLocalElements, indexBase, stridingInfo, comm, stridedBlockId, offset)
209 #endif // TPETRA_ENABLE_DEPRECATED_CODE
212 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
216 size_t numLocalElements,
217 GlobalOrdinal indexBase,
218 std::vector<size_t>& stridingInfo,
220 LocalOrdinal stridedBlockId,
221 GlobalOrdinal offset)
222 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId), offset_(offset), indexBase_(indexBase)
229 "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
234 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer "
235 "multiple of numGlobalElements.");
236 #ifdef HAVE_XPETRA_DEBUG
242 std::invalid_argument,
243 "StridedMap::StridedMap: sum of numbers of local elements is different from the provided "
244 "number of global elements.");
249 numLocalElements % blkSize != 0,
251 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of numLocalElements.");
253 if(stridedBlockId != -1)
257 "StridedTpetraMap::StridedTpetraMap: stridedBlockId > stridingInfo.size()");
261 if(blkSize != 1 ||
offset_ != 0)
267 numGlobalNodes = numGlobalElements / blkSize;
272 RCP<Map> nodeMap = MapFactory_t::Build(xlib, numGlobalNodes, numLocalNodes, indexBase, comm);
275 size_t nStridedOffset = 0;
276 size_t nDofsPerNode = blkSize;
277 if(stridedBlockId > -1)
279 for(
int j = 0; j < stridedBlockId; j++)
285 numGlobalElements = nodeMap->getGlobalNumElements() * Teuchos::as<global_size_t>(nDofsPerNode);
287 numLocalElements = numLocalNodes * Teuchos::as<size_t>(nDofsPerNode);
289 std::vector<GlobalOrdinal> dofgids(numLocalElements);
290 for(LocalOrdinal i = 0; i < Teuchos::as<LocalOrdinal>(numLocalNodes); i++)
292 GlobalOrdinal nodeGID = nodeMap->getGlobalElement(i);
294 for(
size_t j = 0; j < nDofsPerNode; j++)
297 + (nodeGID -
indexBase_) * Teuchos::as<GlobalOrdinal>(blkSize)
298 + Teuchos::as<GlobalOrdinal>(nStridedOffset + j);
302 map_ = MapFactory_t::Build(xlib, numGlobalElements, dofgids, indexBase, comm);
304 if(stridedBlockId == -1)
308 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
311 != Teuchos::as<size_t>(nodeMap->getGlobalNumElements() * nDofsPerNode),
313 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
317 int nDofsInStridedBlock = stridingInfo[ stridedBlockId ];
320 != Teuchos::as<size_t>(nodeMap->getNodeNumElements() * nDofsInStridedBlock),
322 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
325 != Teuchos::as<size_t>(nodeMap->getGlobalNumElements() * nDofsInStridedBlock),
327 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
332 map_ = MapFactory_t::Build(xlib, numGlobalElements, numLocalElements, indexBase, comm);
339 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
340 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
346 GlobalOrdinal indexBase,
347 std::vector<size_t>& stridingInfo,
349 LocalOrdinal stridedBlockId,
351 :
StridedMap(xlib, numGlobalElements, elementList, indexBase, stridingInfo, comm, stridedBlockId)
354 #endif // TPETRA_ENABLE_DEPRECATED_CODE
357 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
362 GlobalOrdinal indexBase,
363 std::vector<size_t>& stridingInfo,
365 LocalOrdinal stridedBlockId)
366 : stridingInfo_(stridingInfo), stridedBlockId_(stridedBlockId), indexBase_(indexBase)
374 "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
375 if(stridedBlockId != -1)
378 "StridedTpetraMap::StridedTpetraMap: stridedBlockId > stridingInfo.size()");
383 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer "
384 "multiple of numGlobalElements.");
385 #ifdef HAVE_XPETRA_DEBUG
390 std::invalid_argument,
391 "StridedMap::StridedMap: sum of numbers of local elements is different from the provided "
392 "number of global elements.");
396 if(stridedBlockId == -1)
404 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer "
405 "multiple of elementList.size().");
415 "StridedMap::StridedMap: stridingInfo not valid: stridingBlockInfo[stridedBlockId] is not "
416 "an integer multiple of elementList.size().");
419 map_ = MapFactory_t::Build(xlib, numGlobalElements, elementList, indexBase, comm);
425 for(Teuchos_Ordinal k = 0; k < elementList.
size(); k++)
427 if(elementList[ k ] < minGidOnCurProc)
429 minGidOnCurProc = elementList[ k ];
436 size_t nStridedOffset = 0;
437 for(
int j = 0; j < stridedBlockId; j++)
439 nStridedOffset += stridingInfo[ j ];
441 const GlobalOrdinal goStridedOffset = Teuchos::as<GlobalOrdinal>(nStridedOffset);
450 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
453 std::vector<size_t>& stridingInfo,
455 LocalOrdinal stridedBlockId,
456 GlobalOrdinal offset)
457 : stridingInfo_(stridingInfo),
458 stridedBlockId_(stridedBlockId),
460 indexBase_(map->getIndexBase())
466 if(Teuchos::rcp_dynamic_cast<const StridedMap>(map) == Teuchos::null)
472 map_ = map->getMap();
477 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
484 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
489 return stridingInfo_;
493 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
498 stridingInfo_ = stridingInfo;
502 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
508 for(std::vector<size_t>::const_iterator it = stridingInfo_.begin(); it != stridingInfo_.end(); ++it)
516 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
521 return stridedBlockId_;
525 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
530 return stridingInfo_.size() > 1 ?
true :
false;
534 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
539 return getFixedBlockSize() > 1 ?
true :
false;
543 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
552 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
561 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
566 GlobalOrdinal tgid = gid - offset_ - indexBase_;
567 tgid = tgid % getFixedBlockSize();
569 size_t nStridedOffset = 0;
570 size_t stridedBlockId = 0;
571 for(
size_t j = 0; j < stridingInfo_.size(); j++)
573 nStridedOffset += stridingInfo_[ j ];
574 if(Teuchos::as<size_t>(tgid) < nStridedOffset)
580 return stridedBlockId;
584 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
593 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
598 #ifndef HAVE_XPETRA_DEBUG
601 if(getStridedBlockId() == -1)
604 if(getNodeNumElements() % getFixedBlockSize() != 0 ||
605 getGlobalNumElements() % getFixedBlockSize() != 0)
614 if(dofGids.
size() == 0)
619 if(dofGids.
size() % stridingInfo_[ stridedBlockId_ ] != 0)
626 size_t nStridedOffset = 0;
627 for(
int j = 0; j < stridedBlockId_; j++)
629 nStridedOffset += stridingInfo_[ j ];
632 const GlobalOrdinal goStridedOffset = Teuchos::as<GlobalOrdinal>(nStridedOffset);
633 const GlobalOrdinal goZeroOffset = (dofGids[ 0 ] - nStridedOffset - offset_ - indexBase_) / Teuchos::as<GlobalOrdinal>(getFixedBlockSize());
635 GlobalOrdinal cnt = 0;
637 i < Teuchos::as<size_t>(dofGids.
size()) / stridingInfo_[ stridedBlockId_ ];
638 i += stridingInfo_[ stridedBlockId_ ])
640 const GlobalOrdinal first_gid = dofGids[ i ];
643 cnt = (first_gid - goStridedOffset - offset_ - indexBase_) / Teuchos::as<GlobalOrdinal>(getFixedBlockSize()) - goZeroOffset;
646 for(
size_t j = 0; j < stridingInfo_[ stridedBlockId_ ]; j++)
648 const GlobalOrdinal gid = dofGids[ i + j ];
649 const GlobalOrdinal r = (gid - Teuchos::as<GlobalOrdinal>(j) - goStridedOffset - offset_ - indexBase_)
650 / Teuchos::as<GlobalOrdinal>(getFixedBlockSize())
651 - goZeroOffset - cnt;
658 std::cout <<
"goZeroOffset : " << goZeroOffset << std::endl
659 <<
"dofGids[0] : " << dofGids[ 0 ] << std::endl
660 <<
"stridedOffset : " << nStridedOffset << std::endl
661 <<
"offset_ : " << offset_ << std::endl
662 <<
"goStridedOffset: " << goStridedOffset << std::endl
663 <<
"getFixedBlkSize: " << getFixedBlockSize() << std::endl
664 <<
"gid: " << gid <<
" GID: " << r << std::endl;
677 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
682 return map_->getGlobalNumElements();
686 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
691 return map_->getNodeNumElements();
695 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
700 return map_->getIndexBase();
704 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
709 return map_->getMinLocalIndex();
713 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
718 return map_->getMaxLocalIndex();
722 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
727 return map_->getMinGlobalIndex();
731 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
736 return map_->getMaxGlobalIndex();
740 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
745 return map_->getMinAllGlobalIndex();
749 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
754 return map_->getMaxAllGlobalIndex();
758 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
763 return map_->getLocalElement(globalIndex);
767 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
772 return map_->getGlobalElement(localIndex);
776 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
783 return map_->getRemoteIndexList(GIDList, nodeIDList, LIDList);
787 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
793 return map_->getRemoteIndexList(GIDList, nodeIDList);
797 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
802 return map_->getNodeElementList();
806 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
811 return map_->isNodeLocalElement(localIndex);
815 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
820 return map_->isNodeGlobalElement(globalIndex);
824 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
829 return map_->isContiguous();
833 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
838 return map_->isDistributed();
842 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
847 return map_->isCompatible(map);
851 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
856 return map_->isSameAs(map);
860 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
865 return map_->getComm();
869 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
870 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
875 return map_->getNode();
877 #endif // TPETRA_ENABLE_DEPRECATED_CODE
880 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
881 RCP<const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node>>
885 return map_->removeEmptyProcesses();
889 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
894 return map_->replaceCommWithSubset(newComm);
898 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
903 return map_->description();
907 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
912 map_->describe(out, verbLevel);
916 template<
class LocalOrdinal,
class GlobalOrdinal,
class Node>
930 #endif // XPETRA_STRIDEDMAP_DEF_HPP
LookupStatus getRemoteIndexList(const Teuchos::ArrayView< const GlobalOrdinal > &GIDList, const Teuchos::ArrayView< int > &nodeIDList, const Teuchos::ArrayView< LocalOrdinal > &LIDList) const
Returns the node IDs and corresponding local indices for a given list of global indices.
LocalOrdinal getStridedBlockId() const
GlobalOrdinal getMaxGlobalIndex() const
Returns maximum global index owned by this node.
GlobalOrdinal getGlobalElement(LocalOrdinal localIndex) const
Return the global index for a given local index.
size_t GID2StridingBlockId(GlobalOrdinal gid) const
bool isContiguous() const
Returns true if this Map is distributed contiguously; returns false otherwise.
void setStridingData(std::vector< size_t > stridingInfo)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::ArrayView< const GlobalOrdinal > getNodeElementList() const
Return a list of the global indices owned by this node.
GlobalOrdinal indexBase_
index base for the strided map (default = 0)
GlobalOrdinal getOffset() const
Exception throws to report errors in the internal logical of the program.
LocalOrdinal getMaxLocalIndex() const
Returns maximum local index.
Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
Get the Comm object for this Map.
bool isCompatible(const Map &map) const
Returns true if map is compatible with this Map.
std::string description() const
Return a simple one-line description of this object.
GlobalOrdinal getMaxAllGlobalIndex() const
Return the maximum global index over all nodes.
bool isNodeGlobalElement(GlobalOrdinal globalIndex) const
Returns true if the global index is found in this Map on this node; returns false if it isn't...
bool isNodeLocalElement(LocalOrdinal localIndex) const
Returns true if the local index is valid for this Map on this node; returns false if it isn't...
bool isStrided() const
returns true, if this is a strided map (i.e. more than 1 strided blocks)
bool isSameAs(const Map &map) const
Returns true if map is identical to this Map.
std::vector< size_t > stridingInfo_
vector with size of strided blocks (dofs)
RCP< const Map > removeEmptyProcesses() const
Return a new Map with processes with zero elements removed.
RCP< const Map > replaceCommWithSubset(const Teuchos::RCP< const Teuchos::Comm< int >> &newComm) const
bool isDistributed() const
Returns true if this Map is distributed across more than one node; returns false otherwise.
size_t getFixedBlockSize() const
GlobalOrdinal offset_
offset for gids in map (default = 0)
TEUCHOS_DEPRECATED void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, Packet *globalReduct)
GlobalOrdinal getMinGlobalIndex() const
Returns minimum global index owned by this node.
size_t getNodeNumElements() const
Returns the number of elements belonging to the calling node.
size_t global_size_t
Global size_t object.
GlobalOrdinal getIndexBase() const
Returns the index base for this Map.
RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const
global_size_t getGlobalNumElements() const
Returns the number of elements in this Map.
virtual bool CheckConsistency()
std::vector< size_t > getStridingData() const
LocalOrdinal getLocalElement(GlobalOrdinal globalIndex) const
Return the local index for a given global index.
StridedMap(UnderlyingLib xlib, global_size_t numGlobalElements, GlobalOrdinal indexBase, std::vector< size_t > &stridingInfo, const Teuchos::RCP< const Teuchos::Comm< int >> &comm, LocalOrdinal stridedBlockId=-1, GlobalOrdinal offset=0, LocalGlobal lg=GloballyDistributed)
Map constructor with contiguous uniform distribution.
LocalOrdinal getMinLocalIndex() const
Returns minimum local index.
UnderlyingLib lib() const
Get the library used by this object (Tpetra or Epetra?)
GlobalOrdinal getMinAllGlobalIndex() const
Return the minimum global index over all nodes.
Create an Xpetra::Map instance.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to a FancyOStream object.
virtual ~StridedMap()
Destructor.
Class that stores a strided map.
void setOffset(GlobalOrdinal offset)
RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > map_