43 #include "Ifpack_ConfigDefs.h"
44 #include "Ifpack_DiagonalFilter.h"
45 #include "Epetra_ConfigDefs.h"
46 #include "Epetra_RowMatrix.h"
47 #include "Epetra_Comm.h"
48 #include "Epetra_Map.h"
49 #include "Epetra_MultiVector.h"
50 #include "Epetra_Vector.h"
54 double AbsoluteThreshold,
55 double RelativeThreshold) :
57 AbsoluteThreshold_(AbsoluteThreshold),
58 RelativeThreshold_(RelativeThreshold)
65 pos_.resize(NumMyRows());
66 val_.resize(NumMyRows());
72 for (
int MyRow = 0 ; MyRow < NumMyRows() ; ++MyRow) {
76 int ierr = A_->ExtractMyRowCopy(MyRow,
MaxNumEntries(), NumEntries,
77 &Values[0], &Indices[0]);
81 for (
int i = 0 ; i < NumEntries ; ++i) {
82 if (Indices[i] == MyRow) {
84 val_[MyRow] = Values[i] * (RelativeThreshold_ - 1) +
85 AbsoluteThreshold_ * EPETRA_SGN(Values[i]);
94 int Ifpack_DiagonalFilter::
95 ExtractMyRowCopy(
int MyRow,
int Length,
int& NumEntries,
96 double* Values,
int* Indices)
const
99 IFPACK_CHK_ERR(A_->ExtractMyRowCopy(MyRow, Length, NumEntries,
102 if (pos_[MyRow] != -1)
103 Values[pos_[MyRow]] += val_[MyRow];
109 int Ifpack_DiagonalFilter::
114 if (X.NumVectors() != Y.NumVectors())
117 IFPACK_CHK_ERR(A_->Multiply(TransA, X, Y));
119 for (
int v = 0 ; v < X.NumVectors() ; ++v)
120 for (
int i = 0 ; i < NumMyRows() ; ++i)
121 Y[v][i] += val_[i] * X[v][i];
double ElapsedTime(void) const
virtual int MaxNumEntries() const
Returns the maximum number of entries.
Ifpack_DiagonalFilter(const Teuchos::RefCountPtr< Epetra_RowMatrix > &Matrix, double AbsoluteThreshold, double RelativeThreshold)
Constructor.