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 bool hasPerfectUpdate()
const
93 return linsolver_->preconditioner().hasPerfectUpdate();
96 void apply(X& x, X& b,
double reduction, Dune::InverseOperatorResult& res)
override
98 linsolver_->apply(x, b, reduction, res);
101 void apply(X& x, X& b, Dune::InverseOperatorResult& res)
override
103 linsolver_->apply(x, b, res);
106 void updatePreconditioner()
108 linsolver_->preconditioner().update();
112 std::unique_ptr<Solver> linsolver_;
128 coarseOperator_ = transferPolicy.getCoarseLevelOperator();
133 coarseOperator_ = transferPolicy.getCoarseLevelOperator();
134 auto& tp =
dynamic_cast<LevelTransferPolicy&
>(transferPolicy);
135 PressureInverseOperator* inv
136 =
new PressureInverseOperator(*coarseOperator_, prm_, tp.getCoarseLevelCommunication());
142 std::shared_ptr<Operator> coarseOperator_;