20#ifndef OPM_PRECONDITIONERWITHUPDATE_HEADER_INCLUDED
21#define OPM_PRECONDITIONERWITHUPDATE_HEADER_INCLUDED
23#include <dune/istl/preconditioner.hh>
30template <
class X,
class Y>
34 virtual void update() = 0;
37 virtual bool hasPerfectUpdate()
const = 0;
40template <
class OriginalPreconditioner>
42 typename OriginalPreconditioner::range_type>
45 template <
class... Args>
47 : orig_precond_(std::forward<Args>(args)...)
51 using X =
typename OriginalPreconditioner::domain_type;
52 using Y =
typename OriginalPreconditioner::range_type;
54 virtual void pre(X& x, Y& b)
override
56 orig_precond_.pre(x, b);
59 virtual void apply(X& v,
const Y& d)
override
61 orig_precond_.apply(v, d);
64 virtual void post(X& x)
override
66 orig_precond_.post(x);
69 virtual SolverCategory::Category category()
const override
71 return orig_precond_.category();
75 virtual void update()
override
79 virtual bool hasPerfectUpdate()
const override {
84 OriginalPreconditioner orig_precond_;
87template <
class OriginalPreconditioner,
class... Args>
88std::shared_ptr<DummyUpdatePreconditioner<OriginalPreconditioner>>
89getDummyUpdateWrapper(Args&&... args)
91 return std::make_shared<DummyUpdatePreconditioner<OriginalPreconditioner>>(std::forward<Args>(args)...);
96template <
class OriginalPreconditioner>
98 virtual std::unique_ptr<
99 Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>>
108template <
class OriginalPreconditioner,
class... Args>
110 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
116 std::unique_ptr<GenericPreconditioner>
122 return std::make_unique<OriginalPreconditioner>(std::forward<Args>(args)...);
126 std::tuple<Args...> args_;
131template <
class OriginalPreconditioner>
133 typename OriginalPreconditioner::range_type>
136 template<
class... Args>
143 using X =
typename OriginalPreconditioner::domain_type;
144 using Y =
typename OriginalPreconditioner::range_type;
146 virtual void pre(X& x, Y& b)
override
148 orig_precond_->pre(x, b);
151 virtual void apply(X& v,
const Y& d)
override
153 orig_precond_->apply(v, d);
156 virtual void post(X& x)
override
158 orig_precond_->post(x);
161 virtual SolverCategory::Category category()
const override
163 return orig_precond_->category();
167 void update()
override
169 orig_precond_ = preconditioner_maker_->make();
172 virtual bool hasPerfectUpdate()
const override {
178 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
180 std::unique_ptr<AbstractMakerType> preconditioner_maker_;
181 std::unique_ptr<GenericPreconditioner> orig_precond_;
189template <
class OriginalPreconditioner,
class... Args>
191getRebuildOnUpdateWrapper(Args... args)
193 return std::make_shared<RebuildOnUpdatePreconditioner<OriginalPreconditioner>>(
194 std::forward<Args>(args)...);
Definition PreconditionerWithUpdate.hpp:43
Interface class adding the update() method to the preconditioner interface.
Definition PreconditionerWithUpdate.hpp:32
Wrapper class of preconditioners that should be reconstructed on update.
Definition PreconditionerWithUpdate.hpp:134
Interface class ensuring make function is overriden.
Definition PreconditionerWithUpdate.hpp:97
Struct implementing a make function which creates a preconditioner Can create arbitrary preconditione...
Definition PreconditionerWithUpdate.hpp:109