43 #ifndef IFPACK2_LOCALFILTER_DEF_HPP
44 #define IFPACK2_LOCALFILTER_DEF_HPP
46 #include <Ifpack2_LocalFilter_decl.hpp>
47 #include <Tpetra_Map.hpp>
48 #include <Tpetra_MultiVector.hpp>
49 #include <Tpetra_Vector.hpp>
54 # include "Teuchos_DefaultSerialComm.hpp"
60 template<
class MatrixType>
62 LocalFilter<MatrixType>::
63 mapPairsAreFitted (
const row_matrix_type& A)
65 const map_type& rangeMap = * (A.getRangeMap ());
66 const map_type& rowMap = * (A.getRowMap ());
67 const bool rangeAndRowFitted = mapPairIsFitted (rangeMap, rowMap);
69 const map_type& domainMap = * (A.getDomainMap ());
70 const map_type& columnMap = * (A.getColMap ());
71 const bool domainAndColumnFitted = mapPairIsFitted (domainMap, columnMap);
73 return rangeAndRowFitted && domainAndColumnFitted;
77 template<
class MatrixType>
79 LocalFilter<MatrixType>::
80 mapPairIsFitted (
const map_type& map1,
const map_type& map2)
82 return map1.isLocallyFitted (map2);
86 template<
class MatrixType>
97 #ifdef HAVE_IFPACK2_DEBUG
99 ! mapPairsAreFitted (*A), std::invalid_argument,
"Ifpack2::LocalFilter: "
100 "A's Map pairs are not fitted to each other on Process "
101 << A_->getRowMap ()->getComm ()->getRank () <<
" of the input matrix's "
103 "This means that LocalFilter does not currently know how to work with A. "
104 "This will change soon. Please see discussion of Bug 5992.");
105 #endif // HAVE_IFPACK2_DEBUG
108 RCP<const Teuchos::Comm<int> > localComm;
110 localComm =
rcp (
new Teuchos::MpiComm<int> (MPI_COMM_SELF));
138 const size_t numRows = A_->getRangeMap()->getNodeNumElements ();
146 const global_ordinal_type indexBase =
static_cast<global_ordinal_type
> (0);
150 Tpetra::GloballyDistributed));
153 localRangeMap_ = localRowMap_;
160 localDomainMap_ = localRangeMap_;
163 const size_t numCols = A_->getDomainMap()->getNodeNumElements ();
166 Tpetra::GloballyDistributed));
172 NumEntries_.resize (numRows);
176 MaxNumEntries_ = A_->getNodeMaxNumRowEntries ();
177 MaxNumEntriesA_ = A_->getNodeMaxNumRowEntries ();
180 localIndices_.
resize (MaxNumEntries_);
181 Values_.
resize (MaxNumEntries_);
190 size_t ActualMaxNumEntries = 0;
192 for (
size_t i = 0; i < numRows; ++i) {
194 size_t Nnz, NewNnz = 0;
195 A_->getLocalRowCopy (i, localIndices_, Values_, Nnz);
196 for (
size_t j = 0; j < Nnz; ++j) {
208 if (static_cast<size_t> (localIndices_[j]) < numRows) {
213 if (NewNnz > ActualMaxNumEntries) {
214 ActualMaxNumEntries = NewNnz;
217 NumNonzeros_ += NewNnz;
218 NumEntries_[i] = NewNnz;
221 MaxNumEntries_ = ActualMaxNumEntries;
225 template<
class MatrixType>
230 template<
class MatrixType>
234 return localRowMap_->getComm ();
238 #ifdef TPETRA_ENABLE_DEPRECATED_CODE
239 template<
class MatrixType>
244 return Teuchos::null;
246 #endif // TPETRA_ENABLE_DEPRECATED_CODE
249 template<
class MatrixType>
250 Teuchos::RCP<
const Tpetra::Map<
typename MatrixType::local_ordinal_type,
251 typename MatrixType::global_ordinal_type,
252 typename MatrixType::node_type> >
259 template<
class MatrixType>
260 Teuchos::RCP<
const Tpetra::Map<
typename MatrixType::local_ordinal_type,
261 typename MatrixType::global_ordinal_type,
262 typename MatrixType::node_type> >
269 template<
class MatrixType>
270 Teuchos::RCP<
const Tpetra::Map<
typename MatrixType::local_ordinal_type,
271 typename MatrixType::global_ordinal_type,
272 typename MatrixType::node_type> >
275 return localDomainMap_;
279 template<
class MatrixType>
280 Teuchos::RCP<
const Tpetra::Map<
typename MatrixType::local_ordinal_type,
281 typename MatrixType::global_ordinal_type,
282 typename MatrixType::node_type> >
285 return localRangeMap_;
289 template<
class MatrixType>
290 Teuchos::RCP<
const Tpetra::RowGraph<
typename MatrixType::local_ordinal_type,
291 typename MatrixType::global_ordinal_type,
292 typename MatrixType::node_type> >
298 return A_->getGraph ();
302 template<
class MatrixType>
305 return static_cast<global_size_t
> (localRangeMap_->getNodeNumElements ());
309 template<
class MatrixType>
312 return static_cast<global_size_t
> (localDomainMap_->getNodeNumElements ());
316 template<
class MatrixType>
319 return static_cast<size_t> (localRangeMap_->getNodeNumElements ());
323 template<
class MatrixType>
326 return static_cast<size_t> (localDomainMap_->getNodeNumElements ());
330 template<
class MatrixType>
331 typename MatrixType::global_ordinal_type
334 return A_->getIndexBase ();
338 template<
class MatrixType>
345 template<
class MatrixType>
352 template<
class MatrixType>
366 return NumEntries_[localRow];
371 template<
class MatrixType>
381 if (getRowMap ()->isNodeLocalElement (localRow)) {
382 return NumEntries_[localRow];
394 template<
class MatrixType>
397 return MaxNumEntries_;
401 template<
class MatrixType>
404 return MaxNumEntries_;
408 template<
class MatrixType>
415 template<
class MatrixType>
418 return A_->isLocallyIndexed ();
422 template<
class MatrixType>
425 return A_->isGloballyIndexed();
429 template<
class MatrixType>
432 return A_->isFillComplete ();
436 template<
class MatrixType>
442 size_t& numEntries)
const
447 const LO localRow = this->getRowMap ()->getLocalElement (globalRow);
460 numEntries = this->getNumEntriesInLocalRow (localRow);
465 this->getLocalRowCopy (localRow, localIndices (), values, numEntries);
467 const map_type& colMap = * (this->getColMap ());
470 const size_type numEnt =
471 std::min (static_cast<size_type> (numEntries),
472 std::min (globalIndices.
size (), values.
size ()));
473 for (size_type k = 0; k < numEnt; ++k) {
474 globalIndices[k] = colMap.getGlobalElement (localIndices[k]);
480 template<
class MatrixType>
486 size_t &NumEntries)
const
489 typedef global_ordinal_type GO;
491 if (! A_->getRowMap ()->isNodeLocalElement (LocalRow)) {
497 if (A_->getRowMap()->getComm()->getSize() == 1) {
498 A_->getLocalRowCopy (LocalRow, Indices (), Values (), NumEntries);
503 const size_t numEntInLclRow = NumEntries_[LocalRow];
504 if (static_cast<size_t> (Indices.
size ()) < numEntInLclRow ||
505 static_cast<size_t> (Values.
size ()) < numEntInLclRow) {
510 true, std::runtime_error,
511 "Ifpack2::LocalFilter::getLocalRowCopy: Invalid output array length. "
512 "The output arrays must each have length at least " << numEntInLclRow
513 <<
" for local row " << LocalRow <<
" on Process "
514 << localRowMap_->getComm ()->getRank () <<
".");
516 else if (numEntInLclRow == static_cast<size_t> (0)) {
535 size_t numEntInMat = 0;
536 A_->getLocalRowCopy (LocalRow, localIndices_ (), Values_ (), numEntInMat);
541 const map_type& matrixDomMap = * (A_->getDomainMap ());
542 const map_type& matrixColMap = * (A_->getColMap ());
544 const size_t capacity =
static_cast<size_t> (std::min (Indices.
size (),
547 const size_t numRows = localRowMap_->getNodeNumElements ();
548 const bool buggy =
true;
549 for (
size_t j = 0; j < numEntInMat; ++j) {
555 const LO matrixLclCol = localIndices_[j];
556 const GO gblCol = matrixColMap.getGlobalElement (matrixLclCol);
565 if ((
size_t) localIndices_[j] < numRows) {
566 Indices[NumEntries] = localIndices_[j];
567 Values[NumEntries] = Values_[j];
571 if (matrixDomMap.isNodeGlobalElement (gblCol)) {
575 if (NumEntries < capacity) {
576 Indices[NumEntries] = matrixLclCol;
577 Values[NumEntries] = Values_[j];
586 template<
class MatrixType>
594 "Ifpack2::LocalFilter does not implement getGlobalRowView.");
598 template<
class MatrixType>
606 "Ifpack2::LocalFilter does not implement getLocalRowView.");
610 template<
class MatrixType>
613 getLocalDiagCopy (Tpetra::Vector<scalar_type,local_ordinal_type,global_ordinal_type,node_type>& diag)
const
617 global_ordinal_type, node_type> vector_type;
620 RCP<vector_type> diagView = diag.offsetViewNonConst (A_->getRowMap (), 0);
621 A_->getLocalDiagCopy (*diagView);
625 template<
class MatrixType>
628 leftScale (
const Tpetra::Vector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& )
631 "Ifpack2::LocalFilter does not implement leftScale.");
635 template<
class MatrixType>
638 rightScale (
const Tpetra::Vector<scalar_type, local_ordinal_type, global_ordinal_type, node_type>& )
641 "Ifpack2::LocalFilter does not implement rightScale.");
645 template<
class MatrixType>
648 apply (
const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &X,
649 Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &Y,
654 typedef Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> MV;
656 X.getNumVectors() != Y.getNumVectors(), std::runtime_error,
657 "Ifpack2::LocalFilter::apply: X and Y must have the same number of columns. "
658 "X has " << X.getNumVectors () <<
" columns, but Y has "
659 << Y.getNumVectors () <<
" columns.");
661 #ifdef HAVE_IFPACK2_DEBUG
667 for (
size_t j = 0; j < X.getNumVectors (); ++j) {
668 if (STM::isnaninf (norms[j])) {
673 TEUCHOS_TEST_FOR_EXCEPTION( ! good, std::runtime_error,
"Ifpack2::LocalFilter::apply: The 1-norm of the input X is NaN or Inf.");
675 #endif // HAVE_IFPACK2_DEBUG
684 applyNonAliased (X_copy, Y, mode, alpha, beta);
686 applyNonAliased (X, Y, mode, alpha, beta);
689 #ifdef HAVE_IFPACK2_DEBUG
695 for (
size_t j = 0; j < Y.getNumVectors (); ++j) {
696 if (STM::isnaninf (norms[j])) {
701 TEUCHOS_TEST_FOR_EXCEPTION( ! good, std::runtime_error,
"Ifpack2::LocalFilter::apply: The 1-norm of the output Y is NaN or Inf.");
703 #endif // HAVE_IFPACK2_DEBUG
706 template<
class MatrixType>
709 applyNonAliased (
const Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &X,
710 Tpetra::MultiVector<scalar_type,local_ordinal_type,global_ordinal_type,node_type> &Y,
713 scalar_type beta)
const
719 const scalar_type zero = STS::zero ();
720 const scalar_type one = STS::one ();
725 else if (beta != one) {
729 const size_t NumVectors = Y.getNumVectors ();
730 const size_t numRows = localRowMap_->getNodeNumElements ();
737 const bool constantStride = X.isConstantStride () && Y.isConstantStride ();
738 if (constantStride) {
741 const size_t x_stride = X.getStride();
742 const size_t y_stride = Y.getStride();
743 ArrayRCP<scalar_type> y_rcp = Y.get1dViewNonConst();
744 ArrayRCP<const scalar_type> x_rcp = X.get1dView();
745 ArrayView<scalar_type> y_ptr = y_rcp();
746 ArrayView<const scalar_type> x_ptr = x_rcp();
747 for (
size_t i = 0; i < numRows; ++i) {
750 getLocalRowCopy (i, localIndices_ (), Values_ (), Nnz);
752 for (
size_t j = 0; j < Nnz; ++j) {
753 const local_ordinal_type col = localIndices_[j];
754 for (
size_t k = 0; k < NumVectors; ++k) {
755 y_ptr[i + y_stride*k] +=
756 alpha * Values_[j] * x_ptr[col + x_stride*k];
761 for (
size_t j = 0; j < Nnz; ++j) {
762 const local_ordinal_type col = localIndices_[j];
763 for (
size_t k = 0; k < NumVectors; ++k) {
764 y_ptr[col + y_stride*k] +=
765 alpha * Values_[j] * x_ptr[i + x_stride*k];
770 for (
size_t j = 0; j < Nnz; ++j) {
771 const local_ordinal_type col = localIndices_[j];
772 for (
size_t k = 0; k < NumVectors; ++k) {
773 y_ptr[col + y_stride*k] +=
774 alpha * STS::conjugate (Values_[j]) * x_ptr[i + x_stride*k];
783 ArrayRCP<ArrayRCP<const scalar_type> > x_ptr = X.get2dView();
784 ArrayRCP<ArrayRCP<scalar_type> > y_ptr = Y.get2dViewNonConst();
786 for (
size_t i = 0; i < numRows; ++i) {
789 getLocalRowCopy (i, localIndices_ (), Values_ (), Nnz);
791 for (
size_t k = 0; k < NumVectors; ++k) {
792 ArrayView<const scalar_type> x_local = (x_ptr())[k]();
793 ArrayView<scalar_type> y_local = (y_ptr())[k]();
794 for (
size_t j = 0; j < Nnz; ++j) {
795 y_local[i] += alpha * Values_[j] * x_local[localIndices_[j]];
800 for (
size_t k = 0; k < NumVectors; ++k) {
801 ArrayView<const scalar_type> x_local = (x_ptr())[k]();
802 ArrayView<scalar_type> y_local = (y_ptr())[k]();
803 for (
size_t j = 0; j < Nnz; ++j) {
804 y_local[localIndices_[j]] += alpha * Values_[j] * x_local[i];
809 for (
size_t k = 0; k < NumVectors; ++k) {
810 ArrayView<const scalar_type> x_local = (x_ptr())[k]();
811 ArrayView<scalar_type> y_local = (y_ptr())[k]();
812 for (
size_t j = 0; j < Nnz; ++j) {
813 y_local[localIndices_[j]] +=
814 alpha * STS::conjugate (Values_[j]) * x_local[i];
822 template<
class MatrixType>
829 template<
class MatrixType>
836 template<
class MatrixType>
838 LocalFilter<MatrixType>::mag_type
841 #ifdef TPETRA_HAVE_KOKKOS_REFACTOR
842 typedef Kokkos::Details::ArithTraits<scalar_type> STS;
843 typedef Kokkos::Details::ArithTraits<mag_type> STM;
850 const size_type maxNumRowEnt = getNodeMaxNumRowEntries ();
853 const size_t numRows =
static_cast<size_t> (localRowMap_->getNodeNumElements ());
856 mag_type sumSquared = STM::zero ();
857 for (
size_t i = 0; i < numRows; ++i) {
858 size_t numEntries = 0;
859 this->getLocalRowCopy (i, ind (), val (), numEntries);
860 for (size_type k = 0; k < static_cast<size_type> (numEntries); ++k) {
861 const mag_type v_k_abs = STS::magnitude (val[k]);
862 sumSquared += v_k_abs * v_k_abs;
865 return STM::squareroot (sumSquared);
868 template<
class MatrixType>
873 std::ostringstream os;
875 os <<
"Ifpack2::LocalFilter: {";
876 os <<
"MatrixType: " << TypeNameTraits<MatrixType>::name ();
877 if (this->getObjectLabel () !=
"") {
878 os <<
", Label: \"" << this->getObjectLabel () <<
"\"";
880 os <<
", Number of rows: " << getGlobalNumRows ()
881 <<
", Number of columns: " << getGlobalNumCols ()
887 template<
class MatrixType>
904 out <<
"Ifpack2::LocalFilter:" << endl;
906 out <<
"MatrixType: " << TypeNameTraits<MatrixType>::name () << endl;
907 if (this->getObjectLabel () !=
"") {
908 out <<
"Label: \"" << this->getObjectLabel () <<
"\"" << endl;
910 out <<
"Number of rows: " << getGlobalNumRows () << endl
911 <<
"Number of columns: " << getGlobalNumCols () << endl
912 <<
"Number of nonzeros: " << NumNonzeros_ << endl;
915 out <<
"Row Map:" << endl;
916 localRowMap_->describe (out, vl);
917 out <<
"Domain Map:" << endl;
918 localDomainMap_->describe (out, vl);
919 out <<
"Range Map:" << endl;
920 localRangeMap_->describe (out, vl);
925 template<
class MatrixType>
926 Teuchos::RCP<
const Tpetra::RowMatrix<
typename MatrixType::scalar_type,
927 typename MatrixType::local_ordinal_type,
928 typename MatrixType::global_ordinal_type,
929 typename MatrixType::node_type> >
938 #define IFPACK2_LOCALFILTER_INSTANT(S,LO,GO,N) \
939 template class Ifpack2::LocalFilter< Tpetra::RowMatrix<S, LO, GO, N> >;
virtual void rightScale(const Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &x)
Scales the RowMatrix on the right with the Vector x.
Definition: Ifpack2_LocalFilter_def.hpp:638
virtual Teuchos::RCP< const map_type > getRowMap() const
Returns the Map that describes the row distribution in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:253
virtual void describe(Teuchos::FancyOStream &out, const Teuchos::EVerbosityLevel verbLevel=Teuchos::Describable::verbLevel_default) const
Print the object to the given output stream.
Definition: Ifpack2_LocalFilter_def.hpp:890
basic_OSTab< char > OSTab
virtual size_t getNodeNumRows() const
The number of rows owned on the calling process.
Definition: Ifpack2_LocalFilter_def.hpp:317
virtual Teuchos::RCP< const map_type > getDomainMap() const
Returns the Map that describes the domain distribution in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:273
#define TEUCHOS_TEST_FOR_EXCEPTION(throw_exception_test, Exception, msg)
virtual bool isFillComplete() const
Returns true if fillComplete() has been called.
Definition: Ifpack2_LocalFilter_def.hpp:430
virtual Teuchos::RCP< const Teuchos::Comm< int > > getComm() const
Returns the communicator.
Definition: Ifpack2_LocalFilter_def.hpp:232
virtual size_t getNodeMaxNumRowEntries() const
The maximum number of entries across all rows/columns on this process.
Definition: Ifpack2_LocalFilter_def.hpp:402
virtual void apply(const Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &X, Tpetra::MultiVector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &Y, Teuchos::ETransp mode=Teuchos::NO_TRANS, scalar_type alpha=Teuchos::ScalarTraits< scalar_type >::one(), scalar_type beta=Teuchos::ScalarTraits< scalar_type >::zero()) const
Compute Y = beta*Y + alpha*A_local*X.
Definition: Ifpack2_LocalFilter_def.hpp:648
virtual bool hasTransposeApply() const
Whether this operator supports applying the transpose or conjugate transpose.
Definition: Ifpack2_LocalFilter_def.hpp:823
virtual bool isLocallyIndexed() const
Whether the underlying sparse matrix is locally (opposite of globally) indexed.
Definition: Ifpack2_LocalFilter_def.hpp:416
virtual void getGlobalRowView(global_ordinal_type GlobalRow, Teuchos::ArrayView< const global_ordinal_type > &indices, Teuchos::ArrayView< const scalar_type > &values) const
Extract a const, non-persisting view of global indices in a specified row of the matrix.
Definition: Ifpack2_LocalFilter_def.hpp:589
virtual void getLocalDiagCopy(Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &diag) const
Get the diagonal entries of the (locally filtered) matrix.
Definition: Ifpack2_LocalFilter_def.hpp:613
Tpetra::Map< local_ordinal_type, global_ordinal_type, node_type > map_type
Type of the Tpetra::Map specialization that this class uses.
Definition: Ifpack2_LocalFilter_decl.hpp:204
virtual mag_type getFrobeniusNorm() const
The Frobenius norm of the (locally filtered) matrix.
Definition: Ifpack2_LocalFilter_def.hpp:839
virtual Teuchos::RCP< const Tpetra::RowGraph< local_ordinal_type, global_ordinal_type, node_type > > getGraph() const
The (locally filtered) matrix's graph.
Definition: Ifpack2_LocalFilter_def.hpp:293
MatrixType::local_ordinal_type local_ordinal_type
The type of local indices in the input MatrixType.
Definition: Ifpack2_LocalFilter_decl.hpp:184
TEUCHOS_DEPRECATED RCP< T > rcp(T *p, Dealloc_T dealloc, bool owns_mem)
virtual bool supportsRowViews() const
Returns true if RowViews are supported.
Definition: Ifpack2_LocalFilter_def.hpp:830
virtual size_t getNumEntriesInGlobalRow(global_ordinal_type globalRow) const
The current number of entries on this node in the specified global row.
Definition: Ifpack2_LocalFilter_def.hpp:355
virtual void leftScale(const Tpetra::Vector< scalar_type, local_ordinal_type, global_ordinal_type, node_type > &x)
Scales the RowMatrix on the left with the Vector x.
Definition: Ifpack2_LocalFilter_def.hpp:628
virtual global_ordinal_type getIndexBase() const
Returns the index base for global indices for this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:332
virtual bool isGloballyIndexed() const
Whether the underlying sparse matrix is globally (opposite of locally) indexed.
Definition: Ifpack2_LocalFilter_def.hpp:423
virtual size_t getGlobalMaxNumRowEntries() const
The maximum number of entries across all rows/columns on all processes.
Definition: Ifpack2_LocalFilter_def.hpp:395
virtual void getLocalRowCopy(local_ordinal_type LocalRow, const Teuchos::ArrayView< local_ordinal_type > &Indices, const Teuchos::ArrayView< scalar_type > &Values, size_t &NumEntries) const
Get the entries in the given row, using local indices.
Definition: Ifpack2_LocalFilter_def.hpp:483
void resize(size_type new_size, const value_type &x=value_type())
virtual size_t getNodeNumCols() const
The number of columns in the (locally filtered) matrix.
Definition: Ifpack2_LocalFilter_def.hpp:324
LocalFilter(const Teuchos::RCP< const row_matrix_type > &A)
Constructor.
Definition: Ifpack2_LocalFilter_def.hpp:88
virtual ~LocalFilter()
Destructor.
Definition: Ifpack2_LocalFilter_def.hpp:226
virtual global_size_t getGlobalNumRows() const
The number of global rows in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:303
MatrixType::scalar_type scalar_type
The type of the entries of the input MatrixType.
Definition: Ifpack2_LocalFilter_decl.hpp:181
virtual std::string description() const
A one-line description of this object.
Definition: Ifpack2_LocalFilter_def.hpp:870
virtual size_t getNodeNumEntries() const
Returns the local number of entries in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:346
virtual size_t getNumEntriesInLocalRow(local_ordinal_type localRow) const
The current number of entries on this node in the specified local row.
Definition: Ifpack2_LocalFilter_def.hpp:374
virtual Teuchos::RCP< const map_type > getRangeMap() const
Returns the Map that describes the range distribution in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:283
virtual global_size_t getGlobalNumEntries() const
Returns the global number of entries in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:339
virtual Teuchos::RCP< const row_matrix_type > getUnderlyingMatrix() const
Return matrix that LocalFilter was built on.
Definition: Ifpack2_LocalFilter_def.hpp:930
virtual void getGlobalRowCopy(global_ordinal_type GlobalRow, const Teuchos::ArrayView< global_ordinal_type > &Indices, const Teuchos::ArrayView< scalar_type > &Values, size_t &NumEntries) const
Get the entries in the given row, using global indices.
Definition: Ifpack2_LocalFilter_def.hpp:439
Access only local rows and columns of a sparse matrix.
Definition: Ifpack2_LocalFilter_decl.hpp:160
virtual global_size_t getGlobalNumCols() const
The number of global columns in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:310
virtual Teuchos::RCP< const map_type > getColMap() const
Returns the Map that describes the column distribution in this matrix.
Definition: Ifpack2_LocalFilter_def.hpp:263
virtual void getLocalRowView(local_ordinal_type LocalRow, Teuchos::ArrayView< const local_ordinal_type > &indices, Teuchos::ArrayView< const scalar_type > &values) const
Extract a const, non-persisting view of local indices in a specified row of the matrix.
Definition: Ifpack2_LocalFilter_def.hpp:601
virtual bool hasColMap() const
Whether this matrix has a well-defined column Map.
Definition: Ifpack2_LocalFilter_def.hpp:409