Skip to content

Commit f215c35

Browse files
author
Atgeirr Flø Rasmussen
committed
Fix preconditioner update wrapper and usage.
Used for the Dune::SeqILU preconditioner. Using std::reference_wrapper by calling std::cref at the call site ensures that the matrix is stored with reference semantics, instead of copying the matrix from the initial call.
1 parent c73a62f commit f215c35

3 files changed

Lines changed: 14 additions & 6 deletions

File tree

opm/simulators/linalg/PreconditionerWithUpdate.hpp

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222

2323
#include <dune/istl/preconditioner.hh>
2424
#include <memory>
25+
#include <tuple>
26+
#include <utility>
2527

2628
namespace Dune
2729
{
@@ -109,7 +111,7 @@ template <class OriginalPreconditioner, class... Args>
109111
struct PreconditionerMaker : public GeneralPreconditionerMaker<OriginalPreconditioner> {
110112
using GenericPreconditioner = Preconditioner<typename OriginalPreconditioner::domain_type, typename OriginalPreconditioner::range_type>;
111113

112-
explicit PreconditionerMaker(Args&&... args)
114+
explicit PreconditionerMaker(Args... args)
113115
: args_(args...)
114116
{
115117
}
@@ -136,7 +138,7 @@ class RebuildOnUpdatePreconditioner : public PreconditionerWithUpdate<typename O
136138
public:
137139
template<class... Args>
138140
explicit RebuildOnUpdatePreconditioner(Args... args)
139-
: preconditioner_maker_(std::make_unique<PreconditionerMaker<OriginalPreconditioner, Args...>>(std::forward<Args>(args)...))
141+
: preconditioner_maker_(std::make_unique<PreconditionerMaker<OriginalPreconditioner, Args...>>(args...))
140142
{
141143
update();
142144
}
@@ -192,8 +194,7 @@ template <class OriginalPreconditioner, class... Args>
192194
auto
193195
getRebuildOnUpdateWrapper(Args... args)
194196
{
195-
return std::make_shared<RebuildOnUpdatePreconditioner<OriginalPreconditioner>>(
196-
std::forward<Args>(args)...);
197+
return std::make_shared<RebuildOnUpdatePreconditioner<OriginalPreconditioner>>(args...);
197198
}
198199

199200
} // namespace Dune

opm/simulators/linalg/StandardPreconditioners_mpi.hpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
#endif
3030
#endif
3131

32+
#include <functional>
33+
#include <memory>
34+
#include <type_traits>
3235

3336
namespace Opm {
3437

@@ -154,7 +157,7 @@ struct StandardPreconditioners
154157
const double w = prm.get<double>("relaxation", 1.0);
155158
const bool resort = prm.get<bool>("resort", false);
156159
return wrapBlockPreconditioner<RebuildOnUpdatePreconditioner<Dune::SeqILU<M, V, V>>>(
157-
comm, op.getmat(), n, w, resort);
160+
comm, std::cref(op.getmat()), n, w, resort);
158161
});
159162
F::addCreator("dilu", [](const O& op, const P& prm, const std::function<V()>&, std::size_t, const C& comm) {
160163
DUNE_UNUSED_PARAMETER(prm);

opm/simulators/linalg/StandardPreconditioners_serial.hpp

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,10 @@
2929
#endif
3030
#endif
3131

32+
#include <functional>
33+
#include <memory>
34+
#include <type_traits>
35+
3236
namespace Opm {
3337

3438
template <class X, class Y>
@@ -66,7 +70,7 @@ struct StandardPreconditioners<Operator, Dune::Amg::SequentialInformation, typen
6670
const double w = prm.get<double>("relaxation", 1.0);
6771
const int n = prm.get<int>("ilulevel", 0);
6872
const bool resort = prm.get<bool>("resort", false);
69-
return getRebuildOnUpdateWrapper<Dune::SeqILU<M, V, V>>(op.getmat(), n, w, resort);
73+
return getRebuildOnUpdateWrapper<Dune::SeqILU<M, V, V>>(std::cref(op.getmat()), n, w, resort);
7074
});
7175
F::addCreator("paroverilu0", [](const O& op, const P& prm, const std::function<V()>&, std::size_t) {
7276
const double w = prm.get<double>("relaxation", 1.0);

0 commit comments

Comments
 (0)