IFPACK  Development
 All Classes Files Functions Variables Enumerations Friends
Ifpack_DropFilter.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_DROPFILTER_H
00044 #define IFPACK_DROPFILTER_H
00045 
00046 #include "Ifpack_ConfigDefs.h"
00047 #include "Epetra_RowMatrix.h"
00048 #include "Teuchos_RefCountPtr.hpp"  
00049 
00050 class Epetra_Comm;
00051 class Epetra_Map;
00052 class Epetra_MultiVector;
00053 class Epetra_Import;
00054 class Epetra_BlockMap;
00055 
00057 
00081 class Ifpack_DropFilter : public virtual Epetra_RowMatrix {
00082 
00083 public:
00085   Ifpack_DropFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix,
00086             double DropTol);
00087 
00089   virtual ~Ifpack_DropFilter() {};
00090 
00092   virtual inline int NumMyRowEntries(int MyRow, int & NumEntries) const
00093   {
00094     NumEntries = NumEntries_[MyRow];
00095     return(0);
00096   }
00097 
00099   virtual int MaxNumEntries() const
00100   {
00101     return(MaxNumEntries_);
00102   }
00103 
00104   virtual int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00105 
00106   virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00107 
00108   virtual int Multiply(bool TransA, const Epetra_MultiVector& X, 
00109                Epetra_MultiVector& Y) const;
00110 
00111   virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, 
00112             const Epetra_MultiVector& X,
00113             Epetra_MultiVector& Y) const;
00114 
00115   virtual int Apply(const Epetra_MultiVector& X,
00116             Epetra_MultiVector& Y) const;
00117 
00118   virtual int ApplyInverse(const Epetra_MultiVector& X,
00119                Epetra_MultiVector& Y) const;
00120 
00121   virtual int InvRowSums(Epetra_Vector& x) const;
00122 
00123   virtual int LeftScale(const Epetra_Vector& x)
00124   {
00125     return(A_->LeftScale(x));
00126   }
00127 
00128   virtual int InvColSums(Epetra_Vector& x) const;
00129 
00130   virtual int RightScale(const Epetra_Vector& x) 
00131   {
00132     return(A_->RightScale(x));
00133   }
00134 
00135   virtual bool Filled() const
00136   {
00137     return(A_->Filled());
00138   }
00139 
00140   virtual double NormInf() const
00141   {
00142     return(-1.0);
00143   }
00144 
00145   virtual double NormOne() const
00146   {
00147     return(-1.0);
00148   }
00149 
00150 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
00151   virtual int NumGlobalNonzeros() const
00152   {
00153     return(NumNonzeros_);
00154   }
00155 
00156   virtual int NumGlobalRows() const
00157   {
00158     return(NumRows_);
00159   }
00160 
00161   virtual int NumGlobalCols() const
00162   {
00163     return(NumRows_);
00164   }
00165 
00166   virtual int NumGlobalDiagonals() const
00167   {
00168     return(NumRows_);
00169   }
00170 #endif
00171 
00172   virtual long long NumGlobalNonzeros64() const
00173   {
00174     return(NumNonzeros_);
00175   }
00176 
00177   virtual long long NumGlobalRows64() const
00178   {
00179     return(NumRows_);
00180   }
00181 
00182   virtual long long NumGlobalCols64() const
00183   {
00184     return(NumRows_);
00185   }
00186 
00187   virtual long long NumGlobalDiagonals64() const
00188   {
00189     return(NumRows_);
00190   }
00191 
00192   virtual int NumMyNonzeros() const
00193   {
00194     return(NumNonzeros_);
00195   }
00196 
00197   virtual int NumMyRows() const
00198   {
00199     return(NumRows_);
00200   }
00201 
00202   virtual int NumMyCols() const
00203   {
00204     return(NumRows_);
00205   }
00206 
00207   virtual int NumMyDiagonals() const
00208   {
00209     return(NumRows_);
00210   }
00211 
00212   virtual bool LowerTriangular() const
00213   {
00214     return(false);
00215   }
00216 
00217   virtual bool UpperTriangular() const
00218   {
00219     return(false);
00220   }
00221 
00222   virtual const Epetra_Map & RowMatrixRowMap() const
00223   {
00224     return(A_->RowMatrixRowMap());
00225   }
00226 
00227   virtual const Epetra_Map & RowMatrixColMap() const
00228   {
00229     return(A_->RowMatrixColMap());
00230   }
00231 
00232   virtual const Epetra_Import * RowMatrixImporter() const
00233   {
00234     return(A_->RowMatrixImporter());
00235   }
00236 
00237   int SetUseTranspose(bool UseTranspose)
00238   {
00239     return(A_->SetUseTranspose(UseTranspose));
00240   }
00241 
00242   bool UseTranspose() const 
00243   {
00244     return(A_->UseTranspose());
00245   }
00246 
00247   bool HasNormInf() const
00248   {
00249     return(false);
00250   }
00251 
00252   const Epetra_Comm & Comm() const
00253   {
00254     return(A_->Comm());
00255   }
00256 
00257   const Epetra_Map & OperatorDomainMap() const 
00258   {
00259     return(A_->OperatorDomainMap());
00260   }
00261 
00262   const Epetra_Map & OperatorRangeMap() const 
00263   {
00264     return(A_->OperatorRangeMap());
00265   }
00266 
00267   const Epetra_BlockMap& Map() const 
00268   {
00269     return(A_->Map());
00270   }
00271 
00272   const char* Label() const{
00273     return(Label_);
00274   }
00275 
00276 private:
00277 
00279   Teuchos::RefCountPtr<Epetra_RowMatrix> A_;
00281   double DropTol_;
00283   int MaxNumEntries_;
00284   int MaxNumEntriesA_;
00285   int NumRows_;
00286   
00288   int NumNonzeros_;
00289 
00291   mutable std::vector<int> Indices_;
00293   mutable std::vector<double> Values_;
00295   char Label_[80];
00296   std::vector<int> NumEntries_;
00297 
00298 };
00299 
00300 
00301 #endif /* IFPACK_DROPFILTER_H */
 All Classes Files Functions Variables Enumerations Friends