46 #ifndef XPETRA_REORDEREDBLOCKEDCRSMATRIX_HPP
47 #define XPETRA_REORDEREDBLOCKEDCRSMATRIX_HPP
56 #include "Xpetra_BlockedMultiVector.hpp"
58 #include "Xpetra_CrsMatrixWrap.hpp"
70 template <
class Scalar,
83 #undef XPETRA_REORDEREDBLOCKEDCRSMATRIX_SHORT
133 map = fullRangeMapExtractor->getMap(Teuchos::as<size_t>(leaf->
GetIndex()),
false);
136 std::vector<Teuchos::RCP<const Map> > subMaps (numBlocks, Teuchos::null);
138 for(
size_t i = 0; i < numBlocks; i++) {
179 bool bCopyResultX =
false;
180 bool bCopyResultY =
false;
242 if (bCopyResultX ==
true) {
247 if (bCopyResultY ==
true) {
270 std::string
description()
const {
return "ReorderedBlockedCrsMatrix"; }
279 out <<
"ReorderedBlockMatrix is fillComplete" << std::endl;
281 out <<
"fullRowMap" << std::endl;
288 out <<
"Xpetra::ReorderedBlockedCrsMatrix is NOT fillComplete" << std::endl;
293 out <<
"Block(" << r <<
"," << c <<
")" << std::endl;
307 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
323 map = fullRangeMapExtractor->getMap(Teuchos::as<size_t>(leaf->
GetIndex()), bThyraMode);
326 std::vector<Teuchos::RCP<const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > > subMaps (numBlocks, Teuchos::null);
328 for(
size_t i = 0; i < numBlocks; i++) {
353 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
369 if(rowSz == 0 && colSz == 0) {
377 if (mat == Teuchos::null)
return Teuchos::null;
381 if(matwrap != Teuchos::null) {
386 std::vector<Teuchos::RCP<const Map> > rowSubMaps (1, submap);
391 std::vector<Teuchos::RCP<const Map> > colSubMaps (1, submap2);
394 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor,doMapExtractor, 33, rowMgr,bmat));
398 rbmat = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(mat);
407 std::vector<Teuchos::RCP<const Map> > rowSubMaps (rowSz, Teuchos::null);
408 for(
size_t i = 0; i < rowSz; i++) {
414 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(rgMergedSubMaps, rowSubMaps,
false));
421 std::vector<Teuchos::RCP<const Map> > rowSubMaps (1, submap);
422 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(submap, rowSubMaps,
false));
427 std::vector<Teuchos::RCP<const Map> > colSubMaps (colSz, Teuchos::null);
428 for(
size_t j = 0; j < colSz; j++) {
434 doMapExtractor =
Teuchos::rcp(
new MapExtractor(doMergedSubMaps, colSubMaps,
false));
441 std::vector<Teuchos::RCP<const Map> > colSubMaps (1, submap);
442 doMapExtractor =
Teuchos::rcp(
new MapExtractor(submap, colSubMaps,
false));
445 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor,doMapExtractor, 33, rowMgr,bmat));
449 if (rowSz == 0 && colSz > 0) {
450 for(
size_t j = 0; j < colSz; j++) {
453 rbmat->
setMatrix(0,j,Teuchos::rcp_const_cast<Matrix>(submat));
456 }
else if (rowSz > 0 && colSz == 0) {
457 for(
size_t i = 0; i < rowSz; i++) {
460 rbmat->
setMatrix(i,0,Teuchos::rcp_const_cast<Matrix>(submat));
464 for(
size_t i = 0; i < rowSz; i++) {
466 for(
size_t j = 0; j < colSz; j++) {
469 rbmat->
setMatrix(i,j,Teuchos::rcp_const_cast<Matrix>(submat));
482 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
491 TEUCHOS_ASSERT(bmat->getRangeMapExtractor()->getThyraMode() ==
true);
492 TEUCHOS_ASSERT(bmat->getDomainMapExtractor()->getThyraMode() ==
true);
500 if(rowSz == 0 && colSz == 0) {
508 if(mat == Teuchos::null)
return Teuchos::null;
512 if(matwrap != Teuchos::null) {
519 std::vector<Teuchos::RCP<const Map> > rowXpSubMaps (1, xpsubmap);
520 std::vector<Teuchos::RCP<const Map> > rowTySubMaps (1, thysubmap);
528 std::vector<Teuchos::RCP<const Map> > colXpSubMaps (1, xpsubmap2);
529 std::vector<Teuchos::RCP<const Map> > colTySubMaps (1, tysubmap2);
535 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor,doMapExtractor, 33, rowMgr,bmat));
539 rbmat = Teuchos::rcp_dynamic_cast<BlockedCrsMatrix>(mat);
548 std::vector<Teuchos::RCP<const Map> > rowXpSubMaps (rowSz, Teuchos::null);
549 std::vector<Teuchos::RCP<const Map> > rowTySubMaps (rowSz, Teuchos::null);
550 for(
size_t i = 0; i < rowSz; i++) {
559 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(rowXpSubMaps, rowTySubMaps));
566 std::vector<Teuchos::RCP<const Map> > rowXpSubMaps (1, xpsubmap);
567 std::vector<Teuchos::RCP<const Map> > rowTySubMaps (1, thysubmap);
569 rgMapExtractor =
Teuchos::rcp(
new MapExtractor(rowXpSubMaps, rowTySubMaps));
574 std::vector<Teuchos::RCP<const Map> > colXpSubMaps (colSz, Teuchos::null);
575 std::vector<Teuchos::RCP<const Map> > colTySubMaps (colSz, Teuchos::null);
576 for(
size_t j = 0; j < colSz; j++) {
585 doMapExtractor =
Teuchos::rcp(
new MapExtractor(colXpSubMaps,colTySubMaps));
592 std::vector<Teuchos::RCP<const Map> > colXpSubMaps (1, xpsubmap);
593 std::vector<Teuchos::RCP<const Map> > colTySubMaps (1, tysubmap);
595 doMapExtractor =
Teuchos::rcp(
new MapExtractor(colXpSubMaps, colTySubMaps));
599 rbmat =
Teuchos::rcp(
new ReorderedBlockedCrsMatrix(rgMapExtractor,doMapExtractor, 33, rowMgr,bmat));
603 if (rowSz == 0 && colSz > 0) {
604 for(
size_t j = 0; j < colSz; j++) {
607 rbmat->
setMatrix(0,j,Teuchos::rcp_const_cast<Matrix>(submat));
610 }
else if (rowSz > 0 && colSz == 0) {
611 for(
size_t i = 0; i < rowSz; i++) {
614 rbmat->
setMatrix(i,0,Teuchos::rcp_const_cast<Matrix>(submat));
618 for(
size_t i = 0; i < rowSz; i++) {
620 for(
size_t j = 0; j < colSz; j++) {
623 rbmat->
setMatrix(i,j,Teuchos::rcp_const_cast<Matrix>(submat));
635 template<
class Scalar,
class LocalOrdinal,
class GlobalOrdinal,
class Node>
637 TEUCHOS_ASSERT(bmat->getRangeMapExtractor()->getThyraMode() == bmat->getDomainMapExtractor()->getThyraMode());
639 if(bmat->getRangeMapExtractor()->getThyraMode() ==
false) {
651 #define XPETRA_REORDEREDBLOCKEDCRSMATRIX_SHORT
virtual size_t getNodeNumEntries() const =0
Returns the local number of entries in this matrix.
bool is_null(const boost::shared_ptr< T > &p)
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)
bool isFillComplete() const
Returns true if fillComplete() has been called and the matrix is in compute mode. ...
void fillComplete(const RCP< const Map > &domainMap, const RCP< const Map > &rangeMap, const RCP< ParameterList > ¶ms=null)
Signal that data entry is complete.
RCP< const Map > getRangeMap() const
Returns the Map associated with the range of this operator.
Teuchos::RCP< const Xpetra::BlockedCrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > fullOp_
void swap(RCP< T > &r_ptr)
size_t getNodeNumEntries() const
Returns the local number of entries in this matrix.
Xpetra utility class for common map-related routines.
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.
Teuchos::RCP< const Xpetra::BlockReorderManager > getBlockReorderManager()
Returns internal BlockReorderManager object.
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.
GlobalOrdinal global_ordinal_type
BlockedCrsMatrix(const Teuchos::RCP< const BlockedMap > &rangeMaps, const Teuchos::RCP< const BlockedMap > &domainMaps, size_t npr, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor.
int GetIndex() const
Get the index that is stored in this block/leaf.
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)
virtual void update(const Scalar &alpha, const MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > &A, const Scalar &beta)=0
Update multi-vector values with scaled values of A, this = beta*this + alpha*A.
virtual size_t GetNumBlocks() const
Returns number of subblocks.
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)
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
Teuchos::RCP< Matrix > getMatrix(size_t r, size_t c) const
return block (r,c)
virtual const Teuchos::RCP< BlockReorderManager > GetBlock(int blockIndex)
Get a particular block. If there is no block at this index location return a new one.
virtual size_t Cols() const
number of column blocks
static const EVerbosityLevel verbLevel_default
std::string description() const
Return a simple one-line description of this object.
Teuchos::RCP< const Xpetra::Matrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > buildReorderedBlockedCrsMatrix(Teuchos::RCP< const Xpetra::BlockReorderManager > brm, Teuchos::RCP< const Xpetra::BlockedCrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > bmat)
virtual ~ReorderedBlockedCrsMatrix()
Destructor.
Teuchos::RCP< const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > mergeSubBlockMaps(Teuchos::RCP< const Xpetra::BlockReorderManager > brm)
void setMatrix(size_t r, size_t c, Teuchos::RCP< Matrix > mat)
set matrix block
LocalOrdinal local_ordinal_type
virtual void apply(const MultiVector &X, MultiVector &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=ScalarTraits< Scalar >::one(), Scalar beta=ScalarTraits< Scalar >::zero()) const
Computes the sparse matrix-multivector multiplication.
Concrete implementation of Xpetra::Matrix.
ReorderedBlockedCrsMatrix(Teuchos::RCP< const MapExtractor > &rangeMaps, Teuchos::RCP< const MapExtractor > &domainMaps, size_t npr, Teuchos::RCP< const Xpetra::BlockReorderManager > brm, Teuchos::RCP< const Xpetra::BlockedCrsMatrix< Scalar, LocalOrdinal, GlobalOrdinal, Node > > bmat, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor.
virtual size_t Rows() const
number of row blocks
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)
#define TEUCHOS_ASSERT(assertion_test)
size_t getNodeNumRows() const
Returns the number of matrix rows owned on the calling node.
Xpetra-specific matrix class.
virtual void apply(const MultiVector &X, MultiVector &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=ScalarTraits< Scalar >::one(), Scalar beta=ScalarTraits< Scalar >::zero()) const
Computes the sparse matrix-multivector multiplication.
Teuchos::RCP< const Xpetra::BlockReorderManager > brm_