From 0da1e57a924e3aee62e84b942cb8e03433c8df80 Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Thu, 28 Oct 2021 11:58:47 +0200
Subject: [PATCH] finally made this running for quantities and doubles

---
 corsika/detail/framework/geometry/Vector.inl |  7 ++++++-
 corsika/framework/geometry/Vector.hpp        | 22 ++++++++++++++++++++
 tests/framework/testGeometry.cpp             | 11 ++++++++++
 3 files changed, 39 insertions(+), 1 deletion(-)

diff --git a/corsika/detail/framework/geometry/Vector.inl b/corsika/detail/framework/geometry/Vector.inl
index 703f2c222..0e2cfdd61 100644
--- a/corsika/detail/framework/geometry/Vector.inl
+++ b/corsika/detail/framework/geometry/Vector.inl
@@ -241,9 +241,14 @@ namespace corsika {
   /*
    * scalar * vector multiplication
    */
+  template <typename TDimension, typename UDimension>
+  inline Vector<phys::units::detail::product_d<TDimension, UDimension>> operator*(
+      quantity<UDimension> const n, Vector<TDimension> const& vec) {
+    return vec * n;
+  }
+
   template <typename TDimension>
   inline Vector<TDimension> operator*(double const n, Vector<TDimension> const& vec) {
     return vec * n;
   }
-
 } // namespace corsika
diff --git a/corsika/framework/geometry/Vector.hpp b/corsika/framework/geometry/Vector.hpp
index 5c97a6526..13d47d717 100644
--- a/corsika/framework/geometry/Vector.hpp
+++ b/corsika/framework/geometry/Vector.hpp
@@ -142,6 +142,28 @@ namespace corsika {
     auto dot(Vector<TDimension2> const& pV) const;
   };
 
+  /**
+   * Free operator to allow commutative multiplications of quantities and Vector.
+   *
+   * @tparam TDimension
+   * @tparam UDimension
+   * @param n
+   * @param vec
+   * @return auto
+   */
+  template <typename TDimension, typename UDimension>
+  Vector<phys::units::detail::product_d<TDimension, UDimension>> operator*(
+      quantity<UDimension> const n, Vector<TDimension> const& vec);
+
+  /**
+   * Free operator to allow commutative multiplications of normal double with Vector.
+   *
+   * @tparam TDimension
+   * @tparam UDimension
+   * @param n
+   * @param vec
+   * @return auto
+   */
   template <typename TDimension>
   Vector<TDimension> operator*(double const n, Vector<TDimension> const& vec);
 
diff --git a/tests/framework/testGeometry.cpp b/tests/framework/testGeometry.cpp
index f3b696931..19c311881 100644
--- a/tests/framework/testGeometry.cpp
+++ b/tests/framework/testGeometry.cpp
@@ -46,6 +46,17 @@ TEST_CASE("Geometry CoordinateSystems") {
   CHECK((p1.getCoordinates(rootCS) - coordinates).getNorm().magnitude() ==
         Approx(0).margin(absMargin));
 
+  SECTION("basic operations") {
+    auto testV0 = v1 * 6;
+    CHECK(testV0.getNorm() / tesla == Approx(6));
+    auto testV1 = 6 * v1;
+    CHECK(testV1.getNorm() / tesla == Approx(6));
+    auto testV2 = 6_m * v1;
+    CHECK(testV2.getNorm() / (tesla * meter) == Approx(6));
+    auto testV3 = v1 * 6_m;
+    CHECK(testV3.getNorm() / (tesla * meter) == Approx(6));
+  }
+
   SECTION("translations") {
     QuantityVector<length_d> const translationVector{0_m, 4_m, 0_m};
     CORSIKA_LOG_INFO("QuantityVector<length_d> translationVector={}", translationVector);
-- 
GitLab