IFPACK  Development
 All Classes Files Functions Variables Enumerations Friends
Ifpack_ReorderFilter.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_REORDERFILTER_H
00044 #define IFPACK_REORDERFILTER_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 class Ifpack_Reordering;
00056 
00058 
00081 class Ifpack_ReorderFilter : public virtual Epetra_RowMatrix {
00082 
00083 public:
00084   // Constructor.
00085   Ifpack_ReorderFilter(const Teuchos::RefCountPtr<Epetra_RowMatrix>& Matrix_in,
00086                const Teuchos::RefCountPtr<Ifpack_Reordering>& Reordering_in);
00087 
00089   Ifpack_ReorderFilter(const Ifpack_ReorderFilter& RHS);
00090 
00092   virtual ~Ifpack_ReorderFilter() {};
00093 
00095   Ifpack_ReorderFilter& operator=(const Ifpack_ReorderFilter& RHS);
00096 
00098   virtual inline int NumMyRowEntries(int MyRow, int & NumEntries) const
00099   {
00100     return(Matrix()->NumMyRowEntries(MyRow, NumEntries));
00101   }
00102 
00104   virtual int MaxNumEntries() const
00105   {
00106     return(MaxNumEntries_);
00107   }
00108   
00109   // Extracts a copy of the given row for the reordered matrix.
00110   virtual int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00111 
00113   virtual int ExtractDiagonalCopy(Epetra_Vector & Diagonal) const;
00114 
00116   virtual int Multiply(bool TransA, const Epetra_MultiVector& X, 
00117                Epetra_MultiVector& Y) const;
00118 
00120   virtual int Solve(bool Upper, bool Trans, bool UnitDiagonal, 
00121             const Epetra_MultiVector& X,
00122             Epetra_MultiVector& Y) const;
00123 
00125   virtual int Apply(const Epetra_MultiVector& X,
00126             Epetra_MultiVector& Y) const;
00127 
00129   virtual int ApplyInverse(const Epetra_MultiVector& X,
00130                Epetra_MultiVector& Y) const
00131   {
00132     return(-1);
00133   }
00134 
00136   virtual int InvRowSums(Epetra_Vector& x) const
00137   {
00138     return(-1);
00139   }
00140 
00142   virtual int LeftScale(const Epetra_Vector& x)
00143   {
00144     return(-1);
00145   }
00146 
00148   virtual int InvColSums(Epetra_Vector& x) const
00149   {
00150     return(-1);
00151   }
00152 
00154   virtual int RightScale(const Epetra_Vector& x) 
00155   {
00156     return(-1);
00157   }
00158 
00160   virtual bool Filled() const
00161   {
00162     return(Matrix()->Filled());
00163   }
00164 
00166   virtual double NormInf() const
00167   {
00168     return(-1.0);
00169   }
00170 
00172   virtual double NormOne() const
00173   {
00174     return(-1.0);
00175   }
00176 
00177 #ifndef EPETRA_NO_32BIT_GLOBAL_INDICES
00178 
00180   virtual int NumGlobalNonzeros() const
00181   {
00182     return(Matrix()->NumGlobalNonzeros());
00183   }
00184 
00186   virtual int NumGlobalRows() const
00187   {
00188     return(Matrix()->NumGlobalRows());
00189   }
00190 
00192   virtual int NumGlobalCols() const
00193   {
00194     return(Matrix()->NumGlobalCols());
00195   }
00196 
00198   virtual int NumGlobalDiagonals() const
00199   {
00200     return(Matrix()->NumGlobalDiagonals());
00201   }
00202 #endif
00203 
00205   virtual long long NumGlobalNonzeros64() const
00206   {
00207     return(Matrix()->NumGlobalNonzeros64());
00208   }
00209 
00211   virtual long long NumGlobalRows64() const
00212   {
00213     return(Matrix()->NumGlobalRows64());
00214   }
00215 
00217   virtual long long NumGlobalCols64() const
00218   {
00219     return(Matrix()->NumGlobalCols64());
00220   }
00221 
00223   virtual long long NumGlobalDiagonals64() const
00224   {
00225     return(Matrix()->NumGlobalDiagonals64());
00226   }
00227 
00229   virtual int NumMyNonzeros() const
00230   {
00231     return(Matrix()->NumMyNonzeros());
00232   }
00233 
00235   virtual int NumMyRows() const
00236   {
00237     return(Matrix()->NumMyRows());
00238   }
00239 
00241   virtual int NumMyCols() const
00242   {
00243     return(Matrix()->NumMyCols());
00244   }
00245 
00247   virtual int NumMyDiagonals() const
00248   {
00249     return(Matrix()->NumMyDiagonals());
00250   }
00251 
00253   virtual bool LowerTriangular() const
00254   {
00255     return(false);
00256   }
00257 
00259   virtual bool UpperTriangular() const
00260   {
00261     return(false);
00262   }
00263 
00265   virtual const Epetra_Map & RowMatrixRowMap() const
00266   {
00267     return(Matrix()->RowMatrixRowMap());
00268   }
00269 
00271   virtual const Epetra_Map & RowMatrixColMap() const
00272   {
00273     return(Matrix()->RowMatrixColMap());
00274   }
00275 
00277   virtual const Epetra_Import * RowMatrixImporter() const
00278   {
00279     return(Matrix()->RowMatrixImporter());
00280   }
00281 
00283   int SetUseTranspose(bool UseTranspose_in)
00284   {
00285     return(Matrix()->SetUseTranspose(UseTranspose_in));
00286   }
00287 
00289   bool UseTranspose() const 
00290   {
00291     return(Matrix()->UseTranspose());
00292   }
00293   
00295   bool HasNormInf() const
00296   {
00297     return(true);
00298   }
00299 
00301   const Epetra_Comm & Comm() const
00302   {
00303     return(Matrix()->Comm());
00304   }
00305 
00307   const Epetra_Map & OperatorDomainMap() const 
00308   {
00309     return(Matrix()->OperatorDomainMap());
00310   }
00311 
00313   const Epetra_Map & OperatorRangeMap() const 
00314   {
00315     return(Matrix()->OperatorRangeMap());
00316   }
00317 
00319   const Epetra_BlockMap& Map() const 
00320   {
00321     return(Matrix()->Map());
00322   }
00323 
00325   const char* Label() const{
00326     return(Label_);
00327   }
00328 
00330   inline Teuchos::RefCountPtr<Epetra_RowMatrix> Matrix() const {
00331     return(A_);
00332   }
00333 
00335   inline Teuchos::RefCountPtr<Ifpack_Reordering> Reordering() const {
00336     return(Reordering_);
00337   }
00338 
00339 private:
00340 
00342   Teuchos::RefCountPtr<Epetra_RowMatrix> A_;
00344   Teuchos::RefCountPtr<Ifpack_Reordering> Reordering_;
00345 
00347   int NumMyRows_;
00349   int MaxNumEntries_;
00351   char Label_[80];
00352 
00353 };
00354 
00355 
00356 #endif /* IFPACK_DROPFILTER_H */
 All Classes Files Functions Variables Enumerations Friends