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>
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)
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
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)
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
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();
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