File indexing completed on 2026-11-07 10:11:35
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include "corecel/Assert.hh"
0010 #include "corecel/random/distribution/BernoulliDistribution.hh"
0011 #include "celeritas/Quantities.hh"
0012 #include "celeritas/Types.hh"
0013 #include "celeritas/mucf/Types.hh"
0014
0015 namespace celeritas
0016 {
0017 namespace detail
0018 {
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030 class MuonicAtomSpinSelector
0031 {
0032 public:
0033
0034 inline CELER_FUNCTION MuonicAtomSpinSelector(MucfMuonicAtom atom);
0035
0036
0037 template<class Engine>
0038 inline CELER_FUNCTION units::HalfSpinInt operator()(Engine& rng);
0039
0040 private:
0041 MucfMuonicAtom atom_;
0042
0043
0044 constexpr CELER_FUNCTION real_type deuterium_spin_probability()
0045 {
0046 using namespace celeritas::literals;
0047 return 2_r / 3;
0048 }
0049
0050
0051 constexpr CELER_FUNCTION real_type tritium_spin_probability()
0052 {
0053 using namespace celeritas::literals;
0054 return 0.75_r;
0055 }
0056 };
0057
0058
0059
0060
0061
0062
0063
0064 CELER_FUNCTION MuonicAtomSpinSelector::MuonicAtomSpinSelector(
0065 MucfMuonicAtom atom)
0066 : atom_(atom)
0067 {
0068 CELER_EXPECT(atom_ < MucfMuonicAtom::size_);
0069 }
0070
0071
0072
0073
0074
0075 template<class Engine>
0076 CELER_FUNCTION units::HalfSpinInt MuonicAtomSpinSelector::operator()(
0077 Engine& rng)
0078 {
0079 switch (atom_)
0080 {
0081 case MucfMuonicAtom::deuterium:
0082 return BernoulliDistribution(this->deuterium_spin_probability())(
0083 rng)
0084 ? units::HalfSpinInt{3}
0085 : units::HalfSpinInt{1};
0086
0087 case MucfMuonicAtom::tritium:
0088 return BernoulliDistribution(this->tritium_spin_probability())(rng)
0089 ? units::HalfSpinInt{2}
0090 : units::HalfSpinInt{0};
0091 default:
0092 CELER_ASSERT_UNREACHABLE();
0093 }
0094 }
0095
0096
0097 }
0098 }