20 #ifndef OPM_OWNINGBLOCKPRECONDITIONER_HEADER_INCLUDED 21 #define OPM_OWNINGBLOCKPRECONDITIONER_HEADER_INCLUDED 23 #include <opm/common/TimingMacros.hpp> 25 #include <opm/simulators/linalg/PreconditionerWithUpdate.hpp> 27 #include <dune/istl/schwarz.hh> 32 template <
class OriginalPreconditioner,
class Comm>
34 typename OriginalPreconditioner::range_type>
37 template <
class... Args>
39 : orig_precond_(std::forward<Args>(args)...)
40 , block_precond_(orig_precond_, comm)
44 using X =
typename OriginalPreconditioner::domain_type;
45 using Y =
typename OriginalPreconditioner::range_type;
47 virtual void pre(X& x, Y& b)
override 50 block_precond_.pre(x, b);
53 virtual void apply(X& v,
const Y& d)
override 56 block_precond_.apply(v, d);
59 virtual void post(X& x)
override 62 block_precond_.post(x);
65 virtual SolverCategory::Category category()
const override 67 return block_precond_.category();
71 virtual void update()
override 73 OPM_TIMEBLOCK(update);
74 orig_precond_.update();
77 virtual bool hasPerfectUpdate()
const override {
78 return orig_precond_.hasPerfectUpdate();
82 OriginalPreconditioner orig_precond_;
83 BlockPreconditioner<X, Y, Comm, OriginalPreconditioner> block_precond_;
87 template <
class OriginalPreconditioner,
class Comm,
class... Args>
88 std::shared_ptr<OwningBlockPreconditioner<OriginalPreconditioner, Comm>>
89 wrapBlockPreconditioner(
const Comm& comm, Args&&... args)
91 return std::make_shared<OwningBlockPreconditioner<OriginalPreconditioner, Comm>>(comm, std::forward<Args>(args)...);
96 #endif // OPM_OWNINGBLOCKPRECONDITIONER_HEADER_INCLUDED Definition: fvbaseprimaryvariables.hh:161
Interface class adding the update() method to the preconditioner interface.
Definition: PreconditionerWithUpdate.hpp:33
Definition: OwningBlockPreconditioner.hpp:33