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