BioCMAMC-ST
simple_acetate.hpp
1
2#ifndef __SIMPLE_ACETATE_MODEL_HPP__
3#define __SIMPLE_ACETATE_MODEL_HPP__
4
5#include "Kokkos_Assert.hpp"
6#include "Kokkos_Core_fwd.hpp"
7#include "Kokkos_Macros.hpp"
8#include "common/common.hpp"
9#include "common/traits.hpp"
10#include "mc/macros.hpp"
11#include "models/fixed_length.hpp"
12#include "models/utils.hpp"
13#include <mc/prng/prng_extension.hpp>
14#include <mc/traits.hpp>
15#include <optional>
16#include <string_view>
17
18namespace Models
19{
20 // template <FloatingPointType F>
21 // static F consteval
22 // _get_phi_s_max(F density, F dl, F glucose_to_biomass_yield = 0.5)
23 // {
24 // // dl and density must be same unit, dl*density -> mass and y is mass
25 // yield return (dl * density) / glucose_to_biomass_yield;
26 // }
28 {
29 using uniform_weight = std::true_type;
31 using FloatType = float;
32 using Config = std::nullopt_t;
33
34 enum class particle_var : int // NOLINT
35 {
36 length = 0,
40 // Export
44 // Con
48 };
49
50 static constexpr std::size_t n_var
51 = INDEX_FROM_ENUM(particle_var::__COUNT__);
52
53 static constexpr std::string_view name = "simple_acetate";
55
56 MODEL_CONSTANT std::size_t N_N = 2; // Number of species
57 MODEL_CONSTANT FloatType a_max_m = 2e-6 / 3600.; // m
58 MODEL_CONSTANT FloatType l_max_m = 2e-6; // m
59 MODEL_CONSTANT FloatType l_min_m = l_max_m / 2.; // m
60 // MODEL_CONSTANT FloatType k = 1e-3; // m
61 MODEL_CONSTANT FloatType d_m = 0.6e-6; // m
62 MODEL_CONSTANT FloatType lin_density
63 = c_linear_density(static_cast<FloatType>(1000), d_m);
64
65 MODEL_CONSTANT FloatType k_s = 1e-3;
66 MODEL_CONSTANT FloatType k_a = 1e-4;
67 MODEL_CONSTANT Kokkos::Array<FloatType, N_N> k = { k_s, k_a };
68
69 MODEL_CONSTANT FloatType y_s = 2;
70 MODEL_CONSTANT FloatType y_a = 3;
71 MODEL_CONSTANT Kokkos::Array<FloatType, N_N> y = { y_s, y_a };
72
73 MODEL_CONSTANT FloatType phi_s_max
75
76 MODEL_CONSTANT auto l_max_dist
78 l_max_m, l_max_m / 10., l_max_m * 0.7, 1.3 * l_max_m);
79
81 l_max_m * 0.75, l_max_m / 10., 0.7 * l_min_m, l_max_m * 1.3);
82
84
85 // static Self::Config get_config(std::size_t n);
86
87 KOKKOS_INLINE_FUNCTION static void init(const MC::pool_type& random_pool,
88 std::size_t idx,
89 const SelfParticle& arr);
90
91 KOKKOS_INLINE_FUNCTION static MC::Status
92 update(const MC::pool_type& random_pool,
93 FloatType d_t,
94 std::size_t idx,
95 const SelfParticle& arr,
96 const MC::LocalConcentration& c);
97
98 KOKKOS_INLINE_FUNCTION static void
99 division(const MC::pool_type& random_pool,
100 std::size_t idx,
101 std::size_t idx2,
102 const SelfParticle& arr,
103 const SelfParticle& buffer_arr);
104
105 KOKKOS_INLINE_FUNCTION static double
106 mass(std::size_t idx, const SelfParticle& arr)
107 {
108 return GET_PROPERTY(Self::particle_var::length) * lin_density;
109 }
110
111 static std::array<std::string_view, Self::n_var>
113 {
114 return {
115 "length", "l_max", "a_p", "a_max", "a_e",
116 "a_e_s", "a_e_a", "phi_s", "phi_a",
117 };
118 }
119
120 // static std::vector<std::size_t>
121 // get_number()
122 // {
123 // return { INDEX_FROM_ENUM(particle_var::length) };
124 // }
125 };
126
127 CHECK_MODEL(SimpleAcetate)
128
129 KOKKOS_INLINE_FUNCTION void
130 SimpleAcetate::init([[maybe_unused]] const MC::pool_type& random_pool,
131 std::size_t idx,
132 const SelfParticle& arr)
133 {
134
135 MODEL_CONSTANT auto a_max_dist
137 a_max_m, a_max_m / 2., 0.5 * a_max_m, a_max_m * 1.5);
138
139 static constexpr auto ld = l_dist;
140 static constexpr auto lm = l_dist;
141 auto gen = random_pool.get_state();
142 GET_PROPERTY(particle_var::length) = ld.draw(gen);
143 GET_PROPERTY(particle_var::l_max) = lm.draw(gen);
144 GET_PROPERTY(particle_var::a_p) = a_max_m / 2.;
145 GET_PROPERTY(particle_var::a_max) = a_max_dist.mean();
146 random_pool.free_state(gen);
147
148 GET_PROPERTY(particle_var::phi_s) = 0.;
149 }
150
151 KOKKOS_INLINE_FUNCTION MC::Status
152 SimpleAcetate::update([[maybe_unused]] const MC::pool_type& random_pool,
153 FloatType d_t,
154 std::size_t idx,
155 const SelfParticle& arr,
156 const MC::LocalConcentration& c)
157 {
158 Kokkos::Array<FloatType, N_N> adm
159 = { GET_PROPERTY(particle_var::a_max),
160 GET_PROPERTY(particle_var::a_max) / 3 };
161
162 Kokkos::Array<FloatType, N_N> D{};
163
164 FloatType inv = 1. / (c[0] + k[0]);
165 D[0] = adm[0] * c[0] * inv;
166 inv = 1. / (c[1] + k[1]);
167 D[1] = adm[1] * c[1] * inv;
168
169 GET_PROPERTY(particle_var::a_e) = 0.;
170 Kokkos::Array<FloatType, N_N> U{};
171 U[0] = Kokkos::min(D[0], GET_PROPERTY(particle_var::a_p));
172 GET_PROPERTY(particle_var::a_e) += U[0];
173
174 const FloatType pa = D[0] - GET_PROPERTY(particle_var::a_p);
175 const auto mask_pa = static_cast<FloatType>(pa < 0.F);
176
177 U[1] = mask_pa * Kokkos::min(D[1], -pa) + (1 - mask_pa) * 0.F;
178 GET_PROPERTY(particle_var::a_e) += U[1];
179
180 GET_PROPERTY(particle_var::length) += d_t * GET_PROPERTY(particle_var::a_e);
181
182 GET_PROPERTY(particle_var::a_e_s) = U[0];
183 GET_PROPERTY(particle_var::a_e_a) = U[1];
184
185 GET_PROPERTY(particle_var::phi_s) = -1 * D[0] * lin_density * y[0];
186 GET_PROPERTY(particle_var::phi_a)
187 = mask_pa * (-U[1] * lin_density * y[1])
188 + (1.F - mask_pa) * (pa * lin_density * y[0] / y[1]);
189
190 return check_div(GET_PROPERTY(Self::particle_var::length),
191 GET_PROPERTY(Self::particle_var::l_max));
192 }
193
194 KOKKOS_INLINE_FUNCTION void
195 SimpleAcetate::division([[maybe_unused]] const MC::pool_type& random_pool,
196 std::size_t idx,
197 std::size_t idx2,
198 const SelfParticle& arr,
199 const SelfParticle& buffer_arr)
200 {
201 Kokkos::View<FloatType**,
202 Kokkos::LayoutRight,
203 Kokkos::MemoryTraits<Kokkos::MemoryTraitsFlags::Restrict>>
204 buffer_e = buffer_arr;
205
206 const FloatType current_l = GET_PROPERTY(particle_var::length);
207 const FloatType new_current_length = current_l / 2.F;
208 GET_PROPERTY(particle_var::length) = new_current_length;
209 constexpr auto binf = INDEX_FROM_ENUM(particle_var::length);
210 constexpr auto bsup = INDEX_FROM_ENUM(particle_var::a_e);
211 for (auto i = binf; i < bsup; ++i)
212 {
213 COPY_PROPERTY_TO(i, idx2, buffer_e);
214 }
215
216 const auto current_a_e = GET_PROPERTY(particle_var::a_e);
217 auto gen = random_pool.get_state();
218
219 const double sigma = 0.2;
220 const double average = Kokkos::log(current_a_e) - sigma * sigma / 2;
221
222 const auto dist = MC::Distributions::LogNormal<double>(average, sigma);
223 const auto gen1 = static_cast<FloatType>(dist.draw(gen));
224 const auto gen2 = static_cast<FloatType>(dist.draw(gen));
225
226 static constexpr auto local_l = l_max_dist;
227 const FloatType lmax1 = local_l.draw(gen);
228 const FloatType lmax2 = local_l.draw(gen);
229
230 KOKKOS_ASSERT(gen1 != 0 && gen2 != 0);
231
232 GET_PROPERTY(particle_var::a_p) = gen1;
233 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::a_p) = gen2;
234
235 GET_PROPERTY(particle_var::l_max) = lmax1;
236 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::l_max) = lmax2;
237
238 random_pool.free_state(gen);
239 }
240
243 {
244 int begin = INDEX_FROM_ENUM(Self::particle_var::phi_s);
245 return { .begin = begin, .end = begin + 2 };
246 }
247
248} // namespace Models
249
250#endif
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:95
Status
Definition alias.hpp:58
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:39
Kokkos::View< F *[Nd], Kokkos::LayoutRight > ParticlesModel
Definition alias.hpp:19
Models definition.
Definition config_loader.hpp:9
KOKKOS_INLINE_FUNCTION MC::Status check_div(const T l, const T lc)
Definition utils.hpp:19
static F consteval _get_phi_s_max(F density, F dl, F glucose_to_biomass_yield=0.5)
Definition fixed_length.hpp:18
KOKKOS_INLINE_FUNCTION consteval F c_linear_density(F rho, F d)
Definition utils.hpp:49
Definition alias.hpp:66
Represents a LogNormal (Gaussian) probability distribution.
Definition prng_extension.hpp:525
Represents a TruncatedNormal (Gaussian) probability distribution.
Definition prng_extension.hpp:354
Definition simple_acetate.hpp:28
particle_var
Definition simple_acetate.hpp:35
@ phi_s
Definition simple_acetate.hpp:45
@ a_e_a
Definition simple_acetate.hpp:43
@ length
Definition simple_acetate.hpp:36
@ a_e
Definition simple_acetate.hpp:41
@ phi_a
Definition simple_acetate.hpp:46
@ a_e_s
Definition simple_acetate.hpp:42
@ l_max
Definition simple_acetate.hpp:37
@ __COUNT__
Definition simple_acetate.hpp:47
@ a_max
Definition simple_acetate.hpp:39
@ a_p
Definition simple_acetate.hpp:38
static std::array< std::string_view, Self::n_var > names()
Definition simple_acetate.hpp:112
MODEL_CONSTANT FloatType y_a
Definition simple_acetate.hpp:70
std::nullopt_t Config
Definition simple_acetate.hpp:32
MODEL_CONSTANT Kokkos::Array< FloatType, N_N > k
Definition simple_acetate.hpp:67
MODEL_CONSTANT FloatType phi_s_max
Definition simple_acetate.hpp:74
MODEL_CONSTANT auto l_dist
Definition simple_acetate.hpp:80
float FloatType
Definition simple_acetate.hpp:31
std::true_type uniform_weight
Definition simple_acetate.hpp:29
MC::ParticlesModel< Self::n_var, Self::FloatType > SelfParticle
Definition simple_acetate.hpp:54
MODEL_CONSTANT Kokkos::Array< FloatType, N_N > y
Definition simple_acetate.hpp:71
static MC::ContribIndexBounds get_bounds()
Definition simple_acetate.hpp:242
SimpleAcetate Self
Definition simple_acetate.hpp:30
static KOKKOS_INLINE_FUNCTION MC::Status update(const MC::pool_type &random_pool, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition simple_acetate.hpp:152
MODEL_CONSTANT FloatType lin_density
Definition simple_acetate.hpp:63
MODEL_CONSTANT auto l_max_dist
Definition simple_acetate.hpp:77
MODEL_CONSTANT FloatType y_s
Definition simple_acetate.hpp:69
MODEL_CONSTANT FloatType a_max_m
Definition simple_acetate.hpp:57
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_acetate.hpp:195
MODEL_CONSTANT FloatType d_m
Definition simple_acetate.hpp:61
MODEL_CONSTANT FloatType l_min_m
Definition simple_acetate.hpp:59
MODEL_CONSTANT FloatType l_max_m
Definition simple_acetate.hpp:58
static constexpr std::string_view name
Definition simple_acetate.hpp:53
MODEL_CONSTANT std::size_t N_N
Definition simple_acetate.hpp:56
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition simple_acetate.hpp:106
MODEL_CONSTANT FloatType k_s
Definition simple_acetate.hpp:65
MODEL_CONSTANT FloatType k_a
Definition simple_acetate.hpp:66
static constexpr std::size_t n_var
Definition simple_acetate.hpp:51
static KOKKOS_INLINE_FUNCTION void init(const MC::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition simple_acetate.hpp:130