include/deal.II/lac/petsc_solver.h

00001 //---------------------------------------------------------------------------
00002 //    @f$Id: petsc_solver.h 25345 2012-03-31 08:37:04Z bangerth @f$
00003 //
00004 //    Copyright (C) 2004, 2005, 2006, 2007, 2009, 2010, 2012 by the deal.II authors
00005 //
00006 //    This file is subject to QPL and may not be  distributed
00007 //    without copyright and license information. Please refer
00008 //    to the file deal.II/doc/license.html for the  text  and
00009 //    further information on this license.
00010 //
00011 //---------------------------------------------------------------------------
00012 #ifndef __deal2__petsc_solver_h
00013 #define __deal2__petsc_solver_h
00014 
00015 
00016 #include <deal.II/base/config.h>
00017 
00018 #ifdef DEAL_II_USE_PETSC
00019 
00020 #  include <deal.II/lac/exceptions.h>
00021 #  include <deal.II/lac/solver_control.h>
00022 #  include <deal.II/base/std_cxx1x/shared_ptr.h>
00023 
00024 #  include <petscksp.h>
00025 
00026 DEAL_II_NAMESPACE_OPEN
00027 
00028 
00029 namespace PETScWrappers
00030 {
00031                                    // forward declarations
00032   class MatrixBase;
00033   class VectorBase;
00034   class PreconditionerBase;
00035 
00036 
00095   class SolverBase
00096   {
00097     public:
00114       SolverBase (SolverControl  &cn,
00115                   const MPI_Comm &mpi_communicator);
00116 
00120       virtual ~SolverBase ();
00121 
00134       void
00135       solve (const MatrixBase         &A,
00136              VectorBase               &x,
00137              const VectorBase         &b,
00138              const PreconditionerBase &preconditioner);
00139 
00140 
00146       virtual void reset();
00147 
00148 
00155       void set_prefix(const std::string &prefix);
00156 
00157 
00162       SolverControl & control() const;
00163 
00167       DeclException1 (ExcPETScError,
00168                       int,
00169                       << "An error with error number " << arg1
00170                       << " occured while calling a PETSc function");
00171 
00172     protected:
00173 
00184       SolverControl &solver_control;
00185 
00190       const MPI_Comm mpi_communicator;
00191 
00198       virtual void set_solver_type (KSP &ksp) const = 0;
00199 
00200     private:
00210       std::string prefix_name;
00211 
00221       static
00222 #ifdef PETSC_USE_64BIT_INDICES
00223       PetscErrorCode
00224 #else
00225       int
00226 #endif
00227       convergence_test (KSP                 ksp,
00228 #ifdef PETSC_USE_64BIT_INDICES
00229                         const PetscInt      iteration,
00230 #else
00231                         const int           iteration,
00232 #endif
00233                         const PetscReal     residual_norm,
00234                         KSPConvergedReason *reason,
00235                         void               *solver_control);
00236 
00266       struct SolverData
00267       {
00271           ~SolverData ();
00272 
00273 #if (PETSC_VERSION_MAJOR == 2) && (PETSC_VERSION_MINOR < 2)
00274 
00277           SLES sles;
00278 #endif
00279 
00283           KSP  ksp;
00284           PC   pc;
00285       };
00286 
00293       std_cxx1x::shared_ptr<SolverData> solver_data;
00294   };
00295 
00296 
00297 
00305   class SolverRichardson : public SolverBase
00306   {
00307     public:
00313       struct AdditionalData
00314       {
00320           AdditionalData (const double omega = 1);
00321 
00325           double omega;
00326       };
00327 
00356       SolverRichardson (SolverControl        &cn,
00357                         const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00358                         const AdditionalData &data = AdditionalData());
00359 
00360     protected:
00365       const AdditionalData additional_data;
00366 
00373       virtual void set_solver_type (KSP &ksp) const;
00374   };
00375 
00376 
00377 
00385   class SolverChebychev : public SolverBase
00386   {
00387     public:
00393       struct AdditionalData
00394       {};
00395 
00424       SolverChebychev (SolverControl        &cn,
00425                        const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00426                        const AdditionalData &data = AdditionalData());
00427 
00428     protected:
00433       const AdditionalData additional_data;
00434 
00441       virtual void set_solver_type (KSP &ksp) const;
00442   };
00443 
00444 
00445 
00453   class SolverCG : public SolverBase
00454   {
00455     public:
00461       struct AdditionalData
00462       {};
00463 
00492       SolverCG (SolverControl        &cn,
00493                 const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00494                 const AdditionalData &data = AdditionalData());
00495 
00496     protected:
00501       const AdditionalData additional_data;
00502 
00509       virtual void set_solver_type (KSP &ksp) const;
00510   };
00511 
00512 
00513 
00521   class SolverBiCG : public SolverBase
00522   {
00523     public:
00529       struct AdditionalData
00530       {};
00531 
00560       SolverBiCG (SolverControl        &cn,
00561                   const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00562                   const AdditionalData &data = AdditionalData());
00563 
00564     protected:
00569       const AdditionalData additional_data;
00570 
00577       virtual void set_solver_type (KSP &ksp) const;
00578   };
00579 
00580 
00581 
00588   class SolverGMRES : public SolverBase
00589   {
00590     public:
00596       struct AdditionalData
00597       {
00604           AdditionalData (const unsigned int restart_parameter = 30,
00605                           const bool right_preconditioning = false);
00606 
00611           unsigned int restart_parameter;
00612 
00617           bool right_preconditioning;
00618       };
00619 
00648       SolverGMRES (SolverControl        &cn,
00649                    const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00650                    const AdditionalData &data = AdditionalData());
00651 
00652     protected:
00657       const AdditionalData additional_data;
00658 
00665       virtual void set_solver_type (KSP &ksp) const;
00666   };
00667 
00668 
00669 
00677   class SolverBicgstab : public SolverBase
00678   {
00679     public:
00685       struct AdditionalData
00686       {};
00687 
00716       SolverBicgstab (SolverControl        &cn,
00717                       const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00718                       const AdditionalData &data = AdditionalData());
00719 
00720     protected:
00725       const AdditionalData additional_data;
00726 
00733       virtual void set_solver_type (KSP &ksp) const;
00734   };
00735 
00743   class SolverCGS : public SolverBase
00744   {
00745     public:
00751       struct AdditionalData
00752       {};
00753 
00782       SolverCGS (SolverControl        &cn,
00783                  const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00784                  const AdditionalData &data = AdditionalData());
00785 
00786     protected:
00791       const AdditionalData additional_data;
00792 
00799       virtual void set_solver_type (KSP &ksp) const;
00800   };
00801 
00802 
00803 
00811   class SolverTFQMR : public SolverBase
00812   {
00813     public:
00819       struct AdditionalData
00820       {};
00821 
00850       SolverTFQMR (SolverControl        &cn,
00851                    const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00852                    const AdditionalData &data = AdditionalData());
00853 
00854     protected:
00859       const AdditionalData additional_data;
00860 
00867       virtual void set_solver_type (KSP &ksp) const;
00868   };
00869 
00870 
00871 
00872 
00884   class SolverTCQMR : public SolverBase
00885   {
00886     public:
00892       struct AdditionalData
00893       {};
00894 
00923       SolverTCQMR (SolverControl        &cn,
00924                    const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00925                    const AdditionalData &data = AdditionalData());
00926 
00927     protected:
00932       const AdditionalData additional_data;
00933 
00940       virtual void set_solver_type (KSP &ksp) const;
00941   };
00942 
00943 
00944 
00952   class SolverCR : public SolverBase
00953   {
00954     public:
00960       struct AdditionalData
00961       {};
00962 
00991       SolverCR (SolverControl        &cn,
00992                 const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
00993                 const AdditionalData &data = AdditionalData());
00994 
00995     protected:
01000       const AdditionalData additional_data;
01001 
01008       virtual void set_solver_type (KSP &ksp) const;
01009   };
01010 
01011 
01012 
01020   class SolverLSQR : public SolverBase
01021   {
01022     public:
01028       struct AdditionalData
01029       {};
01030 
01059       SolverLSQR (SolverControl        &cn,
01060                   const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
01061                   const AdditionalData &data = AdditionalData());
01062 
01063     protected:
01068       const AdditionalData additional_data;
01069 
01076       virtual void set_solver_type (KSP &ksp) const;
01077   };
01078 
01079 
01092   class SolverPreOnly : public SolverBase
01093   {
01094     public:
01100       struct AdditionalData
01101       {};
01102 
01131       SolverPreOnly (SolverControl        &cn,
01132                      const MPI_Comm       &mpi_communicator = PETSC_COMM_SELF,
01133                      const AdditionalData &data = AdditionalData());
01134 
01135     protected:
01140       const AdditionalData additional_data;
01141 
01148       virtual void set_solver_type (KSP &ksp) const;
01149   };
01150 
01151 }
01152 
01153 DEAL_II_NAMESPACE_CLOSE
01154 
01155 #endif // DEAL_II_USE_PETSC
01156 
01157 /*----------------------------   petsc_solver.h     ---------------------------*/
01158 
01159 #endif
01160 /*----------------------------   petsc_solver.h     ---------------------------*/
01161 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines

deal.II documentation generated on Wed May 23 2012 06:07:38 by doxygen 1.7.3