File indexing completed on 2026-01-10 10:05:47
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include <memory>
0010
0011 #include "corecel/Macros.hh"
0012 #include "corecel/data/AuxInterface.hh"
0013 #include "corecel/data/AuxStateVec.hh"
0014 #include "celeritas/inp/Events.hh"
0015 #include "celeritas/optical/action/ActionInterface.hh"
0016 #include "celeritas/phys/GeneratorInterface.hh"
0017
0018 #include "OpticalGeneratorBase.hh"
0019 #include "../GeneratorData.hh"
0020 #include "../OffloadData.hh"
0021
0022 namespace celeritas
0023 {
0024 class CoreParams;
0025
0026 namespace detail
0027 {
0028
0029
0030
0031
0032
0033
0034
0035 class PrimaryGeneratorAction final : public OpticalGeneratorBase
0036 {
0037 public:
0038
0039
0040 using Input = inp::OpticalPrimaryGenerator;
0041
0042
0043 public:
0044
0045 static std::shared_ptr<PrimaryGeneratorAction>
0046 make_and_insert(::celeritas::CoreParams const&,
0047 optical::CoreParams const&,
0048 Input&&);
0049
0050
0051 PrimaryGeneratorAction(ActionId, AuxId, GeneratorId, Input);
0052
0053
0054
0055
0056
0057 UPState create_state(MemSpace, StreamId, size_type) const final;
0058
0059
0060
0061
0062
0063
0064 void step(optical::CoreParams const&, CoreStateHost&) const final;
0065
0066 void step(optical::CoreParams const&, CoreStateDevice&) const final;
0067
0068
0069
0070 template<MemSpace M>
0071 inline void queue_primaries(optical::CoreState<M>&) const;
0072
0073 private:
0074
0075
0076 PrimaryDistributionData data_;
0077
0078
0079
0080 template<MemSpace M>
0081 void step_impl(optical::CoreParams const&, optical::CoreState<M>&) const;
0082
0083 void generate(optical::CoreParams const&, CoreStateHost&) const;
0084 void generate(optical::CoreParams const&, CoreStateDevice&) const;
0085 };
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100 template<MemSpace M>
0101 void PrimaryGeneratorAction::queue_primaries(optical::CoreState<M>& state) const
0102 {
0103 CELER_EXPECT(state.aux());
0104 auto& aux_state = this->counters(*state.aux());
0105 aux_state.counters.num_pending = data_.num_photons;
0106 state.counters().num_pending = data_.num_photons;
0107 }
0108
0109
0110 }
0111 }