From 2c3c6d932b40cdbb9ce32ab3b8a1319ec4da46a2 Mon Sep 17 00:00:00 2001 From: Andre Schmidt <schmidt-a@ikp-admins@lists.kit.edu> Date: Tue, 18 Aug 2020 15:31:18 +0200 Subject: [PATCH] solved transition error --- Framework/Cascade/Cascade.h | 23 ++++++++----------- .../ObservationPlane/ObservationPlane.cc | 5 ++-- Processes/TrackingLine/TrackingLine.h | 13 ++++++++--- 3 files changed, 23 insertions(+), 18 deletions(-) diff --git a/Framework/Cascade/Cascade.h b/Framework/Cascade/Cascade.h index 9ba4c4bc8..9d0a296d5 100644 --- a/Framework/Cascade/Cascade.h +++ b/Framework/Cascade/Cascade.h @@ -229,18 +229,15 @@ namespace corsika::cascade { // take minimum of geometry, interaction, decay for next step auto min_distance = std::min( {distance_interact, distance_decay, distance_max, geomMaxLength}); - if (min_distance == geomMaxLength) { - min_distance = 1.001 * geomMaxLength; - } C8LOG_DEBUG("transport particle by : {} m", min_distance / 1_m); // determine displacement by the magnetic field - auto const* currentLogicalVolumeNode = vParticle.GetNode(); + auto const* currentLogicalVolumeNode = vParticle.GetNode(); auto magneticfield = currentLogicalVolumeNode->GetModelProperties().GetMagneticField(vParticle.GetPosition()); geometry::Vector<SpeedType::dimension_type> velocity = vParticle.GetMomentum() / vParticle.GetEnergy() * corsika::units::constants::c; - geometry::Vector<dimensionless_d> const directionBefore = velocity.normalized(); + geometry::Vector<dimensionless_d> const directionBefore = velocity.normalized(); int chargeNumber; if (corsika::particles::IsNucleus(vParticle.GetPID())) { chargeNumber = vParticle.GetNuclearZ(); @@ -250,19 +247,19 @@ namespace corsika::cascade { auto k = chargeNumber * corsika::units::constants::cSquared * 1_eV / (velocity.GetNorm() * vParticle.GetEnergy() * 1_V); - // First Movement - // assuming magnetic field does not change during movement - auto position = vParticle.GetPosition() + directionBefore * min_distance / 2; - // Change of direction by magnetic field - geometry::Vector<dimensionless_d> const directionAfter = directionBefore + directionBefore.cross(magneticfield) * + // First Movement + // assuming magnetic field does not change during movement + auto position = vParticle.GetPosition() + directionBefore * min_distance / 2; + // Change of direction by magnetic field + geometry::Vector<dimensionless_d> const directionAfter = directionBefore + directionBefore.cross(magneticfield) * min_distance * k; - // Second Movement - position = position + directionAfter * min_distance / 2; + // Second Movement + position = position + directionAfter * min_distance / 2; auto distance = position - vParticle.GetPosition(); // distance.norm() != min_distance if q != 0 // small error can be neglected if (distance.norm() != 0_m) { - velocity = distance.normalized() * velocity.norm(); + velocity = distance.normalized() * velocity.norm(); } // no velocity update for very small steps // here the particle is actually moved along the trajectory to new position: diff --git a/Processes/ObservationPlane/ObservationPlane.cc b/Processes/ObservationPlane/ObservationPlane.cc index d12a55f5a..b135f9c7a 100644 --- a/Processes/ObservationPlane/ObservationPlane.cc +++ b/Processes/ObservationPlane/ObservationPlane.cc @@ -71,7 +71,7 @@ LengthType ObservationPlane::MaxStepLength(setup::Stack::ParticleType const& vPa auto magneticfield = currentLogicalVolumeNode->GetModelProperties().GetMagneticField(vParticle.GetPosition()); geometry::Vector<SpeedType::dimension_type> const velocity = trajectory.GetV0(); - if (chargeNumber != 0 && plane_.GetNormal().dot(velocity.cross(magneticfield)) * 1_s / 1_m / 1_T != 0) { + if (chargeNumber != 0 && plane_.GetNormal().dot(velocity.cross(magneticfield)) * 1_s / 1_m / 1_T > 0.0001) { auto const* currentLogicalVolumeNode = vParticle.GetNode(); auto magneticfield = currentLogicalVolumeNode->GetModelProperties().GetMagneticField(vParticle.GetPosition()); auto k = chargeNumber * corsika::units::constants::cSquared * 1_eV / @@ -88,12 +88,13 @@ LengthType ObservationPlane::MaxStepLength(setup::Stack::ParticleType const& vPa plane_.GetNormal().dot(velocity.cross(magneticfield)) * 2 * k)) - velocity.dot(plane_.GetNormal()) / velocity.GetNorm() ) / (plane_.GetNormal().dot(velocity.cross(magneticfield)) * k); - if (MaxStepLength1 <= 0_m && MaxStepLength2 <= 0_m) { return std::numeric_limits<double>::infinity() * 1_m; } else if (MaxStepLength1 <= 0_m || MaxStepLength2 < MaxStepLength1) { + std::cout << " distance to obs plane : " << MaxStepLength2 << std::endl; return MaxStepLength2 * 1.0001; } else if (MaxStepLength2 <= 0_m || MaxStepLength1 < MaxStepLength2) { + std::cout << " distance to obs plane : " << MaxStepLength1 << std::endl; return MaxStepLength1 * 1.0001; } } diff --git a/Processes/TrackingLine/TrackingLine.h b/Processes/TrackingLine/TrackingLine.h index eff54e7e2..a888cffaa 100644 --- a/Processes/TrackingLine/TrackingLine.h +++ b/Processes/TrackingLine/TrackingLine.h @@ -111,12 +111,13 @@ namespace corsika::process { for (int i = 0; i < 4; i++) { if (solutions[i].imag() == 0 && solutions[i].real() > 0) { tmp.push_back(solutions[i].real()); + std::cout << "Solutions for next Volume: " << solutions[i].real() << std::endl; } } LengthType Steplength; if (tmp.size() > 0) { Steplength = 1_m * *std::min_element(tmp.begin(),tmp.end()); - std::cout << "s = " << Steplength << std::endl; + std::cout << "Steplength to next volume = " << Steplength << std::endl; } else { std::cout << "no intersection (1)!" << std::endl; // what to do when this happens? (very unlikely) @@ -172,12 +173,18 @@ namespace corsika::process { for (int i = 0; i < 4; i++) { if (solutions[i].imag() == 0 && solutions[i].real() > 0) { tmp.push_back(solutions[i].real()); + std::cout << "Solutions for current Volume: " << solutions[i].real() << std::endl; } } LengthType Steplength; if (tmp.size() > 0) { - Steplength = 1_m * *std::min_element(tmp.begin(),tmp.end()); - std::cout << "s = " << Steplength << std::endl; + Steplength = 1_m * *std::min_element(tmp.begin(),tmp.end()); + if (numericallyInside == false) { + int p = std::min_element(tmp.begin(),tmp.end()) - tmp.begin(); + tmp.erase(tmp.begin() + p); + Steplength = 1_m * *std::min_element(tmp.begin(),tmp.end()); + } + std::cout << "steplength out of current volume = " << Steplength << std::endl; } else { std::cout << "no intersection (2)!" << std::endl; // what to do when this happens? (very unlikely) -- GitLab