|
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_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 /* IFPACK_SPARSITYFILTER_H */
1.7.4