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