diff --git a/dune/solvers/norms/h1seminorm.hh b/dune/solvers/norms/h1seminorm.hh index f3e4ec449629070cd9042836e0da49f48da81210..2816e2595b616fc5675e43738baea62b4ec6875d 100644 --- a/dune/solvers/norms/h1seminorm.hh +++ b/dune/solvers/norms/h1seminorm.hh @@ -8,6 +8,7 @@ #include <dune/common/fmatrix.hh> #include <dune/istl/bcrsmatrix.hh> +#include <dune/solvers/common/wrapownshare.hh> #include "norm.hh" //! Specialisation of the EnergyNorm class to identity blocks @@ -23,12 +24,13 @@ public: /** \brief The type used for the result */ using typename Base::field_type; - H1SemiNorm() : matrix_(NULL) {} + H1SemiNorm() = default; - H1SemiNorm(const MatrixType& matrix) - : matrix_(&matrix) + template<typename Matrix> + H1SemiNorm(Matrix&& matrix) + : matrix_(Dune::Solvers::wrap_own_share<const MatrixType>(std::forward<Matrix>(matrix))) { - assert(matrix.N() == matrix.M()); + assert(matrix_->N() == matrix_->M()); } //! Compute the norm of the difference of two vectors @@ -77,7 +79,7 @@ public: return std::sqrt(sum); } - const MatrixType* matrix_; + std::shared_ptr<const MatrixType> matrix_; };