File indexing completed on 2026-01-07 10:01:43
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <cmath>
0010
0011 #include "corecel/Assert.hh"
0012 #include "corecel/Macros.hh"
0013 #include "corecel/Types.hh"
0014 #include "geocel/random/IsotropicDistribution.hh"
0015
0016 #include "../TrackInitializer.hh"
0017
0018 namespace celeritas
0019 {
0020
0021
0022
0023
0024
0025
0026 class OpticalPrimaryGenerator
0027 {
0028 public:
0029
0030 inline CELER_FUNCTION
0031 OpticalPrimaryGenerator(PrimaryDistributionData const& data);
0032
0033
0034 template<class Generator>
0035 inline CELER_FUNCTION optical::TrackInitializer operator()(Generator& rng);
0036
0037 private:
0038
0039
0040 PrimaryDistributionData const& data_;
0041 IsotropicDistribution<real_type> sample_angle_;
0042 };
0043
0044
0045
0046
0047
0048
0049
0050 CELER_FUNCTION
0051 OpticalPrimaryGenerator::OpticalPrimaryGenerator(
0052 PrimaryDistributionData const& data)
0053 : data_(data)
0054 {
0055 CELER_EXPECT(data_);
0056 }
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066 template<class Generator>
0067 CELER_FUNCTION optical::TrackInitializer
0068 OpticalPrimaryGenerator::operator()(Generator& rng)
0069 {
0070 optical::TrackInitializer result;
0071 result.energy = data_.energy;
0072 result.position = data_.position;
0073 result.direction = sample_angle_(rng);
0074 do
0075 {
0076 result.polarization = make_unit_vector(
0077 make_orthogonal(sample_angle_(rng), result.direction));
0078 } while (CELER_UNLIKELY(
0079 !soft_zero(dot_product(result.polarization, result.direction))));
0080
0081 return result;
0082 }
0083
0084
0085 }