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