EpetraExt_HypreIJMatrix.h

Go to the documentation of this file.
00001 //@HEADER
00002 // ***********************************************************************
00003 // 
00004 //     EpetraExt: Epetra Extended - Linear Algebra Services Package
00005 //                 Copyright (2009) 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 #ifndef EPETRAEXT_HYPREIJMATRIX_H_
00030 #define EPETRAEXT_HYPREIJMATRIX_H_
00031 
00032 // Trilinos source files
00033 #include "Epetra_Object.h"
00034 #include "Epetra_CompObject.h"
00035 #include "Epetra_BasicRowMatrix.h"
00036 #include "Epetra_Map.h"
00037 #include "Epetra_Import.h"
00038 #include "Epetra_MpiComm.h"
00039 
00040 //Hypre source files
00041 #include "krylov.h"
00042 #include "HYPRE_parcsr_ls.h"
00043 #include "_hypre_parcsr_mv.h"
00044 #include "HYPRE_parcsr_mv.h"
00045 #include "HYPRE_IJ_mv.h"
00046 #include "_hypre_IJ_mv.h"
00047 #include "HYPRE.h"
00048 
00049 class Epetra_Vector;
00050 class Epetra_MultiVector;
00051 class Epetra_Import;
00052 
00054 
00061 #ifndef HYPRE_ENUMS
00062 #define HYPRE_ENUMS
00064 
00066   enum Hypre_Solver{ 
00067     BoomerAMG, 
00068     ParaSails, 
00069     Euclid,    
00070     AMS,       
00071     Hybrid,    
00072     PCG,       
00073     GMRES,     
00074     FlexGMRES, 
00075     LGMRES,    
00076     BiCGSTAB   
00077   };
00078 
00080   enum Hypre_Chooser{
00081     Solver,        
00082     Preconditioner 
00083   };
00084 #endif //HYPRE_ENUMS
00085 
00086 class EpetraExt_HypreIJMatrix: public Epetra_BasicRowMatrix  {
00087       
00088 public:
00089 
00091 
00092 
00093 
00097   EpetraExt_HypreIJMatrix(HYPRE_IJMatrix matrix);
00098 
00100   virtual ~EpetraExt_HypreIJMatrix();
00102   
00104 
00105 
00107 
00116   int ExtractMyRowCopy(int MyRow, int Length, int & NumEntries, double *Values, int * Indices) const;
00117     
00119 
00128   int ExtractMyEntryView(int CurEntry, double *&Value, int &RowIndex, int &ColIndex);
00129     
00131 
00140   int ExtractMyEntryView(int CurEntry, const double *&Value, int &RowIndex, int &ColIndex) const;
00142 
00144 
00145 
00147 
00155   int SetParameter(Hypre_Chooser chooser, int (*pt2Func)(HYPRE_Solver, int), int parameter);
00156 
00158 
00166   int SetParameter(Hypre_Chooser chooser, int (*pt2Func)(HYPRE_Solver, double), double parameter);
00167 
00169 
00178   int SetParameter(Hypre_Chooser chooser, int (*pt2Func)(HYPRE_Solver, double, int), double parameter1, int parameter2);
00179 
00181 
00190   int SetParameter(Hypre_Chooser chooser, int (*pt2Func)(HYPRE_Solver, int, int), int parameter1, int parameter2);
00191 
00193 
00201   int SetParameter(Hypre_Chooser chooser, int (*pt2Func)(HYPRE_Solver, double*), double* parameter);
00202 
00204 
00212   int SetParameter(Hypre_Chooser chooser, int (*pt2Func)(HYPRE_Solver, int*), int* parameter);
00213 
00215 
00225   int SetParameter(Hypre_Chooser chooser, Hypre_Solver Solver, bool transpose=false);
00226 
00228 
00236   int SetParameter(bool UsePreconditioner);
00237 
00239 
00245   int SetParameter(Hypre_Chooser chooser);
00247 
00248 
00249 
00251 
00258   int Multiply(bool TransA, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00259 
00261 
00271   int Solve(bool Upper, bool Trans, bool UnitDiagonal, const Epetra_MultiVector& X, Epetra_MultiVector& Y) const;
00272 
00274 
00280   int LeftScale(const Epetra_Vector& X);
00281 
00282 
00284 
00290   int RightScale(const Epetra_Vector& X);
00292 
00294 
00295 
00297 
00303   int Apply(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const {
00304     return(EpetraExt_HypreIJMatrix::Multiply(EpetraExt_HypreIJMatrix::UseTranspose(), X, Y));};
00305 
00307 
00318   int ApplyInverse(const Epetra_MultiVector& X, Epetra_MultiVector& Y) const {
00319     return(EpetraExt_HypreIJMatrix::Solve(EpetraExt_HypreIJMatrix::UpperTriangular(), EpetraExt_HypreIJMatrix::UseTranspose(), false, X, Y));};
00320 
00322   virtual bool UseTranspose() const {return(false);}
00323 
00325 
00326 
00327 
00329 
00336   int NumMyRowEntries(int MyRow, int & NumEntries) const;
00337 
00339   HYPRE_IJMatrix& GetMatrix(){ return Matrix_;}
00340 
00342 protected:
00343 
00345   int InitializeDefaults();
00346    
00347   // These methods are needed only because the create methods in Hypre sometimes take an MPI_Comm but not always. 
00348   // They simply call the create solver in the correct way.
00350   int Hypre_BoomerAMGCreate(MPI_Comm comm, HYPRE_Solver *solver)
00351     { return HYPRE_BoomerAMGCreate(solver);}
00352 
00354   int Hypre_ParaSailsCreate(MPI_Comm comm, HYPRE_Solver *solver)
00355     { return HYPRE_ParaSailsCreate(comm, solver);}
00356 
00358   int Hypre_EuclidCreate(MPI_Comm comm, HYPRE_Solver *solver)
00359     { return HYPRE_EuclidCreate(comm, solver);}
00360 
00362   int Hypre_AMSCreate(MPI_Comm comm, HYPRE_Solver *solver)
00363     { return HYPRE_AMSCreate(solver);}
00364 
00366   int Hypre_ParCSRHybridCreate(MPI_Comm comm, HYPRE_Solver *solver)
00367     { return HYPRE_ParCSRHybridCreate(solver);}
00368 
00370   int Hypre_ParCSRPCGCreate(MPI_Comm comm, HYPRE_Solver *solver)
00371     { return HYPRE_ParCSRPCGCreate(comm, solver);}
00372 
00374   int Hypre_ParCSRGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver)
00375     { return HYPRE_ParCSRGMRESCreate(comm, solver);}
00376 
00378   int Hypre_ParCSRFlexGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver)
00379     { return HYPRE_ParCSRFlexGMRESCreate(comm, solver);}
00380 
00382   int Hypre_ParCSRLGMRESCreate(MPI_Comm comm, HYPRE_Solver *solver)
00383     { return HYPRE_ParCSRLGMRESCreate(comm, solver);}
00384 
00386   int Hypre_ParCSRBiCGSTABCreate(MPI_Comm comm, HYPRE_Solver *solver)
00387     { return HYPRE_ParCSRBiCGSTABCreate(comm, solver);}
00388 
00390   int CreateSolver();
00392   int CreatePrecond();
00393   // These two methods setup the solver or preconditioner by calling the pointer. 
00394   // They are const because they are called from the Solve() routine.
00395   // They really aren't const because they change the value of IsSolverSetup_. This is because it should only be called if it isn't setup.
00396   int SetupSolver() const;
00397   int SetupPrecond() const;
00398 
00399   // Hypre variables
00400   mutable HYPRE_IJMatrix Matrix_;
00401   mutable HYPRE_ParCSRMatrix ParMatrix_;
00402   mutable HYPRE_IJVector X_hypre;
00403   mutable HYPRE_IJVector Y_hypre;
00404   mutable HYPRE_ParVector par_x;
00405   mutable HYPRE_ParVector par_y;
00406   mutable hypre_ParVector *x_vec;
00407   mutable hypre_ParVector *y_vec;
00408   mutable hypre_Vector *x_local;
00409   mutable hypre_Vector *y_local;
00410   mutable HYPRE_Solver Solver_;
00411   mutable HYPRE_Solver Preconditioner_;
00412   // The following are pointers to functions to use the solver and preconditioner.
00413   int (EpetraExt_HypreIJMatrix::*SolverCreatePtr_)(MPI_Comm, HYPRE_Solver*);
00414   int (*SolverDestroyPtr_)(HYPRE_Solver);
00415   int (*SolverSetupPtr_)(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector);
00416   int (*SolverSolvePtr_)(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector);
00417   int (*SolverPrecondPtr_)(HYPRE_Solver, HYPRE_PtrToParSolverFcn, HYPRE_PtrToParSolverFcn, HYPRE_Solver);
00418   int (EpetraExt_HypreIJMatrix::*PrecondCreatePtr_)(MPI_Comm, HYPRE_Solver*);
00419   int (*PrecondDestroyPtr_)(HYPRE_Solver);
00420   int (*PrecondSetupPtr_)(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector);
00421   int (*PrecondSolvePtr_)(HYPRE_Solver, HYPRE_ParCSRMatrix, HYPRE_ParVector, HYPRE_ParVector);
00422     
00424   int NumMyRows_;
00426   int NumGlobalRows_;
00428   int NumGlobalCols_;
00430   int MyRowStart_;
00432   int MyRowEnd_;
00434   mutable int MatType_;
00436   bool TransposeSolve_;
00438   Hypre_Chooser SolveOrPrec_; 
00440   bool *IsSolverSetup_; 
00442   bool *IsPrecondSetup_;
00443 };
00444 #endif /* EPETRAEXT_HYPREIJMATRIX_H_ */

Generated on Wed May 12 21:24:45 2010 for EpetraExt by  doxygen 1.4.7