BioCMAMC-ST
traits.hpp
1#ifndef __MODELS_TRAITS_HPP__
2#define __MODELS_TRAITS_HPP__
3
4#include <Kokkos_Core_fwd.hpp>
5#include <Kokkos_Random.hpp>
6#include <Kokkos_ScatterView.hpp>
7#include <common/common.hpp>
8#include <common/traits.hpp>
9#include <concepts>
10#include <cstdint>
11#include <mc/alias.hpp>
12#include <mc/macros.hpp>
13#include <mc/prng/prng.hpp>
14#include <type_traits>
15
16
17
18template <std::size_t N1, std::size_t N2>
19constexpr std::array<std::string_view, N1 + N2>
20concat_arrays(const std::array<std::string_view, N1>& arr1,
21 const std::array<std::string_view, N2>& arr2)
22{
23 std::array<std::string_view, N1 + N2> result;
24 std::copy(arr1.begin(), arr1.end(), result.begin());
25 std::copy(arr2.begin(), arr2.end(), result.begin() + N1);
26 return result;
27}
28
29namespace MC
30{
31
32 // NOLINTBEGIN(hicpp-avoid-c-arrays,cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
33 template <uint64_t Nd, FloatingPointType F> using ParticlesModel = Kokkos::View<F* [Nd]>;
34 template <FloatingPointType F> using DynParticlesModel = Kokkos::View<F**>;
35 // NOLINTEND(hicpp-avoid-c-arrays,cppcoreguidelines-avoid-c-arrays,modernize-avoid-c-arrays)
36
37}; // namespace MC
38
42template <typename T,typename ViewType>
43concept CommonModelType = requires(T model,
44 T::FloatType d_t,
45 std::size_t idx,
46 std::size_t idx2,
47 double weight,
48 const T::SelfParticle& arr,
49 const T::SelfParticle& buffer_arr,
51 std::size_t position,
52 const MC::ContributionView& contributions,
53 const MC::KPRNG::pool_type& random_pool) {
54 { T::n_var } -> std::convertible_to<std::size_t>;
55 typename T::FloatType;
56 typename T::SelfParticle;
57 typename T::Self;
59 { T::n_var } -> std::convertible_to<std::size_t>;
60
61 { T::init(random_pool, idx, arr) } -> std::same_as<void>;
62
63 { T::mass(idx, arr) } -> std::same_as<double>;
64
65 { T::update(random_pool, d_t, idx, arr, c) } -> std::convertible_to<MC::Status>;
66
67 { T::contribution(idx, position, weight, arr, contributions) } -> std::same_as<void>;
68
69 { T::division(random_pool, idx, idx2, arr, buffer_arr) } -> std::same_as<void>;
70};
71
72
73template <typename T>
75
76template <typename T>
78
79
80template <typename T>
82
83
84template <std::size_t n, typename T>
85concept _HasExportProperties = requires(const T obj) {
86 { T::names() } -> std::convertible_to<std::array<std::string_view, n>>;
87};
88
89template <typename T>
90concept HasExportPropertiesFull = FixedModelType<T> && requires(const T obj) {
91 { T::names() } -> std::convertible_to<std::array<std::string_view, T::n_var>>;
92};
93
94template <typename T>
95concept HasExportPropertiesPartial = ModelType<T> && requires(const T obj) {
96 { T::names() } -> std::convertible_to<std::vector<std::string_view>>;
97 { T::get_number() } -> std::convertible_to<std::vector<std::size_t>>;
98};
99
100template <typename T>
102
103// Helper to detect if `uniform_weight` exists as a type alias (using `using` keyword)
104template <typename T, typename = void> struct has_uniform_weight : std::false_type
105{
106};
107
108template <typename T>
109struct has_uniform_weight<T, std::void_t<typename T::uniform_weight>> : std::true_type
110{
111};
112
113// Concept to check if a model type has `uniform_weight`
114template <typename T>
116
118{
119 enum class particle_var : int
120 {
121 mass = 0,
122 };
123 static constexpr std::size_t n_var = 1;
124 static constexpr std::string_view name = "simple";
125 using uniform_weight = std::true_type; // Using type alias
127 using FloatType = float;
129 static constexpr bool uniform_weigth = false;
130
131 KOKKOS_INLINE_FUNCTION static void init([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
132 [[maybe_unused]] std::size_t idx,
133 [[maybe_unused]] const SelfParticle& arr)
134 {
135 }
136
137 KOKKOS_INLINE_FUNCTION static double mass([[maybe_unused]] std::size_t idx,
138 [[maybe_unused]] const SelfParticle& arr)
139 {
140 return 1.;
141 }
142
143 KOKKOS_INLINE_FUNCTION static MC::Status
144 update([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
145 [[maybe_unused]] FloatType d_t,
146 [[maybe_unused]] std::size_t idx,
147 [[maybe_unused]] const SelfParticle& arr,
148 [[maybe_unused]] const MC::LocalConcentration& c)
149 {
150
151 return MC::Status::Idle;
152 }
153
154 KOKKOS_INLINE_FUNCTION static void
155 division([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
156 [[maybe_unused]] std::size_t idx,
157 [[maybe_unused]] std::size_t idx2,
158 [[maybe_unused]] const SelfParticle& arr,
159 [[maybe_unused]] const SelfParticle& buffer_arr)
160 {
161 }
162
163 KOKKOS_INLINE_FUNCTION static void
164 contribution([[maybe_unused]] std::size_t idx,
165 [[maybe_unused]] std::size_t position,
166 [[maybe_unused]] double weight,
167 [[maybe_unused]] const SelfParticle& arr,
168 [[maybe_unused]] const MC::ContributionView& contributions)
169 {
170 }
171};
172
173CHECK_MODEL(DefaultModel)
174
175
177{
178 enum class particle_var : int
179 {
180 mass = 0,
181 };
182 static constexpr std::size_t n_var = 1;
183 static constexpr std::string_view name = "simple";
184 using uniform_weight = std::true_type; // Using type alias
186 using FloatType = float;
188 static constexpr bool uniform_weigth = false;
189
190 KOKKOS_INLINE_FUNCTION static void init([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
191 [[maybe_unused]] std::size_t idx,
192 [[maybe_unused]] const SelfParticle& arr)
193 {
194 }
195
196 KOKKOS_INLINE_FUNCTION static double mass([[maybe_unused]] std::size_t idx,
197 [[maybe_unused]] const SelfParticle& arr)
198 {
199 return 1.;
200 }
201
202 KOKKOS_INLINE_FUNCTION static MC::Status
203 update([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
204 [[maybe_unused]] FloatType d_t,
205 [[maybe_unused]] std::size_t idx,
206 [[maybe_unused]] const SelfParticle& arr,
207 [[maybe_unused]] const MC::LocalConcentration& c)
208 {
209
210 return MC::Status::Idle;
211 }
212
213 KOKKOS_INLINE_FUNCTION static void
214 division([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
215 [[maybe_unused]] std::size_t idx,
216 [[maybe_unused]] std::size_t idx2,
217 [[maybe_unused]] const SelfParticle& arr,
218 [[maybe_unused]] const SelfParticle& buffer_arr)
219 {
220 }
221
222 KOKKOS_INLINE_FUNCTION static void
223 contribution([[maybe_unused]] std::size_t idx,
224 [[maybe_unused]] std::size_t position,
225 [[maybe_unused]] double weight,
226 [[maybe_unused]] const SelfParticle& arr,
227 [[maybe_unused]] const MC::ContributionView& contributions)
228 {
229 }
230};
231
232CHECK_MODEL(DynamicDefaultModel)
233
234// namespace MC
235// {
236// // TODO MOVE
237
238// struct TagDetector
239// {
240// KOKKOS_FUNCTION void
241// operator()(const Kokkos::TeamPolicy<ComputeSpace>::member_type& team_handle,
242// int& dead_count) const
243// {
244// (void)team_handle;
245// (void)dead_count;
246// }
247// TagDetector() = default;
248// };
249// Kokkos::TeamPolicy<ComputeSpace> inline get_policy_auto(std::size_t range)
250// {
251
252// Kokkos::TeamPolicy<ComputeSpace> _policy;
253
254// int recommended_team_size =
255// _policy.team_size_recommended(TagDetector(), Kokkos::ParallelForTag());
256// int league_size = (static_cast<int>(range) + recommended_team_size - 1) /
257// recommended_team_size;
258
259// _policy = Kokkos::TeamPolicy<ComputeSpace>(league_size, recommended_team_size);
260
261// return _policy;
262// }
263
264// template <typename FunctorType>
265// Kokkos::TeamPolicy<ComputeSpace>
266// get_policy(FunctorType& f, std::size_t range, bool reduce = false)
267// {
268
269// // Kokkos::TeamPolicy<ComputeSpace> _policy;
270// // int recommended_team_size = (reduce)
271// // ? _policy.team_size_recommended(f,
272// // Kokkos::ParallelReduceTag()) :
273// // _policy.team_size_recommended(f,
274// Kokkos::ParallelForTag());
275
276// // int league_size = (static_cast<int>(range) + recommended_team_size - 1) /
277// // recommended_team_size;
278
279// // return {league_size, recommended_team_size};
280
281// Kokkos::TeamPolicy<ComputeSpace> _policy;
282
283// int recommended_team_size =
284// _policy.team_size_recommended(TagDetector(), Kokkos::ParallelForTag());
285// int league_size = (static_cast<int>(range) + recommended_team_size - 1) /
286// recommended_team_size;
287
288// _policy = Kokkos::TeamPolicy<ComputeSpace>(league_size, recommended_team_size);
289
290// return _policy;
291// }
292// } // namespace MC
293
294#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
Concept to define a correct Model.
Definition traits.hpp:43
Definition traits.hpp:115
Definition traits.hpp:74
Definition traits.hpp:77
Definition traits.hpp:20
Definition traits.hpp:90
Definition traits.hpp:95
Definition traits.hpp:101
Definition traits.hpp:81
Definition traits.hpp:85
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:9
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:41
Kokkos::Experimental::ScatterView< double **, Kokkos::LayoutRight > ContributionView
Definition alias.hpp:30
Kokkos::View< F *[Nd]> ParticlesModel
Definition traits.hpp:33
Status
Definition alias.hpp:11
Kokkos::View< F ** > DynParticlesModel
Definition traits.hpp:34
Definition traits.hpp:118
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition traits.hpp:131
float FloatType
Definition traits.hpp:127
static KOKKOS_INLINE_FUNCTION void contribution(std::size_t idx, std::size_t position, double weight, const SelfParticle &arr, const MC::ContributionView &contributions)
Definition traits.hpp:164
static KOKKOS_INLINE_FUNCTION MC::Status update(const MC::KPRNG::pool_type &random_pool, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition traits.hpp:144
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition traits.hpp:137
static constexpr std::size_t n_var
Definition traits.hpp:123
std::true_type uniform_weight
Definition traits.hpp:125
static constexpr bool uniform_weigth
Definition traits.hpp:129
MC::ParticlesModel< Self::n_var, Self::FloatType > SelfParticle
Definition traits.hpp:128
particle_var
Definition traits.hpp:120
static constexpr std::string_view name
Definition traits.hpp:124
static KOKKOS_INLINE_FUNCTION void division(const MC::KPRNG::pool_type &random_pool, std::size_t idx, std::size_t idx2, const SelfParticle &arr, const SelfParticle &buffer_arr)
Definition traits.hpp:155
Definition traits.hpp:177
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition traits.hpp:190
static KOKKOS_INLINE_FUNCTION void contribution(std::size_t idx, std::size_t position, double weight, const SelfParticle &arr, const MC::ContributionView &contributions)
Definition traits.hpp:223
static KOKKOS_INLINE_FUNCTION void division(const MC::KPRNG::pool_type &random_pool, std::size_t idx, std::size_t idx2, const SelfParticle &arr, const SelfParticle &buffer_arr)
Definition traits.hpp:214
static KOKKOS_INLINE_FUNCTION MC::Status update(const MC::KPRNG::pool_type &random_pool, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition traits.hpp:203
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition traits.hpp:196
float FloatType
Definition traits.hpp:186
particle_var
Definition traits.hpp:179
MC::DynParticlesModel< FloatType > SelfParticle
Definition traits.hpp:187
std::true_type uniform_weight
Definition traits.hpp:184
Definition traits.hpp:105