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