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_precondition.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_precondition_h
14#define dealii_petsc_precondition_h
15
16
17#include <deal.II/base/config.h>
18
21#include <deal.II/base/point.h>
22
23#ifdef DEAL_II_WITH_PETSC
24
26
27# include <petscpc.h>
28
29# include <functional>
30
31#endif // DEAL_II_WITH_PETSC
32
34
35#ifdef DEAL_II_WITH_PETSC
36namespace PETScWrappers
37{
38 // forward declarations
39# ifndef DOXYGEN
40 class MatrixBase;
41 class VectorBase;
42# endif
43
60 {
61 public:
65 explicit PreconditionBase(const MPI_Comm mpi_communicator);
66
72
76 virtual ~PreconditionBase();
77
82 void
83 clear();
84
88 void
89 vmult(VectorBase &dst, const VectorBase &src) const;
90
94 void
95 Tvmult(VectorBase &dst, const VectorBase &src) const;
96
101 void
102 setup();
103
107 const PC &
108 get_pc() const;
109
114 get_mpi_communicator() const;
115
116 protected:
120 PC pc;
121
126 void
128
132 void
134 };
135
136
137
149 {
150 public:
156 {};
157
163
169 const MatrixBase &matrix,
171
177 const MPI_Comm communicator,
179
186 void
187 initialize(const MatrixBase &matrix,
189
190 protected:
195
201 void
202 initialize();
203 };
204
205
206
231 {
232 public:
238 {};
239
245
251 const MatrixBase &matrix,
253
259 const MPI_Comm communicator,
261
262
269 void
270 initialize(const MatrixBase &matrix,
272
273 protected:
278
284 void
285 initialize();
286 };
287
288
289
299 {
300 public:
306 {
310 AdditionalData(const double omega = 1);
311
315 double omega;
316 };
317
323
328 PreconditionSOR(const MatrixBase &matrix,
330
337 void
338 initialize(const MatrixBase &matrix,
340
341 protected:
346 };
347
348
349
359 {
360 public:
366 {
370 explicit AdditionalData(const double omega = 1);
371
375 double omega;
376 };
377
383
388 PreconditionSSOR(const MatrixBase &matrix,
390
397 void
398 initialize(const MatrixBase &matrix,
400
401 protected:
406 };
407
417 {
418 public:
424 {
428 AdditionalData(const unsigned int levels = 0);
429
433 unsigned int levels;
434 };
435
441
446 PreconditionICC(const MatrixBase &matrix,
448
455 void
456 initialize(const MatrixBase &matrix,
458
459 protected:
464 };
465
466
467
477 {
478 public:
484 {
488 AdditionalData(const unsigned int levels = 0);
489
493 unsigned int levels;
494 };
495
501
506 PreconditionILU(const MatrixBase &matrix,
508
515 void
516 initialize(const MatrixBase &matrix,
518
519 protected:
524 };
525
526
527
542 {
543 public:
549 {
554 AdditionalData(const double pivoting = 1.e-6,
555 const double zero_pivot = 1.e-12,
556 const double damping = 0.0);
557
563 double pivoting;
564
570
575 double damping;
576 };
577
583
588 PreconditionLU(const MatrixBase &matrix,
590
597 void
598 initialize(const MatrixBase &matrix,
600
601 protected:
606 };
607
608
609
627 {
628 public:
634 {
656
662 const bool symmetric_operator = false,
663 const double strong_threshold = 0.25,
664 const double max_row_sum = 0.9,
665 const unsigned int aggressive_coarsening_num_levels = 0,
666 const bool output_details = false,
671 const unsigned int n_sweeps_coarse = 1,
672 const double tol = 0.0,
673 const unsigned int max_iter = 1,
674 const bool w_cycle = false);
675
682
689
702
709
715
720
725
730
734 unsigned int n_sweeps_coarse;
735
739 double tol;
740
744 unsigned int max_iter;
745
751 };
752
758
764 const MatrixBase &matrix,
766
772 const MPI_Comm communicator,
774
775
782 void
783 initialize(const MatrixBase &matrix,
785
786 protected:
791
797 void
798 initialize();
799 };
800
801
802
823 {
824 public:
830 {
834 AdditionalData(const unsigned int symmetric = 1,
835 const unsigned int n_levels = 1,
836 const double threshold = 0.1,
837 const double filter = 0.05,
838 const bool output_details = false);
839
851 unsigned int symmetric;
852
859 unsigned int n_levels;
860
871 double threshold;
872
883 double filter;
884
890 };
891
892
893
899
905 const MatrixBase &matrix,
907
914 void
915 initialize(const MatrixBase &matrix,
917
918 private:
923 };
924
925
926
933 {
934 public:
940 {};
941
947
953 PreconditionNone(const MatrixBase &matrix,
955
963 void
964 initialize(const MatrixBase &matrix,
966
967 private:
972 };
973
997 template <int dim>
999 {
1000 public:
1006 {
1011 AdditionalData(const bool use_vertices = true,
1012 const bool use_edges = false,
1013 const bool use_faces = false,
1014 const bool symmetric = false,
1015 const std::vector<Point<dim>> coords = {});
1016
1022
1029
1036
1041
1046 std::vector<Point<dim>> coords;
1047 };
1048
1054
1059 PreconditionBDDC(const MatrixBase &matrix,
1061
1066 PreconditionBDDC(const MPI_Comm communicator,
1068
1075 void
1076 initialize(const MatrixBase &matrix,
1078
1079 protected:
1084
1090 void
1091 initialize();
1092 };
1093
1095 {
1096 public:
1102
1106 PreconditionShell(const MatrixBase &matrix);
1107
1111 PreconditionShell(const MPI_Comm communicator);
1112
1121 std::function<void(VectorBase &dst, const VectorBase &src)> vmult;
1122
1131 std::function<void(VectorBase &dst, const VectorBase &src)> vmultT;
1132
1133 protected:
1138 void
1139 initialize(const MPI_Comm comm);
1140
1145 void
1146 initialize(const MatrixBase &matrix);
1147
1148 private:
1152 static PetscErrorCode
1153 pcapply(PC pc, Vec src, Vec dst);
1154
1158 static PetscErrorCode
1159 pcapply_transpose(PC pc, Vec src, Vec dst);
1160
1164 static PetscErrorCode
1165 pcsetup(PC pc);
1166 };
1167} // namespace PETScWrappers
1168
1169#endif // DEAL_II_WITH_PETSC
1170
1172
1173#endif
void Tvmult(VectorBase &dst, const VectorBase &src) const
void vmult(VectorBase &dst, const VectorBase &src) const
void create_pc_with_mat(const MatrixBase &)
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
void initialize(const MatrixBase &matrix, const AdditionalData &additional_data=AdditionalData())
std::function< void(VectorBase &dst, const VectorBase &src)> vmult
static PetscErrorCode pcapply_transpose(PC pc, Vec src, Vec dst)
static PetscErrorCode pcsetup(PC pc)
void initialize(const MPI_Comm comm)
std::function< void(VectorBase &dst, const VectorBase &src)> vmultT
static PetscErrorCode pcapply(PC pc, Vec src, Vec dst)
Definition point.h:111
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:38
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:39
const MPI_Comm comm
Definition mpi.cc:912