From 00d47c87a3b5c4fe537e31f34703f51edcf7a9c1 Mon Sep 17 00:00:00 2001 From: Maximilian Reininghaus <maximilian.reininghaus@kit.edu> Date: Mon, 15 Jun 2020 11:59:54 +0200 Subject: [PATCH] style, explanations --- Environment/ShowerAxis.cc | 17 +++++++++++------ Environment/ShowerAxis.h | 25 +++++++++++++------------ 2 files changed, 24 insertions(+), 18 deletions(-) diff --git a/Environment/ShowerAxis.cc b/Environment/ShowerAxis.cc index e7dd237d5..3ae28638a 100644 --- a/Environment/ShowerAxis.cc +++ b/Environment/ShowerAxis.cc @@ -1,5 +1,5 @@ /* - * (c) Copyright 2018 CORSIKA Project, corsika-project@lists.kit.edu + * (c) Copyright 2020 CORSIKA Project, corsika-project@lists.kit.edu * * See file AUTHORS for a list of contributors. * @@ -9,6 +9,7 @@ */ #include <corsika/environment/ShowerAxis.h> +#include <sstream> using namespace corsika::environment; using namespace corsika::units::si; @@ -19,21 +20,25 @@ GrammageType ShowerAxis::X(LengthType l) const { auto const lambda = fractionalBin - lower; int const upper = lower + 1; - if (upper >= steps) { - throw std::runtime_error("shower axis too short, cannot extrapolate"); + if (upper >= X_.size()) { + std::stringstream errormsg; + errormsg << "shower axis too short, cannot extrapolate (l / max_length_ = " + << l / max_length_ << ")"; + throw std::runtime_error(errormsg.str().c_str()); } else if (lower < 0) { throw std::runtime_error("cannot extrapolate to points behind point of injection"); } assert(0 <= lambda && lambda <= 1.); - return (*X_)[lower] * lambda + (*X_)[upper] * (1 - lambda); + // linear interpolation between X[lower] and X[upper] + return X_[lower] * lambda + X_[upper] * (1 - lambda); } LengthType ShowerAxis::steplength() const { return steplength_; } -GrammageType ShowerAxis::maximumX() const { return *(X_->rbegin()); } +GrammageType ShowerAxis::maximumX() const { return *X_.rbegin(); } -GrammageType ShowerAxis::minimumX() const { return *(X_->cbegin()); } +GrammageType ShowerAxis::minimumX() const { return *X_.cbegin(); } GrammageType ShowerAxis::projectedX(geometry::Point const& p) const { auto const projectedLength = (p - pointStart_).dot(axis_normalized_); diff --git a/Environment/ShowerAxis.h b/Environment/ShowerAxis.h index 888f53398..3d31a0c7c 100644 --- a/Environment/ShowerAxis.h +++ b/Environment/ShowerAxis.h @@ -31,12 +31,13 @@ namespace corsika::environment { template <typename TEnvModel> ShowerAxis(geometry::Point const& pStart, geometry::Vector<units::si::length_d> length, - environment::Environment<TEnvModel> const& env) + environment::Environment<TEnvModel> const& env, int steps = 10'000) : pointStart_(pStart) , length_(length) , max_length_(length_.norm()) , steplength_(max_length_ / steps) - , axis_normalized_(length / max_length_) { + , axis_normalized_(length / max_length_) + , X_(steps) { auto const* const universe = env.GetUniverse().get(); auto rho = [pStart, length, universe](double x) { @@ -56,15 +57,15 @@ namespace corsika::environment { auto const result = units::si::MassDensityType(phys::units::detail::magnitude_tag, r) * max_length_; - auto const resultTotal = result + (*X_)[i - 1]; - (*X_)[i] = resultTotal; + auto const resultTotal = result + X_[i - 1]; + X_[i] = resultTotal; for (; resultTotal > k * X_binning_; ++k) { d_.emplace_back(d_prev + k * X_binning_ * steplength_ / result); } } - assert(std::is_sorted(X_->cbegin(), X_->cend())); + assert(std::is_sorted(X_.cbegin(), X_.cend())); assert(std::is_sorted(d_.cbegin(), d_.cend())); } @@ -79,17 +80,17 @@ namespace corsika::environment { units::si::GrammageType X(units::si::LengthType) const; private: - static constexpr int steps = 10'000; - units::si::GrammageType const X_binning_ = std::invoke([]() { - using namespace units::si; - return 1_g / 1_cm / 1_cm; - }); - std::unique_ptr<std::array<units::si::GrammageType, steps>> const X_{ - new std::array<units::si::GrammageType, steps>}; geometry::Point const pointStart_; geometry::Vector<units::si::length_d> const length_; units::si::LengthType const max_length_, steplength_; geometry::Vector<units::si::dimensionless_d> const axis_normalized_; + std::vector<units::si::GrammageType> X_; + + // for storing the lengths corresponding to equidistant X values + units::si::GrammageType const X_binning_ = std::invoke([]() { + using namespace units::si; + return 1_g / 1_cm / 1_cm; + }); std::vector<units::si::LengthType> d_; }; } // namespace corsika::environment -- GitLab