deal.II version GIT relicensing-6842-g793a97d2aa 2026-10-02 14:00:01+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\}}\)
Loading...
Searching...
No Matches
petsc_solver.h
Go to the documentation of this file.
1// -----------------------------------------------------------------------------
2//
3// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception OR LGPL-2.1-or-later
4// Copyright (C) 2004 - 2026 by the deal.II authors
5//
6// This file is part of the deal.II library.
7//
8// Detailed license information governing the source code and contributions
9// can be found in LICENSE.md and CONTRIBUTING.md at the top level directory.
10//
11// -----------------------------------------------------------------------------
12
13#ifndef dealii_petsc_solver_h
14#define dealii_petsc_solver_h
15
16
17#include <deal.II/base/config.h>
18
19#ifdef DEAL_II_WITH_PETSC
20
23
26
27# include <petscksp.h>
28
29#endif // DEAL_II_WITH_PETSC
30
32
33#ifdef DEAL_II_WITH_PETSC
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
264 protected:
269
274 virtual void
275 set_solver_type(KSP &ksp) const override;
276 };
277
278
279
287 {
288 public:
293 {};
294
304
305 protected:
310
315 virtual void
316 set_solver_type(KSP &ksp) const override;
317 };
318
319
320
326 class SolverCG : public SolverBase
327 {
328 public:
333 {};
334
343
344 protected:
349
354 virtual void
355 set_solver_type(KSP &ksp) const override;
356 };
357
358
359
365 class SolverBiCG : public SolverBase
366 {
367 public:
372 {};
373
383
384 protected:
389
394 virtual void
395 set_solver_type(KSP &ksp) const override;
396 };
397
398
399
405 class SolverGMRES : public SolverBase
406 {
407 public:
412 {
417 AdditionalData(const unsigned int restart_parameter = 30,
418 const bool right_preconditioning = false);
419
423 unsigned int restart_parameter;
424
429 };
430
440
441 protected:
446
451 virtual void
452 set_solver_type(KSP &ksp) const override;
453 };
454
455
456
464 {
465 public:
470 {};
471
481
482 protected:
487
492 virtual void
493 set_solver_type(KSP &ksp) const override;
494 };
495
496
497
504 class SolverCGS : public SolverBase
505 {
506 public:
511 {};
512
521
522 protected:
527
532 virtual void
533 set_solver_type(KSP &ksp) const override;
534 };
535
536
537
543 class SolverTFQMR : public SolverBase
544 {
545 public:
550 {};
551
561
562 protected:
567
572 virtual void
573 set_solver_type(KSP &ksp) const override;
574 };
575
576
577
588 class SolverTCQMR : public SolverBase
589 {
590 public:
595 {};
596
606
607 protected:
612
617 virtual void
618 set_solver_type(KSP &ksp) const override;
619 };
620
621
622
628 class SolverCR : public SolverBase
629 {
630 public:
635 {};
636
645
646 protected:
651
656 virtual void
657 set_solver_type(KSP &ksp) const override;
658 };
659
660
661
668 class SolverLSQR : public SolverBase
669 {
670 public:
675 {};
676
686
687 protected:
692
697 virtual void
698 set_solver_type(KSP &ksp) const override;
699 };
700
701
714 {
715 public:
720 {};
721
731
732 protected:
737
742 virtual void
743 set_solver_type(KSP &ksp) const override;
744 };
745
770 {
771 public:
776 {};
777
783
787 void
788 solve(const MatrixBase &A, VectorBase &x, const VectorBase &b);
789
813 void
814 set_symmetric_mode(const bool matrix_is_symmetric);
815
816 protected:
821
822 virtual void
823 set_solver_type(KSP &ksp) const override;
824
830 };
831} // namespace PETScWrappers
832
833#endif // DEAL_II_WITH_PETSC
834
836
837#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_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
std::vector< index_type > data
Definition mpi.cc:734
const MPI_Comm comm
Definition mpi.cc:912