49 using X =
typename Operator::range_type;
56 struct PressureInverseOperator :
public Dune::InverseOperator<X, X>
59 template <
typename GlobalIndex,
typename LocalIndex>
60 PressureInverseOperator(
Operator& op,
62 const Dune::OwnerOverlapCopyCommunication<GlobalIndex, LocalIndex>& comm)
65 assert(op.category() == Dune::SolverCategory::overlapping);
68 linsolver_ = std::make_unique<Solver>(op, comm, prm, std::function<X()>(),
73 PressureInverseOperator(
Operator& op,
75 const SequentialInformation&)
78 assert(op.category() != Dune::SolverCategory::overlapping);
81 linsolver_ = std::make_unique<Solver>(op, prm, std::function<X()>(),
86 Dune::SolverCategory::Category category()
const override
88 return linsolver_->category();
91 void apply(X& x, X& b,
double reduction, Dune::InverseOperatorResult& res)
override
93 linsolver_->apply(x, b, reduction, res);
96 void apply(X& x, X& b, Dune::InverseOperatorResult& res)
override
98 linsolver_->apply(x, b, res);
101 void updatePreconditioner()
103 linsolver_->preconditioner().update();
107 std::unique_ptr<Solver> linsolver_;
123 coarseOperator_ = transferPolicy.getCoarseLevelOperator();
128 coarseOperator_ = transferPolicy.getCoarseLevelOperator();
129 auto& tp =
dynamic_cast<LevelTransferPolicy&
>(transferPolicy);
130 PressureInverseOperator* inv
131 =
new PressureInverseOperator(*coarseOperator_, prm_, tp.getCoarseLevelCommunication());
137 std::shared_ptr<Operator> coarseOperator_;