File indexing completed on 2026-11-07 10:11:43
0001
0002
0003
0004
0005
0006
0007 #pragma once
0008
0009 #include "corecel/Types.hh"
0010 #include "corecel/cont/Range.hh"
0011 #include "corecel/data/Collection.hh"
0012 #include "corecel/data/CollectionAlgorithms.hh"
0013 #include "corecel/data/CollectionBuilder.hh"
0014 #include "corecel/random/data/RngData.hh"
0015 #include "corecel/sys/Device.hh"
0016 #include "corecel/sys/ThreadId.hh"
0017 #include "geocel/Types.hh"
0018 #include "celeritas/Types.hh"
0019 #include "celeritas/phys/ParticleData.hh"
0020 #include "celeritas/phys/Primary.hh"
0021
0022 #include "CoreStateCounters.hh"
0023 #include "SimData.hh"
0024
0025 namespace celeritas
0026 {
0027
0028
0029
0030
0031
0032
0033
0034
0035 template<Ownership W, MemSpace M>
0036 struct TrackInitParamsData
0037 {
0038 size_type capacity{0};
0039 size_type max_events{0};
0040 TrackOrder track_order{TrackOrder::none};
0041
0042
0043
0044
0045
0046 explicit CELER_FUNCTION operator bool() const
0047 {
0048 return capacity > 0 && max_events > 0;
0049 }
0050
0051
0052 template<Ownership W2, MemSpace M2>
0053 TrackInitParamsData& operator=(TrackInitParamsData<W2, M2> const& other)
0054 {
0055 CELER_EXPECT(other);
0056 capacity = other.capacity;
0057 max_events = other.max_events;
0058 track_order = other.track_order;
0059 return *this;
0060 }
0061 };
0062
0063
0064
0065
0066
0067
0068 struct TrackInitializer
0069 {
0070 SimTrackInitializer sim;
0071 GeoTrackInitializer geo;
0072 ParticleTrackInitializer particle;
0073 RngStateInitializer rng;
0074
0075
0076 explicit CELER_FUNCTION operator bool() const
0077 {
0078 return sim && geo && particle;
0079 }
0080 };
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105 template<Ownership W, MemSpace M>
0106 struct TrackInitStateData
0107 {
0108
0109
0110 template<class T>
0111 using StateItems = StateCollection<T, W, M>;
0112 template<class T>
0113 using EventItems = Collection<T, W, M, EventId>;
0114 template<class T>
0115 using Items = Collection<T, W, M>;
0116
0117
0118
0119 StateItems<size_type> indices;
0120 StateItems<size_type> secondary_counts;
0121 StateItems<TrackSlotId> vacancies;
0122 EventItems<TrackId::size_type> track_counters;
0123
0124
0125
0126 Items<TrackInitializer> initializers;
0127
0128
0129
0130
0131 Items<CoreStateCounters> counters;
0132
0133
0134
0135
0136 explicit CELER_FUNCTION operator bool() const
0137 {
0138 return (indices.size() == vacancies.size() || indices.empty())
0139 && secondary_counts.size() == vacancies.size() + 1
0140 && !track_counters.empty() && !initializers.empty()
0141 && !counters.empty();
0142 }
0143
0144
0145 template<Ownership W2, MemSpace M2>
0146 TrackInitStateData& operator=(TrackInitStateData<W2, M2>& other)
0147 {
0148 CELER_EXPECT(other);
0149
0150 indices = other.indices;
0151 secondary_counts = other.secondary_counts;
0152 track_counters = other.track_counters;
0153
0154 vacancies = other.vacancies;
0155 initializers = other.initializers;
0156 counters = other.counters;
0157
0158 return *this;
0159 }
0160 };
0161
0162
0163
0164
0165
0166
0167
0168
0169
0170
0171
0172
0173 template<MemSpace M>
0174 void resize(TrackInitStateData<Ownership::value, M>* data,
0175 HostCRef<TrackInitParamsData> const& params,
0176 StreamId stream,
0177 size_type size)
0178 {
0179 using namespace celeritas::literals;
0180 CELER_EXPECT(params);
0181 CELER_EXPECT(size > 0);
0182 CELER_EXPECT(M == MemSpace::host || celeritas::device());
0183
0184
0185 resize(&data->secondary_counts, size + 1);
0186 resize(&data->track_counters, params.max_events);
0187 resize(&data->counters, 1);
0188 if (params.track_order == TrackOrder::init_charge)
0189 {
0190 resize(&data->indices, size);
0191 }
0192
0193
0194 fill(0_sz, &data->track_counters);
0195
0196
0197 resize(&data->vacancies, size);
0198 fill_sequence(&data->vacancies, stream);
0199
0200
0201 resize(&data->initializers, params.capacity);
0202
0203
0204 fill(CoreStateCounters{}, &data->counters);
0205
0206 CELER_ENSURE(*data);
0207 }
0208
0209
0210
0211 }