46 #ifndef XPETRA_BLOCKEDCRSMATRIX_HPP 47 #define XPETRA_BLOCKEDCRSMATRIX_HPP 72 #ifdef HAVE_XPETRA_THYRA 73 #include <Thyra_ProductVectorSpaceBase.hpp> 74 #include <Thyra_VectorSpaceBase.hpp> 75 #include <Thyra_LinearOpBase.hpp> 76 #include <Thyra_BlockedLinearOpBase.hpp> 77 #include <Thyra_PhysicallyBlockedLinearOpBase.hpp> 90 template <
class Scalar,
95 public Matrix<Scalar, LocalOrdinal, GlobalOrdinal, Node> {
103 #undef XPETRA_BLOCKEDCRSMATRIX_SHORT 129 for (
size_t r = 0; r <
Rows(); ++r)
130 for (
size_t c = 0; c <
Cols(); ++c)
157 for (
size_t r = 0; r <
Rows(); ++r)
158 for (
size_t c = 0; c <
Cols(); ++c)
165 #ifdef HAVE_XPETRA_THYRA 180 int numRangeBlocks = productRangeSpace->numBlocks();
181 int numDomainBlocks = productDomainSpace->numBlocks();
184 std::vector<Teuchos::RCP<const Map> > subRangeMaps(numRangeBlocks);
185 for (
size_t r=0; r<Teuchos::as<size_t>(numRangeBlocks); ++r) {
186 for (
size_t c=0; c<Teuchos::as<size_t>(numDomainBlocks); ++c) {
187 if (thyraOp->blockExists(r,c)) {
192 subRangeMaps[r] = xop->getRangeMap();
201 bool bRangeUseThyraStyleNumbering =
false;
202 size_t numAllElements = 0;
203 for(
size_t v = 0; v < subRangeMaps.size(); ++v) {
204 numAllElements += subRangeMaps[v]->getGlobalNumElements();
206 if ( fullRangeMap->getGlobalNumElements() != numAllElements) bRangeUseThyraStyleNumbering =
true;
210 std::vector<Teuchos::RCP<const Xpetra::Map<LocalOrdinal,GlobalOrdinal,Node> > > subDomainMaps(numDomainBlocks);
211 for (
size_t c=0; c<Teuchos::as<size_t>(numDomainBlocks); ++c) {
212 for (
size_t r=0; r<Teuchos::as<size_t>(numRangeBlocks); ++r) {
213 if (thyraOp->blockExists(r,c)) {
218 subDomainMaps[c] = xop->getDomainMap();
225 bool bDomainUseThyraStyleNumbering =
false;
227 for(
size_t v = 0; v < subDomainMaps.size(); ++v) {
228 numAllElements += subDomainMaps[v]->getGlobalNumElements();
230 if (fullDomainMap->getGlobalNumElements() != numAllElements) bDomainUseThyraStyleNumbering =
true;
239 for (
size_t r = 0; r <
Rows(); ++r) {
240 for (
size_t c = 0; c <
Cols(); ++c) {
241 if(thyraOp->blockExists(r,c)) {
273 std::vector<GlobalOrdinal> gids;
274 for(
size_t tt = 0; tt<subMaps.size(); ++tt) {
278 gids.insert(gids.end(), subMapGids.
begin(), subMapGids.
end());
280 size_t myNumElements = subMap->getNodeNumElements();
281 for(LocalOrdinal l = 0; l < Teuchos::as<LocalOrdinal>(myNumElements); ++l) {
282 GlobalOrdinal gid = subMap->getGlobalElement(l);
293 std::sort(gids.begin(), gids.end());
294 gids.erase(std::unique(gids.begin(), gids.end()), gids.end());
341 getMatrix(0,0)->insertGlobalValues(globalRow, cols, vals);
361 getMatrix(0,0)->insertLocalValues(localRow, cols, vals);
368 XPETRA_MONITOR(
"XpetraBlockedCrsMatrix::removeEmptyProcessesInPlace");
370 getMatrix(0,0)->removeEmptyProcessesInPlace(newMap);
390 getMatrix(0,0)->replaceGlobalValues(globalRow,cols,vals);
406 getMatrix(0,0)->replaceLocalValues(localRow,cols,vals);
415 for (
size_t row = 0; row <
Rows(); row++) {
416 for (
size_t col = 0; col <
Cols(); col++) {
418 getMatrix(row,col)->setAllToScalar(alpha);
427 for (
size_t row = 0; row <
Rows(); row++) {
428 for (
size_t col = 0; col <
Cols(); col++) {
450 for (
size_t row = 0; row <
Rows(); row++) {
451 for (
size_t col = 0; col <
Cols(); col++) {
467 getMatrix(0,0)->fillComplete(domainMap, rangeMap, params);
491 for (
size_t r = 0; r <
Rows(); ++r)
492 for (
size_t c = 0; c <
Cols(); ++c) {
496 if (Ablock != Teuchos::null && !Ablock->isFillComplete())
504 fullrowmap_ =
MapFactory::Build(rangeMap()->lib(), rangeMap()->getGlobalNumElements(), rangeMap()->getNodeElementList(), rangeMap()->getIndexBase(), rangeMap()->getComm());
507 fullcolmap_ = Teuchos::null;
509 std::vector<GO> colmapentries;
510 for (
size_t c = 0; c <
Cols(); ++c) {
513 for (
size_t r = 0; r <
Rows(); ++r) {
516 if (Ablock != Teuchos::null) {
519 copy(colElements.
getRawPtr(), colElements.
getRawPtr() + colElements.
size(), inserter(colset, colset.begin()));
524 colmapentries.reserve(colmapentries.size() + colset.size());
525 copy(colset.begin(), colset.end(), back_inserter(colmapentries));
526 sort(colmapentries.begin(), colmapentries.end());
527 typename std::vector<GO>::iterator gendLocation;
528 gendLocation = std::unique(colmapentries.begin(), colmapentries.end());
529 colmapentries.erase(gendLocation,colmapentries.end());
533 size_t numGlobalElements = 0;
534 Teuchos::reduceAll(*(rangeMap->
getComm()), Teuchos::REDUCE_SUM, colmapentries.size(), Teuchos::outArg(numGlobalElements));
551 for (
size_t row = 0; row <
Rows(); row++)
552 for (
size_t col = 0; col <
Cols(); col++)
554 globalNumRows +=
getMatrix(row,col)->getGlobalNumRows();
558 return globalNumRows;
568 for (
size_t col = 0; col <
Cols(); col++)
569 for (
size_t row = 0; row <
Rows(); row++)
571 globalNumCols +=
getMatrix(row,col)->getGlobalNumCols();
575 return globalNumCols;
583 for (
size_t row = 0; row <
Rows(); ++row)
584 for (
size_t col = 0; col <
Cols(); col++)
586 nodeNumRows +=
getMatrix(row,col)->getNodeNumRows();
598 for (
size_t row = 0; row <
Rows(); ++row)
599 for (
size_t col = 0; col <
Cols(); ++col)
601 globalNumEntries +=
getMatrix(row,col)->getGlobalNumEntries();
603 return globalNumEntries;
611 for (
size_t row = 0; row <
Rows(); ++row)
612 for (
size_t col = 0; col <
Cols(); ++col)
614 nodeNumEntries +=
getMatrix(row,col)->getNodeNumEntries();
616 return nodeNumEntries;
622 XPETRA_MONITOR(
"XpetraBlockedCrsMatrix::getNumEntriesInLocalRow");
624 return getMatrix(0,0)->getNumEntriesInLocalRow(localRow);
635 return getMatrix(0,0)->getGlobalNumDiags();
646 return getMatrix(0,0)->getNodeNumDiags();
655 XPETRA_MONITOR(
"XpetraBlockedCrsMatrix::getGlobalMaxNumRowEntries");
658 for (
size_t row = 0; row <
Rows(); row++) {
660 for (
size_t col = 0; col <
Cols(); col++) {
662 globalMaxEntriesBlockRows +=
getMatrix(row,col)->getGlobalMaxNumRowEntries();
665 if(globalMaxEntriesBlockRows > globalMaxEntries)
666 globalMaxEntries = globalMaxEntriesBlockRows;
668 return globalMaxEntries;
675 XPETRA_MONITOR(
"XpetraBlockedCrsMatrix::getNodeMaxNumRowEntries");
676 size_t localMaxEntries = 0;
678 for (
size_t row = 0; row <
Rows(); row++) {
679 size_t localMaxEntriesBlockRows = 0;
680 for (
size_t col = 0; col <
Cols(); col++) {
682 localMaxEntriesBlockRows +=
getMatrix(row,col)->getNodeMaxNumRowEntries();
685 if(localMaxEntriesBlockRows > localMaxEntries)
686 localMaxEntries = localMaxEntriesBlockRows;
688 return localMaxEntries;
697 for (
size_t i = 0; i <
blocks_.size(); ++i)
709 for (
size_t i = 0; i <
blocks_.size(); i++)
718 for (
size_t i = 0; i <
blocks_.size(); i++)
742 size_t &NumEntries)
const {
745 getMatrix(0,0)->getLocalRowCopy(LocalRow, Indices, Values, NumEntries);
764 getMatrix(0,0)->getGlobalRowView(GlobalRow, indices, values);
783 getMatrix(0,0)->getLocalRowView(LocalRow, indices, values);
806 rm->getLocalDiagCopy(diag);
813 "BlockedCrsMatrix::getLocalDiagCopy(): the number of blocks in diag differ from the number of blocks in this operator." );
817 for (
size_t row = 0; row <
Rows(); row++) {
821 rm->getLocalDiagCopy(*rv);
822 bdiag->setMultiVector(row,rv,bdiag->getBlockedMap()->getThyraMode());
840 for (
size_t col = 0; col <
Cols(); ++col) {
850 "BlockedCrsMatrix::leftScale(): the number of blocks in diag differ from the number of blocks in this operator." );
852 for (
size_t row = 0; row <
Rows(); row++) {
856 for (
size_t col = 0; col <
Cols(); ++col) {
859 rm->leftScale(*rscale);
878 for (
size_t row = 0; row <
Rows(); ++row) {
888 "BlockedCrsMatrix::rightScale(): the number of blocks in diag differ from the number of blocks in this operator." );
890 for (
size_t col = 0; col <
Cols(); ++col) {
894 for (
size_t row = 0; row <
Rows(); row++) {
897 rm->rightScale(*rscale);
908 for (
size_t col = 0; col <
Cols(); ++col) {
909 for (
size_t row = 0; row <
Rows(); ++row) {
967 "apply() only supports the following modes: NO_TRANS and TRANS." );
976 bool bBlockedX = (refbX != Teuchos::null) ?
true :
false;
988 for (
size_t row = 0; row <
Rows(); row++) {
990 for (
size_t col = 0; col <
Cols(); col++) {
1000 bool bBlockedSubMatrix = Teuchos::rcp_dynamic_cast<
BlockedCrsMatrix>(Ablock) == Teuchos::null ?
false :
true;
1012 Ablock->apply(*Xblock, *tmpYblock);
1014 Yblock->
update(one, *tmpYblock, one);
1021 for (
size_t col = 0; col <
Cols(); col++) {
1024 for (
size_t row = 0; row<
Rows(); row++) {
1032 bool bBlockedSubMatrix = Teuchos::rcp_dynamic_cast<
BlockedCrsMatrix>(Ablock) == Teuchos::null ?
false :
true;
1042 Yblock->
update(one, *tmpYblock, one);
1047 Y.
update(alpha, *tmpY, beta);
1107 "apply() only supports the following modes: NO_TRANS and TRANS." );
1115 bool bBlockedX = (refbX != Teuchos::null) ?
true :
false;
1125 for (
size_t col = 0; col <
Cols(); col++) {
1135 bool bBlockedSubMatrix = Teuchos::rcp_dynamic_cast<
BlockedCrsMatrix>(Ablock) == Teuchos::null ?
false :
true;
1147 Ablock->apply(*Xblock, *tmpYblock);
1149 Yblock->
update(one, *tmpYblock, one);
1155 Y.
update(alpha, *tmpY, beta);
1178 getMatrix(0,0)->doImport(source, importer, CM);
1188 getMatrix(0,0)->doExport(dest, importer, CM);
1198 getMatrix(0,0)->doImport(source, exporter, CM);
1208 getMatrix(0,0)->doExport(dest, exporter, CM);
1220 std::string
description()
const {
return "Xpetra_BlockedCrsMatrix.description()"; }
1224 out <<
"Xpetra::BlockedCrsMatrix: " <<
Rows() <<
" x " <<
Cols() << std::endl;
1227 out <<
"BlockMatrix is fillComplete" << std::endl;
1240 out <<
"BlockMatrix is NOT fillComplete" << std::endl;
1243 for (
size_t r = 0; r <
Rows(); ++r)
1244 for (
size_t c = 0; c <
Cols(); ++c) {
1246 out <<
"Block(" << r <<
"," << c <<
")" << std::endl;
1247 getMatrix(r,c)->describe(out,verbLevel);
1248 }
else out <<
"Block(" << r <<
"," << c <<
") = null" << std::endl;
1280 if (bmat == Teuchos::null)
return mat;
1281 return bmat->getCrsMatrix();
1287 size_t row =
Rows()+1, col =
Cols()+1;
1288 for (
size_t r = 0; r <
Rows(); ++r)
1289 for(
size_t c = 0; c <
Cols(); ++c)
1298 if (bmat == Teuchos::null)
return mm;
1299 return bmat->getInnermostCrsMatrix();
1334 using Teuchos::rcp_dynamic_cast;
1338 "BlockedCrsMatrix::Merge: only implemented for Xpetra-style or Thyra-style numbering. No mixup allowed!" );
1341 "BlockedCrsMatrix::Merge: BlockMatrix must be fill-completed." );
1347 for (
size_t i = 0; i <
Rows(); i++) {
1348 for (
size_t j = 0; j <
Cols(); j++) {
1354 if (bMat != Teuchos::null) mat = bMat->Merge();
1358 "BlockedCrsMatrix::Merge: Merging of blocked sub-operators failed?!" );
1361 if(mat->getNodeNumEntries() == 0)
continue;
1363 this->
Add(*mat, one, *sparse, one);
1369 for (
size_t i = 0; i <
Rows(); i++) {
1370 for (
size_t j = 0; j <
Cols(); j++) {
1375 if (bMat != Teuchos::null) mat = bMat->Merge();
1379 "BlockedCrsMatrix::Merge: Merging of blocked sub-operators failed?!" );
1403 if(mat->getNodeNumEntries() == 0)
continue;
1405 size_t maxNumEntries = mat->getNodeMaxNumRowEntries();
1413 for (
size_t k = 0; k < mat->getNodeNumRows(); k++) {
1415 crsMat->getCrsMatrix()->getGlobalRowCopy(rowTGID, inds(), vals(), numEntries);
1418 for (
size_t l = 0; l < numEntries; ++l) {
1424 sparse->insertGlobalValues(
1425 rowXGID, inds2(0, numEntries),
1426 vals(0, numEntries));
1436 "BlockedCrsMatrix::Merge: Local number of entries of merged matrix does not coincide with local number of entries of blocked operator." );
1439 "BlockedCrsMatrix::Merge: Global number of entries of merged matrix does not coincide with global number of entries of blocked operator." );
1445 #ifdef HAVE_XPETRA_KOKKOS_REFACTOR 1446 typedef typename CrsMatrix::local_matrix_type local_matrix_type;
1449 local_matrix_type getLocalMatrix ()
const {
1451 return getMatrix(0,0)->getLocalMatrix();
1457 #ifdef HAVE_XPETRA_THYRA 1460 Xpetra::ThyraUtils<Scalar,LO,GO,Node>::toThyra(Teuchos::rcpFromRef(*
this));
1464 Teuchos::rcp_dynamic_cast<Thyra::BlockedLinearOpBase<Scalar> >(thOp);
1489 "Matrix A is not completed");
1498 if (scalarA == zero)
1504 "BlockedCrsMatrix::Add: matrix A must be of type CrsMatrixWrap.");
1518 GO row = rowGIDs[i];
1522 for (
size_t j = 0; j < numEntries; ++j)
1549 #ifdef HAVE_XPETRA_THYRA 1559 #define XPETRA_BLOCKEDCRSMATRIX_SHORT
Teuchos::RCP< Matrix > Merge() const
merge BlockedCrsMatrix blocks in a CrsMatrix
size_t getNodeMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on this node.
virtual size_t getNodeMaxNumRowEntries() const =0
Returns the maximum number of entries across all rows/columns on this node.
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const =0
Get this Map's Comm object.
RCP< const CrsGraph > getCrsGraph() const
Returns the CrsGraph associated with this matrix.
static Teuchos::RCP< Map< LocalOrdinal, GlobalOrdinal, Node > > Build(UnderlyingLib lib, global_size_t numGlobalElements, GlobalOrdinal indexBase, const Teuchos::RCP< const Teuchos::Comm< int > > &comm, LocalGlobal lg=Xpetra::GloballyDistributed, const Teuchos::RCP< Node > &node=defaultArgNode())
Map constructor with Xpetra-defined contiguous uniform distribution.
const Teuchos::RCP< const Map > getMap() const
Implements DistObject interface.
bool isLocallyIndexed() const
If matrix indices of all matrix blocks are in the local range, this function returns true...
virtual const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getColMap() const =0
Returns the Map that describes the column distribution in this matrix.
bool isFillComplete() const
Returns true if fillComplete() has been called and the matrix is in compute mode. ...
RCP< const Map > getRangeMap(size_t i, bool bThyraMode) const
Returns the Map associated with the i'th block range of this operator.
RCP< const BlockedMap > getBlockedDomainMap() const
Returns the BlockedMap associated with the domain of this operator.
void replaceGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Replace matrix entries, using global IDs.
void fillComplete(const RCP< const Map > &domainMap, const RCP< const Map > &rangeMap, const RCP< ParameterList > ¶ms=null)
Signal that data entry is complete.
virtual void setAllToScalar(const Scalar &alpha)
Set all matrix entries equal to scalar.
RCP< const Map > getDomainMap(size_t i) const
Returns the Map associated with the i'th block domain of this operator.
global_size_t getGlobalNumDiags() const
Returns the number of global diagonal entries, based on global row/column index comparisons.
bool is_null(const std::shared_ptr< T > &p)
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
Teuchos::RCP< const MapExtractor > rangemaps_
virtual const RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getRowMap() const =0
Returns the Map that describes the row distribution in this matrix.
void doImport(const Matrix &source, const Import &importer, CombineMode CM)
Import.
Exception throws to report errors in the internal logical of the program.
virtual ScalarTraits< Scalar >::magnitudeType getFrobeniusNorm() const
Get Frobenius norm of the matrix.
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.
virtual LocalOrdinal getLocalElement(GlobalOrdinal globalIndex) const =0
The local index corresponding to the given global index.
virtual ~BlockedCrsMatrix()
Destructor.
Teuchos::RCP< Matrix > getCrsMatrix() const
return unwrap 1x1 blocked operators
void doExport(const Matrix &dest, const Import &importer, CombineMode CM)
Export.
virtual bool haveGlobalConstants() const
Returns true if globalConstants have been computed; false otherwise.
LocalOrdinal local_ordinal_type
size_t getGlobalMaxNumRowEntries() const
Returns the maximum number of entries across all rows/columns on all nodes.
global_size_t getGlobalNumCols() const
Returns the number of global columns in the matrix.
void resumeFill(const RCP< ParameterList > ¶ms=null)
BlockedCrsMatrix(const Teuchos::RCP< const BlockedMap > &rangeMaps, const Teuchos::RCP< const BlockedMap > &domainMaps, size_t npr, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor.
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.
size_t getNodeNumDiags() const
Returns the number of local diagonal entries, based on global row/column index comparisons.
void rightScale(const Vector &x)
Right scale matrix using the given vector entries.
RCP< const BlockedMap > getBlockedRangeMap() const
Returns the BlockedMap associated with the range of this operator.
virtual void getGlobalRowCopy(GlobalOrdinal GlobalRow, const ArrayView< GlobalOrdinal > &indices, const ArrayView< Scalar > &values, size_t &numEntries) const =0
Extract a list of entries in a specified global row of this matrix. Put into pre-allocated storage...
RCP< const Map > getFullRangeMap() const
Returns the Map associated with the full range of this operator.
RCP< const MapExtractor > getRangeMapExtractor() const
Returns map extractor class for range map.
Exception indicating invalid cast attempted.
void insertGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Insert matrix entries, using global IDs.
viewLabel_t defaultViewLabel_
virtual void insertGlobalValues(GlobalOrdinal globalRow, const ArrayView< const GlobalOrdinal > &cols, const ArrayView< const Scalar > &vals)=0
Insert matrix entries, using global IDs.
size_t getNodeNumRows() const
Returns the number of matrix rows owned on the calling node.
GlobalOrdinal global_ordinal_type
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
void doExport(const Matrix &dest, const Export &exporter, CombineMode CM)
Export (using an Importer).
void leftScale(const Vector &x)
Left scale matrix using the given vector entries.
Teuchos::RCP< Matrix > getInnermostCrsMatrix()
helper routine recursively returns the first inner-most non-null matrix block from a (nested) blocked...
void insertLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Insert matrix entries, using local IDs.
bool isGloballyIndexed() const
If matrix indices are in the global range, this function returns true. Otherwise, this function retur...
RCP< const Map > getDomainMap(size_t i, bool bThyraMode) const
Returns the Map associated with the i'th block domain of this operator.
virtual bool isFillComplete() const =0
Returns true if fillComplete() has been called and the matrix is in compute mode. ...
const viewLabel_t & GetDefaultViewLabel() const
void getLocalDiagCopy(Vector &diag) const
Get a copy of the diagonal entries owned by this node, with local row indices.
void Add(const Matrix &A, const Scalar scalarA, Matrix &B, const Scalar scalarB) const
Add a Xpetra::CrsMatrix to another: B = B*scalarB + A*scalarA.
static Teuchos::RCP< Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > > transformThyra2XpetraGIDs(const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &input, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlInput, const Xpetra::Map< LocalOrdinal, GlobalOrdinal, Node > &nonOvlReferenceInput)
replace set of global ids by new global ids
void scale(const Scalar &alpha)
Scale the current values of a matrix, this = alpha*this.
void CreateView(viewLabel_t viewLabel, const RCP< const Map > &rowMap, const RCP< const Map > &colMap)
virtual Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > getMap() const =0
The Map describing the parallel distribution of this object.
viewLabel_t currentViewLabel_
TEUCHOS_DEPRECATED void reduceAll(const Comm< Ordinal > &comm, const EReductionType reductType, const Packet &send, Packet *globalReduct)
void doImport(const Matrix &source, const Export &exporter, CombineMode CM)
Import (using an Exporter).
virtual GlobalOrdinal getGlobalElement(LocalOrdinal localIndex) const =0
The global index corresponding to the given local index.
Exception throws when you call an unimplemented method of Xpetra.
RCP< const Map > getRangeMap(size_t i) const
Returns the Map associated with the i'th block range of this operator.
size_t global_size_t
Global size_t object.
global_size_t getGlobalNumEntries() const
Returns the global number of entries in this matrix.
static RCP< Vector > Build(const Teuchos::RCP< const Map > &map, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.
static const EVerbosityLevel verbLevel_default
std::vector< Teuchos::RCP< Matrix > > blocks_
virtual void bgs_apply(const MultiVector &X, MultiVector &Y, size_t row, Teuchos::ETransp mode=Teuchos::NO_TRANS, Scalar alpha=ScalarTraits< Scalar >::one(), Scalar beta=ScalarTraits< Scalar >::zero()) const
Special multiplication routine (for BGS smoother)
static magnitudeType magnitude(T a)
virtual void getLocalRowCopy(LocalOrdinal LocalRow, const ArrayView< LocalOrdinal > &Indices, const ArrayView< Scalar > &Values, size_t &NumEntries) const
Extract a list of entries in a specified local row of the matrix. Put into storage allocated by calli...
void getLocalRowView(LocalOrdinal LocalRow, ArrayView< const LocalOrdinal > &indices, ArrayView< const Scalar > &values) const
Extract a const, non-persisting view of local indices in a specified row of the matrix.
RCP< const CrsGraph< int, GlobalOrdinal, Node > > toXpetra(const Epetra_CrsGraph &g)
RCP< const Map > getFullDomainMap() const
Returns the Map associated with the full domain of this operator.
#define XPETRA_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
void setMatrix(size_t r, size_t c, Teuchos::RCP< Matrix > mat)
set matrix block
bool bDomainThyraMode_
boolean flag, which is true, if BlockedCrsMatrix has been created using Thyra-style numbering for sub...
BlockedCrsMatrix(Teuchos::RCP< const MapExtractor > &rangeMaps, Teuchos::RCP< const MapExtractor > &domainMaps, size_t npr, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor.
Exception throws to report incompatible objects (like maps).
size_t getNodeNumEntries() const
Returns the local number of entries in this matrix.
RCP< const Map > getRangeMap() const
Returns the Map associated with the range of this operator.
void getGlobalRowView(GlobalOrdinal GlobalRow, ArrayView< const GlobalOrdinal > &indices, ArrayView< const Scalar > &values) const
Extract a const, non-persisting view of global indices in a specified row of the matrix.
Concrete implementation of Xpetra::Matrix.
Teuchos::RCP< Matrix > getMatrix(size_t r, size_t c) const
return block (r,c)
std::string description() const
Return a simple one-line description of this object.
static Teuchos::RCP< MultiVector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > Build(const Teuchos::RCP< const Map< LocalOrdinal, GlobalOrdinal, Node > > &map, size_t NumVectors, bool zeroOut=true)
Constructor specifying the number of non-zeros for all rows.
bool IsView(const viewLabel_t viewLabel) const
CombineMode
Xpetra::Combine Mode enumerable type.
global_size_t getGlobalNumRows() const
Returns the number of global rows.
#define XPETRA_MONITOR(funcName)
RCP< const MapExtractor > getDomainMapExtractor() const
Returns map extractor for domain map.
static RCP< Matrix > Build(const RCP< const Map > &rowMap, size_t maxNumEntriesPerRow, Xpetra::ProfileType pftype=Xpetra::DynamicProfile)
Constructor specifying the number of non-zeros for all rows.
virtual void scale(const Scalar &alpha)=0
Scale the current values of a matrix, this = alpha*this.
void fillComplete(const RCP< ParameterList > ¶ms=null)
Signal that data entry is complete.
#define TEUCHOS_ASSERT(assertion_test)
virtual size_t Rows() const
number of row blocks
virtual size_t Cols() const
number of column blocks
virtual size_t getNumVectors() const =0
Number of columns in the multivector.
RCP< const Map > getDomainMap() const
Returns the Map associated with the domain of this operator.
virtual size_t getNodeNumRows() const =0
Returns the number of matrix rows owned on the calling node.
virtual UnderlyingLib lib() const =0
Get the library used by this object (Tpetra or Epetra?)
void removeEmptyProcessesInPlace(const Teuchos::RCP< const Map > &newMap)
virtual Teuchos::RCP< const Vector< Scalar, LocalOrdinal, GlobalOrdinal, Node > > getVector(size_t j) const =0
Return a Vector which is a const view of column j.
#define TEUCHOS_TEST_FOR_EXCEPT(throw_exception_test)
size_t getNumEntriesInLocalRow(LocalOrdinal localRow) const
Returns the current number of entries on this node in the specified local row.
void replaceLocalValues(LocalOrdinal localRow, const ArrayView< const LocalOrdinal > &cols, const ArrayView< const Scalar > &vals)
Replace matrix entries, using local IDs.
Xpetra-specific matrix class.
Teuchos::RCP< const MapExtractor > domainmaps_
bool bRangeThyraMode_
boolean flag, which is true, if BlockedCrsMatrix has been created using Thyra-style numbering for sub...
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.