IAP GITLAB

Skip to content
Snippets Groups Projects
Commit 43305cfa authored by André Schmidt's avatar André Schmidt Committed by ralfulrich
Browse files

Move magneticfield to Tracking Line

parent b3969f61
No related branches found
No related tags found
No related merge requests found
......@@ -212,75 +212,32 @@ namespace corsika::cascade {
// convert next_decay from time to length [m]
LengthType const distance_decay = next_decay * vParticle.GetMomentum().norm() /
vParticle.GetEnergy() * units::constants::c;
// determine momentum after adding magnetic field
int chargeNumber;
if (corsika::particles::IsNucleus(vParticle.GetPID())) {
chargeNumber = vParticle.GetNuclearZ();
} else {
chargeNumber = corsika::particles::GetChargeNumber(vParticle.GetPID());
}
geometry::Vector<SpeedType::dimension_type> const velocity =
vParticle.GetMomentum() / vParticle.GetEnergy() * corsika::units::constants::c;
geometry::Vector<dimensionless_d> const directionBefore =
velocity / velocity.GetNorm();
auto magMaxLength = 1_m / 0;
auto directionAfter = directionBefore;
if (chargeNumber != 0) {
auto magneticfield = currentLogicalNode->GetModelProperties().
GetMagneticField(vParticle.GetPosition());
geometry::Vector<SpeedType::dimension_type> const velocityVerticalMag =
velocity - velocity.parallelProjectionOnto(magneticfield);
LengthType const gyroradius =
vParticle.GetEnergy() * velocityVerticalMag.GetNorm() * 1_V /
(corsika::units::constants::cSquared * abs(chargeNumber) *
magneticfield.GetNorm() * 1_eV);
// steplength depending on how exact it should
LengthType const Steplength = 0.01 * gyroradius;
// First Movement
auto position = vParticle.GetPosition() + directionBefore * Steplength / 2;
// Change of direction by magnetic field at position
magneticfield = currentLogicalNode->GetModelProperties.GetMagneticField(position);
directionAfter = directionBefore +
velocity.cross(magneticfield) * chargeNumber * Steplength *
corsika::units::constants::cSquared * 1_eV /
(vParticle.GetEnergy() * velocity.GetSquaredNorm() * 1_V);
// Second Movement
position = position + directionAfter * Steplength / 2;
magMaxLength = (position - vParticle.GetPosition()).GetNorm();
geometry::Vector<dimensionless_d> const direction =
(position - vParticle.GetPosition()) / magMaxLength;
vParticle.SetMomentum(direction * vParticle.GetMomentum().GetNorm());
std::cout << "New direction because of magnetic field: "
<< direction.GetComponents() << std::endl;
}
// determine geometric tracking
auto [step, geomMaxLength, nextVol] = fTracking.GetTrack(vParticle);
auto [step, geomMaxLength, nextVol, magMaxLength, directionBefore, directionAfter] = fTracking.GetTrack(vParticle);
[[maybe_unused]] auto const& dummy_nextVol = nextVol;
// convert next_step from grammage to length
LengthType const distance_interact =
currentLogicalNode->GetModelProperties().ArclengthFromGrammage(step,
next_interact);
// determine the maximum geometric step length
LengthType const distance_max = fProcessSequence.MaxStepLength(vParticle, step);
std::cout << "distance_max=" << distance_max << std::endl;
// take minimum of geometry, interaction, decay for next step
auto const min_distance = std::min(
{distance_interact, distance_decay, distance_max, geomMaxLength, magMaxLength});
auto const min_distance =
std::min({distance_interact, distance_decay, distance_max, geomMaxLength, magMaxLength});
C8LOG_DEBUG("transport particle by : {} m", min_distance / 1_m);
// here the particle is actually moved along the trajectory to new position:
// std::visit(setup::ParticleUpdate<Particle>{vParticle}, step);
vParticle.SetPosition(step.PositionFromArclength(min_distance));
// .... also update time, momentum, direction, ...
vParticle.SetMomentum((directionBefore * (1 - min_distance / magMaxLength) +
directionAfter * min_distance / magMaxLength) *
vParticle.GetMomentum().GetNorm());
// .... also update time, momentum, direction, ...
vParticle.SetMomentum((directionBefore * (1 - min_distance / magMaxLength) +
directionAfter * min_distance /magMaxLength) * vParticle.GetMomentum().GetNorm());
vParticle.SetTime(vParticle.GetTime() + min_distance / units::constants::c);
step.LimitEndTo(min_distance);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment