4#include <deal.II/base/config.h>
6#ifdef DEAL_II_WITH_PETSC
8#include <deal.II/lac/petsc_precondition.h>
9#include <deal.II/lac/petsc_solver.h>
10#include <deal.II/lac/solver_control.h>
34#ifdef DEAL_II_PETSC_WITH_HYPRE
35 using PETScDefaultPreconditioner = dealii::PETScWrappers::PreconditionBoomerAMG;
37 using PETScDefaultPreconditioner = dealii::PETScWrappers::PreconditionBlockJacobi;
43 template <
typename PreconditionerType>
typename PreconditionerType::AdditionalData precondition_settings()
45 return typename PreconditionerType::AdditionalData();
48#ifdef DEAL_II_PETSC_WITH_HYPRE
68 inline dealii::PETScWrappers::PreconditionBoomerAMG::AdditionalData
69 precondition_settings<dealii::PETScWrappers::PreconditionBoomerAMG>()
71 using AMG = dealii::PETScWrappers::PreconditionBoomerAMG;
72 AMG::AdditionalData data;
73 data.relaxation_type_coarse = AMG::AdditionalData::RelaxationType::SORJacobi;
97 template <
typename SparseMatrixType,
typename VectorType,
98 typename PreconditionerType = internal::PETScDefaultPreconditioner>
99 class PETScKrylov :
public AbstractLinearSolver<SparseMatrixType, VectorType>
102 static constexpr bool performs_factorization =
false;
104 PETScKrylov() : matrix(nullptr) {}
106 void init(
const SparseMatrixType &matrix)
108 this->matrix = &matrix;
112 preconditioner.initialize(matrix, internal::precondition_settings<PreconditionerType>());
115 bool invert() {
return false; }
117 int solve(
const VectorType &src, VectorType &dst,
const double tol)
119 if (!matrix)
throw std::runtime_error(
"PETScKrylov::solve: matrix not initialized");
123 dealii::SolverControl solver_control(std::max<std::size_t>(1000, src.size() / 10), tol);
124 dealii::PETScWrappers::SolverGMRES solver(solver_control);
127 solver.solve(*matrix, dst, src, preconditioner);
128 }
catch (std::exception &e) {
129 std::cerr <<
"PETSc GMRES linear solver failed: " << e.what() << std::endl;
133 return solver_control.last_step();
137 const SparseMatrixType *matrix;
138 PreconditionerType preconditioner;
Definition complex_math.hh:10