From 11a8fcc78882a22d611f6d8f89e497321a3f3f6b Mon Sep 17 00:00:00 2001 From: ralfulrich <ralf.ulrich@kit.edu> Date: Wed, 19 Sep 2018 15:05:06 +0200 Subject: [PATCH] updated process interface --- .../Examples/staticsequence_example.cc | 12 ++++++---- Framework/Cascade/Cascade.h | 14 ++++++------ Framework/Cascade/testCascade.cc | 8 ++++--- Framework/ProcessSequence/CMakeLists.txt | 1 + Framework/ProcessSequence/ProcessReturn.h | 18 +++++++++++++++ Framework/ProcessSequence/ProcessSequence.h | 22 ++++++++++++------- .../ProcessSequence/testProcessSequence.cc | 14 +++++++----- 7 files changed, 62 insertions(+), 27 deletions(-) create mode 100644 Framework/ProcessSequence/ProcessReturn.h diff --git a/Documentation/Examples/staticsequence_example.cc b/Documentation/Examples/staticsequence_example.cc index 6b8406739..9acbc412a 100644 --- a/Documentation/Examples/staticsequence_example.cc +++ b/Documentation/Examples/staticsequence_example.cc @@ -11,8 +11,9 @@ class Process1 : public BaseProcess<Process1> { public: Process1() {} template <typename D, typename T, typename S> - void DoContinuous(D& d, T& t, S& s) const { + EProcessReturn DoContinuous(D& d, T& t, S& s) const { for (int i = 0; i < 10; ++i) d.p[i] += 1; + return EProcessReturn::eOk; } }; @@ -21,8 +22,9 @@ public: Process2() {} template <typename D, typename T, typename S> - inline void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { // for (int i=0; i<10; ++i) d.p[i] *= 2; + return EProcessReturn::eOk; } }; @@ -32,8 +34,9 @@ public: Process3() {} template <typename D, typename T, typename S> - inline void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { // for (int i=0; i<10; ++i) d.p[i] += fV; + return EProcessReturn::eOk; } private: @@ -45,8 +48,9 @@ public: // Process4(const int v) : fV(v) {} Process4() {} template <typename D, typename T, typename S> - inline void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { // for (int i=0; i<10; ++i) d.p[i] /= fV; + return EProcessReturn::eOk; } private: diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index 3ef8ce928..ebadbd8a6 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -4,6 +4,7 @@ #include <corsika/geometry/LineTrajectory.h> // to be removed #include <corsika/geometry/Point.h> // to be removed #include <corsika/units/PhysicalUnits.h> +#include <corsika/process/ProcessReturn.h> using namespace corsika::units::si; @@ -47,7 +48,7 @@ namespace corsika::cascade { // DoCascadeEquations(); // } } - + void Step(Particle& particle) { double nextStep = fProcesseList.MinStepLength(particle); corsika::geometry::CoordinateSystem root; @@ -55,13 +56,12 @@ namespace corsika::cascade { corsika::geometry::Point(root, {0_m, 0_m, 0_m}), corsika::geometry::Vector<corsika::units::si::SpeedType::dimension_type>( root, 0 * 1_m / second, 0 * 1_m / second, 1 * 1_m / second)); - fProcesseList.DoContinuous(particle, trajectory, fStack); - // if (particle.IsMarkedToBeDeleted()) - { - // std::cout << "DELETET THISSKSKJD!" << std::endl; - // fStack.Delete(particle); + corsika::process::EProcessReturn status = fProcesseList.DoContinuous(particle, trajectory, fStack); + if (status==corsika::process::EProcessReturn::eParticleAbsorbed) { + fStack.Delete(particle); + } else { + fProcesseList.DoDiscrete(particle, fStack); } - fProcesseList.DoDiscrete(particle, fStack); } private: diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc index 7e0bd76ba..c110455cb 100644 --- a/Framework/Cascade/testCascade.cc +++ b/Framework/Cascade/testCascade.cc @@ -25,7 +25,8 @@ public: } template <typename Particle, typename Trajectory, typename Stack> - void DoContinuous(Particle& p, Trajectory& t, Stack& s) const {} + EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const { return EProcessReturn::eOk; +} template <typename Particle, typename Stack> void DoDiscrete(Particle& p, Stack& s) const { @@ -59,9 +60,9 @@ public: } template <typename Particle, typename Trajectory, typename Stack> - void DoContinuous(Particle& p, Trajectory& t, Stack& s) const { + EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const { static int countStep = 0; - if (!fReport) return; + if (!fReport) return EProcessReturn::eOk; //std::cout << "generation " << countStep << std::endl; int i = 0; EnergyType Etot = 0_GeV; @@ -76,6 +77,7 @@ public: countStep++; //cout << "#=" << countStep << " " << s.GetSize() << " " << Etot/1_GeV << endl; cout << countStep << " " << s.GetSize() << " " << Etot/1_GeV << " " << fCount << endl; + return EProcessReturn::eOk; } template <typename Particle, typename Stack> diff --git a/Framework/ProcessSequence/CMakeLists.txt b/Framework/ProcessSequence/CMakeLists.txt index ac853c837..9852db42b 100644 --- a/Framework/ProcessSequence/CMakeLists.txt +++ b/Framework/ProcessSequence/CMakeLists.txt @@ -11,6 +11,7 @@ set ( set ( CORSIKAprocesssequence_HEADERS ProcessSequence.h + ProcessReturn.h ) CORSIKA_COPY_HEADERS_TO_NAMESPACE (CORSIKAprocesssequence ${CORSIKAprocesssequence_NAMESPACE} ${CORSIKAprocesssequence_HEADERS}) diff --git a/Framework/ProcessSequence/ProcessReturn.h b/Framework/ProcessSequence/ProcessReturn.h new file mode 100644 index 000000000..9813b0256 --- /dev/null +++ b/Framework/ProcessSequence/ProcessReturn.h @@ -0,0 +1,18 @@ +#ifndef _include_ProcessReturn_h_ +#define _include_ProcessReturn_h_ + +namespace corsika::process { + + /** + since in a process sequence many status updates can accumulate + for a single particle, this enum should define only bit-flags + that can be accumulated easily with "|=" + */ + + enum class EProcessReturn { + eOk = 1, + eParticleAbsorbed = 2, + }; +} + +#endif diff --git a/Framework/ProcessSequence/ProcessSequence.h b/Framework/ProcessSequence/ProcessSequence.h index 75ab8dad3..f11c45f5b 100644 --- a/Framework/ProcessSequence/ProcessSequence.h +++ b/Framework/ProcessSequence/ProcessSequence.h @@ -1,12 +1,14 @@ #ifndef _include_ProcessSequence_h_ #define _include_ProcessSequence_h_ +#include <corsika/process/ProcessReturn.h> + #include <cmath> #include <iostream> #include <typeinfo> -namespace corsika::process { - +namespace corsika::process { + /** \class BaseProcess @@ -44,9 +46,11 @@ namespace corsika::process { , B(in_B) {} template <typename Particle, typename Trajectory, typename Stack> - inline void DoContinuous(Particle& p, Trajectory& t, Stack& s) const { - A.DoContinuous(p, t, s); - B.DoContinuous(p, t, s); + inline EProcessReturn DoContinuous(Particle& p, Trajectory& t, Stack& s) const { + EProcessReturn ret = EProcessReturn::eOk; + /*ret |=*/ A.DoContinuous(p, t, s); + /*ret |=*/ B.DoContinuous(p, t, s); + return ret; } // add trajectory template <typename D> @@ -54,9 +58,11 @@ namespace corsika::process { return std::min(A.MinStepLength(d), B.MinStepLength(d)); } - // template<typename D> - // inline Trajectory Transport(D& d, double& length) const { A.Transport(d, length); - // B.Transport(d, length); } + template <typename Particle, typename Trajectory> + inline Trajectory Transport(Particle& p, double& length) const { + A.Transport(p, length); // todo: maybe check (?) if there is more than one Transport process implemented?? + return B.Transport(p, length); // need to do this also to decide which Trajectory to return!!!! + } template <typename Particle, typename Stack> void DoDiscrete(Particle& p, Stack& s) const { diff --git a/Framework/ProcessSequence/testProcessSequence.cc b/Framework/ProcessSequence/testProcessSequence.cc index d057facff..efb0a0b2a 100644 --- a/Framework/ProcessSequence/testProcessSequence.cc +++ b/Framework/ProcessSequence/testProcessSequence.cc @@ -16,8 +16,9 @@ public: Process1() {} void Init() {} // cout << "Process1::Init" << endl; } template <typename D, typename T, typename S> - void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { for (int i = 0; i < 10; ++i) d.p[i] += 1 + i; + return EProcessReturn::eOk; } }; @@ -26,8 +27,9 @@ public: Process2() {} void Init() {} // cout << "Process2::Init" << endl; } template <typename D, typename T, typename S> - inline void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { for (int i = 0; i < 10; ++i) d.p[i] *= 0.7; + return EProcessReturn::eOk; } }; @@ -36,8 +38,9 @@ public: Process3() {} void Init() {} // cout << "Process3::Init" << endl; } template <typename D, typename T, typename S> - inline void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { for (int i = 0; i < 10; ++i) d.p[i] += 0.933; + return EProcessReturn::eOk; } }; @@ -46,9 +49,10 @@ public: Process4() {} void Init() {} // cout << "Process4::Init" << endl; } template <typename D, typename T, typename S> - inline void DoContinuous(D& d, T& t, S& s) const { + inline EProcessReturn DoContinuous(D& d, T& t, S& s) const { for (int i = 0; i < 10; ++i) d.p[i] /= 1.2; - } + return EProcessReturn::eOk; + } // inline double MinStepLength(D& d) { // void DoDiscrete(Particle& p, Stack& s) const { }; -- GitLab