20#ifndef OPM_OWNINGBLOCKPRECONDITIONER_HEADER_INCLUDED
21#define OPM_OWNINGBLOCKPRECONDITIONER_HEADER_INCLUDED
23#include <opm/simulators/linalg/PreconditionerWithUpdate.hpp>
25#include <dune/istl/schwarz.hh>
30template <
class OriginalPreconditioner,
class Comm>
32 typename OriginalPreconditioner::range_type>
35 template <
class... Args>
37 : orig_precond_(std::forward<Args>(args)...)
38 , block_precond_(orig_precond_, comm)
42 using X =
typename OriginalPreconditioner::domain_type;
43 using Y =
typename OriginalPreconditioner::range_type;
45 virtual void pre(X& x, Y& b)
override
47 block_precond_.pre(x, b);
50 virtual void apply(X& v,
const Y& d)
override
52 block_precond_.apply(v, d);
55 virtual void post(X& x)
override
57 block_precond_.post(x);
60 virtual SolverCategory::Category category()
const override
62 return block_precond_.category();
66 virtual void update()
override
68 orig_precond_.update();
72 OriginalPreconditioner orig_precond_;
73 BlockPreconditioner<X, Y, Comm, OriginalPreconditioner> block_precond_;
77template <
class OriginalPreconditioner,
class Comm,
class... Args>
78std::shared_ptr<OwningBlockPreconditioner<OriginalPreconditioner, Comm>>
79wrapBlockPreconditioner(
const Comm& comm, Args&&... args)
81 return std::make_shared<OwningBlockPreconditioner<OriginalPreconditioner, Comm>>(comm, std::forward<Args>(args)...);
Definition: OwningBlockPreconditioner.hpp:33
Interface class adding the update() method to the preconditioner interface.
Definition: PreconditionerWithUpdate.hpp:32