Reference documentation for deal.II version 9.1.1
\(\newcommand{\dealcoloneq}{\mathrel{\vcenter{:}}=}\)
petsc_solver.h
1 // ---------------------------------------------------------------------
2 //
3 // Copyright (C) 2004 - 2018 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.md at
12 // the top level directory of deal.II.
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 
27 # include <petscksp.h>
28 
29 # include <memory>
30 
31 # ifdef DEAL_II_WITH_SLEPC
32 # include <deal.II/lac/slepc_spectral_transformation.h>
33 # endif
34 
35 DEAL_II_NAMESPACE_OPEN
36 
37 # ifdef DEAL_II_WITH_SLEPC
38 namespace SLEPcWrappers
39 {
40  // forward declarations
41  class TransformationBase;
42 } // namespace SLEPcWrappers
43 # endif
44 
45 namespace PETScWrappers
46 {
47  // forward declarations
48  class MatrixBase;
49  class VectorBase;
50  class PreconditionerBase;
51 
52 
109  {
110  public:
120  SolverBase(SolverControl &cn, const MPI_Comm &mpi_communicator);
121 
125  virtual ~SolverBase() = default;
126 
134  void
135  solve(const MatrixBase & A,
136  VectorBase & x,
137  const VectorBase & b,
138  const PreconditionerBase &preconditioner);
139 
140 
145  virtual void
146  reset();
147 
148 
153  void
154  set_prefix(const std::string &prefix);
155 
156 
160  SolverControl &
161  control() const;
162 
167  void
168  initialize(const PreconditionerBase &preconditioner);
169 
170  protected:
178 
182  const MPI_Comm mpi_communicator;
183 
188  virtual void
189  set_solver_type(KSP &ksp) const = 0;
190 
197  std::string prefix_name;
198 
199  private:
206  static PetscErrorCode
207  convergence_test(KSP ksp,
208  const PetscInt iteration,
209  const PetscReal residual_norm,
210  KSPConvergedReason *reason,
211  void * solver_control);
212 
230  struct SolverData
231  {
235  ~SolverData();
236 
240  KSP ksp;
241  };
242 
247  std::unique_ptr<SolverData> solver_data;
248 
249 # ifdef DEAL_II_WITH_SLEPC
250 
255 # endif
256  };
257 
258 
259 
268  {
269  public:
274  {
278  explicit AdditionalData(const double omega = 1);
279 
283  double omega;
284  };
285 
303  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
304  const AdditionalData &data = AdditionalData());
305 
306  protected:
311 
316  virtual void
317  set_solver_type(KSP &ksp) const override;
318  };
319 
320 
321 
330  {
331  public:
336  {};
337 
355  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
356  const AdditionalData &data = AdditionalData());
357 
358  protected:
363 
368  virtual void
369  set_solver_type(KSP &ksp) const override;
370  };
371 
372 
373 
380  class SolverCG : public SolverBase
381  {
382  public:
387  {};
388 
405  SolverCG(SolverControl & cn,
406  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
407  const AdditionalData &data = AdditionalData());
408 
409  protected:
414 
419  virtual void
420  set_solver_type(KSP &ksp) const override;
421  };
422 
423 
424 
431  class SolverBiCG : public SolverBase
432  {
433  public:
438  {};
439 
457  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
458  const AdditionalData &data = AdditionalData());
459 
460  protected:
465 
470  virtual void
471  set_solver_type(KSP &ksp) const override;
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
539  set_solver_type(KSP &ksp) const override;
540  };
541 
542 
543 
551  class SolverBicgstab : public SolverBase
552  {
553  public:
558  {};
559 
577  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
578  const AdditionalData &data = AdditionalData());
579 
580  protected:
585 
590  virtual void
591  set_solver_type(KSP &ksp) const override;
592  };
593 
601  class SolverCGS : public SolverBase
602  {
603  public:
608  {};
609 
627  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
628  const AdditionalData &data = AdditionalData());
629 
630  protected:
635 
640  virtual void
641  set_solver_type(KSP &ksp) const override;
642  };
643 
644 
645 
652  class SolverTFQMR : public SolverBase
653  {
654  public:
659  {};
660 
678  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
679  const AdditionalData &data = AdditionalData());
680 
681  protected:
686 
691  virtual void
692  set_solver_type(KSP &ksp) const override;
693  };
694 
695 
696 
708  class SolverTCQMR : public SolverBase
709  {
710  public:
715  {};
716 
734  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
735  const AdditionalData &data = AdditionalData());
736 
737  protected:
742 
747  virtual void
748  set_solver_type(KSP &ksp) const override;
749  };
750 
751 
752 
759  class SolverCR : public SolverBase
760  {
761  public:
766  {};
767 
784  SolverCR(SolverControl & cn,
785  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
786  const AdditionalData &data = AdditionalData());
787 
788  protected:
793 
798  virtual void
799  set_solver_type(KSP &ksp) const override;
800  };
801 
802 
803 
811  class SolverLSQR : public SolverBase
812  {
813  public:
818  {};
819 
837  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
838  const AdditionalData &data = AdditionalData());
839 
840  protected:
845 
850  virtual void
851  set_solver_type(KSP &ksp) const override;
852  };
853 
854 
867  class SolverPreOnly : public SolverBase
868  {
869  public:
874  {};
875 
893  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
894  const AdditionalData &data = AdditionalData());
895 
896  protected:
901 
906  virtual void
907  set_solver_type(KSP &ksp) const override;
908  };
909 
935  {
936  public:
941  {};
946  const MPI_Comm & mpi_communicator = PETSC_COMM_SELF,
947  const AdditionalData &data = AdditionalData());
948 
952  void
953  solve(const MatrixBase &A, VectorBase &x, const VectorBase &b);
954 
960  void
961  set_symmetric_mode(const bool flag);
962 
963  protected:
968 
969  virtual void
970  set_solver_type(KSP &ksp) const override;
971 
972  private:
979  static PetscErrorCode
980  convergence_test(KSP ksp,
981  const PetscInt iteration,
982  const PetscReal residual_norm,
983  KSPConvergedReason *reason,
984  void * solver_control);
985 
992  {
997 
998  KSP ksp;
999  PC pc;
1000  };
1001 
1002  std::unique_ptr<SolverDataMUMPS> solver_data;
1003 
1009  };
1010 } // namespace PETScWrappers
1011 
1012 DEAL_II_NAMESPACE_CLOSE
1013 
1014 # endif // DEAL_II_WITH_PETSC
1015 
1016 /*---------------------------- petsc_solver.h ---------------------------*/
1017 
1018 #endif
1019 /*---------------------------- petsc_solver.h ---------------------------*/
PETScWrappers::SolverGMRES::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:532
PETScWrappers::SolverCG::AdditionalData
Definition: petsc_solver.h:386
PETScWrappers::SolverBicgstab::SolverBicgstab
SolverBicgstab(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:448
PETScWrappers::SolverCGS::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:481
PETScWrappers::SolverCG
Definition: petsc_solver.h:380
PETScWrappers::SolverGMRES::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:396
PETScWrappers::SolverTCQMR::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:529
PETScWrappers::SolverTCQMR::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:741
PETScWrappers::SolverChebychev::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:362
PETScWrappers::SolverBase
Definition: petsc_solver.h:108
PETScWrappers
Definition: la_parallel_block_vector.h:37
PETScWrappers::SolverBase::~SolverBase
virtual ~SolverBase()=default
PETScWrappers::SolverPreOnly::SolverPreOnly
SolverPreOnly(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:592
PETScWrappers::SolverGMRES::AdditionalData::restart_parameter
unsigned int restart_parameter
Definition: petsc_solver.h:500
PETScWrappers::SolverCR::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:553
PETScWrappers::SolverCG::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:413
PETScWrappers::SolverBase::set_solver_type
virtual void set_solver_type(KSP &ksp) const =0
PETScWrappers::SparseDirectMUMPS::solve
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b)
Definition: petsc_solver.cc:671
PETScWrappers::SolverBase::SolverData::~SolverData
~SolverData()
Definition: petsc_solver.cc:38
PETScWrappers::SolverBiCG
Definition: petsc_solver.h:431
PETScWrappers::SolverTCQMR::SolverTCQMR
SolverTCQMR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:520
PETScWrappers::SolverChebychev::SolverChebychev
SolverChebychev(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:306
PETScWrappers::SolverBicgstab::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:584
PETScWrappers::SolverBiCG::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:363
PETScWrappers::SparseDirectMUMPS::set_symmetric_mode
void set_symmetric_mode(const bool flag)
Definition: petsc_solver.cc:884
PETScWrappers::SolverLSQR::AdditionalData
Definition: petsc_solver.h:817
PETScWrappers::SolverCGS::SolverCGS
SolverCGS(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:472
PETScWrappers::SolverRichardson::AdditionalData
Definition: petsc_solver.h:273
PETScWrappers::SolverCG::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:339
PETScWrappers::SolverBase::prefix_name
std::string prefix_name
Definition: petsc_solver.h:197
PETScWrappers::SolverBiCG::AdditionalData
Definition: petsc_solver.h:437
PETScWrappers::SolverTFQMR::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:685
PETScWrappers::SolverBase::control
SolverControl & control() const
Definition: petsc_solver.cc:168
PETScWrappers::SolverCR::SolverCR
SolverCR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:544
PETScWrappers::SolverGMRES::AdditionalData::AdditionalData
AdditionalData(const unsigned int restart_parameter=30, const bool right_preconditioning=false)
Definition: petsc_solver.cc:378
PETScWrappers::SolverTFQMR::SolverTFQMR
SolverTFQMR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:496
SLEPcWrappers::TransformationBase
Definition: slepc_spectral_transformation.h:71
PETScWrappers::SolverBase::convergence_test
static PetscErrorCode convergence_test(KSP ksp, const PetscInt iteration, const PetscReal residual_norm, KSPConvergedReason *reason, void *solver_control)
Definition: petsc_solver.cc:175
PETScWrappers::SolverBase::SolverData
Definition: petsc_solver.h:230
PETScWrappers::SolverRichardson::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:310
PETScWrappers::SolverGMRES::AdditionalData::right_preconditioning
bool right_preconditioning
Definition: petsc_solver.h:505
PETScWrappers::SolverCGS::AdditionalData
Definition: petsc_solver.h:607
PETScWrappers::SolverTCQMR
Definition: petsc_solver.h:708
PETScWrappers::SparseDirectMUMPS::SolverDataMUMPS::~SolverDataMUMPS
~SolverDataMUMPS()
Definition: petsc_solver.cc:626
PETScWrappers::MatrixBase
Definition: petsc_matrix_base.h:283
PETScWrappers::SolverPreOnly::AdditionalData
Definition: petsc_solver.h:873
PETScWrappers::SolverCR::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:792
PETScWrappers::SolverTFQMR
Definition: petsc_solver.h:652
PETScWrappers::SolverTFQMR::AdditionalData
Definition: petsc_solver.h:658
PETScWrappers::SparseDirectMUMPS::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:644
SLEPcWrappers
Definition: petsc_solver.h:38
PETScWrappers::SparseDirectMUMPS::SolverDataMUMPS
Definition: petsc_solver.h:991
PETScWrappers::SolverBiCG::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:464
PETScWrappers::SolverRichardson::AdditionalData::omega
double omega
Definition: petsc_solver.h:283
PETScWrappers::SolverBase::solver_control
SolverControl & solver_control
Definition: petsc_solver.h:177
PETScWrappers::SolverCR
Definition: petsc_solver.h:759
PETScWrappers::SolverRichardson
Definition: petsc_solver.h:267
PETScWrappers::SparseDirectMUMPS::SparseDirectMUMPS
SparseDirectMUMPS(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:634
PETScWrappers::SparseDirectMUMPS
Definition: petsc_solver.h:934
PETScWrappers::SparseDirectMUMPS::AdditionalData
Definition: petsc_solver.h:940
PETScWrappers::SolverChebychev::AdditionalData
Definition: petsc_solver.h:335
PETScWrappers::SolverTCQMR::AdditionalData
Definition: petsc_solver.h:714
PETScWrappers::SolverCGS::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:634
PETScWrappers::SolverGMRES
Definition: petsc_solver.h:482
PETScWrappers::SolverBase::reset
virtual void reset()
Definition: petsc_solver.cc:161
PETScWrappers::SolverBase::set_prefix
void set_prefix(const std::string &prefix)
Definition: petsc_solver.cc:154
PETScWrappers::SolverRichardson::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:267
PETScWrappers::SolverBicgstab::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:457
PETScWrappers::SolverBase::solve
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b, const PreconditionerBase &preconditioner)
Definition: petsc_solver.cc:53
PETScWrappers::SolverChebychev::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:315
PETScWrappers::SparseDirectMUMPS::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:967
PETScWrappers::SolverLSQR::SolverLSQR
SolverLSQR(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:568
PETScWrappers::SparseDirectMUMPS::convergence_test
static PetscErrorCode convergence_test(KSP ksp, const PetscInt iteration, const PetscReal residual_norm, KSPConvergedReason *reason, void *solver_control)
Definition: petsc_solver.cc:847
PETScWrappers::SolverBase::mpi_communicator
const MPI_Comm mpi_communicator
Definition: petsc_solver.h:182
PETScWrappers::SolverBase::SolverData::ksp
KSP ksp
Definition: petsc_solver.h:240
PETScWrappers::SolverBicgstab
Definition: petsc_solver.h:551
PETScWrappers::SolverCG::SolverCG
SolverCG(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:330
PETScWrappers::PreconditionerBase
Definition: petsc_precondition.h:56
PETScWrappers::SolverPreOnly::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:601
PETScWrappers::SolverRichardson::SolverRichardson
SolverRichardson(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:258
PETScWrappers::SolverBase::solver_data
std::unique_ptr< SolverData > solver_data
Definition: petsc_solver.h:247
SolverControl
Definition: solver_control.h:65
PETScWrappers::SolverPreOnly::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:900
PETScWrappers::SolverBase::initialize
void initialize(const PreconditionerBase &preconditioner)
Definition: petsc_solver.cc:213
PETScWrappers::SolverTFQMR::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:505
PETScWrappers::SolverPreOnly
Definition: petsc_solver.h:867
PETScWrappers::SolverBiCG::SolverBiCG
SolverBiCG(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:354
PETScWrappers::SolverLSQR
Definition: petsc_solver.h:811
PETScWrappers::SolverLSQR::additional_data
const AdditionalData additional_data
Definition: petsc_solver.h:844
PETScWrappers::SolverGMRES::AdditionalData
Definition: petsc_solver.h:488
PETScWrappers::VectorBase
Definition: petsc_vector_base.h:239
PETScWrappers::SolverCR::AdditionalData
Definition: petsc_solver.h:765
PETScWrappers::SolverGMRES::SolverGMRES
SolverGMRES(SolverControl &cn, const MPI_Comm &mpi_communicator=PETSC_COMM_SELF, const AdditionalData &data=AdditionalData())
Definition: petsc_solver.cc:387
PETScWrappers::SolverCGS
Definition: petsc_solver.h:601
PETScWrappers::SolverRichardson::AdditionalData::AdditionalData
AdditionalData(const double omega=1)
Definition: petsc_solver.cc:252
PETScWrappers::SolverChebychev
Definition: petsc_solver.h:329
PETScWrappers::SolverBicgstab::AdditionalData
Definition: petsc_solver.h:557
PETScWrappers::SolverBase::SolverBase
SolverBase(SolverControl &cn, const MPI_Comm &mpi_communicator)
Definition: petsc_solver.cc:45
PETScWrappers::SolverLSQR::set_solver_type
virtual void set_solver_type(KSP &ksp) const override
Definition: petsc_solver.cc:577
PETScWrappers::SparseDirectMUMPS::symmetric_mode
bool symmetric_mode
Definition: petsc_solver.h:1008