4#ifndef DUNE_PDELAB_BACKEND_ISTL_MATRIXFREE_GRIDOPERATORPRECONDITIONER_HH
5#define DUNE_PDELAB_BACKEND_ISTL_MATRIXFREE_GRIDOPERATORPRECONDITIONER_HH
7#include<dune/grid/common/rangegenerators.hh>
8#include<dune/istl/preconditioner.hh>
9#include<dune/istl/solvercategory.hh>
18 template<
class PrecGO>
20 :
public Dune::Preconditioner<typename PrecGO::Traits::Domain,typename PrecGO::Traits::Range>
22 using Domain =
typename PrecGO::Traits::Domain;
23 using Range =
typename PrecGO::Traits::Range;
26 static constexpr bool isLinear = PrecGO::LocalAssembler::isLinear();
27 Dune::SolverCategory::Category
category()
const override
29 return Dune::SolverCategory::sequential;
45 void pre(Domain& v, Range& d)
override
48 DUNE_THROW(Dune::InvalidStateException,
"You seem to apply a preconditioner to a linearized problem but haven't set the linearization point explicitly!");
50 auto& lop = _precgo.localAssembler().localOperator();
51 if (lop.requireSetup()){
71 _precgo.residual(d, d);
73 _precgo.residual(*_u, d);
74 lop.setRequireSetup(
false);
78 void apply(Domain& v,
const Range& d)
override
81 _precgo.jacobian_apply(d, v);
83 _precgo.jacobian_apply(*_u, d, v);
86 void post(Domain& v)
override {}
89 const PrecGO& _precgo;
Definition: adaptivity.hh:29
Turn a grid operator that represents a preconditioner into an ISTL preconditioner.
Definition: gridoperatorpreconditioner.hh:21
void post(Domain &v) override
Definition: gridoperatorpreconditioner.hh:86
static constexpr bool isLinear
Definition: gridoperatorpreconditioner.hh:26
void pre(Domain &v, Range &d) override
prepare preconditioner
Definition: gridoperatorpreconditioner.hh:45
Dune::SolverCategory::Category category() const override
Definition: gridoperatorpreconditioner.hh:27
GridOperatorPreconditioner(const PrecGO &precgo)
Definition: gridoperatorpreconditioner.hh:32
void apply(Domain &v, const Range &d) override
Definition: gridoperatorpreconditioner.hh:78
void setLinearizationPoint(const Domain &u)
Definition: gridoperatorpreconditioner.hh:39