00001
00002
00003
00004
00005
00006
00007
00008
00009
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
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
01158
01159 #endif
01160
01161