BioCMAMC-ST
simple_model.hpp
1#ifndef __SIMPLE_MODEL_HPP__
2#define __SIMPLE_MODEL_HPP__
3
4#include "common/traits.hpp"
5#include "models/uptake_dyn.hpp"
6#include "models/utils.hpp"
7#include <mc/prng/prng_extension.hpp>
8#include <mc/traits.hpp>
9#include <models/uptake.hpp>
10#include <optional>
11#include <string_view>
12
13namespace Models
14{
15 template <FloatingPointType F>
16 static F consteval get_phi_s_max(F density, F dl)
17 {
18 // dl and density must be same unit, dl*density -> mass and y is mass yield
19 return (dl * density) * 0.5;
20 }
22 {
23 using uniform_weight = std::true_type; // Using type alias
25 using FloatType = float;
26 using Config = std::nullopt_t;
27
28 enum class particle_var : int
29 {
30 length = INDEX_FROM_ENUM(Uptakeparticle_var::COUNT),
35 };
36
37 static constexpr std::size_t n_var = INDEX_FROM_ENUM(particle_var::COUNT);
38 static constexpr std::string_view name = "simple";
40
41 MODEL_CONSTANT FloatType l_max_m = 5e-6; // m
42 MODEL_CONSTANT FloatType l_c_m = 3e-6; // m
43 MODEL_CONSTANT FloatType d_m = 0.6e-6; // m
44 MODEL_CONSTANT FloatType l_min_m = 0.9e-6; // m
45 MODEL_CONSTANT FloatType lin_density =
46 c_linear_density(static_cast<FloatType>(1000), d_m);
47
48 MODEL_CONSTANT FloatType phi_s_max =
49 get_phi_s_max<FloatType>(lin_density, 8 * 2e-10); // kgS/s
50
51 MODEL_CONSTANT FloatType phi_perm_max = phi_s_max / 40.; // kgS/
52
53 MODEL_CONSTANT FloatType frequency_division = 1. / 1000; // Hz
54
55 KOKKOS_INLINE_FUNCTION static void
56 init(const MC::KPRNG::pool_type& random_pool,
57 std::size_t idx,
58 const SelfParticle& arr);
59
60 KOKKOS_INLINE_FUNCTION static MC::Status
61 update(const MC::KPRNG::pool_type& random_pool,
62 FloatType d_t,
63 std::size_t idx,
64 const SelfParticle& arr,
65 const MC::LocalConcentration& c);
66
67 KOKKOS_INLINE_FUNCTION static void
68 division(const MC::KPRNG::pool_type& random_pool,
69 std::size_t idx,
70 std::size_t idx2,
71 const SelfParticle& arr,
72 const SelfParticle& buffer_arr);
73
74 KOKKOS_INLINE_FUNCTION static void
75 contribution(std::size_t idx,
76 std::size_t position,
77 double weight,
78 const SelfParticle& arr,
79 const MC::ContributionView& contributions);
80
81 KOKKOS_INLINE_FUNCTION static double mass(std::size_t idx,
82 const SelfParticle& arr)
83 {
85 }
86
87 // inline constexpr static std::array<std::string_view, n_var> names()
88 // {
89 // constexpr std::size_t ln_var = n_var - Uptake<SimpleModel>::n_var;
90 // constexpr auto _names = concat_arrays<Uptake<SimpleModel>::n_var,
91 // ln_var>(
92 // Uptake<SimpleModel>::names(), {"length", "age", "phi_s", "t_div"});
93
94 // return _names;
95 // }
96 };
97
98 CHECK_MODEL(SimpleModel)
99
100 KOKKOS_INLINE_FUNCTION void
101 SimpleModel::init([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
102 std::size_t idx,
103 const SelfParticle& arr)
104 {
105 MODEL_CONSTANT auto division_time_d =
107 500,
108 500. / 2.,
109 10,
110 1200); //-Kokkos::log(random_number) / frequency_division;
111 MODEL_CONSTANT auto l_distribution =
113 l_min_m, l_min_m / 5., l_min_m * 0.5, l_max_m);
114 auto gen = random_pool.get_state();
115 arr(idx, static_cast<int>(particle_var::length)) = l_distribution.draw(gen);
116 GET_PROPERTY(SimpleModel::particle_var::t_div) = division_time_d.draw(gen);
117 random_pool.free_state(gen);
118 arr(idx, static_cast<int>(particle_var::age)) = 0;
119 arr(idx, static_cast<int>(particle_var::phi_s)) = 0;
120
122 random_pool, idx, arr);
123 }
124
125 KOKKOS_INLINE_FUNCTION MC::Status
126 SimpleModel::update([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
127 FloatType d_t,
128 std::size_t idx,
129 const SelfParticle& arr,
130 const MC::LocalConcentration& c)
131 {
132
133 const auto phi_s =
135 SimpleModel>::uptake_step(phi_s_max, d_t, idx, arr, c);
136
137 GET_PROPERTY(SimpleModel::particle_var::age) += d_t;
139
140 return (GET_PROPERTY(SimpleModel::particle_var::t_div) <=
141 GET_PROPERTY(SimpleModel::particle_var::age))
144 }
145
146 KOKKOS_INLINE_FUNCTION void
148 std::size_t idx,
149 std::size_t idx2,
150 const SelfParticle& arr,
151 const SelfParticle& buffer_arr)
152 {
153
154 const FloatType new_current_length =
155 arr(idx, static_cast<int>(particle_var::length)) /
156 static_cast<FloatType>(2.);
157 buffer_arr(idx2, static_cast<int>(particle_var::length)) =
158 new_current_length;
159 arr(idx, static_cast<int>(particle_var::length)) = new_current_length;
160
161 arr(idx, static_cast<int>(particle_var::age)) = 0;
162 buffer_arr(idx2, static_cast<int>(particle_var::age)) = 0;
163
164 // auto gen = random_pool.get_state();
165 // GET_PROPERTY_FROM(idx2, buffer_arr, SimpleModel::particle_var::t_div) =
166 // division_time_d.draw(gen);
167 // GET_PROPERTY(SimpleModel::particle_var::t_div) =
168 // division_time_d.draw(gen); random_pool.free_state(gen);
169
171 random_pool, idx, idx2, arr, buffer_arr);
172 }
173
174 KOKKOS_INLINE_FUNCTION void
175 SimpleModel::contribution([[maybe_unused]] std::size_t idx,
176 std::size_t position,
177 double weight,
178 [[maybe_unused]] const SelfParticle& arr,
179 const MC::ContributionView& contributions)
180 {
181 auto access = contributions.access();
182 access(position, 0) +=
183 -weight * GET_PROPERTY(SimpleModel::particle_var::phi_s); // NOLINT
184 }
185
186} // namespace Models
187
188#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:33
Status
Definition alias.hpp:37
@ Division
Definition alias.hpp:39
@ Idle
Definition alias.hpp:38
decltype(Kokkos::Experimental::create_scatter_view(kernelContribution())) ContributionView
Definition alias.hpp:64
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:72
Kokkos::View< F *[Nd], Kokkos::LayoutRight > ParticlesModel
Definition traits.hpp:34
Models definition.
Definition config_loader.hpp:9
KOKKOS_INLINE_FUNCTION consteval F c_linear_density(F rho, F d)
Definition utils.hpp:47
static F consteval get_phi_s_max(F density, F dl)
Definition simple_model.hpp:16
Represents a TruncatedNormal (Gaussian) probability distribution.
Definition prng_extension.hpp:277
Definition simple_model.hpp:22
MODEL_CONSTANT FloatType lin_density
Definition simple_model.hpp:45
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 simple_model.hpp:147
MODEL_CONSTANT FloatType phi_s_max
Definition simple_model.hpp:48
MODEL_CONSTANT FloatType frequency_division
Definition simple_model.hpp:53
MODEL_CONSTANT FloatType phi_perm_max
Definition simple_model.hpp:51
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition simple_model.hpp:81
std::true_type uniform_weight
Definition simple_model.hpp:23
MODEL_CONSTANT FloatType l_min_m
Definition simple_model.hpp:44
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition simple_model.hpp:101
SimpleModel Self
Definition simple_model.hpp:24
static constexpr std::string_view name
Definition simple_model.hpp:38
particle_var
Definition simple_model.hpp:29
@ phi_s
Definition simple_model.hpp:32
@ length
Definition simple_model.hpp:30
@ COUNT
Definition simple_model.hpp:34
@ t_div
Definition simple_model.hpp:33
@ age
Definition simple_model.hpp:31
MODEL_CONSTANT FloatType d_m
Definition simple_model.hpp:43
static constexpr std::size_t n_var
Definition simple_model.hpp:37
static KOKKOS_INLINE_FUNCTION void contribution(std::size_t idx, std::size_t position, double weight, const SelfParticle &arr, const MC::ContributionView &contributions)
Definition simple_model.hpp:175
MC::ParticlesModel< Self::n_var, Self::FloatType > SelfParticle
Definition simple_model.hpp:39
MODEL_CONSTANT FloatType l_c_m
Definition simple_model.hpp:42
std::nullopt_t Config
Definition simple_model.hpp:26
float FloatType
Definition simple_model.hpp:25
MODEL_CONSTANT FloatType l_max_m
Definition simple_model.hpp:41
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 simple_model.hpp:126
Definition uptake_dyn.hpp:64