mirror of
https://github.com/OPM/opm-simulators.git
synced 2025-02-25 18:55:30 -06:00
Add a valid wrapper through OwningBlockPreconditioner that rebuiilds the preconditioner on updates. Still has excessive matrix copy and misses a wrapper function
This commit is contained in:
parent
6b73856fd9
commit
71d58afc0e
@ -177,10 +177,10 @@ struct StandardPreconditioners
|
|||||||
return createParILU(op, prm, comm, prm.get<int>("ilulevel", 0));
|
return createParILU(op, prm, comm, prm.get<int>("ilulevel", 0));
|
||||||
});
|
});
|
||||||
F::addCreator("DuneILU", [](const O& op, const P& prm, const std::function<V()>&, std::size_t, const C& comm) {
|
F::addCreator("DuneILU", [](const O& op, const P& prm, const std::function<V()>&, std::size_t, const C& comm) {
|
||||||
const double w = prm.get<double>("relaxation", 1.0);
|
|
||||||
const int n = prm.get<int>("ilulevel", 0);
|
const int n = prm.get<int>("ilulevel", 0);
|
||||||
|
const double w = prm.get<double>("relaxation", 1.0);
|
||||||
const bool resort = prm.get<bool>("resort", false);
|
const bool resort = prm.get<bool>("resort", false);
|
||||||
return wrapBlockPreconditioner<DummyUpdatePreconditioner<Dune::SeqILU<M, V, V>>>(comm, op.getmat(), n, w, resort);
|
return wrapBlockPreconditioner<RebuildOnUpdatePreconditioner<Dune::SeqILU<M, V, V>, M>>(comm, op.getmat(), n, w, resort);
|
||||||
});
|
});
|
||||||
F::addCreator("DILU", [](const O& op, const P& prm, const std::function<V()>&, std::size_t, const C& comm) {
|
F::addCreator("DILU", [](const O& op, const P& prm, const std::function<V()>&, std::size_t, const C& comm) {
|
||||||
DUNE_UNUSED_PARAMETER(prm);
|
DUNE_UNUSED_PARAMETER(prm);
|
||||||
|
@ -77,7 +77,7 @@ private:
|
|||||||
OriginalPreconditioner orig_precond_;
|
OriginalPreconditioner orig_precond_;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//TODO: extend this functionality to support RebuildOnUpdatePreconditioner
|
||||||
template <class OriginalPreconditioner, class... Args>
|
template <class OriginalPreconditioner, class... Args>
|
||||||
std::shared_ptr<DummyUpdatePreconditioner<OriginalPreconditioner>>
|
std::shared_ptr<DummyUpdatePreconditioner<OriginalPreconditioner>>
|
||||||
wrapPreconditioner(Args&&... args)
|
wrapPreconditioner(Args&&... args)
|
||||||
@ -85,6 +85,53 @@ wrapPreconditioner(Args&&... args)
|
|||||||
return std::make_shared<DummyUpdatePreconditioner<OriginalPreconditioner>>(std::forward<Args>(args)...);
|
return std::make_shared<DummyUpdatePreconditioner<OriginalPreconditioner>>(std::forward<Args>(args)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <class OriginalPreconditioner, class Matrix>
|
||||||
|
class RebuildOnUpdatePreconditioner : public PreconditionerWithUpdate<typename OriginalPreconditioner::domain_type,
|
||||||
|
typename OriginalPreconditioner::range_type>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
RebuildOnUpdatePreconditioner(Matrix op_mat, const int n, const double w, const bool resort)
|
||||||
|
: orig_precond_(std::make_unique<OriginalPreconditioner>(op_mat, n, w, resort)), op_mat_(op_mat), n_(n), w_(w), resort_(resort)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
using X = typename OriginalPreconditioner::domain_type;
|
||||||
|
using Y = typename OriginalPreconditioner::range_type;
|
||||||
|
|
||||||
|
virtual void pre(X& x, Y& b) override
|
||||||
|
{
|
||||||
|
orig_precond_->pre(x, b);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void apply(X& v, const Y& d) override
|
||||||
|
{
|
||||||
|
orig_precond_->apply(v, d);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual void post(X& x) override
|
||||||
|
{
|
||||||
|
orig_precond_->post(x);
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual SolverCategory::Category category() const override
|
||||||
|
{
|
||||||
|
return orig_precond_->category();
|
||||||
|
}
|
||||||
|
|
||||||
|
// The update() function does nothing for a wrapped preconditioner.
|
||||||
|
virtual void update() override
|
||||||
|
{
|
||||||
|
orig_precond_ = std::make_unique<OriginalPreconditioner>(op_mat_, n_, w_, resort_);
|
||||||
|
}
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::unique_ptr<OriginalPreconditioner> orig_precond_;
|
||||||
|
//TODO: replace excess copy of matrix with pointer
|
||||||
|
Matrix op_mat_;
|
||||||
|
int n_;
|
||||||
|
double w_;
|
||||||
|
bool resort_;
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace Dune
|
} // namespace Dune
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user