42 typename OriginalPreconditioner::range_type>
45 template <
class... Args>
46 explicit DummyUpdatePreconditioner(Args&&... 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_;
110 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
112 explicit PreconditionerMaker(Args&&... args)
117 std::unique_ptr<GenericPreconditioner>
123 return std::make_unique<OriginalPreconditioner>(std::forward<Args>(args)...);
127 std::tuple<Args...> args_;
134 typename OriginalPreconditioner::range_type>
137 template<
class... Args>
138 explicit RebuildOnUpdatePreconditioner(Args... args)
144 using X =
typename OriginalPreconditioner::domain_type;
145 using Y =
typename OriginalPreconditioner::range_type;
147 void pre(X& x, Y& b)
override
149 orig_precond_->pre(x, b);
152 void apply(X& v,
const Y& d)
override
154 orig_precond_->apply(v, d);
157 void post(X& x)
override
159 orig_precond_->post(x);
162 SolverCategory::Category category()
const override
164 return orig_precond_->category();
168 void update()
override
170 orig_precond_ = preconditioner_maker_->make();
173 bool hasPerfectUpdate()
const override
180 using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
182 std::unique_ptr<AbstractMakerType> preconditioner_maker_;
183 std::unique_ptr<GenericPreconditioner> orig_precond_;