20 #ifndef OPM_PRECONDITIONERWITHUPDATE_HEADER_INCLUDED 21 #define OPM_PRECONDITIONERWITHUPDATE_HEADER_INCLUDED 23 #include <dune/istl/preconditioner.hh> 32 template <
class X,
class Y>
36 virtual void update() = 0;
39 virtual bool hasPerfectUpdate()
const = 0;
42 template <
class OriginalPreconditioner>
44 typename OriginalPreconditioner::range_type>
47 template <
class... Args>
49 : orig_precond_(std::forward<Args>(args)...)
53 using X =
typename OriginalPreconditioner::domain_type;
54 using Y =
typename OriginalPreconditioner::range_type;
56 virtual void pre(X& x, Y& b)
override 58 orig_precond_.pre(x, b);
61 virtual void apply(X& v,
const Y& d)
override 63 orig_precond_.apply(v, d);
66 virtual void post(X& x)
override 68 orig_precond_.post(x);
71 virtual SolverCategory::Category category()
const override 73 return orig_precond_.category();
77 virtual void update()
override 81 virtual bool hasPerfectUpdate()
const override {
86 OriginalPreconditioner orig_precond_;
89 template <
class OriginalPreconditioner,
class... Args>
90 std::shared_ptr<DummyUpdatePreconditioner<OriginalPreconditioner>>
91 getDummyUpdateWrapper(Args&&... args)
93 return std::make_shared<DummyUpdatePreconditioner<OriginalPreconditioner>>(std::forward<Args>(args)...);
98 template <
class OriginalPreconditioner>
100 virtual std::unique_ptr<
101 Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>>
110 template <
class OriginalPreconditioner,
class... Args>
112 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
119 std::unique_ptr<GenericPreconditioner>
125 return std::make_unique<OriginalPreconditioner>(std::forward<Args>(args)...);
129 std::tuple<Args...> args_;
134 template <
class OriginalPreconditioner>
136 typename OriginalPreconditioner::range_type>
139 template<
class... Args>
146 using X =
typename OriginalPreconditioner::domain_type;
147 using Y =
typename OriginalPreconditioner::range_type;
149 void pre(X& x, Y& b)
override 151 orig_precond_->pre(x, b);
154 void apply(X& v,
const Y& d)
override 156 orig_precond_->apply(v, d);
159 void post(X& x)
override 161 orig_precond_->post(x);
164 SolverCategory::Category category()
const override 166 return orig_precond_->category();
170 void update()
override 172 orig_precond_ = preconditioner_maker_->make();
175 bool hasPerfectUpdate()
const override 182 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
184 std::unique_ptr<AbstractMakerType> preconditioner_maker_;
185 std::unique_ptr<GenericPreconditioner> orig_precond_;
193 template <
class OriginalPreconditioner,
class... Args>
195 getRebuildOnUpdateWrapper(Args... args)
197 return std::make_shared<RebuildOnUpdatePreconditioner<OriginalPreconditioner>>(args...);
202 #endif // OPM_PRECONDITIONERWITHUPDATE_HEADER_INCLUDED Interface class ensuring make function is overriden.
Definition: PreconditionerWithUpdate.hpp:99
Definition: fvbaseprimaryvariables.hh:161
Struct implementing a make function which creates a preconditioner Can create arbitrary preconditione...
Definition: PreconditionerWithUpdate.hpp:111
Interface class adding the update() method to the preconditioner interface.
Definition: PreconditionerWithUpdate.hpp:33
Wrapper class of preconditioners that should be reconstructed on update.
Definition: PreconditionerWithUpdate.hpp:135
Definition: PreconditionerWithUpdate.hpp:43