IFPACK Development
Ifpack_DiagonalFilter.h
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 // Redistribution and use in source and binary forms, with or without
00011 // modification, are permitted provided that the following conditions are
00012 // met:
00013 //
00014 // 1. Redistributions of source code must retain the above copyright
00015 // notice, this list of conditions and the following disclaimer.
00016 //
00017 // 2. Redistributions in binary form must reproduce the above copyright
00018 // notice, this list of conditions and the following disclaimer in the
00019 // documentation and/or other materials provided with the distribution.
00020 //
00021 // 3. Neither the name of the Corporation nor the names of the
00022 // contributors may be used to endorse or promote products derived from
00023 // this software without specific prior written permission.
00024 //
00025 // THIS SOFTWARE IS PROVIDED BY SANDIA CORPORATION "AS IS" AND ANY
00026 // EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00027 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
00028 // PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL SANDIA CORPORATION OR THE
00029 // CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00030 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00031 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00032 // PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00033 // LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00034 // NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00035 // SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00036 //
00037 // Questions? Contact Michael A. Heroux (maherou@sandia.gov)
00038 //
00039 // ***********************************************************************
00040 //@HEADER
00041 */
00042 
00043 #ifndef IFPACK_DIAGONALFILTER_H
00044 #define IFPACK_DIAGONALFILTER_H
00045 
00046 #include "Ifpack_ConfigDefs.h"
00047 #include "Epetra_ConfigDefs.h"
00048 #include "Epetra_RowMatrix.h"
00049 #include "Epetra_Time.h"
00050 #include "Teuchos_RefCountPtr.hpp"
00051 
00052 class Epetra_Comm;
00053 class Epetra_Map;
00054 class Epetra_MultiVector;
00055 class Epetra_Import;
00056 class Epetra_BlockMap;
00057 
00059 
00080 class Ifpack_DiagonalFilter : public virtual Epetra_RowMatrix {
00081 
00082 public:
00084   Ifpack_DiagonalFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix,
00085                         double AbsoluteThreshold,
00086                         double RelativeThreshold);
00087   
00089   virtual ~Ifpack_DiagonalFilter() {};
00090 
00092   virtual int NumMyRowEntries(int MyRow, int& NumEntries) const
00093   {
00094     return(A_->NumMyRowEntries(MyRow, NumEntries));
00095   }
00096 
00098   virtual int MaxNumEntries() const
00099   {
00100     return(A_->MaxNumEntries());
00101   }
00102 
00103   inline virtual int ExtractMyRowCopy(int MyRow, int Length, int& NumEntries, 
00104                                double* Values, int* Indices) const;
00105 
00106   virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const
00107   {
00108     IFPACK_RETURN(A_->ExtractDiagonalCopy(Diagonal));
00109   }
00110 
00111   virtual int Multiply(bool TransA, const Epetra_MultiVector& X, 
00112                Epetra_MultiVector& Y) const;
00113 
00114   virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, 
00115             const Epetra_MultiVector& X,
00116             Epetra_MultiVector& Y) const
00117   {
00118     IFPACK_CHK_ERR(-1);
00119   }
00120 
00121   virtual int Apply(const Epetra_MultiVector& X,
00122             Epetra_MultiVector& Y) const
00123   {
00124     IFPACK_RETURN(Multiply(UseTranspose(),X,Y));
00125   }
00126 
00127   virtual int ApplyInverse(const Epetra_MultiVector& X,
00128                Epetra_MultiVector& Y) const
00129   {
00130     IFPACK_CHK_ERR(-1);
00131   }
00132 
00133   virtual int InvRowSums(Epetra_Vector& x) const
00134   {
00135     IFPACK_CHK_ERR(-1);
00136   }
00137 
00138   virtual int LeftScale(const Epetra_Vector& x)
00139   {
00140     return(A_->LeftScale(x));
00141   }
00142 
00143   virtual int InvColSums(Epetra_Vector& x) const
00144   {
00145     IFPACK_CHK_ERR(-1);;
00146   }
00147 
00148   virtual int RightScale(const Epetra_Vector& x) 
00149   {
00150     return(A_->RightScale(x));
00151   }
00152 
00153   virtual bool Filled() const
00154   {
00155     return(A_->Filled());
00156   }
00157 
00159   virtual double NormInf() const
00160   {
00161     return(-1.0);
00162   }
00163 
00165   virtual double NormOne() const
00166   {
00167     return(-1.0);
00168   }
00169 
00170 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
00171   virtual int NumGlobalNonzeros() const
00172   {
00173     return(A_->NumGlobalNonzeros());
00174   }
00175 
00176   virtual int NumGlobalRows() const
00177   {
00178     return(A_->NumGlobalRows());
00179   }
00180 
00181   virtual int NumGlobalCols() const
00182   {
00183     return(A_->NumGlobalCols());
00184   }
00185 
00186   virtual int NumGlobalDiagonals() const
00187   {
00188     return(A_->NumGlobalDiagonals());
00189   }
00190 #endif
00191 
00192   virtual long long NumGlobalNonzeros64() const
00193   {
00194     return(A_->NumGlobalNonzeros64());
00195   }
00196 
00197   virtual long long NumGlobalRows64() const
00198   {
00199     return(A_->NumGlobalRows64());
00200   }
00201 
00202   virtual long long NumGlobalCols64() const
00203   {
00204     return(A_->NumGlobalCols64());
00205   }
00206 
00207   virtual long long NumGlobalDiagonals64() const
00208   {
00209     return(A_->NumGlobalDiagonals64());
00210   }
00211 
00212   virtual int NumMyNonzeros() const
00213   {
00214     return(A_->NumMyNonzeros());
00215   }
00216 
00217   virtual int NumMyRows() const
00218   {
00219     return(A_->NumMyRows());
00220   }
00221 
00222   virtual int NumMyCols() const
00223   {
00224     return(A_->NumMyCols());
00225   }
00226 
00227   virtual int NumMyDiagonals() const
00228   {
00229     return(A_->NumMyDiagonals());
00230   }
00231 
00232   virtual bool LowerTriangular() const
00233   {
00234     return(A_->LowerTriangular());
00235   }
00236 
00237   virtual bool UpperTriangular() const
00238   {
00239     return(A_->UpperTriangular());
00240   }
00241 
00242   virtual const Epetra_Map& RowMatrixRowMap() const
00243   {
00244     return(A_->RowMatrixRowMap());
00245   }
00246 
00247   virtual const Epetra_Map& RowMatrixColMap() const
00248   {
00249     return(A_->RowMatrixColMap());
00250   }
00251 
00252   virtual const Epetra_Import* RowMatrixImporter() const
00253   {
00254     return(A_->RowMatrixImporter());
00255   }
00256 
00257   int SetUseTranspose(bool UseTranspose_in)
00258   {
00259     return(A_->SetUseTranspose(UseTranspose_in));
00260   }
00261 
00262   bool UseTranspose() const 
00263   {
00264     return(A_->UseTranspose());
00265   }
00266 
00268   bool HasNormInf() const
00269   {
00270     return(false);
00271   }
00272 
00273   const Epetra_Comm& Comm() const
00274   {
00275     return(A_->Comm());
00276   }
00277 
00278   const Epetra_Map& OperatorDomainMap() const 
00279   {
00280     return(A_->OperatorDomainMap());
00281   }
00282 
00283   const Epetra_Map& OperatorRangeMap() const 
00284   {
00285     return(A_->OperatorRangeMap());
00286   }
00287 
00288   const Epetra_BlockMap& Map() const 
00289   {
00290     return(A_->Map());
00291   }
00292 
00293   const char* Label() const{
00294     return(A_->Label());
00295   }
00296 
00297 private:
00298 
00300   Teuchos::RefCountPtr<Epetra_RowMatrix> A_;
00302   double AbsoluteThreshold_;
00304   double RelativeThreshold_;
00306   std::vector<int> pos_;
00308   std::vector<double> val_;
00309 
00310 };
00311 
00312 
00313 #endif /* IFPACK_DIAGONALFILTER_H */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Friends