diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index f5d88b33f99834416bd569b0f53623b630db5add..0e920cc4bb6e2fa1eb5e25378848ab57c8d8a0a7 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -12,11 +12,11 @@ #ifndef _include_Cascade_h_ #define _include_Cascade_h_ -#include <corsika/geometry/LineTrajectory.h> // to be removed. for dummy trajectory only -#include <corsika/geometry/Point.h> // to be removed. for dummy trajectory only #include <corsika/process/ProcessReturn.h> #include <corsika/units/PhysicalUnits.h> +#include <corsika/setup/SetupTrajectory.h> + using namespace corsika::units::si; namespace corsika::cascade { @@ -62,16 +62,17 @@ namespace corsika::cascade { // DoCascadeEquations(); // } } - + void Step(Particle& particle) { [[maybe_unused]] double nextStep = fProcesseList.MinStepLength(particle); // corsika::utls::ignore(nextStep); auto const root = corsika::geometry::CoordinateSystem::CreateRootCS(); - corsika::geometry::LineTrajectory + corsika::geometry::Trajectory<corsika::geometry::Line> trajectory( // trajectory is not yet used. this is a dummy. - 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)); + corsika::geometry::Line(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)), + 0_s, 1_s); corsika::process::EProcessReturn status = fProcesseList.DoContinuous(particle, trajectory, fStack); if (status == corsika::process::EProcessReturn::eParticleAbsorbed) { diff --git a/Framework/Cascade/testCascade.cc b/Framework/Cascade/testCascade.cc index f14a7a3151202947db66ab1cd5564e845e6754b8..edb825bc78e70961920dcba98c28b1de1d02d337 100644 --- a/Framework/Cascade/testCascade.cc +++ b/Framework/Cascade/testCascade.cc @@ -10,7 +10,6 @@ */ #include <corsika/cascade/Cascade.h> -#include <corsika/geometry/LineTrajectory.h> #include <corsika/process/ProcessSequence.h> #include <corsika/process/stack_inspector/StackInspector.h> diff --git a/Framework/Geometry/BaseTrajectory.h b/Framework/Geometry/BaseTrajectory.h index b39335c8c482bc18637fd28a95c90f2123fbaa40..8289e0dca67fbdaa2865fd7c7799ccf51d619c35 100644 --- a/Framework/Geometry/BaseTrajectory.h +++ b/Framework/Geometry/BaseTrajectory.h @@ -24,17 +24,37 @@ namespace corsika::geometry { */ class BaseTrajectory { + BaseTrajectory() = delete; + public: + BaseTrajectory(corsika::units::si::TimeType start, corsika::units::si::TimeType end) + : fTStart(start) + , fTEnd(end) {} + //!< for \f$ t = 0 \f$, the starting Point shall be returned. virtual Point GetPosition(corsika::units::si::TimeType) const = 0; + //!< the Point is return from u=0 (start) to u=1 (end) + virtual Point GetPosition(double u) const = 0; + /*! - * returns the arc length between two points of the trajectory + * returns the length between two points of the trajectory * parameterized by \arg t1 and \arg t2. Requires \arg t2 > \arg t1. */ - virtual LengthType DistanceBetween(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const = 0; + virtual LengthType GetDistance(corsika::units::si::TimeType t1, + corsika::units::si::TimeType t2) const = 0; + + virtual corsika::units::si::TimeType GetDuration( + corsika::units::si::TimeType t1, corsika::units::si::TimeType t2) const { + return t2 - t1; + } + + virtual Point GetEndpoint() const { return GetPosition(fTEnd); } + virtual Point GetStartpoint() const { return GetPosition(fTStart); } + + protected: + corsika::units::si::TimeType const fTStart, fTEnd; }; } // namespace corsika::geometry diff --git a/Framework/Geometry/CMakeLists.txt b/Framework/Geometry/CMakeLists.txt index 60992f4270249a7ad6d090086476849b9364e461..580066ae0fbe9e9f6c79c3980dd6a17bfc9c1fd9 100644 --- a/Framework/Geometry/CMakeLists.txt +++ b/Framework/Geometry/CMakeLists.txt @@ -8,14 +8,14 @@ set ( GEOMETRY_HEADERS Vector.h Point.h + Line.h Sphere.h CoordinateSystem.h Helix.h BaseVector.h QuantityVector.h - BaseTrajectory.h - LineTrajectory.h Trajectory.h + BaseTrajectory.h ) set ( diff --git a/Framework/Geometry/Helix.h b/Framework/Geometry/Helix.h index 018299bcf63fa83f6022ffbc56e733a618a5bd1f..b647688d45c012d5188dd5a8a6147eabdca75ffc 100644 --- a/Framework/Geometry/Helix.h +++ b/Framework/Geometry/Helix.h @@ -12,7 +12,6 @@ #ifndef _include_HELIX_H_ #define _include_HELIX_H_ -#include <corsika/geometry/BaseTrajectory.h> #include <corsika/geometry/Point.h> #include <corsika/geometry/Vector.h> #include <corsika/units/PhysicalUnits.h> @@ -31,7 +30,8 @@ namespace corsika::geometry { \f} */ - class Helix : public BaseTrajectory { + class Helix { + using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; Point const r0; @@ -51,7 +51,7 @@ namespace corsika::geometry { , uPerp(vPerp.cross(vPar.normalized())) , radius(pvPar.norm() / abs(pOmegaC)) {} - Point GetPosition(corsika::units::si::TimeType t) const override { + Point GetPosition(corsika::units::si::TimeType t) const { return r0 + vPar * t + (vPerp * (cos(omegaC * t) - 1) + uPerp * sin(omegaC * t)) / omegaC; } @@ -59,7 +59,7 @@ namespace corsika::geometry { auto GetRadius() const { return radius; } LengthType DistanceBetween(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const override { + corsika::units::si::TimeType t2) const { return (vPar + vPerp).norm() * (t2 - t1); } }; diff --git a/Framework/Geometry/LineTrajectory.h b/Framework/Geometry/Line.h similarity index 79% rename from Framework/Geometry/LineTrajectory.h rename to Framework/Geometry/Line.h index f13f8d822947e2b90fa9a7ba7f69d23f43b0c1f8..829c16044a274785f838f4975f78af4c42354744 100644 --- a/Framework/Geometry/LineTrajectory.h +++ b/Framework/Geometry/Line.h @@ -12,30 +12,30 @@ #ifndef _include_LINETRAJECTORY_H #define _include_LINETRAJECTORY_H -#include <corsika/geometry/BaseTrajectory.h> #include <corsika/geometry/Point.h> #include <corsika/geometry/Vector.h> #include <corsika/units/PhysicalUnits.h> namespace corsika::geometry { - class LineTrajectory : public BaseTrajectory { + class Line { + using VelocityVec = Vector<corsika::units::si::SpeedType::dimension_type>; Point const r0; VelocityVec const v0; public: - LineTrajectory(Point const& pR0, VelocityVec const& pV0) + Line(Point const& pR0, VelocityVec const& pV0) : r0(pR0) , v0(pV0) {} - Point GetPosition(corsika::units::si::TimeType t) const override { + Point GetPosition(corsika::units::si::TimeType t) const { return r0 + v0 * t; } - + LengthType DistanceBetween(corsika::units::si::TimeType t1, - corsika::units::si::TimeType t2) const override { + corsika::units::si::TimeType t2) const { assert(t2 >= t1); return v0.norm() * (t2 - t1); } diff --git a/Framework/Geometry/Trajectory.h b/Framework/Geometry/Trajectory.h index 237f37931e7ddc5ec6f23713c4fdcbc30123668a..97adfdd3bba6a4c449316b37fec428d77060c8db 100644 --- a/Framework/Geometry/Trajectory.h +++ b/Framework/Geometry/Trajectory.h @@ -17,28 +17,32 @@ namespace corsika::geometry { - class Trajectory { - corsika::units::si::TimeType const fTStart, fTEnd; - BaseTrajectory const& fTrajectory; + template <typename T> + class Trajectory : public BaseTrajectory { + + T fTraj; public: - Trajectory(corsika::units::si::TimeType pTStart, corsika::units::si::TimeType pTEnd, - BaseTrajectory const& pTrajectory) - : fTStart(pTStart) - , fTEnd(pTEnd) - , fTrajectory(pTrajectory) {} + Trajectory(T const& theT, corsika::units::si::TimeType pTStart, + corsika::units::si::TimeType pTEnd) + //: T(theT), fTStart(pTStart), fTEnd(pTEnd) {} + : BaseTrajectory(pTStart, pTEnd) + , fTraj(theT) {} Point GetPosition(corsika::units::si::TimeType t) const { - return fTrajectory.GetPosition(t + fTStart); + return fTraj.GetPosition(t + fTStart); } Point GetPosition(double u) const { return GetPosition(fTEnd * u + fTStart * (1 - u)); } + + LengthType GetDistance(corsika::units::si::TimeType t1, + corsika::units::si::TimeType t2) const { + return fTraj.DistanceBetween(t1, t2); + } + - auto GetEndpoint() const { return GetPosition(fTEnd); } - - auto GetStartpoint() const { return GetPosition(fTStart); } }; } // namespace corsika::geometry diff --git a/Framework/Geometry/testGeometry.cc b/Framework/Geometry/testGeometry.cc index 98527c0c18985bde8a0e574df1ed111e8132ac55..742938ffec44f3e65054313634f8c246c33f40e2 100644 --- a/Framework/Geometry/testGeometry.cc +++ b/Framework/Geometry/testGeometry.cc @@ -15,7 +15,7 @@ #include <corsika/geometry/CoordinateSystem.h> #include <corsika/geometry/Helix.h> -#include <corsika/geometry/LineTrajectory.h> +#include <corsika/geometry/Line.h> #include <corsika/geometry/Point.h> #include <corsika/geometry/Sphere.h> #include <corsika/geometry/Trajectory.h> @@ -144,17 +144,17 @@ TEST_CASE("Trajectories") { Vector<SpeedType::dimension_type> v0(rootCS, {1_m / second, 0_m / second, 0_m / second}); - LineTrajectory const lineTrajectory(r0, v0); - CHECK((lineTrajectory.GetPosition(2_s).GetCoordinates() - + Line const line(r0, v0); + CHECK((line.GetPosition(2_s).GetCoordinates() - QuantityVector<length_d>(2_m, 0_m, 0_m)) .norm() .magnitude() == Approx(0).margin(absMargin)); - BaseTrajectory const* base = &lineTrajectory; - CHECK(lineTrajectory.GetPosition(2_s).GetCoordinates() == - base->GetPosition(2_s).GetCoordinates()); + Trajectory<Line> base(line, 0_s, 1_s); + CHECK(line.GetPosition(2_s).GetCoordinates() == + base.GetPosition(2_s).GetCoordinates()); - CHECK(base->DistanceBetween(1_s, 2_s) / 1_m == Approx(1)); + CHECK(base.GetDistance(1_s, 2_s) / 1_m == Approx(1)); } SECTION("Helix") { @@ -178,10 +178,10 @@ TEST_CASE("Trajectories") { .norm() .magnitude() == Approx(0).margin(absMargin)); - BaseTrajectory const* base = &helix; + Trajectory<Helix> const base(helix, 0_s, 1_s); CHECK(helix.GetPosition(1234_s).GetCoordinates() == - base->GetPosition(1234_s).GetCoordinates()); + base.GetPosition(1234_s).GetCoordinates()); - CHECK(base->DistanceBetween(1_s, 2_s) / 1_m == Approx(5)); + CHECK(base.GetDistance(1_s, 2_s) / 1_m == Approx(5)); } } diff --git a/Setup/SetupTrajectory.h b/Setup/SetupTrajectory.h index ab95732be88bcc44489c78b7cf6343b4f4ee9dd7..d7f5c482d207ea04cfae1365ed7f11af13541f7f 100644 --- a/Setup/SetupTrajectory.h +++ b/Setup/SetupTrajectory.h @@ -12,11 +12,12 @@ #ifndef _corsika_setup_setuptrajectory_h_ #define _corsika_setup_setuptrajectory_h_ -#include <corsika/geometry/LineTrajectory.h> +#include <corsika/geometry/Line.h> +#include <corsika/geometry/Trajectory.h> namespace corsika::setup { - typedef corsika::geometry::LineTrajectory Trajectory; + typedef corsika::geometry::Trajectory<corsika::geometry::Line> Trajectory; } #endif