|
IFPACK Development
|
00001 /*@HEADER 00002 // *********************************************************************** 00003 // 00004 // Ifpack: Object-Oriented Algebraic Preconditioner Package 00005 // Copyright (2002) Sandia Corporation 00006 // 00007 // Under terms of Contract DE-AC04-94AL85000, there is a non-exclusive 00008 // license for use of this work by or on behalf of the U.S. Government. 00009 // 00010 // This library is free software; you can redistribute it and/or modify 00011 // it under the terms of the GNU Lesser General Public License as 00012 // published by the Free Software Foundation; either version 2.1 of the 00013 // License, or (at your option) any later version. 00014 // 00015 // This library is distributed in the hope that it will be useful, but 00016 // WITHOUT ANY WARRANTY; without even the implied warranty of 00017 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 00018 // Lesser General Public License for more details. 00019 // 00020 // You should have received a copy of the GNU Lesser General Public 00021 // License along with this library; if not, write to the Free Software 00022 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 00023 // USA 00024 // Questions? Contact Michael A. Heroux (maherou@sandia.gov) 00025 // 00026 // *********************************************************************** 00027 //@HEADER 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 /* IFPACK_DIAGONALFILTER_H */
1.7.4