BioCMAMC-ST
simple_model.hpp
1#ifndef __SIMPLE_MODEL_HPP__
2#define __SIMPLE_MODEL_HPP__
3
4#include <Kokkos_Core_fwd.hpp>
5#include <Kokkos_Macros.hpp>
6#include <common/common.hpp>
7#include <common/traits.hpp>
8#include <mc/alias.hpp>
9#include <mc/macros.hpp>
10#include <mc/prng/prng_extension.hpp>
11#include <mc/traits.hpp>
12#include <models/utils.hpp>
13#include <optional>
14#include <string_view>
15
16namespace Models
17{
26 {
27 using uniform_weight = std::true_type;
29 using FloatType = float;
30 using Config = std::nullopt_t;
31
32 enum class particle_var : int // NOLINT
33 {
34 length = 0,
39 };
40
41 MODEL_CONSTANT std::size_t n_var = INDEX_FROM_ENUM(particle_var::__COUNT__);
42
43 MODEL_CONSTANT std::size_t n_c = 1;
44
45 MODEL_CONSTANT std::string_view name = "simple";
48
49 MODEL_CONSTANT FloatType l_dot_max = 8 * 2e-10; // m/s
50 MODEL_CONSTANT FloatType l_max_m = 5e-6; // m
51 MODEL_CONSTANT FloatType l_min_m = 0.9e-6; // m
52 MODEL_CONSTANT FloatType d_m = 0.6e-6; // m
53 MODEL_CONSTANT FloatType k_s = 1e-3; // kg/m3
54 MODEL_CONSTANT FloatType lin_density
55 = c_linear_density(static_cast<FloatType>(1000), d_m);
56
57 MODEL_CONSTANT FloatType phi_s_max
59
61 l_min_m, l_min_m / 5., l_min_m * 0.5, l_max_m);
62
63 MODEL_CONSTANT auto t_div_dist
65 500. / 2.,
66 10.,
67 1200.); // s
68
69 KOKKOS_INLINE_FUNCTION static void init(const MC::pool_type& random_pool,
70 std::size_t idx,
71 const SelfParticle& arr);
72
73 KOKKOS_INLINE_FUNCTION static MC::Status
74 update(const MC::pool_type& random_pool,
75 FloatType d_t,
76 std::size_t idx,
77 const SelfParticle& arr,
78 const SelfContribs& arr_contribs,
79 std::size_t position_index,
80 const MC::LocalConcentration& c);
81
82 KOKKOS_INLINE_FUNCTION static void
83 division(const MC::pool_type& random_pool,
84 std::size_t idx,
85 std::size_t idx2,
86 const SelfParticle& arr,
87 const SelfParticle& buffer_arr);
88
89 KOKKOS_INLINE_FUNCTION static double
90 mass(std::size_t idx, const SelfParticle& arr)
91 {
92 return GET_PROPERTY(Self::particle_var::length) * lin_density;
93 }
94
95 // age is not exported is it export by default
96 static std::vector<std::string_view>
98 {
99 return { "length", "t_div", "phi_s" };
100 }
101
102 static std::vector<std::size_t>
104 {
105 return { INDEX_FROM_ENUM(particle_var::length),
106 INDEX_FROM_ENUM(particle_var::t_div),
107 INDEX_FROM_ENUM(particle_var::phi_s) };
108 }
109
110 static std::vector<std::string_view>
112 {
113 return { "S" };
114 }
115 };
116
117 CHECK_MODEL(SimpleModel)
118
119 KOKKOS_INLINE_FUNCTION void
121 std::size_t idx,
122 const SelfParticle& arr)
123 {
124 // Local copies, struct scope distributions may not be captured in cuda
125 static constexpr auto local_l = l_dist;
126 static constexpr auto local_t = t_div_dist;
127
128 auto gen = random_pool.get_state();
129 GET_PROPERTY(particle_var::length) = local_l.draw(gen);
130 GET_PROPERTY(particle_var::t_div) = local_t.draw(gen);
131 random_pool.free_state(gen);
132
133 GET_PROPERTY(particle_var::age) = 0.;
134 GET_PROPERTY(particle_var::phi_s) = 0.;
135 }
136
137 KOKKOS_INLINE_FUNCTION MC::Status
138 SimpleModel::update([[maybe_unused]] const MC::pool_type& random_pool,
139 FloatType d_t,
140 std::size_t idx,
141 const SelfParticle& arr,
142 const SelfContribs& arr_contribs,
143 const std::size_t position_index,
144 const MC::LocalConcentration& c)
145 {
146 const auto s = GET_CLAMPED_CONCENTRATION_CAST(FloatType, 0);
147
148 const FloatType g = s / (k_s + s);
149 const FloatType phi_s = phi_s_max * g;
150
151 GET_PROPERTY(particle_var::length) += d_t * l_dot_max * g;
152 GET_PROPERTY(particle_var::age) += d_t;
153 GET_PROPERTY(particle_var::phi_s) = phi_s;
154
155 GET_CONTRIBS(0) = -phi_s;
156
157 return (GET_PROPERTY(Self::particle_var::age)
158 >= GET_PROPERTY(Self::particle_var::t_div))
161 }
162
163 KOKKOS_INLINE_FUNCTION void
165 std::size_t idx,
166 std::size_t idx2,
167 const SelfParticle& arr,
168 const SelfParticle& buffer_arr)
169 {
170 static constexpr auto local_t = t_div_dist;
171
172 const FloatType new_current_length
173 = GET_PROPERTY(particle_var::length) / 2.F;
174
175 GET_PROPERTY(particle_var::length) = new_current_length;
176 GET_PROPERTY(particle_var::age) = 0.;
177 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::length)
178 = new_current_length;
179 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::age) = 0.;
180
181 // Redraw both, without it the whole lineage keeps the same period
182 auto gen = random_pool.get_state();
183 GET_PROPERTY(particle_var::t_div) = local_t.draw(gen);
184 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::t_div)
185 = local_t.draw(gen);
186 random_pool.free_state(gen);
187
188 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::phi_s)
189 = GET_PROPERTY(particle_var::phi_s);
190 }
191
192} // namespace Models
193
194#endif
Status
Definition alias.hpp:125
@ Division
Definition alias.hpp:127
@ Idle
Definition alias.hpp:126
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:100
KernelConcentrationType LocalConcentration
Definition alias.hpp:173
Kokkos::View< F *[Nc], ComputeSpace::array_layout, ComputeSpace, Kokkos::MemoryTraits< Kokkos::MemoryTraitsFlags::Restrict > > ParticlesContribs
Definition alias.hpp:66
Kokkos::View< F *[Nd], ComputeSpace::array_layout, ComputeSpace, Kokkos::MemoryTraits< Kokkos::MemoryTraitsFlags::Restrict > > ParticlesModel
Definition alias.hpp:52
Models definition.
Definition acetate.hpp:18
KOKKOS_INLINE_FUNCTION consteval F c_linear_density(F rho, F d)
Definition utils.hpp:94
static F constexpr _get_phi_s_max(F density, F dl, F glucose_to_biomass_yield=0.5)
Definition utils.hpp:45
Represents a TruncatedNormal (Gaussian) probability distribution.
Definition prng_extension.hpp:354
Rod-shaped cell growing on glucose, dividing on a timer.
Definition simple_model.hpp:26
MODEL_CONSTANT std::size_t n_c
Definition simple_model.hpp:43
MODEL_CONSTANT auto t_div_dist
Definition simple_model.hpp:64
MODEL_CONSTANT FloatType lin_density
Definition simple_model.hpp:55
MODEL_CONSTANT FloatType phi_s_max
Definition simple_model.hpp:58
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition simple_model.hpp:90
std::true_type uniform_weight
Definition simple_model.hpp:27
static KOKKOS_INLINE_FUNCTION MC::Status update(const MC::pool_type &random_pool, FloatType d_t, std::size_t idx, const SelfParticle &arr, const SelfContribs &arr_contribs, std::size_t position_index, const MC::LocalConcentration &c)
Definition simple_model.hpp:138
static std::vector< std::size_t > get_number()
Definition simple_model.hpp:103
MODEL_CONSTANT FloatType l_min_m
Definition simple_model.hpp:51
SimpleModel Self
Definition simple_model.hpp:28
static std::vector< std::string_view > names()
Definition simple_model.hpp:97
MODEL_CONSTANT std::size_t n_var
Definition simple_model.hpp:41
particle_var
Definition simple_model.hpp:33
@ phi_s
Definition simple_model.hpp:37
@ length
Definition simple_model.hpp:34
@ t_div
Definition simple_model.hpp:36
@ age
Definition simple_model.hpp:35
@ __COUNT__
Definition simple_model.hpp:38
MODEL_CONSTANT FloatType d_m
Definition simple_model.hpp:52
static KOKKOS_INLINE_FUNCTION void division(const MC::pool_type &random_pool, std::size_t idx, std::size_t idx2, const SelfParticle &arr, const SelfParticle &buffer_arr)
Definition simple_model.hpp:164
MC::ParticlesContribs< Self::n_c, Self::FloatType > SelfContribs
Definition simple_model.hpp:47
MC::ParticlesModel< Self::n_var, Self::FloatType > SelfParticle
Definition simple_model.hpp:46
static KOKKOS_INLINE_FUNCTION void init(const MC::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition simple_model.hpp:120
std::nullopt_t Config
Definition simple_model.hpp:30
MODEL_CONSTANT FloatType l_dot_max
Definition simple_model.hpp:49
float FloatType
Definition simple_model.hpp:29
MODEL_CONSTANT auto l_dist
Definition simple_model.hpp:60
MODEL_CONSTANT std::string_view name
Definition simple_model.hpp:45
MODEL_CONSTANT FloatType k_s
Definition simple_model.hpp:53
static std::vector< std::string_view > species()
Definition simple_model.hpp:111
MODEL_CONSTANT FloatType l_max_m
Definition simple_model.hpp:50