Reference documentation for deal.II version 8.4.2
petsc_solver.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2004 - 2016 by the deal.II authors
4 //
5 // This file is part of the deal.II library.
6 //
7 // The deal.II library is free software; you can use it, redistribute
8 // it, and/or modify it under the terms of the GNU Lesser General
9 // Public License as published by the Free Software Foundation; either
10 // version 2.1 of the License, or (at your option) any later version.
11 // The full text of the license can be found in the file LICENSE at
12 // the top level of the deal.II distribution.
13 //
14 // ---------------------------------------------------------------------
15 
16 #ifndef dealii__petsc_solver_h
17 #define dealii__petsc_solver_h
18 
19 
20 #include <deal.II/base/config.h>
21 
22 #ifdef DEAL_II_WITH_PETSC
23 
24 # include <deal.II/lac/exceptions.h>
25 # include <deal.II/lac/solver_control.h>
26 # include <deal.II/base/std_cxx11/shared_ptr.h>
27 
28 # include <petscksp.h>
29 
30 #ifdef DEAL_II_WITH_SLEPC
31 #include <deal.II/lac/slepc_spectral_transformation.h>
32 #endif
33 
34 DEAL_II_NAMESPACE_OPEN
35 
36 #ifdef DEAL_II_WITH_SLEPC
37 namespace SLEPcWrappers
38 {
39  // forward declarations
40  class TransformationBase;
41 }
42 #endif
43 
44 namespace PETScWrappers
45 {
46  // forward declarations
47  class MatrixBase;
48  class VectorBase;
49  class PreconditionerBase;
50 
51 
107  {
108  public:
119  const MPI_Comm &mpi_communicator);
120 
124  virtual ~SolverBase ();
125 
133  void
134  solve (const MatrixBase &A,
135  VectorBase &x,
136  const VectorBase &b,
137  const PreconditionerBase &preconditioner);
138 
139 
144  virtual void reset();
145 
146 
151  void set_prefix(const std::string &prefix);
152 
153 
157  SolverControl &control() const;
158 
163  void initialize(const PreconditionerBase &preconditioner);
164 
168  DeclException1 (ExcPETScError,
169  int,
170  << "An error with error number " << arg1
171  << " occurred while calling a PETSc function");
172 
173  protected:
174 
182 
186  const MPI_Comm mpi_communicator;
187 
192  virtual void set_solver_type (KSP &ksp) const = 0;
193 
200  std::string prefix_name;
201 
202  private:
209  static
210  PetscErrorCode convergence_test (KSP ksp,
211  const PetscInt iteration,
212  const PetscReal residual_norm,
213  KSPConvergedReason *reason,
214  void *solver_control);
215 
233  struct SolverData
234  {
238  ~SolverData ();
239 
243  KSP ksp;
244  };
245 
250  std_cxx11::shared_ptr<SolverData> solver_data;
251 
252 #ifdef DEAL_II_WITH_SLEPC
253 
258 #endif
259  };
260 
261 
262 
271  {
272  public:
277  {
281  explicit
282  AdditionalData (const double omega = 1);
283 
287  double omega;
288  };
289 
307  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
308  const AdditionalData &data = AdditionalData());
309 
310  protected:
315 
320  virtual void set_solver_type (KSP &ksp) const;
321  };
322 
323 
324 
333  {
334  public:
339  {};
340 
358  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
359  const AdditionalData &data = AdditionalData());
360 
361  protected:
366 
371  virtual void set_solver_type (KSP &ksp) const;
372  };
373 
374 
375 
382  class SolverCG : public SolverBase
383  {
384  public:
389  {};
390 
407  SolverCG (SolverControl &cn,
408  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
409  const AdditionalData &data = AdditionalData());
410 
411  protected:
416 
421  virtual void set_solver_type (KSP &ksp) const;
422  };
423 
424 
425 
432  class SolverBiCG : public SolverBase
433  {
434  public:
439  {};
440 
458  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
459  const AdditionalData &data = AdditionalData());
460 
461  protected:
466 
471  virtual void set_solver_type (KSP &ksp) const;
472  };
473 
474 
475 
482  class SolverGMRES : public SolverBase
483  {
484  public:
489  {
494  AdditionalData (const unsigned int restart_parameter = 30,
495  const bool right_preconditioning = false);
496 
500  unsigned int restart_parameter;
501 
506  };
507 
525  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
526  const AdditionalData &data = AdditionalData());
527 
528  protected:
533 
538  virtual void set_solver_type (KSP &ksp) const;
539  };
540 
541 
542 
550  class SolverBicgstab : public SolverBase
551  {
552  public:
557  {};
558 
576  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
577  const AdditionalData &data = AdditionalData());
578 
579  protected:
584 
589  virtual void set_solver_type (KSP &ksp) const;
590  };
591 
599  class SolverCGS : public SolverBase
600  {
601  public:
606  {};
607 
625  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
626  const AdditionalData &data = AdditionalData());
627 
628  protected:
633 
638  virtual void set_solver_type (KSP &ksp) const;
639  };
640 
641 
642 
649  class SolverTFQMR : public SolverBase
650  {
651  public:
656  {};
657 
675  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
676  const AdditionalData &data = AdditionalData());
677 
678  protected:
683 
688  virtual void set_solver_type (KSP &ksp) const;
689  };
690 
691 
692 
693 
705  class SolverTCQMR : public SolverBase
706  {
707  public:
712  {};
713 
731  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
732  const AdditionalData &data = AdditionalData());
733 
734  protected:
739 
744  virtual void set_solver_type (KSP &ksp) const;
745  };
746 
747 
748 
755  class SolverCR : public SolverBase
756  {
757  public:
762  {};
763 
780  SolverCR (SolverControl &cn,
781  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
782  const AdditionalData &data = AdditionalData());
783 
784  protected:
789 
794  virtual void set_solver_type (KSP &ksp) const;
795  };
796 
797 
798 
806  class SolverLSQR : public SolverBase
807  {
808  public:
813  {};
814 
832  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
833  const AdditionalData &data = AdditionalData());
834 
835  protected:
840 
845  virtual void set_solver_type (KSP &ksp) const;
846  };
847 
848 
861  class SolverPreOnly : public SolverBase
862  {
863  public:
868  {};
869 
887  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
888  const AdditionalData &data = AdditionalData());
889 
890  protected:
895 
900  virtual void set_solver_type (KSP &ksp) const;
901  };
902 
929  {
930  public:
935  {};
940  const MPI_Comm &mpi_communicator = PETSC_COMM_SELF,
941  const AdditionalData &data = AdditionalData());
942 
946  void solve (const MatrixBase &A,
947  VectorBase &x,
948  const VectorBase &b);
949 
955  void set_symmetric_mode (const bool flag);
956 
957  protected:
962 
963  virtual void set_solver_type (KSP &ksp) const;
964 
965  private:
972  static
973  PetscErrorCode convergence_test (KSP ksp,
974  const PetscInt iteration,
975  const PetscReal residual_norm,
976  KSPConvergedReason *reason,
977  void *solver_control);
978 
985  {
989  ~SolverDataMUMPS ();
990 
991  KSP ksp;
992  PC pc;
993  };
994 
995  std_cxx11::shared_ptr<SolverDataMUMPS> solver_data;
996 
1002  };
1003 }
1004 
1005 DEAL_II_NAMESPACE_CLOSE
1006 
1007 #endif // DEAL_II_WITH_PETSC
1008 
1009 /*---------------------------- petsc_solver.h ---------------------------*/
1010 
1011 #endif
1012 /*---------------------------- petsc_solver.h ---------------------------*/
const AdditionalData additional_data
Definition: petsc_solver.h:415
const AdditionalData additional_data
Definition: petsc_solver.h:839
const AdditionalData additional_data
Definition: petsc_solver.h:314
const AdditionalData additional_data
Definition: petsc_solver.h:365
const AdditionalData additional_data
Definition: petsc_solver.h:738
std_cxx11::shared_ptr< SolverData > solver_data
Definition: petsc_solver.h:250
const AdditionalData additional_data
Definition: petsc_solver.h:532
#define DeclException1(Exception1, type1, outsequence)
Definition: exceptions.h:542
const MPI_Comm mpi_communicator
Definition: petsc_solver.h:186
const AdditionalData additional_data
Definition: petsc_solver.h:894
SolverControl & solver_control
Definition: petsc_solver.h:181
const AdditionalData additional_data
Definition: petsc_solver.h:465
const AdditionalData additional_data
Definition: petsc_solver.h:583
const AdditionalData additional_data
Definition: petsc_solver.h:961
const AdditionalData additional_data
Definition: petsc_solver.h:632
const AdditionalData additional_data
Definition: petsc_solver.h:788
const AdditionalData additional_data
Definition: petsc_solver.h:682