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)...);
96 template <
class X,
class Y>
101 : category_(category)
102 , needs_rebuild_(
false)
106 void update()
override 108 needs_rebuild_ =
true;
111 bool hasPerfectUpdate()
const override 116 bool needsRebuild()
const 118 return needs_rebuild_;
121 void resetNeedsRebuild()
123 needs_rebuild_ =
false;
126 void pre([[maybe_unused]] X& x, [[maybe_unused]] Y& y)
override 130 void post([[maybe_unused]] X& x)
override 134 void apply([[maybe_unused]] X& x, [[maybe_unused]]
const Y& y)
override 138 SolverCategory::Category category()
const override 144 SolverCategory::Category category_;
150 template <
class OriginalPreconditioner>
152 virtual std::unique_ptr<
153 Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>>
162 template <
class OriginalPreconditioner,
class... Args>
164 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
171 std::unique_ptr<GenericPreconditioner>
177 return std::make_unique<OriginalPreconditioner>(std::forward<Args>(args)...);
181 std::tuple<Args...> args_;
186 template <
class OriginalPreconditioner>
188 typename OriginalPreconditioner::range_type>
191 template<
class... Args>
198 using X =
typename OriginalPreconditioner::domain_type;
199 using Y =
typename OriginalPreconditioner::range_type;
201 void pre(X& x, Y& b)
override 203 orig_precond_->pre(x, b);
206 void apply(X& v,
const Y& d)
override 208 orig_precond_->apply(v, d);
211 void post(X& x)
override 213 orig_precond_->post(x);
216 SolverCategory::Category category()
const override 218 return orig_precond_->category();
222 void update()
override 224 orig_precond_ = preconditioner_maker_->make();
227 bool hasPerfectUpdate()
const override 234 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
236 std::unique_ptr<AbstractMakerType> preconditioner_maker_;
237 std::unique_ptr<GenericPreconditioner> orig_precond_;
245 template <
class OriginalPreconditioner,
class... Args>
247 getRebuildOnUpdateWrapper(Args... args)
249 return std::make_shared<RebuildOnUpdatePreconditioner<OriginalPreconditioner>>(args...);
254 #endif // OPM_PRECONDITIONERWITHUPDATE_HEADER_INCLUDED Interface class ensuring make function is overriden.
Definition: PreconditionerWithUpdate.hpp:151
Definition: fvbaseprimaryvariables.hh:161
Struct implementing a make function which creates a preconditioner Can create arbitrary preconditione...
Definition: PreconditionerWithUpdate.hpp:163
Interface class adding the update() method to the preconditioner interface.
Definition: PreconditionerWithUpdate.hpp:33
Definition: PreconditionerWithUpdate.hpp:97
Wrapper class of preconditioners that should be reconstructed on update.
Definition: PreconditionerWithUpdate.hpp:187
Definition: PreconditionerWithUpdate.hpp:43