Loading [MathJax]/extensions/TeX/AMSsymbols.js
 deal.II version GIT relicensing-3081-g720ce0d1b5 2025-04-18 12:20:00+00:00
\(\newcommand{\dealvcentcolon}{\mathrel{\mathop{:}}}\) \(\newcommand{\dealcoloneq}{\dealvcentcolon\mathrel{\mkern-1.2mu}=}\) \(\newcommand{\jump}[1]{\left[\!\left[ #1 \right]\!\right]}\) \(\newcommand{\average}[1]{\left\{\!\left\{ #1 \right\}\!\right\}}\)
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
petsc_solver.h
Go to the documentation of this file.
1// ------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: LGPL-2.1-or-later
4// Copyright (C) 2004 - 2024 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Part of the source code is dual licensed under Apache-2.0 WITH
9// LLVM-exception OR LGPL-2.1-or-later. Detailed license information
10// governing the source code and code contributions can be found in
11// LICENSE.md and CONTRIBUTING.md at the top level directory of deal.II.
12//
13// ------------------------------------------------------------------------
14
15#ifndef dealii_petsc_solver_h
16#define dealii_petsc_solver_h
17
18
19#include <deal.II/base/config.h>
20
21#ifdef DEAL_II_WITH_PETSC
22
25
28
29# include <petscksp.h>
30
31
33
34// Forward declarations
35# ifndef DOXYGEN
36# ifdef DEAL_II_WITH_SLEPC
37namespace SLEPcWrappers
38{
39 // forward declarations
40 class TransformationBase;
41} // namespace SLEPcWrappers
42# endif
43# endif
44
45namespace PETScWrappers
46{
47 // forward declarations
48# ifndef DOXYGEN
49 class MatrixBase;
50 class VectorBase;
51 class PreconditionBase;
52# endif
53
54
90 {
91 public:
96 SolverBase();
97
102
106 virtual ~SolverBase();
107
115 void
116 solve(const MatrixBase &A,
117 VectorBase &x,
118 const VectorBase &b,
119 const PreconditionBase &preconditioner);
120
125 virtual void
126 reset();
127
132 void
133 set_prefix(const std::string &prefix);
134
139 control() const;
140
145 void
146 initialize(const PreconditionBase &preconditioner);
147
151 KSP
152 petsc_ksp();
153
159 operator KSP() const;
160
161 protected:
165 KSP ksp;
166
174
178 void
180
185 virtual void
186 set_solver_type(KSP &ksp) const;
187
194 void
196
203 std::string prefix_name;
204
205 private:
212 static PetscErrorCode
214 const PetscInt iteration,
215 const PetscReal residual_norm,
216 KSPConvergedReason *reason,
217 void *solver_control);
218
219
220# ifdef DEAL_II_WITH_SLEPC
221 // Make the transformation class a friend, since it needs to set the KSP
222 // solver.
224# endif
225 };
226
227
228
236 {
237 public:
242 {
246 explicit AdditionalData(const double omega = 1);
247
251 double omega;
252 };
253
263
272 const MPI_Comm mpi_communicator,
274
275 protected:
280
285 virtual void
286 set_solver_type(KSP &ksp) const override;
287 };
288
289
290
298 {
299 public:
304 {};
305
315
324 const MPI_Comm mpi_communicator,
326
327 protected:
332
337 virtual void
338 set_solver_type(KSP &ksp) const override;
339 };
340
341
342
348 class SolverCG : public SolverBase
349 {
350 public:
355 {};
356
365
374 const MPI_Comm mpi_communicator,
376
377 protected:
382
387 virtual void
388 set_solver_type(KSP &ksp) const override;
389 };
390
391
392
398 class SolverBiCG : public SolverBase
399 {
400 public:
405 {};
406
416
425 const MPI_Comm mpi_communicator,
427
428 protected:
433
438 virtual void
439 set_solver_type(KSP &ksp) const override;
440 };
441
442
443
449 class SolverGMRES : public SolverBase
450 {
451 public:
456 {
461 AdditionalData(const unsigned int restart_parameter = 30,
462 const bool right_preconditioning = false);
463
467 unsigned int restart_parameter;
468
473 };
474
484
493 const MPI_Comm mpi_communicator,
495
496 protected:
501
506 virtual void
507 set_solver_type(KSP &ksp) const override;
508 };
509
510
511
519 {
520 public:
525 {};
526
536
545 const MPI_Comm mpi_communicator,
547
548 protected:
553
558 virtual void
559 set_solver_type(KSP &ksp) const override;
560 };
561
562
563
570 class SolverCGS : public SolverBase
571 {
572 public:
577 {};
578
587
596 const MPI_Comm mpi_communicator,
598
599 protected:
604
609 virtual void
610 set_solver_type(KSP &ksp) const override;
611 };
612
613
614
620 class SolverTFQMR : public SolverBase
621 {
622 public:
627 {};
628
638
647 const MPI_Comm mpi_communicator,
649
650 protected:
655
660 virtual void
661 set_solver_type(KSP &ksp) const override;
662 };
663
664
665
676 class SolverTCQMR : public SolverBase
677 {
678 public:
683 {};
684
694
703 const MPI_Comm mpi_communicator,
705
706 protected:
711
716 virtual void
717 set_solver_type(KSP &ksp) const override;
718 };
719
720
721
727 class SolverCR : public SolverBase
728 {
729 public:
734 {};
735
744
753 const MPI_Comm mpi_communicator,
755
756 protected:
761
766 virtual void
767 set_solver_type(KSP &ksp) const override;
768 };
769
770
771
778 class SolverLSQR : public SolverBase
779 {
780 public:
785 {};
786
796
805 const MPI_Comm mpi_communicator,
807
808 protected:
813
818 virtual void
819 set_solver_type(KSP &ksp) const override;
820 };
821
822
835 {
836 public:
841 {};
842
852
861 const MPI_Comm mpi_communicator,
863
864 protected:
869
874 virtual void
875 set_solver_type(KSP &ksp) const override;
876 };
877
902 {
903 public:
908 {};
909
915
924 const MPI_Comm mpi_communicator,
926
930 void
931 solve(const MatrixBase &A, VectorBase &x, const VectorBase &b);
932
956 void
957 set_symmetric_mode(const bool matrix_is_symmetric);
958
959 protected:
964
965 virtual void
966 set_solver_type(KSP &ksp) const override;
967
973 };
974} // namespace PETScWrappers
975
977
978#endif // DEAL_II_WITH_PETSC
979
980#endif
SolverControl & control() const
ObserverPointer< SolverControl, SolverBase > solver_control
void initialize(const PreconditionBase &preconditioner)
void perhaps_set_convergence_test() const
static PetscErrorCode convergence_test(KSP ksp, const PetscInt iteration, const PetscReal residual_norm, KSPConvergedReason *reason, void *solver_control)
void set_prefix(const std::string &prefix)
void initialize_ksp_with_comm(const MPI_Comm comm)
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b, const PreconditionBase &preconditioner)
virtual void set_solver_type(KSP &ksp) const
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
void solve(const MatrixBase &A, VectorBase &x, const VectorBase &b)
const AdditionalData additional_data
virtual void set_solver_type(KSP &ksp) const override
void set_symmetric_mode(const bool matrix_is_symmetric)
#define DEAL_II_DEPRECATED
Definition config.h:280
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:35
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:36
std::vector< index_type > data
Definition mpi.cc:746
const MPI_Comm comm
Definition mpi.cc:924