deal.II version 9.7.0
\(\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: LGPL-2.1-or-later
4// Copyright (C) 2004 - 2025 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_precondition_h
16#define dealii_petsc_precondition_h
17
18
19#include <deal.II/base/config.h>
20
23#include <deal.II/base/point.h>
24
25#ifdef DEAL_II_WITH_PETSC
26
28
29# include <petscpc.h>
30
31# include <functional>
32
34
35
36
37namespace PETScWrappers
38{
39 // forward declarations
40# ifndef DOXYGEN
41 class MatrixBase;
42 class VectorBase;
43# endif
44
61 {
62 public:
66 explicit PreconditionBase(const MPI_Comm mpi_communicator);
67
73
77 virtual ~PreconditionBase();
78
83 void
84 clear();
85
89 void
90 vmult(VectorBase &dst, const VectorBase &src) const;
91
95 void
96 Tvmult(VectorBase &dst, const VectorBase &src) const;
97
102 void
103 setup();
104
108 const PC &
109 get_pc() const;
110
115 get_mpi_communicator() const;
116
117 protected:
121 PC pc;
122
127 void
129
133 void
135 };
136
137
138
150 {
151 public:
157 {};
158
164
170 const MatrixBase &matrix,
172
178 const MPI_Comm communicator,
180
187 void
188 initialize(const MatrixBase &matrix,
190
191 protected:
196
202 void
203 initialize();
204 };
205
206
207
232 {
233 public:
239 {};
240
246
252 const MatrixBase &matrix,
254
260 const MPI_Comm communicator,
262
263
270 void
271 initialize(const MatrixBase &matrix,
273
274 protected:
279
285 void
286 initialize();
287 };
288
289
290
300 {
301 public:
307 {
311 AdditionalData(const double omega = 1);
312
316 double omega;
317 };
318
324
329 PreconditionSOR(const MatrixBase &matrix,
331
338 void
339 initialize(const MatrixBase &matrix,
341
342 protected:
347 };
348
349
350
360 {
361 public:
367 {
371 explicit AdditionalData(const double omega = 1);
372
376 double omega;
377 };
378
384
389 PreconditionSSOR(const MatrixBase &matrix,
391
398 void
399 initialize(const MatrixBase &matrix,
401
402 protected:
407 };
408
418 {
419 public:
425 {
429 AdditionalData(const unsigned int levels = 0);
430
434 unsigned int levels;
435 };
436
442
447 PreconditionICC(const MatrixBase &matrix,
449
456 void
457 initialize(const MatrixBase &matrix,
459
460 protected:
465 };
466
467
468
478 {
479 public:
485 {
489 AdditionalData(const unsigned int levels = 0);
490
494 unsigned int levels;
495 };
496
502
507 PreconditionILU(const MatrixBase &matrix,
509
516 void
517 initialize(const MatrixBase &matrix,
519
520 protected:
525 };
526
527
528
543 {
544 public:
550 {
555 AdditionalData(const double pivoting = 1.e-6,
556 const double zero_pivot = 1.e-12,
557 const double damping = 0.0);
558
564 double pivoting;
565
571
576 double damping;
577 };
578
584
589 PreconditionLU(const MatrixBase &matrix,
591
598 void
599 initialize(const MatrixBase &matrix,
601
602 protected:
607 };
608
609
610
628 {
629 public:
753
759
765 const MatrixBase &matrix,
767
773 const MPI_Comm communicator,
775
776
783 void
784 initialize(const MatrixBase &matrix,
786
787 protected:
792
798 void
799 initialize();
800 };
801
802
803
824 {
825 public:
831 {
835 AdditionalData(const unsigned int symmetric = 1,
836 const unsigned int n_levels = 1,
837 const double threshold = 0.1,
838 const double filter = 0.05,
839 const bool output_details = false);
840
852 unsigned int symmetric;
853
860 unsigned int n_levels;
861
872 double threshold;
873
884 double filter;
885
891 };
892
893
894
900
906 const MatrixBase &matrix,
908
915 void
916 initialize(const MatrixBase &matrix,
918
919 private:
924 };
925
926
927
934 {
935 public:
941 {};
942
948
954 PreconditionNone(const MatrixBase &matrix,
956
964 void
965 initialize(const MatrixBase &matrix,
967
968 private:
973 };
974
998 template <int dim>
1000 {
1001 public:
1007 {
1012 AdditionalData(const bool use_vertices = true,
1013 const bool use_edges = false,
1014 const bool use_faces = false,
1015 const bool symmetric = false,
1016 const std::vector<Point<dim>> coords = {});
1017
1023
1030
1037
1042
1047 std::vector<Point<dim>> coords;
1048 };
1049
1055
1060 PreconditionBDDC(const MatrixBase &matrix,
1062
1067 PreconditionBDDC(const MPI_Comm communicator,
1069
1076 void
1077 initialize(const MatrixBase &matrix,
1079
1080 protected:
1085
1091 void
1092 initialize();
1093 };
1094
1096 {
1097 public:
1103
1107 PreconditionShell(const MatrixBase &matrix);
1108
1112 PreconditionShell(const MPI_Comm communicator);
1113
1122 std::function<void(VectorBase &dst, const VectorBase &src)> vmult;
1123
1132 std::function<void(VectorBase &dst, const VectorBase &src)> vmultT;
1133
1134 protected:
1139 void
1140 initialize(const MPI_Comm comm);
1141
1146 void
1147 initialize(const MatrixBase &matrix);
1148
1149 private:
1153 static PetscErrorCode
1154 pcapply(PC pc, Vec src, Vec dst);
1155
1159 static PetscErrorCode
1160 pcapply_transpose(PC pc, Vec src, Vec dst);
1161
1165 static PetscErrorCode
1166 pcsetup(PC pc);
1167 };
1168} // namespace PETScWrappers
1169
1170
1172
1173
1174#else
1175
1176// Make sure the scripts that create the C++20 module input files have
1177// something to latch on if the preprocessor #ifdef above would
1178// otherwise lead to an empty content of the file.
1181
1182#endif // DEAL_II_WITH_PETSC
1183
1184#endif
void Tvmult(VectorBase &dst, const VectorBase &src) const
void vmult(VectorBase &dst, const VectorBase &src) const
PreconditionBase(const MPI_Comm mpi_communicator)
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:113
#define DEAL_II_NAMESPACE_OPEN
Definition config.h:40
#define DEAL_II_NAMESPACE_CLOSE
Definition config.h:41
*braid_SplitCommworld & comm
AdditionalData(const bool use_vertices=true, const bool use_edges=false, const bool use_faces=false, const bool symmetric=false, const std::vector< Point< dim > > coords={})
AdditionalData(const bool symmetric_operator=false, const double strong_threshold=0.25, const double max_row_sum=0.9, const unsigned int aggressive_coarsening_num_levels=0, const bool output_details=false, const RelaxationType relaxation_type_up=RelaxationType::SORJacobi, const RelaxationType relaxation_type_down=RelaxationType::SORJacobi, const RelaxationType relaxation_type_coarse=RelaxationType::GaussianElimination, const unsigned int n_sweeps_coarse=1, const double tol=0.0, const unsigned int max_iter=1, const bool w_cycle=false)
AdditionalData(const double pivoting=1.e-6, const double zero_pivot=1.e-12, const double damping=0.0)
AdditionalData(const unsigned int symmetric=1, const unsigned int n_levels=1, const double threshold=0.1, const double filter=0.05, const bool output_details=false)