44 typename OriginalPreconditioner::range_type>
47 template <
class... Args>
48 explicit DummyUpdatePreconditioner(Args&&... 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_;
112 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
114 explicit PreconditionerMaker(Args... args)
119 std::unique_ptr<GenericPreconditioner>
125 return std::make_unique<OriginalPreconditioner>(std::forward<Args>(args)...);
129 std::tuple<Args...> args_;
136 typename OriginalPreconditioner::range_type>
139 template<
class... Args>
140 explicit RebuildOnUpdatePreconditioner(Args... 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_;