Back to home page

EIC code displayed by LXR

 
 

    


File indexing completed on 2025-12-16 10:11:44

0001 //------------------------------- -*- C++ -*- -------------------------------//
0002 // Copyright Celeritas contributors: see top-level COPYRIGHT file for details
0003 // SPDX-License-Identifier: (Apache-2.0 OR MIT)
0004 //---------------------------------------------------------------------------//
0005 //! \file celeritas/phys/InteractionUtils.hh
0006 //---------------------------------------------------------------------------//
0007 #pragma once
0008 
0009 #include "corecel/Types.hh"
0010 #include "corecel/math/ArrayUtils.hh"
0011 #include "corecel/random/distribution/UniformRealDistribution.hh"
0012 #include "geocel/Types.hh"
0013 #include "celeritas/Constants.hh"
0014 
0015 namespace celeritas
0016 {
0017 //---------------------------------------------------------------------------//
0018 //! Particle momenntum
0019 struct Momentum
0020 {
0021     real_type magnitude;
0022     Real3 const& direction;
0023 };
0024 
0025 //---------------------------------------------------------------------------//
0026 /*!
0027  * Calculate exiting direction via conservation of momentum.
0028  */
0029 inline CELER_FUNCTION Real3 calc_exiting_direction(Momentum inc_momentum,
0030                                                    Momentum out_momentum)
0031 {
0032     CELER_EXPECT(inc_momentum.magnitude > 0);
0033     CELER_EXPECT(out_momentum.magnitude > 0);
0034 
0035     Real3 result;
0036     for (int i = 0; i < 3; ++i)
0037     {
0038         result[i] = inc_momentum.direction[i] * inc_momentum.magnitude
0039                     - out_momentum.direction[i] * out_momentum.magnitude;
0040     }
0041     return make_unit_vector(result);
0042 }
0043 
0044 //---------------------------------------------------------------------------//
0045 /*!
0046  * Sample an exiting direction from a polar cosine and incident direction.
0047  *
0048  * Combine an already-sampled change in polar cosine (dot product of incident
0049  * and exiting) with a sampled uniform azimuthal direction, and apply that
0050  * rotation to the original track's incident direction.
0051  */
0052 struct ExitingDirectionSampler
0053 {
0054     real_type costheta;
0055     Real3 const& direction;
0056 
0057     template<class Engine>
0058     inline CELER_FUNCTION Real3 operator()(Engine& rng)
0059     {
0060         UniformRealDistribution<real_type> sample_phi(
0061             0, real_type(2 * constants::pi));
0062         return rotate(from_spherical(costheta, sample_phi(rng)), direction);
0063     }
0064 };
0065 
0066 //---------------------------------------------------------------------------//
0067 }  // namespace celeritas