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_DIAGONALFILTER_H
00031 #define IFPACK_DIAGONALFILTER_H
00032
00033 #include "Ifpack_ConfigDefs.h"
00034 #include "Epetra_ConfigDefs.h"
00035 #include "Epetra_RowMatrix.h"
00036 #include "Epetra_Time.h"
00037 #include "Teuchos_RefCountPtr.hpp"
00038
00039 class Epetra_Comm;
00040 class Epetra_Map;
00041 class Epetra_MultiVector;
00042 class Epetra_Import;
00043 class Epetra_BlockMap;
00044
00046
00067 class Ifpack_DiagonalFilter : public virtual Epetra_RowMatrix {
00068
00069 public:
00071 Ifpack_DiagonalFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix,
00072 double AbsoluteThreshold,
00073 double RelativeThreshold);
00074
00076 virtual ~Ifpack_DiagonalFilter() {};
00077
00079 virtual int NumMyRowEntries(int MyRow, int& NumEntries) const
00080 {
00081 return(A_->NumMyRowEntries(MyRow, NumEntries));
00082 }
00083
00085 virtual int MaxNumEntries() const
00086 {
00087 return(A_->MaxNumEntries());
00088 }
00089
00090 inline virtual int ExtractMyRowCopy(int MyRow, int Length, int& NumEntries,
00091 double* Values, int* Indices) const;
00092
00093 virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const
00094 {
00095 IFPACK_RETURN(A_->ExtractDiagonalCopy(Diagonal));
00096 }
00097
00098 virtual int Multiply(bool TransA, const Epetra_MultiVector& X,
00099 Epetra_MultiVector& Y) const;
00100
00101 virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal,
00102 const Epetra_MultiVector& X,
00103 Epetra_MultiVector& Y) const
00104 {
00105 IFPACK_CHK_ERR(-1);
00106 }
00107
00108 virtual int Apply(const Epetra_MultiVector& X,
00109 Epetra_MultiVector& Y) const
00110 {
00111 IFPACK_RETURN(Multiply(UseTranspose(),X,Y));
00112 }
00113
00114 virtual int ApplyInverse(const Epetra_MultiVector& X,
00115 Epetra_MultiVector& Y) const
00116 {
00117 IFPACK_CHK_ERR(-1);
00118 }
00119
00120 virtual int InvRowSums(Epetra_Vector& x) const
00121 {
00122 IFPACK_CHK_ERR(-1);
00123 }
00124
00125 virtual int LeftScale(const Epetra_Vector& x)
00126 {
00127 return(A_->LeftScale(x));
00128 }
00129
00130 virtual int InvColSums(Epetra_Vector& x) const
00131 {
00132 IFPACK_CHK_ERR(-1);;
00133 }
00134
00135 virtual int RightScale(const Epetra_Vector& x)
00136 {
00137 return(A_->RightScale(x));
00138 }
00139
00140 virtual bool Filled() const
00141 {
00142 return(A_->Filled());
00143 }
00144
00146 virtual double NormInf() const
00147 {
00148 return(-1.0);
00149 }
00150
00152 virtual double NormOne() const
00153 {
00154 return(-1.0);
00155 }
00156
00157 virtual int NumGlobalNonzeros() const
00158 {
00159 return(A_->NumGlobalNonzeros());
00160 }
00161
00162 virtual int NumGlobalRows() const
00163 {
00164 return(A_->NumGlobalRows());
00165 }
00166
00167 virtual int NumGlobalCols() const
00168 {
00169 return(A_->NumGlobalCols());
00170 }
00171
00172 virtual int NumGlobalDiagonals() const
00173 {
00174 return(A_->NumGlobalDiagonals());
00175 }
00176
00177 virtual int NumMyNonzeros() const
00178 {
00179 return(A_->NumMyNonzeros());
00180 }
00181
00182 virtual int NumMyRows() const
00183 {
00184 return(A_->NumMyRows());
00185 }
00186
00187 virtual int NumMyCols() const
00188 {
00189 return(A_->NumMyCols());
00190 }
00191
00192 virtual int NumMyDiagonals() const
00193 {
00194 return(A_->NumMyDiagonals());
00195 }
00196
00197 virtual bool LowerTriangular() const
00198 {
00199 return(A_->LowerTriangular());
00200 }
00201
00202 virtual bool UpperTriangular() const
00203 {
00204 return(A_->UpperTriangular());
00205 }
00206
00207 virtual const Epetra_Map& RowMatrixRowMap() const
00208 {
00209 return(A_->RowMatrixRowMap());
00210 }
00211
00212 virtual const Epetra_Map& RowMatrixColMap() const
00213 {
00214 return(A_->RowMatrixColMap());
00215 }
00216
00217 virtual const Epetra_Import* RowMatrixImporter() const
00218 {
00219 return(A_->RowMatrixImporter());
00220 }
00221
00222 int SetUseTranspose(bool UseTranspose_in)
00223 {
00224 return(A_->SetUseTranspose(UseTranspose_in));
00225 }
00226
00227 bool UseTranspose() const
00228 {
00229 return(A_->UseTranspose());
00230 }
00231
00233 bool HasNormInf() const
00234 {
00235 return(false);
00236 }
00237
00238 const Epetra_Comm& Comm() const
00239 {
00240 return(A_->Comm());
00241 }
00242
00243 const Epetra_Map& OperatorDomainMap() const
00244 {
00245 return(A_->OperatorDomainMap());
00246 }
00247
00248 const Epetra_Map& OperatorRangeMap() const
00249 {
00250 return(A_->OperatorRangeMap());
00251 }
00252
00253 const Epetra_BlockMap& Map() const
00254 {
00255 return(A_->Map());
00256 }
00257
00258 const char* Label() const{
00259 return(A_->Label());
00260 }
00261
00262 private:
00263
00265 Teuchos::RefCountPtr<Epetra_RowMatrix> A_;
00267 double AbsoluteThreshold_;
00269 double RelativeThreshold_;
00271 std::vector<int> pos_;
00273 std::vector<double> val_;
00274
00275 };
00276
00277
00278 #endif