From 36a1be2113a82db9b297d6272b4473a39998a78f Mon Sep 17 00:00:00 2001
From: Remy Prechelt <prechelt@hawaii.edu>
Date: Mon, 16 Nov 2020 23:17:37 -1000
Subject: [PATCH] Port over inhomogenous medium.

---
 corsika/detail/media/InhomogeneousMedium.inl | 50 ++++++++++++++++++++
 corsika/media/InhomogeneousMedium.hpp        | 45 +++++++-----------
 2 files changed, 67 insertions(+), 28 deletions(-)
 create mode 100644 corsika/detail/media/InhomogeneousMedium.inl

diff --git a/corsika/detail/media/InhomogeneousMedium.inl b/corsika/detail/media/InhomogeneousMedium.inl
new file mode 100644
index 000000000..ff64e9cd1
--- /dev/null
+++ b/corsika/detail/media/InhomogeneousMedium.inl
@@ -0,0 +1,50 @@
+/*
+ * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * This software is distributed under the terms of the GNU General Public
+ * Licence version 3 (GPL Version 3). See file LICENSE for a full version of
+ * the license.
+ */
+
+#pragma once
+
+#include <corsika/framework/core/PhysicalUnits.hpp>
+#include <corsika/framework/geometry/Line.hpp>
+#include <corsika/framework/geometry/Point.hpp>
+#include <corsika/framework/geometry/Trajectory.hpp>
+#include <corsika/media/NuclearComposition.hpp>
+
+namespace corsika {
+
+  template <typename T, typename TDensityFunction>
+  template <typename... TArgs>
+  InhomogeneousMedium<T, TDensityFunction>::InhomogeneousMedium(
+      NuclearComposition nuclComp, TArgs&&... rhoTArgs)
+      : nuclComp_(nuclComp)
+      , densityFunction_(rhoTArgs...){}
+
+  template <typename T, typename TDensityFunction>
+  units::si::MassDensityType InhomogeneousMedium<T, TDensityFunction>::getMassDensity(
+      Point const& point) const {
+    return densityFunction_.evaluateAt(point);
+  }
+
+  template <typename T, typename TDensityFunction>
+  NuclearComposition const&
+  InhomogeneousMedium<T, TDensityFunction>::getNuclearComposition() const {
+    return nuclComp_;
+  }
+
+  template <typename T, typename TDensityFunction>
+  units::si::GrammageType InhomogeneousMedium<T, TDensityFunction>::integratedGrammage(
+      Trajectory<Line> const& line, units::si::LengthType to) const {
+    return densityFunction_.integrateGrammage(line, to);
+  }
+
+  template <typename T, typename TDensityFunction>
+  units::si::LengthType InhomogeneousMedium<T, TDensityFunction>::arclengthFromGrammage(
+      Trajectory<Line> const& line, units::si::GrammageType grammage) const {
+    return densityFunction_.arclengthFromGrammage(line, grammage);
+  }
+
+} // namespace corsika
diff --git a/corsika/media/InhomogeneousMedium.hpp b/corsika/media/InhomogeneousMedium.hpp
index 5df9a04bb..5467e2db3 100644
--- a/corsika/media/InhomogeneousMedium.hpp
+++ b/corsika/media/InhomogeneousMedium.hpp
@@ -8,12 +8,10 @@
 
 #pragma once
 
-#include <corsika/framework/core/ParticleProperties.hpp>
 #include <corsika/framework/core/PhysicalUnits.hpp>
 #include <corsika/framework/geometry/Line.hpp>
 #include <corsika/framework/geometry/Point.hpp>
 #include <corsika/framework/geometry/Trajectory.hpp>
-#include <corsika/framework/random/RNGManager.hpp>
 #include <corsika/media/NuclearComposition.hpp>
 
 /**
@@ -23,35 +21,26 @@
 
 namespace corsika {
 
-  template <class T, class TDensityFunction>
+  template <typename T, typename TDensityFunction>
   class InhomogeneousMedium : public T {
-    NuclearComposition const fNuclComp;
-    TDensityFunction const fDensityFunction;
+    NuclearComposition const nuclComp_;
+    TDensityFunction const densityFunction_;
 
   public:
-    /*
-     * FIXME: should have traits here for ...Args
-     */
-    template <typename... Args>
-    InhomogeneousMedium(NuclearComposition pNuclComp, Args&&... rhoArgs)
-        : fNuclComp(pNuclComp)
-        , fDensityFunction(rhoArgs...) {}
-
-    MassDensityType GetMassDensity(Point const& p) const override {
-      return fDensityFunction.EvaluateAt(p);
-    }
-
-    NuclearComposition const& GetNuclearComposition() const override { return fNuclComp; }
-
-    GrammageType IntegratedGrammage(Trajectory<Line> const& pLine,
-                                    LengthType pTo) const override {
-      return fDensityFunction.IntegrateGrammage(pLine, pTo);
-    }
-
-    LengthType ArclengthFromGrammage(Trajectory<Line> const& pLine,
-                                     GrammageType pGrammage) const override {
-      return fDensityFunction.ArclengthFromGrammage(pLine, pGrammage);
-    }
+    template <typename... TArgs>
+    InhomogeneousMedium(NuclearComposition nuclComp, TArgs&&... rhoTArgs);
+
+    units::si::MassDensityType getMassDensity(Point const& point) const override;
+
+    NuclearComposition const& getNuclearComposition() const override;
+
+    units::si::GrammageType integratedGrammage(Trajectory<Line> const& line,
+                                               units::si::LengthType to) const override;
+
+    units::si::LengthType arclengthFromGrammage(
+        Trajectory<Line> const& pLine, units::si::GrammageType grammage) const override;
   };
 
 } // namespace corsika
+
+#include <corsika/detail/media/InhomogeneousMedium.inl>
-- 
GitLab