46 #ifndef XPETRA_REORDEREDBLOCKEDMULTIVECTOR_HPP
47 #define XPETRA_REORDEREDBLOCKEDMULTIVECTOR_HPP
49 #include <Tpetra_KokkosCompat_DefaultNode.hpp>
57 #include "Xpetra_BlockedMap.hpp"
58 #include "Xpetra_BlockedMultiVector.hpp"
68 template <
class Scalar,
71 class Node = Tpetra::KokkosClassic::DefaultNode::DefaultNodeType>
80 #undef XPETRA_REORDEREDBLOCKEDMULTIVECTOR_SHORT
96 Teuchos::RCP<const Xpetra::BlockReorderManager> brm,
107 brm_ = Teuchos::null;
114 Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>
mergeSubBlockMaps(Teuchos::RCP<const Xpetra::BlockReorderManager> brm) {
115 RCP<const BlockedMap> bmap =
fullVec_->getBlockedMap();
118 size_t numBlocks = brm->GetNumBlocks();
120 Teuchos::RCP<const Map> map = Teuchos::null;
122 if (numBlocks == 0) {
127 map = bmap->getMap(Teuchos::as<size_t>(leaf->GetIndex()),
false);
130 std::vector<Teuchos::RCP<const Map>> subMaps(numBlocks, Teuchos::null);
132 for (
size_t i = 0; i < numBlocks; i++) {
133 Teuchos::RCP<const Xpetra::BlockReorderManager> blkMgr = brm->GetBlock(Teuchos::as<int>(i));
135 TEUCHOS_ASSERT(subMaps[i].is_null() ==
false);
140 TEUCHOS_ASSERT(map.is_null() ==
false);
149 std::string
description()
const {
return "ReorderedBlockedMultiVector"; }
152 void describe(Teuchos::FancyOStream& out,
const Teuchos::EVerbosityLevel verbLevel = Teuchos::Describable::verbLevel_default)
const {
153 TEUCHOS_ASSERT(
brm_ != Teuchos::null);
161 Teuchos::RCP<const Xpetra::BlockReorderManager>
brm_;
162 Teuchos::RCP<const Xpetra::BlockedMultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>>
fullVec_;
165 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
170 RCP<const Xpetra::BlockedMap<LocalOrdinal, GlobalOrdinal, Node>> bmap = bvec->getBlockedMap();
173 size_t numBlocks = brm->GetNumBlocks();
175 Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>> map = Teuchos::null;
177 if (numBlocks == 0) {
181 map = bmap->getMap(Teuchos::as<size_t>(leaf->GetIndex()), bThyraMode);
184 std::vector<Teuchos::RCP<const Xpetra::Map<LocalOrdinal, GlobalOrdinal, Node>>> subMaps(numBlocks, Teuchos::null);
186 for (
size_t i = 0; i < numBlocks; i++) {
187 Teuchos::RCP<const Xpetra::BlockReorderManager> blkMgr = brm->GetBlock(Teuchos::as<int>(i));
189 TEUCHOS_ASSERT(subMaps[i].is_null() ==
false);
206 TEUCHOS_ASSERT(map.is_null() ==
false);
210 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
220 size_t rowSz = rowMgr->GetNumBlocks();
222 Teuchos::RCP<BlockedMultiVector> rbvec = Teuchos::null;
226 Teuchos::RCP<const Xpetra::BlockReorderLeaf> rowleaf = Teuchos::rcp_dynamic_cast<
const Xpetra::BlockReorderLeaf>(rowMgr);
229 Teuchos::RCP<MultiVector> vec = bvec->getMultiVector(rowleaf->GetIndex(),
false);
231 TEUCHOS_ASSERT(vec != Teuchos::null);
234 Teuchos::RCP<BlockedMultiVector> subBVec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(vec);
235 if (subBVec == Teuchos::null) {
248 RCP<const BlockedMap> fullBlockedMap = bvec->getBlockedMap();
249 Teuchos::RCP<const Map> submap = fullBlockedMap->getMap(rowleaf->GetIndex(),
false);
250 std::vector<Teuchos::RCP<const Map>> rowSubMaps(1, submap);
251 Teuchos::RCP<const BlockedMap> bbmap = Teuchos::rcp(
new BlockedMap(submap, rowSubMaps,
false));
253 rbvec = Teuchos::rcp(
new ReorderedBlockedMultiVector(bbmap, rowMgr, bvec));
254 rbvec->setMultiVector(0, Teuchos::rcp_const_cast<MultiVector>(vec),
false);
259 TEUCHOS_ASSERT(rbvec != Teuchos::null);
264 Teuchos::RCP<const BlockedMap> rgBlockedMap = Teuchos::null;
265 std::vector<Teuchos::RCP<const Map>> rowSubMaps(rowSz, Teuchos::null);
266 for (
size_t i = 0; i < rowSz; i++) {
267 Teuchos::RCP<const Xpetra::BlockReorderManager> rowSubMgr = rowMgr->GetBlock(Teuchos::as<int>(i));
269 TEUCHOS_ASSERT(rowSubMaps[i].is_null() ==
false);
272 rgBlockedMap = Teuchos::rcp(
new BlockedMap(rgMergedSubMaps, rowSubMaps,
false));
273 rbvec = Teuchos::rcp(
new ReorderedBlockedMultiVector(rgBlockedMap, rowMgr, bvec));
275 for (
size_t i = 0; i < rowSz; i++) {
276 Teuchos::RCP<const Xpetra::BlockReorderManager> rowSubMgr = rowMgr->GetBlock(Teuchos::as<int>(i));
277 Teuchos::RCP<const MultiVector> subvec =
mergeSubBlocks(rowSubMgr, bvec);
278 rbvec->setMultiVector(i, Teuchos::rcp_const_cast<MultiVector>(subvec),
false);
284 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
292 TEUCHOS_ASSERT(bvec->getBlockedMap()->getThyraMode() ==
true);
295 size_t rowSz = rowMgr->GetNumBlocks();
297 Teuchos::RCP<BlockedMultiVector> rbvec = Teuchos::null;
301 Teuchos::RCP<const Xpetra::BlockReorderLeaf> rowleaf = Teuchos::rcp_dynamic_cast<
const Xpetra::BlockReorderLeaf>(rowMgr);
304 Teuchos::RCP<MultiVector> vec = bvec->getMultiVector(rowleaf->GetIndex(),
true);
306 TEUCHOS_ASSERT(vec.is_null() ==
false);
309 Teuchos::RCP<BlockedMultiVector> bbvec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(vec);
310 if (bbvec == Teuchos::null) {
313 RCP<const BlockedMap> fullBlockedRangeMap = bvec->getBlockedMap();
315 Teuchos::RCP<const Map> xpsubmap = fullBlockedRangeMap->getMap(rowleaf->GetIndex(),
false);
316 Teuchos::RCP<const Map> thysubmap = fullBlockedRangeMap->getMap(rowleaf->GetIndex(),
true);
317 std::vector<Teuchos::RCP<const Map>> rowXpSubMaps(1, xpsubmap);
318 std::vector<Teuchos::RCP<const Map>> rowTySubMaps(1, thysubmap);
320 Teuchos::RCP<const BlockedMap> rgBlockedMap = Teuchos::rcp(
new BlockedMap(rowXpSubMaps, rowTySubMaps));
324 rbvec = Teuchos::rcp(
new ReorderedBlockedMultiVector(rgBlockedMap, rowMgr, bvec));
325 rbvec->setMultiVector(0, vec,
true);
328 rbvec = Teuchos::rcp_dynamic_cast<BlockedMultiVector>(vec);
334 std::vector<Teuchos::RCP<const Map>> rowXpSubMaps(rowSz, Teuchos::null);
335 std::vector<Teuchos::RCP<const Map>> rowTySubMaps(rowSz, Teuchos::null);
336 for (
size_t i = 0; i < rowSz; i++) {
337 Teuchos::RCP<const Xpetra::BlockReorderManager> rowSubMgr = rowMgr->GetBlock(Teuchos::as<int>(i));
341 TEUCHOS_ASSERT(rowXpSubMaps[i].is_null() ==
false);
342 TEUCHOS_ASSERT(rowTySubMaps[i].is_null() ==
false);
345 Teuchos::RCP<const BlockedMap> rgBlockedMap = Teuchos::rcp(
new BlockedMap(rowXpSubMaps, rowTySubMaps));
347 rbvec = Teuchos::rcp(
new ReorderedBlockedMultiVector(rgBlockedMap, rowMgr, bvec));
349 for (
size_t i = 0; i < rowSz; i++) {
350 Teuchos::RCP<const Xpetra::BlockReorderManager> rowSubMgr = rowMgr->GetBlock(Teuchos::as<int>(i));
352 rbvec->setMultiVector(i, Teuchos::rcp_const_cast<MultiVector>(subvec),
true);
358 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
360 Teuchos::RCP<const Xpetra::MultiVector<Scalar, LocalOrdinal, GlobalOrdinal, Node>> rbvec = Teuchos::null;
361 if (bvec->getBlockedMap()->getThyraMode() ==
false) {
366 TEUCHOS_ASSERT(rbvec.is_null() ==
false);
370 template <
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
374 Teuchos::RCP<const MultiVector> rbvec = Teuchos::null;
375 if (bvec->getBlockedMap()->getThyraMode() ==
false) {
376 rbvec =
mergeSubBlocks(brm, Teuchos::rcp_const_cast<const BlockedMultiVector>(bvec));
380 TEUCHOS_ASSERT(rbvec.is_null() ==
false);
381 return Teuchos::rcp_const_cast<MultiVector>(rbvec);
386 #define XPETRA_REORDEREDBLOCKEDMULTIVECTOR_SHORT
Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > mergeSubBlockMaps(Teuchos::RCP< const Xpetra::BlockReorderManager > brm, Teuchos::RCP< const Xpetra::BlockedCrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >> bmat, bool bThyraMode)
virtual ~ReorderedBlockedMultiVector()
Destructor.
Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > mergeSubBlockMaps(Teuchos::RCP< const Xpetra::BlockReorderManager > brm)
Xpetra utility class for common map-related routines.
Teuchos::RCP< const Xpetra::MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > buildReorderedBlockedMultiVector(Teuchos::RCP< const Xpetra::BlockReorderManager > brm, Teuchos::RCP< const Xpetra::BlockedMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node >> bvec)
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.
void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object with some verbosity level to an FancyOStream object.
ReorderedBlockedMultiVector(Teuchos::RCP< const BlockedMap > &rangeMap, Teuchos::RCP< const Xpetra::BlockReorderManager > brm, Teuchos::RCP< const Xpetra::BlockedMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node >> bvec)
Constructor.
Teuchos::RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > mergeSubBlocks(Teuchos::RCP< const Xpetra::BlockReorderManager > rowMgr, Teuchos::RCP< const Xpetra::BlockReorderManager > colMgr, Teuchos::RCP< const Xpetra::BlockedCrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >> bmat)
GlobalOrdinal global_ordinal_type
Teuchos::RCP< const Xpetra::BlockedMultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > fullVec_
LocalOrdinal local_ordinal_type
virtual size_t getNumVectors() const
Number of columns in the multivector.
Teuchos::RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > mergeSubBlocksThyra(Teuchos::RCP< const Xpetra::BlockReorderManager > rowMgr, Teuchos::RCP< const Xpetra::BlockReorderManager > colMgr, Teuchos::RCP< const Xpetra::BlockedCrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node >> bmat)
Teuchos::RCP< const Xpetra::BlockReorderManager > brm_
std::string description() const
Return a simple one-line description of this object.