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