From 99ebd18886eeefc37141a3c53a3885e0862a1735 Mon Sep 17 00:00:00 2001
From: Maximilian Reininghaus <maximilian.reininghaus@kit.edu>
Date: Fri, 10 Jun 2022 19:19:17 +0200
Subject: [PATCH] started implementing sibyll::InteractionModel

---
 .../modules/sibyll/InteractionModel.inl       | 49 +++++++++++++++++++
 corsika/modules/Sibyll.hpp                    |  6 ++-
 corsika/modules/sibyll/InteractionModel.hpp   | 31 ++++++++++++
 3 files changed, 85 insertions(+), 1 deletion(-)
 create mode 100644 corsika/detail/modules/sibyll/InteractionModel.inl
 create mode 100644 corsika/modules/sibyll/InteractionModel.hpp

diff --git a/corsika/detail/modules/sibyll/InteractionModel.inl b/corsika/detail/modules/sibyll/InteractionModel.inl
new file mode 100644
index 000000000..7e95f3a31
--- /dev/null
+++ b/corsika/detail/modules/sibyll/InteractionModel.inl
@@ -0,0 +1,49 @@
+#include <corsika/framework/core/ParticleProperties.hpp>
+#include <corsika/framework/core/PhysicalUnits.hpp>
+#include <corsika/framework/geometry/FourVector.hpp>
+#include <corsika/modules/sibyll/HadronInteractionModel.hpp>
+#include <corsika/modules/sibyll/NuclearInteractionModel.hpp>
+
+namespace corsika::sibyll {
+  template <typename TEnvironment>
+  InteractionModel<TEnvironment>::InteractionModel(TEnvironment const& environment)
+      : hadronSibyll_{}
+      , nuclearSibyll_{hadronSibyll_, environment} {}
+
+  template <typename TEnvironment>
+  HadronInteractionModel& InteractionModel<TEnvironment>::getHadronInteractionModel() {
+    return hadronSibyll_;
+  }
+
+  template <typename TEnvironment>
+  typename InteractionModel<TEnvironment>::nuclear_model_type&
+  InteractionModel<TEnvironment>::getNuclearInteractionModel() {
+    return nuclearSibyll_;
+  }
+
+  template <typename TEnvironment>
+  CrossSectionType InteractionModel<TEnvironment>::getCrossSection(
+      Code projCode, Code targetCode, FourMomentum const& proj4mom,
+      FourMomentum const& target4mom) const {
+    if (is_nucleus(projCode))
+      return getNuclearInteractionModel().getCrossSection(projCode, targetCode, proj4mom,
+                                                          target4mom);
+    else
+      return getHadronInteractionModel().getCrossSection(projCode, targetCode, proj4mom,
+                                                         target4mom);
+  }
+
+  template <typename TEnvironment>
+  template <typename TSecondaries>
+  void InteractionModel<TEnvironment>::doInteraction(TSecondaries& view, Code projCode,
+                                                     Code targetCode,
+                                                     FourMomentum const& proj4mom,
+                                                     FourMomentum const& target4mom) {
+    if (is_nucleus(projCode))
+      return getNuclearInteractionModel().doInteraction(view, projCode, targetCode,
+                                                        proj4mom, target4mom);
+    else
+      return getHadronInteractionModel().doInteraction(view, projCode, targetCode,
+                                                       proj4mom, target4mom);
+  }
+} // namespace corsika::sibyll
diff --git a/corsika/modules/Sibyll.hpp b/corsika/modules/Sibyll.hpp
index 74dec3158..d01692871 100644
--- a/corsika/modules/Sibyll.hpp
+++ b/corsika/modules/Sibyll.hpp
@@ -13,6 +13,8 @@
 #include <corsika/modules/sibyll/Decay.hpp>
 #include <corsika/modules/sibyll/NuclearInteractionModel.hpp>
 
+#include <corsika/modules/sibyll/InteractionModel.hpp>
+
 #include <corsika/framework/process/InteractionProcess.hpp>
 
 /**
@@ -29,7 +31,9 @@ namespace corsika::sibyll {
    * The sibyll::InteractionModel is wrapped as an InteractionProcess here in order
    * to provide all the functions for ProcessSequence.
    */
-  class Interaction : public HadronInteractionModel, public InteractionProcess<Interaction> {};
+  template <typename TEnvironment>
+  class Interaction : public InteractionModel<TEnvironment>,
+                      public InteractionProcess<Interaction<TEnvironment>> {};
 
   /**
    * @brief sibyll::NuclearInteraction is the process for ProcessSequence.
diff --git a/corsika/modules/sibyll/InteractionModel.hpp b/corsika/modules/sibyll/InteractionModel.hpp
new file mode 100644
index 000000000..262b3271c
--- /dev/null
+++ b/corsika/modules/sibyll/InteractionModel.hpp
@@ -0,0 +1,31 @@
+#include <corsika/framework/core/ParticleProperties.hpp>
+#include <corsika/framework/core/PhysicalUnits.hpp>
+#include <corsika/framework/geometry/FourVector.hpp>
+#include <corsika/modules/sibyll/HadronInteractionModel.hpp>
+#include <corsika/modules/sibyll/NuclearInteractionModel.hpp>
+
+namespace corsika::sibyll {
+  template <typename TEnvironment>
+  class InteractionModel {
+  public:
+    using nuclear_model_type =
+        NuclearInteractionModel<TEnvironment, HadronInteractionModel>;
+    InteractionModel(TEnvironment const&);
+
+    CrossSectionType getCrossSection(Code, Code, FourMomentum const&,
+                                     FourMomentum const&) const;
+
+    template <typename TSecondaries>
+    void doInteraction(TSecondaries&, Code, Code, FourMomentum const&,
+                       FourMomentum const&);
+
+    HadronInteractionModel& getHadronInteractionModel();
+    nuclear_model_type& getNuclearInteractionModel();
+
+  private:
+    HadronInteractionModel hadronSibyll_;
+    nuclear_model_type nuclearSibyll_;
+  };
+} // namespace corsika::sibyll
+
+#include <corsika/detail/modules/sibyll/InteractionModel.inl>
-- 
GitLab