File indexing completed on 2025-12-16 10:11:44
0001
0002
0003
0004
0005
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
0019 struct Momentum
0020 {
0021 real_type magnitude;
0022 Real3 const& direction;
0023 };
0024
0025
0026
0027
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
0047
0048
0049
0050
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 }