diff --git a/corsika/detail/framework/process/ProcessSequence.inl b/corsika/detail/framework/process/ProcessSequence.inl index 9a9cc4d4f00f96a451f403262b87a501ce317552..1240e6c4e60520a16b2ca4316c4da87f3001cd28 100644 --- a/corsika/detail/framework/process/ProcessSequence.inl +++ b/corsika/detail/framework/process/ProcessSequence.inl @@ -121,7 +121,9 @@ namespace corsika { //~ "doContinuous(TParticle [const]&,TTrack [const]&,bool)\" required for " //~ "ContinuousProcess<TDerived>. "); - ret |= A_.doContinuous(step, limitId == ContinuousProcessIndex(IndexProcess1)); + ret |= A_.doContinuous( + step, limitId == ContinuousProcessIndex( + static_cast<void const*>(std::addressof(A_)))); } } @@ -142,7 +144,9 @@ namespace corsika { //~ "doContinuous(TParticle [const]&,TTrack [const]&,bool)\" required for " //~ "ContinuousProcess<TDerived>. "); - ret |= B_.doContinuous(step, limitId == ContinuousProcessIndex(IndexProcess2)); + ret |= B_.doContinuous( + step, limitId == ContinuousProcessIndex( + static_cast<void const*>(std::addressof(B_)))); } } @@ -279,8 +283,9 @@ namespace corsika { "getMaxStepLength(TParticle const&, TTrack const&)\" required for " "ContinuousProcess<TDerived>. "); - ContinuousProcessStepLength const step(A_.getMaxStepLength(particle, vTrack), - ContinuousProcessIndex(IndexProcess1)); + ContinuousProcessStepLength const step( + A_.getMaxStepLength(particle, vTrack), + ContinuousProcessIndex(static_cast<void const*>(std::addressof(A_)))); max_length = std::min(max_length, step); } } @@ -299,8 +304,9 @@ namespace corsika { "getMaxStepLength(TParticle const&, TTrack const&)\" required for " "ContinuousProcess<TDerived>. "); - ContinuousProcessStepLength const step(B_.getMaxStepLength(particle, vTrack), - ContinuousProcessIndex(IndexProcess2)); + ContinuousProcessStepLength const step( + B_.getMaxStepLength(particle, vTrack), + ContinuousProcessIndex(static_cast<void const*>(std::addressof(B_)))); max_length = std::min(max_length, step); } } diff --git a/corsika/detail/framework/process/SwitchProcessSequence.inl b/corsika/detail/framework/process/SwitchProcessSequence.inl index 0fbe23aacd022fa146dac2c756328777a0ec0703..0e4584a7625a48c5331c55cca2a41331bb4bf16a 100644 --- a/corsika/detail/framework/process/SwitchProcessSequence.inl +++ b/corsika/detail/framework/process/SwitchProcessSequence.inl @@ -99,7 +99,9 @@ namespace corsika { // "doContinuous(TParticle[const]&,TTrack[const]&,bool)\" required for // " "ContinuousProcess<TDerived>. "); - return A_.doContinuous(step, idLimit == ContinuousProcessIndex(IndexProcess1)); + return A_.doContinuous( + step, idLimit == ContinuousProcessIndex( + static_cast<void const*>(std::addressof(A_)))); } } else { if constexpr (process2_type::is_process_sequence) { @@ -120,7 +122,9 @@ namespace corsika { // "doContinuous(TParticle [const]&,TTrack[const]&,bool)\" required for // " "ContinuousProcess<TDerived>. "); - return B_.doContinuous(step, idLimit == ContinuousProcessIndex(IndexProcess2)); + return B_.doContinuous( + step, idLimit == ContinuousProcessIndex( + static_cast<void const*>(std::addressof(B_)))); } } return ProcessReturn::Ok; @@ -184,8 +188,9 @@ namespace corsika { "getMaxStepLength(TParticle const&, TTrack const&)\" required for " "ContinuousProcess<TDerived>. "); - return ContinuousProcessStepLength(A_.getMaxStepLength(particle, vTrack), - ContinuousProcessIndex(IndexProcess1)); + return ContinuousProcessStepLength( + A_.getMaxStepLength(particle, vTrack), + ContinuousProcessIndex(static_cast<void const*>(std::addressof(A_)))); } } else { if constexpr (process2_type::is_process_sequence) { @@ -200,8 +205,9 @@ namespace corsika { "getMaxStepLength(TParticle const&, TTrack const&)\" required for " "ContinuousProcess<TDerived>. "); - return ContinuousProcessStepLength(B_.getMaxStepLength(particle, vTrack), - ContinuousProcessIndex(IndexProcess2)); + return ContinuousProcessStepLength( + B_.getMaxStepLength(particle, vTrack), + ContinuousProcessIndex(static_cast<void const*>(std::addressof(B_)))); } } diff --git a/corsika/framework/process/ContinuousProcessIndex.hpp b/corsika/framework/process/ContinuousProcessIndex.hpp index 7192b86bf968ffdc74b5420940ea549befa12c73..6898633e9b3cde1b6446ed2fe09b1ce4c2297d92 100644 --- a/corsika/framework/process/ContinuousProcessIndex.hpp +++ b/corsika/framework/process/ContinuousProcessIndex.hpp @@ -19,16 +19,16 @@ namespace corsika { class ContinuousProcessIndex { public: ContinuousProcessIndex() - : id_(-1) {} // default - ContinuousProcessIndex(int const id) + : id_(nullptr) {} // default + ContinuousProcessIndex(void const* id) : id_(id) {} - void setIndex(int const id) { id_ = id; } - int getIndex() const { return id_; } + void setIndex(void const* id) { id_ = id; } + void const* getIndex() const { return id_; } bool operator==(ContinuousProcessIndex const v) const { return id_ == v.id_; } - bool operator!=(ContinuousProcessIndex const v) const { return id_ != v.id_; } + bool operator!=(ContinuousProcessIndex const v) const { return !(*this == v); } private: - int id_; + void const* id_; }; } // namespace corsika diff --git a/tests/framework/testProcessSequence.cpp b/tests/framework/testProcessSequence.cpp index 2686b2cca2354dcba06127002105fefe6251b6c2..a7f23a329e5c42e0a0407f249b679c86f814274a 100644 --- a/tests/framework/testProcessSequence.cpp +++ b/tests/framework/testProcessSequence.cpp @@ -535,7 +535,7 @@ TEST_CASE("ProcessSequence General", "ProcessSequence") { int const nLoop = 5; CORSIKA_LOG_DEBUG("Running loop with n={}", nLoop); for (int iLoop = 0; iLoop < nLoop; ++iLoop) { - sequence2.doContinuous(step, ContinuousProcessIndex(1)); + sequence2.doContinuous(step, ContinuousProcessIndex(&cp1)); } CHECK(step.getDiffT() / 1_s == Approx(77)); CHECK(step.getDiffEkin() / 1_eV == Approx(7)); @@ -692,7 +692,7 @@ TEST_CASE("SwitchProcessSequence", "ProcessSequence") { checkSec = 0; checkCont = 0; particle.data_[0] = 100; // data positive --> sequence1 - sequence3.doContinuous(step, ContinuousProcessIndex(1)); + sequence3.doContinuous(step, ContinuousProcessIndex(&cp1)); CHECK(checkInteract == 0); CHECK(checkDecay == 0); CHECK(checkCont == 0b011); @@ -703,7 +703,7 @@ TEST_CASE("SwitchProcessSequence", "ProcessSequence") { checkSec = 0; checkCont = 0; particle.data_[0] = -100; // data negative --> sequence2 - sequence3.doContinuous(step, ContinuousProcessIndex(1)); + sequence3.doContinuous(step, ContinuousProcessIndex(&cp1)); CHECK(checkInteract == 0); CHECK(checkDecay == 0); CHECK(checkCont == 0b101); @@ -1089,12 +1089,11 @@ TEST_CASE("SelectInteractionZeroCrossSection", "ProcessSequence") { auto sequence = make_sequence(ProcessZero()); + FourMomentum const projectileP4{10_GeV, {rootCS, {0_eV, 0_eV, 0_eV}}}; + DummyData particle; - DummyTrajectory track; DummyView view(particle); - FourMomentum const projectileP4{10_GeV, {rootCS, {0_eV, 0_eV, 0_eV}}}; - CrossSectionType cx_select = sequence.getCrossSection(particle, Code::Nitrogen, projectileP4); CHECK(cx_select == 0_mb); // should be zero @@ -1105,4 +1104,184 @@ TEST_CASE("SelectInteractionZeroCrossSection", "ProcessSequence") { sequence.selectInteraction(view, projectileP4, noComposition, rng, 0_mb); CHECK(!isInteracted(retValue)); // cross section of process sequence is zero, no process // should cause an interaction -} \ No newline at end of file +} + +TEST_CASE("SwitchProcessSequence Indexing", "ProcessSequence") { + // see issue https://gitlab.iap.kit.edu/AirShowerPhysics/corsika/-/issues/573 + // and issue https://gitlab.iap.kit.edu/AirShowerPhysics/corsika/-/issues/586 + + logging::set_level(logging::level::info); + + CoordinateSystemPtr rootCS = get_root_CoordinateSystem(); + + struct SwitchSelect { + bool operator()(DummyData const& p) const { return (p.data_[0] > 0); } + }; + SwitchSelect select1; + + auto cp1 = ContinuousProcess1(0, 0_m); + auto cp2 = ContinuousProcess1(0, 0_m); + auto cp3 = ContinuousProcess1(0, 0_m); + auto cp4 = ContinuousProcess1(0, 0_m); + + auto switch_sequence = make_select(select1, cp1, cp2); + auto sequence = make_sequence(switch_sequence, cp3, cp4); + + CHECK(sequence.getNumberOfProcesses() == 4); + CHECK(switch_sequence.getNumberOfProcesses() == 2); + + DummyData particle; + DummyTrajectory track; + DummyView view(particle); + Step step(particle, track); + + // cp1 selected + cp1.setStep(1_m); + cp2.setStep(100_m); + cp3.setStep(100_m); + cp4.setStep(100_m); + particle.data_[0] = 1; // positive so that cp1 is selected + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + ContinuousProcessStepLength continuousMaxStep = + sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); + + // cp2 selected + cp1.setStep(100_m); + cp2.setStep(1_m); + cp3.setStep(100_m); + cp4.setStep(100_m); + particle.data_[0] = -1; // negative so that cp2 is selected + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); + + // cp3 selected + cp1.setStep(100_m); + cp2.setStep(100_m); + cp3.setStep(1_m); + cp4.setStep(100_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); + + // cp4 selected + cp1.setStep(100_m); + cp2.setStep(100_m); + cp3.setStep(100_m); + cp4.setStep(1_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK_FALSE(cp4.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + CHECK(cp4.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + cp4.resetFlag(); +} + +TEST_CASE("Nested ProcessSequence", "ProcessSequence") { + // + + logging::set_level(logging::level::info); + + CoordinateSystemPtr rootCS = get_root_CoordinateSystem(); + + auto cp1 = ContinuousProcess1(0, 0_m); + auto cp2 = ContinuousProcess1(0, 0_m); + auto cp3 = ContinuousProcess1(0, 0_m); + + auto sequence = make_sequence(make_sequence(cp1, cp2), cp3); + + CHECK(sequence.getNumberOfProcesses() == 3); + + DummyData particle; + DummyTrajectory track; + DummyView view(particle); + Step step(particle, track); + + // cp1 selected + cp1.setStep(1_m); + cp2.setStep(100_m); + cp3.setStep(100_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + ContinuousProcessStepLength continuousMaxStep = + sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + + // cp2 selected + cp1.setStep(100_m); + cp2.setStep(1_m); + cp3.setStep(100_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + cp1.resetFlag(); + cp2.resetFlag(); + cp3.resetFlag(); + + // cp3 selected + cp1.setStep(100_m); + cp2.setStep(100_m); + cp3.setStep(1_m); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK_FALSE(cp3.getFlag()); + continuousMaxStep = sequence.getMaxStepLength(particle, track); + sequence.doContinuous(step, continuousMaxStep.getIndex()); + CHECK_FALSE(cp1.getFlag()); + CHECK_FALSE(cp2.getFlag()); + CHECK(cp3.getFlag()); +}