1#ifndef __MODELS_TRAITS_HPP__
2#define __MODELS_TRAITS_HPP__
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>
11#include <mc/alias.hpp>
12#include <mc/macros.hpp>
13#include <mc/prng/prng.hpp>
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)
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);
33 template <u
int64_t Nd, FloatingPo
intType F>
using ParticlesModel = Kokkos::View<F* [Nd]>;
42template <
typename T,
typename ViewType>
48 const T::SelfParticle& arr,
49 const T::SelfParticle& buffer_arr,
54 { T::n_var } -> std::convertible_to<std::size_t>;
55 typename T::FloatType;
56 typename T::SelfParticle;
59 { T::n_var } -> std::convertible_to<std::size_t>;
61 { T::init(random_pool, idx, arr) } -> std::same_as<void>;
63 { T::mass(idx, arr) } -> std::same_as<double>;
65 { T::update(random_pool, d_t, idx, arr, c) } -> std::convertible_to<MC::Status>;
67 { T::contribution(idx, position, weight, arr, contributions) } -> std::same_as<void>;
69 { T::division(random_pool, idx, idx2, arr, buffer_arr) } -> std::same_as<void>;
84template <std::
size_t n,
typename T>
86 { T::names() } -> std::convertible_to<std::array<std::string_view, n>>;
91 { T::names() } -> std::convertible_to<std::array<std::string_view, T::n_var>>;
96 { T::names() } -> std::convertible_to<std::vector<std::string_view>>;
97 { T::get_number() } -> std::convertible_to<std::vector<std::size_t>>;
123 static constexpr std::size_t
n_var = 1;
124 static constexpr std::string_view
name =
"simple";
132 [[maybe_unused]] std::size_t idx,
137 KOKKOS_INLINE_FUNCTION
static double mass([[maybe_unused]] std::size_t idx,
146 [[maybe_unused]] std::size_t idx,
154 KOKKOS_INLINE_FUNCTION
static void
156 [[maybe_unused]] std::size_t idx,
157 [[maybe_unused]] std::size_t idx2,
163 KOKKOS_INLINE_FUNCTION
static void
165 [[maybe_unused]] std::size_t position,
166 [[maybe_unused]]
double weight,
182 static constexpr std::size_t n_var = 1;
183 static constexpr std::string_view name =
"simple";
188 static constexpr bool uniform_weigth =
false;
191 [[maybe_unused]] std::size_t idx,
196 KOKKOS_INLINE_FUNCTION
static double mass([[maybe_unused]] std::size_t idx,
205 [[maybe_unused]] std::size_t idx,
213 KOKKOS_INLINE_FUNCTION
static void
215 [[maybe_unused]] std::size_t idx,
216 [[maybe_unused]] std::size_t idx2,
222 KOKKOS_INLINE_FUNCTION
static void
224 [[maybe_unused]] std::size_t position,
225 [[maybe_unused]]
double weight,
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:101
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