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;
37template <
class OriginalPreconditioner>
39 typename OriginalPreconditioner::range_type>
42 template <
class... Args>
44 : orig_precond_(std::forward<Args>(args)...)
48 using X =
typename OriginalPreconditioner::domain_type;
49 using Y =
typename OriginalPreconditioner::range_type;
51 virtual void pre(X& x, Y& b)
override
53 orig_precond_.pre(x, b);
56 virtual void apply(X& v,
const Y& d)
override
58 orig_precond_.apply(v, d);
61 virtual void post(X& x)
override
63 orig_precond_.post(x);
66 virtual SolverCategory::Category category()
const override
68 return orig_precond_.category();
72 virtual void update()
override
77 OriginalPreconditioner orig_precond_;
80template <
class OriginalPreconditioner,
class... Args>
81std::shared_ptr<DummyUpdatePreconditioner<OriginalPreconditioner>>
82getDummyUpdateWrapper(Args&&... args)
84 return std::make_shared<DummyUpdatePreconditioner<OriginalPreconditioner>>(std::forward<Args>(args)...);
89template <
class OriginalPreconditioner>
91 virtual std::unique_ptr<
92 Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>>
100template <
class OriginalPreconditioner,
class... Args>
102 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
108 std::unique_ptr<GenericPreconditioner>
114 return std::make_unique<OriginalPreconditioner>(std::forward<Args>(args)...);
117 std::tuple<Args...> args_;
122template <
class OriginalPreconditioner>
124 typename OriginalPreconditioner::range_type>
127 template<
class... Args>
134 using X =
typename OriginalPreconditioner::domain_type;
135 using Y =
typename OriginalPreconditioner::range_type;
137 virtual void pre(X& x, Y& b)
override
139 orig_precond_->pre(x, b);
142 virtual void apply(X& v,
const Y& d)
override
144 orig_precond_->apply(v, d);
147 virtual void post(X& x)
override
149 orig_precond_->post(x);
152 virtual SolverCategory::Category category()
const override
154 return orig_precond_->category();
158 void update()
override
160 orig_precond_ = preconditioner_maker_->make();
165 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
167 std::unique_ptr<AbstractMakerType> preconditioner_maker_;
168 std::unique_ptr<GenericPreconditioner> orig_precond_;
176template <
class OriginalPreconditioner,
class... Args>
178getRebuildOnUpdateWrapper(Args... args)
180 return std::make_shared<RebuildOnUpdatePreconditioner<OriginalPreconditioner>>(
181 std::forward<Args>(args)...);
Definition PreconditionerWithUpdate.hpp:40
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:125
Interface class ensuring make function is overriden.
Definition PreconditionerWithUpdate.hpp:90
Struct implementing a make function which creates a preconditioner Can create arbitrary preconditione...
Definition PreconditionerWithUpdate.hpp:101