From c085edc259fab9cb6c0c795f84954441cc631c48 Mon Sep 17 00:00:00 2001
From: ralfulrich <ralf.ulrich@kit.edu>
Date: Thu, 16 Jul 2020 21:29:21 +0200
Subject: [PATCH] added testShowerAxis

---
 Environment/CMakeLists.txt    |  8 ++++
 Environment/testShowerAxis.cc | 90 +++++++++++++++++++++++++++++++++++
 2 files changed, 98 insertions(+)
 create mode 100644 Environment/testShowerAxis.cc

diff --git a/Environment/CMakeLists.txt b/Environment/CMakeLists.txt
index e90160a67..b062a66c5 100644
--- a/Environment/CMakeLists.txt
+++ b/Environment/CMakeLists.txt
@@ -75,3 +75,11 @@ target_link_libraries (
   CORSIKAenvironment
   CORSIKAtesting
   )
+
+CORSIKA_ADD_TEST(testShowerAxis)
+target_link_libraries (
+  testShowerAxis
+  CORSIKAsetup
+  CORSIKAenvironment
+  CORSIKAtesting
+  )
diff --git a/Environment/testShowerAxis.cc b/Environment/testShowerAxis.cc
new file mode 100644
index 000000000..e86bb6754
--- /dev/null
+++ b/Environment/testShowerAxis.cc
@@ -0,0 +1,90 @@
+/*
+ * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu
+ *
+ * See file AUTHORS for a list of contributors.
+ *
+ * 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.
+ */
+
+#include <corsika/environment/ShowerAxis.h>
+#include <corsika/environment/DensityFunction.h>
+#include <corsika/environment/HomogeneousMedium.h>
+#include <corsika/environment/IMediumModel.h>
+#include <corsika/environment/NuclearComposition.h>
+#include <corsika/environment/VolumeTreeNode.h>
+#include <corsika/geometry/Line.h>
+#include <corsika/geometry/RootCoordinateSystem.h>
+#include <corsika/geometry/Vector.h>
+#include <corsika/particles/ParticleProperties.h>
+#include <corsika/units/PhysicalUnits.h>
+
+#include <catch2/catch.hpp>
+
+using namespace corsika::geometry;
+using namespace corsika::environment;
+using namespace corsika::particles;
+using namespace corsika::units;
+using namespace corsika::units::si;
+using namespace corsika;
+
+const auto density = 1_kg / (1_m * 1_m * 1_m);
+
+auto setupEnvironment(particles::Code vTargetCode) {
+  // setup environment, geometry
+  auto env = std::make_unique<environment::Environment<environment::IMediumModel>>();
+  auto& universe = *(env->GetUniverse());
+  const geometry::CoordinateSystem& cs = env->GetCoordinateSystem();
+
+  auto theMedium =
+      environment::Environment<environment::IMediumModel>::CreateNode<geometry::Sphere>(
+          geometry::Point{cs, 0_m, 0_m, 0_m},
+          1_km * std::numeric_limits<double>::infinity());
+
+  using MyHomogeneousModel = environment::HomogeneousMedium<environment::IMediumModel>;
+  theMedium->SetModelProperties<MyHomogeneousModel>(
+      density,
+      environment::NuclearComposition(std::vector<particles::Code>{vTargetCode},
+                                      std::vector<float>{1.}));
+
+  auto const* nodePtr = theMedium.get();
+  universe.AddChild(std::move(theMedium));
+
+  return std::make_tuple(std::move(env), &cs, nodePtr);
+}
+
+
+TEST_CASE("Homogeneous Density") {
+  auto [env, csPtr, nodePtr] = setupEnvironment(particles::Code::Nitrogen);
+  auto const& cs = *csPtr;
+  [[maybe_unused]] auto const& env_dummy = env;
+  [[maybe_unused]] auto const& node_dummy = nodePtr;
+
+  auto const observationHeight = 0_km;
+  auto const injectionHeight = 10_km;
+  auto const t = -observationHeight + injectionHeight;
+  Point const showerCore{cs, 0_m, 0_m, observationHeight};
+  Point const injectionPos = 
+    showerCore + 
+    Vector<dimensionless_d>{cs, {0, 0, 1}} * t;
+  
+  environment::ShowerAxis const showerAxis{injectionPos,
+      (showerCore - injectionPos), *env, 10000};
+
+  CHECK( showerAxis.steplength() == 1_m );
+  
+  CHECK( showerAxis.maximumX()/(10_km * density) == Approx(1).epsilon(1e-8) );
+
+  CHECK( showerAxis.minimumX() == 0_g / square(1_cm) );
+
+  const Point p{cs, 10_km, 20_km, 9_km};
+  CHECK( showerAxis.projectedX(p)/(1_km * density) == Approx(1).epsilon(1e-8) );
+
+  const units::si::LengthType d = 1_km;
+  CHECK( showerAxis.X(d)/(d * density) == Approx(1).epsilon(1e-8) );
+
+  const Vector<dimensionless_d> dir{cs, {0, 0, -1}};
+  CHECK( showerAxis.GetDirection().GetComponents(cs) == dir.GetComponents(cs) ); 
+  CHECK( showerAxis.GetStart().GetCoordinates() == injectionPos.GetCoordinates() );
+}
-- 
GitLab