49 #ifndef XPETRA_STRIDEDMAP_HPP
50 #define XPETRA_STRIDEDMAP_HPP
56 #include <Teuchos_Describable.hpp>
95 template <class LocalOrdinal = Map<>::local_ordinal_type,
98 class StridedMap :
public virtual Map<LocalOrdinal, GlobalOrdinal, Node> {
107 #undef XPETRA_STRIDEDMAP_SHORT
136 GlobalOrdinal indexBase,
137 std::vector<size_t>& stridingInfo,
139 LocalOrdinal stridedBlockId = -1,
140 GlobalOrdinal offset = 0,
151 "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
154 std::invalid_argument,
155 "StridedMap::StridedMap: numGlobalElements is invalid");
158 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize "
159 "is not an integer multiple of numGlobalElements.");
160 if (stridedBlockId != -1)
162 stridingInfo.size() < static_cast<size_t> (stridedBlockId),
164 "stridedBlockId > stridingInfo.size()");
167 if (blkSize != 1 ||
offset_ != 0) {
176 size_t nStridedOffset = 0;
177 size_t nDofsPerNode = blkSize;
178 if (stridedBlockId > -1) {
179 for (
int j = 0; j < stridedBlockId; j++)
183 numGlobalElements = numGlobalNodes * Teuchos::as<global_size_t>(nDofsPerNode);
185 size_t numLocalElements = numLocalNodes * Teuchos::as<size_t>(nDofsPerNode);
187 std::vector<GlobalOrdinal> dofgids(numLocalElements);
188 for (LocalOrdinal i = 0; i < Teuchos::as<LocalOrdinal>(numLocalNodes); i++) {
189 GlobalOrdinal nodeGID = nodeMap->getGlobalElement(i);
191 for (
size_t j = 0; j < nDofsPerNode; j++)
192 dofgids[i*nDofsPerNode + j] =
indexBase_ +
offset_ + (nodeGID -
indexBase_)*Teuchos::as<GlobalOrdinal>(blkSize) + Teuchos::as<GlobalOrdinal>(nStridedOffset + j);
197 if (stridedBlockId == -1) {
199 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
201 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
204 size_t nDofsInStridedBlock = stridingInfo[stridedBlockId];
206 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
208 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
245 "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
248 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of numGlobalElements.");
249 #ifdef HAVE_XPETRA_DEBUG
252 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, Teuchos::as<global_size_t>(numLocalElements), Teuchos::outArg(sumLocalElements));
254 "StridedMap::StridedMap: sum of numbers of local elements is different from the provided number of global elements.");
258 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of numLocalElements.");
259 if (stridedBlockId != -1)
261 "StridedTpetraMap::StridedTpetraMap: stridedBlockId > stridingInfo.size()");
264 if (blkSize != 1 ||
offset_ != 0) {
268 numGlobalNodes = numGlobalElements / blkSize;
275 size_t nStridedOffset = 0;
276 size_t nDofsPerNode = blkSize;
277 if (stridedBlockId > -1) {
278 for (
int j = 0; j < stridedBlockId; j++)
282 numGlobalElements = nodeMap->getGlobalNumElements() * Teuchos::as<global_size_t>(nDofsPerNode);
284 numLocalElements = numLocalNodes * Teuchos::as<size_t>(nDofsPerNode);
286 std::vector<GlobalOrdinal> dofgids(numLocalElements);
287 for (LocalOrdinal i = 0; i < Teuchos::as<LocalOrdinal>(numLocalNodes); i++) {
288 GlobalOrdinal nodeGID = nodeMap->getGlobalElement(i);
290 for (
size_t j = 0; j < nDofsPerNode; j++)
291 dofgids[i*nDofsPerNode + j] =
indexBase_ +
offset_ + (nodeGID -
indexBase_)*Teuchos::as<GlobalOrdinal>(blkSize) + Teuchos::as<GlobalOrdinal>(nStridedOffset + j);
296 if (stridedBlockId == -1) {
298 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
300 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
303 int nDofsInStridedBlock = stridingInfo[stridedBlockId];
305 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
307 "StridedTpetraMap::StridedTpetraMap: wrong distribution of dofs among processors.");
335 "StridedMap::StridedMap: stridingInfo not valid: stridingInfo.size() = 0?");
336 if (stridedBlockId != -1)
338 "StridedTpetraMap::StridedTpetraMap: stridedBlockId > stridingInfo.size()");
341 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of numGlobalElements.");
342 #ifdef HAVE_XPETRA_DEBUG
345 Teuchos::reduceAll(*comm, Teuchos::REDUCE_SUM, numLocalElements, Teuchos::outArg(sumLocalElements));
347 "StridedMap::StridedMap: sum of numbers of local elements is different from the provided number of global elements.");
351 if (stridedBlockId == -1) {
356 "StridedMap::StridedMap: stridingInfo not valid: getFixedBlockSize is not an integer multiple of elementList.size().");
363 "StridedMap::StridedMap: stridingInfo not valid: stridingBlockInfo[stridedBlockId] is not an integer multiple of elementList.size().");
372 for (Teuchos_Ordinal k = 0; k < elementList.
size(); k++)
373 if (elementList[k] < minGidOnCurProc)
374 minGidOnCurProc = elementList[k];
379 size_t nStridedOffset = 0;
380 for (
int j = 0; j < stridedBlockId; j++)
381 nStridedOffset += stridingInfo[j];
382 const GlobalOrdinal goStridedOffset = Teuchos::as<GlobalOrdinal>(nStridedOffset);
390 StridedMap(
const RCP<const Map>& map, std::vector<size_t>& stridingInfo, GlobalOrdinal indexBase, LocalOrdinal stridedBlockId = -1, GlobalOrdinal offset = 0)
397 if(Teuchos::rcp_dynamic_cast<const StridedMap>(map) == Teuchos::null)
400 map_ = map->getMap();
443 size_t nStridedOffset = 0;
444 size_t stridedBlockId = 0;
447 if (Teuchos::as<size_t>(tgid) < nStridedOffset) {
452 return stridedBlockId;
460 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR
461 #ifdef HAVE_XPETRA_TPETRA
464 local_map_type getLocalMap ()
const {
465 return map_->getLocalMap();
469 #warning "Xpetra Kokkos interface for CrsMatrix is enabled (HAVE_XPETRA_KOKKOS_REFACTOR) but Tpetra is disabled. The Kokkos interface needs Tpetra to be enabled, too."
512 #ifndef HAVE_XPETRA_DEBUG
526 if (dofGids.
size() == 0)
534 size_t nStridedOffset = 0;
538 const GlobalOrdinal goStridedOffset = Teuchos::as<GlobalOrdinal>(nStridedOffset);
541 GlobalOrdinal cnt = 0;
543 const GlobalOrdinal first_gid = dofGids[i];
550 const GlobalOrdinal gid = dofGids[i+j];
551 const GlobalOrdinal r = (gid - Teuchos::as<GlobalOrdinal>(j) - goStridedOffset -
offset_ -
indexBase_) /
558 std::cout <<
"goZeroOffset : " << goZeroOffset << std::endl
559 <<
"dofGids[0] : " << dofGids[0] << std::endl
560 <<
"stridedOffset : " << nStridedOffset << std::endl
561 <<
"offset_ : " <<
offset_ << std::endl
562 <<
"goStridedOffset: " << goStridedOffset << std::endl
564 <<
"gid: " << gid <<
" GID: " << r << std::endl;
619 LocalOrdinal
getLocalElement(GlobalOrdinal globalIndex)
const {
return map_->getLocalElement(globalIndex); }
626 return map_->getRemoteIndexList(GIDList, nodeIDList, LIDList);
631 return map_->getRemoteIndexList(GIDList, nodeIDList);
679 #define XPETRA_STRIDEDMAP_SHORT
680 #endif // XPETRA_STRIDEDMAP_HPP