00001 #ifndef IFPACK_SPARSITYFILTER_H
00002 #define IFPACK_SPARSITYFILTER_H
00003
00004 #include "Ifpack_ConfigDefs.h"
00005 #include "Epetra_RowMatrix.h"
00006 class Epetra_Comm;
00007 class Epetra_Map;
00008 class Epetra_MultiVector;
00009 class Epetra_Import;
00010 class Epetra_BlockMap;
00011
00013
00014 class Ifpack_SparsityFilter : public virtual Epetra_RowMatrix {
00015
00016 public:
00017 Ifpack_SparsityFilter(Epetra_RowMatrix* Matrix,
00018 int AllowedNumEntries,
00019 int AllowedBandwidth = -1);
00020
00021 virtual ~Ifpack_SparsityFilter();
00022
00023 virtual inline int NumMyRowEntries(int MyRow, int & NumEntries) const
00024 {
00025 NumEntries = NumEntries_[MyRow];
00026 return(0);
00027 }
00028
00029 virtual int MaxNumEntries() const
00030 {
00031 return(MaxNumEntries_);
00032 }
00033
00034 virtual int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00035
00036 virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00037
00038 virtual int Multiply(bool TransA, const Epetra_MultiVector& X,
00039 Epetra_MultiVector& Y) const;
00040
00041 virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal,
00042 const Epetra_MultiVector& X,
00043 Epetra_MultiVector& Y) const;
00044
00045 virtual int Apply(const Epetra_MultiVector& X,
00046 Epetra_MultiVector& Y) const;
00047
00048 virtual int ApplyInverse(const Epetra_MultiVector& X,
00049 Epetra_MultiVector& Y) const;
00050
00051 virtual int InvRowSums(Epetra_Vector& x) const
00052 {
00053 return(-98);
00054 }
00055
00056 virtual int LeftScale(const Epetra_Vector& x)
00057 {
00058 return(-98);
00059 }
00060
00061 virtual int InvColSums(Epetra_Vector& x) const
00062 {
00063 return(-98);
00064 }
00065
00066 virtual int RightScale(const Epetra_Vector& x)
00067 {
00068 return(A_.RightScale(x));
00069 }
00070
00071 virtual bool Filled() const
00072 {
00073 return(A_.Filled());
00074 }
00075
00076 virtual double NormInf() const
00077 {
00078 return(-1.0);
00079 }
00080
00081 virtual double NormOne() const
00082 {
00083 return(-1.0);
00084 }
00085
00086 virtual int NumGlobalNonzeros() const
00087 {
00088 return(NumNonzeros_);
00089 }
00090
00091 virtual int NumGlobalRows() const
00092 {
00093 return(NumRows_);
00094 }
00095
00096 virtual int NumGlobalCols() const
00097 {
00098 return(NumRows_);
00099 }
00100
00101 virtual int NumGlobalDiagonals() const
00102 {
00103 return(NumRows_);
00104 }
00105
00106 virtual int NumMyNonzeros() const
00107 {
00108 return(NumNonzeros_);
00109 }
00110
00111 virtual int NumMyRows() const
00112 {
00113 return(NumRows_);
00114 }
00115
00116 virtual int NumMyCols() const
00117 {
00118 return(NumRows_);
00119 }
00120
00121 virtual int NumMyDiagonals() const
00122 {
00123 return(NumRows_);
00124 }
00125
00126 virtual bool LowerTriangular() const
00127 {
00128 return(false);
00129 }
00130
00131 virtual bool UpperTriangular() const
00132 {
00133 return(false);
00134 }
00135
00136 virtual const Epetra_Map & RowMatrixRowMap() const
00137 {
00138 return(A_.RowMatrixRowMap());
00139 }
00140
00141 virtual const Epetra_Map & RowMatrixColMap() const
00142 {
00143 return(A_.RowMatrixColMap());
00144 }
00145
00146 virtual const Epetra_Import * RowMatrixImporter() const
00147 {
00148 return(A_.RowMatrixImporter());
00149 }
00150
00151 int SetUseTranspose(bool UseTranspose)
00152 {
00153 return(A_.SetUseTranspose(UseTranspose));
00154 }
00155
00156 bool UseTranspose() const
00157 {
00158 return(A_.UseTranspose());
00159 }
00160
00161 bool HasNormInf() const
00162 {
00163 return(false);
00164 }
00165
00166 const Epetra_Comm & Comm() const
00167 {
00168 return(A_.Comm());
00169 }
00170
00171 const Epetra_Map & OperatorDomainMap() const
00172 {
00173 return(A_.OperatorDomainMap());
00174 }
00175
00176 const Epetra_Map & OperatorRangeMap() const
00177 {
00178 return(A_.OperatorRangeMap());
00179 }
00180
00181 const Epetra_BlockMap& Map() const
00182 {
00183 return(A_.Map());
00184 }
00185
00186 const char* Label() const{
00187 return(Label_);
00188 }
00189
00190 private:
00191
00193 Epetra_RowMatrix& A_;
00195 int MaxNumEntries_;
00196 int MaxNumEntriesA_;
00197
00199 int AllowedBandwidth_;
00201 int AllowedEntries_;
00202
00204 int NumNonzeros_;
00205
00207 mutable vector<int> Indices_;
00209 mutable vector<double> Values_;
00211 char Label_[80];
00212
00213 int NumRows_;
00214 vector<int> NumEntries_;
00215
00216 };
00217
00218
00219 #endif