43 #include "Ifpack_ConfigDefs.h"
45 #include "Epetra_MultiVector.h"
46 #include "Epetra_Vector.h"
47 #include "Epetra_RowMatrix.h"
48 #include "Epetra_Map.h"
49 #include "Epetra_BlockMap.h"
50 #include "Ifpack_LocalFilter.h"
60 sprintf(Label_,
"%s",
"Ifpack_LocalFilter");
69 NumRows_ = Matrix->NumMyRows();
71 #if !defined(EPETRA_NO_32BIT_GLOBAL_INDICES) || !defined(EPETRA_NO_64BIT_GLOBAL_INDICES)
73 Map_ = Teuchos::rcp(
new Epetra_Map(NumRows_,0,*SerialComm_) );
79 NumEntries_.resize(NumRows_);
83 if (Diagonal_ == Teuchos::null) IFPACK_CHK_ERRV(-5);
87 MaxNumEntriesA_ = Matrix->MaxNumEntries();
90 MaxNumEntries_ = Matrix->MaxNumEntries();
93 Indices_.resize(MaxNumEntries_);
94 Values_.resize(MaxNumEntries_);
103 int ActualMaxNumEntries = 0;
105 for (
int i = 0 ; i < NumRows_ ; ++i) {
109 IFPACK_CHK_ERRV(
ExtractMyRowCopy(i,MaxNumEntries_,Nnz,&Values_[0],&Indices_[0]));
111 for (
int j = 0 ; j < Nnz ; ++j) {
112 if (Indices_[j] < NumRows_ ) ++NewNnz;
114 if (Indices_[j] == i)
115 (*Diagonal_)[i] = Values_[j];
118 if (NewNnz > ActualMaxNumEntries)
119 ActualMaxNumEntries = NewNnz;
121 NumNonzeros_ += NewNnz;
122 NumEntries_[i] = NewNnz;
126 MaxNumEntries_ = ActualMaxNumEntries;
132 double *Values,
int * Indices)
const
134 if ((MyRow < 0) || (MyRow >= NumRows_)) {
138 if (Length < NumEntries_[MyRow])
145 int ierr = Matrix_->ExtractMyRowCopy(MyRow,MaxNumEntriesA_,Nnz,
146 &Values_[0],&Indices_[0]);
148 IFPACK_CHK_ERR(ierr);
153 for (
int j = 0 ; j < Nnz ; ++j) {
155 if (Indices_[j] < NumRows_ ) {
156 Indices[NumEntries] = Indices_[j];
157 Values[NumEntries] = Values_[j];
169 if (!Diagonal.Map().SameAs(*Map_))
171 Diagonal = *Diagonal_;
183 int NumVectors = Y.NumVectors();
187 X.ExtractView(&X_ptr);
188 Y.ExtractView(&Y_ptr);
190 for (
int i = 0 ; i < NumRows_ ; ++i) {
193 int ierr = Matrix_->ExtractMyRowCopy(i,MaxNumEntriesA_,Nnz,&Values_[0],
195 IFPACK_CHK_ERR(ierr);
197 for (
int j = 0 ; j < Nnz ; ++j) {
198 if (Indices_[j] < NumRows_ ) {
199 for (
int k = 0 ; k < NumVectors ; ++k)
200 Y_ptr[k][i] += Values_[j] * X_ptr[k][Indices_[j]];
virtual int ExtractDiagonalCopy(Epetra_Vector &Diagonal) const
Returns a copy of the main diagonal in a user-provided vector.
Ifpack_LocalFilter(const Teuchos::RefCountPtr< const Epetra_RowMatrix > &Matrix)
Constructor.
virtual int ExtractMyRowCopy(int MyRow, int Length, int &NumEntries, double *Values, int *Indices) const
Returns a copy of the specified local row in user-provided arrays.