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)
82 template<
class LocalOrdinal,
class GlobalOrdinal,
class 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");
108 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize "
109 "is not an integer multiple of numGlobalElements.");
111 if(stridedBlockId != -1)
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)
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)
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
239 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, Teuchos::as<global_size_t>(numLocalElements), Teuchos::outArg(sumLocalElements));
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)
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
388 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, numLocalElements, Teuchos::outArg(sumLocalElements));
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();
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>
Exception throws to report errors in the internal logical of the program.
Create an Xpetra::Map instance.
Class that stores a strided map.
RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const
LocalOrdinal getMaxLocalIndex() const
Returns maximum local index.
std::vector< size_t > stridingInfo_
vector with size of strided blocks (dofs)
GlobalOrdinal getMinAllGlobalIndex() const
Return the minimum global index over all nodes.
virtual ~StridedMap()
Destructor.
RCP< const Map > replaceCommWithSubset(const Teuchos::RCP< const Teuchos::Comm< int >> &newComm) const
bool isSameAs(const Map &map) const
Returns true if map is identical to this Map.
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.
size_t GID2StridingBlockId(GlobalOrdinal gid) const
GlobalOrdinal indexBase_
index base for the strided map (default = 0)
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.
Teuchos::ArrayView< const GlobalOrdinal > getNodeElementList() const
Return a list of the global indices owned by this node.
GlobalOrdinal getGlobalElement(LocalOrdinal localIndex) const
Return the global index for a given local index.
UnderlyingLib lib() const
Get the library used by this object (Tpetra or Epetra?)
global_size_t getGlobalNumElements() const
Returns the number of elements in this Map.
bool isDistributed() const
Returns true if this Map is distributed across more than one node; returns false otherwise.
LocalOrdinal getStridedBlockId() const
void setStridingData(std::vector< size_t > stridingInfo)
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.
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.
GlobalOrdinal getOffset() const
bool isContiguous() const
Returns true if this Map is distributed contiguously; returns false otherwise.
GlobalOrdinal getMaxAllGlobalIndex() const
Return the maximum global index over all nodes.
void setOffset(GlobalOrdinal offset)
GlobalOrdinal offset_
offset for gids in map (default = 0)
GlobalOrdinal getMinGlobalIndex() const
Returns minimum global index owned by this node.
std::vector< size_t > getStridingData() const
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.
size_t getFixedBlockSize() const
LocalOrdinal getLocalElement(GlobalOrdinal globalIndex) const
Return the local index for a given global index.
bool isStrided() const
returns true, if this is a strided map (i.e. more than 1 strided blocks)
virtual bool CheckConsistency()
size_t getNodeNumElements() const
Returns the number of elements belonging to the calling node.
std::string description() const
Return a simple one-line description of this object.
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.
RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > map_
LocalOrdinal getMinLocalIndex() const
Returns minimum local index.
GlobalOrdinal getMaxGlobalIndex() const
Returns maximum global index owned by this node.
RCP< const Map > removeEmptyProcesses() const
Return a new Map with processes with zero elements removed.
GlobalOrdinal getIndexBase() const
Returns the index base for this Map.
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
TEUCHOS_DEPRECATED void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, Packet *globalReduct)
size_t global_size_t
Global size_t object.