deal.II version GIT relicensing-2581-gae2745de1b 2025-02-07 22:30: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\}}\)
Loading...
Searching...
No Matches
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
24
27
28# include <petscksp.h>
29
30
32
33// Forward declarations
34# ifndef DOXYGEN
35# ifdef DEAL_II_WITH_SLEPC
36namespace SLEPcWrappers
37{
38 // forward declarations
39 class TransformationBase;
40} // namespace SLEPcWrappers
41# endif
42# endif
43
44namespace PETScWrappers
45{
46 // forward declarations
47# ifndef DOXYGEN
48 class MatrixBase;
49 class VectorBase;
50 class PreconditionBase;
51# endif
52
53
89 {
90 public:
95 SolverBase();
96
101
105 virtual ~SolverBase();
106
114 void
115 solve(const MatrixBase &A,
116 VectorBase &x,
117 const VectorBase &b,
118 const PreconditionBase &preconditioner);
119
124 virtual void
125 reset();
126
131 void
132 set_prefix(const std::string &prefix);
133
138 control() const;
139
144 void
145 initialize(const PreconditionBase &preconditioner);
146
150 KSP
151 petsc_ksp();
152
158 operator KSP() const;
159
160 protected:
164 KSP ksp;
165
173
177 void
179
184 virtual void
185 set_solver_type(KSP &ksp) const;
186
193 void
195
202 std::string prefix_name;
203
204 private:
211 static PetscErrorCode
213 const PetscInt iteration,
214 const PetscReal residual_norm,
215 KSPConvergedReason *reason,
216 void *solver_control);
217
218
219# ifdef DEAL_II_WITH_SLEPC
220 // Make the transformation class a friend, since it needs to set the KSP
221 // solver.
223# endif
224 };
225
226
227
235 {
236 public:
241 {
245 explicit AdditionalData(const double omega = 1);
246
250 double omega;
251 };
252
262
271 const MPI_Comm mpi_communicator,
273
274 protected:
279
284 virtual void
285 set_solver_type(KSP &ksp) const override;
286 };
287
288
289
297 {
298 public:
303 {};
304
314
323 const MPI_Comm mpi_communicator,
325
326 protected:
331
336 virtual void
337 set_solver_type(KSP &ksp) const override;
338 };
339
340
341
347 class SolverCG : public SolverBase
348 {
349 public:
354 {};
355
364
373 const MPI_Comm mpi_communicator,
375
376 protected:
381
386 virtual void
387 set_solver_type(KSP &ksp) const override;
388 };
389
390
391
397 class SolverBiCG : public SolverBase
398 {
399 public:
404 {};
405
415
424 const MPI_Comm mpi_communicator,
426
427 protected:
432
437 virtual void
438 set_solver_type(KSP &ksp) const override;
439 };
440
441
442
448 class SolverGMRES : public SolverBase
449 {
450 public:
455 {
460 AdditionalData(const unsigned int restart_parameter = 30,
461 const bool right_preconditioning = false);
462
466 unsigned int restart_parameter;
467
472 };
473
483
492 const MPI_Comm mpi_communicator,
494
495 protected:
500
505 virtual void
506 set_solver_type(KSP &ksp) const override;
507 };
508
509
510
518 {
519 public:
524 {};
525
535
544 const MPI_Comm mpi_communicator,
546
547 protected:
552
557 virtual void
558 set_solver_type(KSP &ksp) const override;
559 };
560
561
562
569 class SolverCGS : public SolverBase
570 {
571 public:
576 {};
577
586
595 const MPI_Comm mpi_communicator,
597
598 protected:
603
608 virtual void
609 set_solver_type(KSP &ksp) const override;
610 };
611
612
613
619 class SolverTFQMR : public SolverBase
620 {
621 public:
626 {};
627
637
646 const MPI_Comm mpi_communicator,
648
649 protected:
654
659 virtual void
660 set_solver_type(KSP &ksp) const override;
661 };
662
663
664
675 class SolverTCQMR : public SolverBase
676 {
677 public:
682 {};
683
693
702 const MPI_Comm mpi_communicator,
704
705 protected:
710
715 virtual void
716 set_solver_type(KSP &ksp) const override;
717 };
718
719
720
726 class SolverCR : public SolverBase
727 {
728 public:
733 {};
734
743
752 const MPI_Comm mpi_communicator,
754
755 protected:
760
765 virtual void
766 set_solver_type(KSP &ksp) const override;
767 };
768
769
770
777 class SolverLSQR : public SolverBase
778 {
779 public:
784 {};
785
795
804 const MPI_Comm mpi_communicator,
806
807 protected:
812
817 virtual void
818 set_solver_type(KSP &ksp) const override;
819 };
820
821
834 {
835 public:
840 {};
841
851
860 const MPI_Comm mpi_communicator,
862
863 protected:
868
873 virtual void
874 set_solver_type(KSP &ksp) const override;
875 };
876
901 {
902 public:
907 {};
908
914
923 const MPI_Comm mpi_communicator,
925
929 void
930 solve(const MatrixBase &A, VectorBase &x, const VectorBase &b);
931
955 void
956 set_symmetric_mode(const bool matrix_is_symmetric);
957
958 protected:
963
964 virtual void
965 set_solver_type(KSP &ksp) const override;
966
972 };
973} // namespace PETScWrappers
974
976
977#endif // DEAL_II_WITH_PETSC
978
979#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)
virtual void set_solver_type(KSP &ksp) const override
const AdditionalData additional_data
void set_symmetric_mode(const bool matrix_is_symmetric)
#define DEAL_II_DEPRECATED
Definition config.h:220
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:513
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:514
std::vector< index_type > data
Definition mpi.cc:735
const MPI_Comm comm
Definition mpi.cc:913