BioCMAMC-ST
uptake.hpp
1#ifndef __MODELS_UPTAKES_HPP__
2#define __MODELS_UPTAKES_HPP__
3
4#include "mc/prng/prng_extension.hpp"
5#include <cstddef>
6#include <mc/traits.hpp>
7
8#define MONOD_RATIO(__c1__, __x1__, __k1__) ((__c1__) * (__x1__) / ((__x1__) + (__k1__)))
9
10namespace Models
11{
19
20 // TODO Put ELSEWHERE
21 template <FloatingPointType F> consteval F freq(F tau)
22 {
23 return F(1) / tau;
24 }
25
26 template <ModelType M> struct Uptake
27 {
28
29 static constexpr std::size_t n_var = static_cast<std::size_t>(Uptakeparticle_var::COUNT);
30 static constexpr std::string_view name = "uptake";
31 using uniform_weight = std::true_type;
32 using Self = Uptake;
33 using FloatType = M::FloatType;
35
36 MODEL_CONSTANT FloatType NPermease_init = 1;
37 MODEL_CONSTANT FloatType NPermease_max = 200;
38 MODEL_CONSTANT FloatType k_pts = 1e-3;
39 MODEL_CONSTANT FloatType kppermease = 1e-2;
40
41 MODEL_CONSTANT double tau_new_permease = 40.;
42 MODEL_CONSTANT double tau_rm_perm = 200.;
43 MODEL_CONSTANT double tau_pts = 20.;
44 MODEL_CONSTANT double tau_Au = 40.;
45 MODEL_CONSTANT double tau_Ad = 5.;
46
47 static KOKKOS_INLINE_FUNCTION constexpr FloatType _k_pts()
48 {
49 return static_cast<FloatType>(k_pts);
50 }
51
52 static KOKKOS_INLINE_FUNCTION constexpr FloatType
53 phi_pts(const FloatType phi_pts_max, const FloatType a_pts, const FloatType S)
54 {
55 return a_pts * (phi_pts_max * S / (S + static_cast<FloatType>(k_pts)));
56 }
57
58 static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_permease(FloatType phi_permease_specific,
61 FloatType S)
62 {
63 return a_permease * ((n_permease * phi_permease_specific) * (S) / ((S) + (kppermease)));
64 }
65
66 KOKKOS_INLINE_FUNCTION static void
67 init(const MC::KPRNG::pool_type& random_pool, std::size_t idx, const SelfParticle& arr)
68 {
69
70 static constexpr FloatType half = FloatType(0.5);
71 auto gen = random_pool.get_state();
72 GET_PROPERTY(Uptakeparticle_var::a_pts) =
74 gen, FloatType(1e-3), FloatType(1e-4), FloatType(0.), FloatType(1.));
75
76 GET_PROPERTY(Uptakeparticle_var::a_permease) =
78 gen, FloatType(0.8), FloatType(0.1), FloatType(0.), FloatType(1.));
79
80 GET_PROPERTY(Uptakeparticle_var::n_permease) =
82 gen,
85 FloatType(0.),
87 random_pool.free_state(gen);
88 }
89
90 KOKKOS_INLINE_FUNCTION static FloatType uptake(FloatType phi_pts_max,
91 FloatType phi_permease_specific,
92 std::size_t idx,
93 const SelfParticle& arr,
95 {
96 const auto s = c(0);
97 const FloatType phi_s_pts = phi_pts(phi_pts_max, GET_PROPERTY(Uptakeparticle_var::a_pts), s);
98 return phi_s_pts + phi_permease(phi_permease_specific,
100 GET_PROPERTY(Uptakeparticle_var::a_permease),
101 s);
102 }
103
104 KOKKOS_INLINE_FUNCTION static FloatType uptake_step(FloatType phi_pts_max,
105 FloatType phi_permease_specific,
106 FloatType d_t,
107 std::size_t idx,
108 const SelfParticle& arr,
109 const MC::LocalConcentration& c)
110 {
111
112 constexpr FloatType apts_frequency = freq(tau_pts);
113 constexpr FloatType aperm_frequency_au = freq(tau_Au);
114 constexpr FloatType aperm_frequency_ad = freq(tau_Ad);
115 constexpr FloatType n_perm_frequence_new = freq(tau_new_permease);
116 constexpr FloatType n_perm_frequence_rm = freq(tau_rm_perm);
117
118 const auto s = c(0);
119 const FloatType phi_s_pts = phi_pts(phi_pts_max, GET_PROPERTY(Uptakeparticle_var::a_pts), s);
120 const FloatType gamma_PTS_S = phi_s_pts / phi_pts_max;
121 const FloatType phi_s = phi_s_pts + phi_permease(phi_permease_specific,
122 GET_PROPERTY(Uptakeparticle_var::n_permease),
123 GET_PROPERTY(Uptakeparticle_var::a_permease),
124 s);
125 GET_PROPERTY(Uptakeparticle_var::a_pts) +=
126 d_t * apts_frequency *
127 (MONOD_RATIO(FloatType(1), s, k_pts) - GET_PROPERTY(Uptakeparticle_var::a_pts));
128
129 GET_PROPERTY(Uptakeparticle_var::a_permease) +=
130 d_t *
131 ((aperm_frequency_au * gamma_PTS_S + aperm_frequency_ad * (FloatType(1) - gamma_PTS_S)) *
132 (FloatType(1) - gamma_PTS_S - GET_PROPERTY(Uptakeparticle_var::a_permease)));
133
134 GET_PROPERTY(Uptakeparticle_var::n_permease) +=
135 d_t *
136 (MONOD_RATIO(n_perm_frequence_new, k_pts, s) +
137 MONOD_RATIO(n_perm_frequence_rm, s, k_pts)) *
138 (MONOD_RATIO(NPermease_max, k_pts, s) - GET_PROPERTY(Uptakeparticle_var::n_permease));
139
140 return phi_s;
141 }
142
143 // TODO FIND OUT HOW TO MAKE THIS MODEL
144 // KOKKOS_INLINE_FUNCTION static MC::Status update(const MC::KPRNG::pool_type& random_pool,
145 // FloatType d_t,
146 // std::size_t idx,
147 // const SelfParticle& arr,
148 // const MC::LocalConcentration& c)
149 // {
150 // constexpr FloatType apts_frequency = freq(tau_pts);
151 // constexpr FloatType aperm_frequency_au = freq(tau_Au);
152 // constexpr FloatType aperm_frequency_ad = freq(tau_Ad);
153 // constexpr FloatType n_perm_frequence_new = freq(tau_new_permease);
154 // constexpr FloatType n_perm_frequence_rm = freq(tau_rm_perm);
155 // const auto s = c(0);
156
157 // GET_PROPERTY(Uptakeparticle_var::a_pts) +=
158 // d_t * apts_frequency *
159 // (MONOD_RATIO(FloatType(1), s, k_pts) - GET_PROPERTY(Uptakeparticle_var::a_pts));
160 // GET_PROPERTY(Uptakeparticle_var::a_permease) +=
161 // d_t *
162 // ((aperm_frequency_au * gamma_PTS_S + aperm_frequency_ad * (FloatType(1) - gamma_PTS_S))
163 // *
164 // (FloatType(1) - gamma_PTS_S - GET_PROPERTY(Uptakeparticle_var::a_permease)));
165
166 // GET_PROPERTY(Uptakeparticle_var::n_permease) +=
167 // d_t *
168 // (MONOD_RATIO(n_perm_frequence_new, k_pts, s) +
169 // MONOD_RATIO(n_perm_frequence_rm, s, k_pts)) *
170 // (MONOD_RATIO(NPermease_init, k_pts, s) - GET_PROPERTY(Uptakeparticle_var::n_permease));
171 // }
172
173 KOKKOS_INLINE_FUNCTION static void division(const MC::KPRNG::pool_type& random_pool,
174 std::size_t idx,
175 std::size_t idx2,
176 const SelfParticle& arr,
177 const SelfParticle& buffer_arr)
178 {
179
180 static constexpr FloatType half = FloatType(0.5);
181 auto generator = random_pool.get_state();
182 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::a_pts) =
184 generator,
185 GET_PROPERTY(Uptakeparticle_var::a_pts),
186 GET_PROPERTY(Uptakeparticle_var::a_pts) * half,
187 FloatType(0.),
188 FloatType(1.));
189
190 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::a_permease) =
192 generator,
193 GET_PROPERTY(Uptakeparticle_var::a_pts),
194 GET_PROPERTY(Uptakeparticle_var::a_permease) * half,
195 FloatType(0.),
196 FloatType(1.));
197
198 const auto new_n_permease = GET_PROPERTY(Uptakeparticle_var::n_permease) * half;
199 GET_PROPERTY(Uptakeparticle_var::n_permease) = new_n_permease;
200 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::n_permease) = new_n_permease;
201 random_pool.free_state(generator);
202 }
203
204 [[maybe_unused]] KOKKOS_INLINE_FUNCTION static void
205 contribution([[maybe_unused]] std::size_t idx,
206 [[maybe_unused]] std::size_t position,
207 [[maybe_unused]] double weight,
208 [[maybe_unused]] const SelfParticle& arr,
209 [[maybe_unused]] const MC::ContributionView& contributions)
210 {
211 }
212
213 KOKKOS_INLINE_FUNCTION static double mass(std::size_t idx, const SelfParticle& arr)
214 {
215 (void)idx;
216 (void)arr;
217 return 0.;
218 }
219
220 inline constexpr static std::array<std::string_view, n_var> names()
221 {
222 constexpr std::array<std::string_view, n_var> _names = {"a_pts", "a_permease", "n_permease"};
223 static_assert(_names.size() == n_var);
224 return _names;
225 }
226 };
227 // CHECK_MODEL(Uptake<DefaultModel>)
228} // namespace Models
229
230#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
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
Models definition.
Definition simple_model.hpp:12
Uptakeparticle_var
Definition uptake.hpp:13
@ a_permease
Definition uptake.hpp:15
@ a_pts
Definition uptake.hpp:14
@ n_permease
Definition uptake.hpp:16
@ COUNT
Definition uptake.hpp:17
consteval F freq(F tau)
Definition uptake.hpp:21
static KOKKOS_INLINE_FUNCTION F draw_from(Kokkos::Random_XorShift1024< DeviceType > &gen, F mu, F sigma, F lower, F upper)
Definition prng_extension.hpp:285
Definition uptake.hpp:27
MODEL_CONSTANT double tau_Au
Definition uptake.hpp:44
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition uptake.hpp:67
MODEL_CONSTANT FloatType NPermease_max
Definition uptake.hpp:37
MODEL_CONSTANT FloatType kppermease
Definition uptake.hpp:39
MODEL_CONSTANT FloatType NPermease_init
Definition uptake.hpp:36
static KOKKOS_INLINE_FUNCTION void contribution(std::size_t idx, std::size_t position, double weight, const SelfParticle &arr, const MC::ContributionView &contributions)
Definition uptake.hpp:205
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_permease(FloatType phi_permease_specific, FloatType n_permease, FloatType a_permease, FloatType S)
Definition uptake.hpp:58
static KOKKOS_INLINE_FUNCTION FloatType uptake_step(FloatType phi_pts_max, FloatType phi_permease_specific, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition uptake.hpp:104
static KOKKOS_INLINE_FUNCTION constexpr FloatType _k_pts()
Definition uptake.hpp:47
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition uptake.hpp:213
MC::ParticlesModel< M::n_var, Self::FloatType > SelfParticle
Definition uptake.hpp:34
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 uptake.hpp:173
MODEL_CONSTANT double tau_new_permease
Definition uptake.hpp:41
MODEL_CONSTANT double tau_rm_perm
Definition uptake.hpp:42
static KOKKOS_INLINE_FUNCTION FloatType uptake(FloatType phi_pts_max, FloatType phi_permease_specific, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition uptake.hpp:90
static constexpr std::size_t n_var
Definition uptake.hpp:29
static constexpr std::string_view name
Definition uptake.hpp:30
M::FloatType FloatType
Definition uptake.hpp:33
MODEL_CONSTANT double tau_Ad
Definition uptake.hpp:45
MODEL_CONSTANT FloatType k_pts
Definition uptake.hpp:38
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_pts(const FloatType phi_pts_max, const FloatType a_pts, const FloatType S)
Definition uptake.hpp:53
MODEL_CONSTANT double tau_pts
Definition uptake.hpp:43
static constexpr std::array< std::string_view, n_var > names()
Definition uptake.hpp:220
std::true_type uniform_weight
Definition uptake.hpp:31