From 2f20ba524184d8425d46aec167ca8faf5234d05f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Carsten=20Gr=C3=A4ser?= <graeser@dune-project.org> Date: Fri, 19 Nov 2021 23:04:21 +0100 Subject: [PATCH] Add `operator*` for `ScaledIdentityMatrix` and scalar --- CHANGELOG.md | 3 +++ dune/istl/scaledidmatrix.hh | 18 ++++++++++++++++++ dune/istl/test/scaledidmatrixtest.cc | 3 +++ 3 files changed, 24 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index d5a452f2e..d8b79390a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,6 +10,9 @@ used by `CHOLMOD` itself to store the Cholesky factor. This can be used to use the more advanced features of `CHOLMOD`. +- You can now multiply objects of type `ScaledIdentityMatrix` by scalars + using `operator*`. + # Release 2.8 - Extended the MatrixMarket IO functions for reading and writing vectors with diff --git a/dune/istl/scaledidmatrix.hh b/dune/istl/scaledidmatrix.hh index ab9fe5d72..18ac31d6f 100644 --- a/dune/istl/scaledidmatrix.hh +++ b/dune/istl/scaledidmatrix.hh @@ -197,6 +197,24 @@ namespace Dune { return *this; } + //===== binary operators + + //! vector space multiplication with scalar + template <class Scalar, + std::enable_if_t<IsNumber<Scalar>::value, int> = 0> + friend auto operator* ( const ScaledIdentityMatrix& matrix, Scalar scalar) + { + return ScaledIdentityMatrix<typename PromotionTraits<K,Scalar>::PromotedType, n>{matrix.scalar()*scalar}; + } + + //! vector space multiplication with scalar + template <class Scalar, + std::enable_if_t<IsNumber<Scalar>::value, int> = 0> + friend auto operator* (Scalar scalar, const ScaledIdentityMatrix& matrix) + { + return ScaledIdentityMatrix<typename PromotionTraits<Scalar,K>::PromotedType, n>{scalar*matrix.scalar()}; + } + //===== comparison ops //! comparison operator diff --git a/dune/istl/test/scaledidmatrixtest.cc b/dune/istl/test/scaledidmatrixtest.cc index 3687a7921..0bd49ebc4 100644 --- a/dune/istl/test/scaledidmatrixtest.cc +++ b/dune/istl/test/scaledidmatrixtest.cc @@ -31,6 +31,9 @@ void test_matrix() // matrix vector product A.umv(v,f); + // matrix times scalar + auto r1 = A * 23.; + auto r2 = 42. * A; // test norms A.frobenius_norm(); -- GitLab