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 using Config = std::nullopt_t;
36
37 MODEL_CONSTANT FloatType NPermease_init = 1;
38 MODEL_CONSTANT FloatType NPermease_max = 200;
39 MODEL_CONSTANT FloatType k_pts = 1e-3;
40 MODEL_CONSTANT FloatType kppermease = 1e-2;
41
42 MODEL_CONSTANT double tau_new_permease = 40.;
43 MODEL_CONSTANT double tau_rm_perm = 200.;
44 MODEL_CONSTANT double tau_pts = 20.;
45 MODEL_CONSTANT double tau_Au = 40.;
46 MODEL_CONSTANT double tau_Ad = 5.;
47
48 static KOKKOS_INLINE_FUNCTION constexpr FloatType _k_pts()
49 {
50 return static_cast<FloatType>(k_pts);
51 }
52
53 static KOKKOS_INLINE_FUNCTION constexpr FloatType
54 phi_pts(const FloatType phi_pts_max, const FloatType a_pts, const FloatType S)
55 {
56 return a_pts * (phi_pts_max * S / (S + static_cast<FloatType>(k_pts)));
57 }
58
59 static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_permease(FloatType phi_permease_specific,
62 FloatType S)
63 {
64 return a_permease * ((n_permease * phi_permease_specific) * (S) / ((S) + (kppermease)));
65 }
66
67 KOKKOS_INLINE_FUNCTION static void
68 init(const MC::KPRNG::pool_type& random_pool, std::size_t idx, const SelfParticle& arr)
69 {
70
71 static constexpr FloatType half = FloatType(0.5);
72 auto gen = random_pool.get_state();
73 GET_PROPERTY(Uptakeparticle_var::a_pts) =
75 gen, FloatType(1e-3), FloatType(1e-4), FloatType(0.), FloatType(1.));
76
77 GET_PROPERTY(Uptakeparticle_var::a_permease) =
79 gen, FloatType(0.8), FloatType(0.1), FloatType(0.), FloatType(1.));
80
81 GET_PROPERTY(Uptakeparticle_var::n_permease) =
83 gen,
86 FloatType(0.),
88 random_pool.free_state(gen);
89 }
90
91 KOKKOS_INLINE_FUNCTION static FloatType uptake(FloatType phi_pts_max,
92 FloatType phi_permease_specific,
93 std::size_t idx,
94 const SelfParticle& arr,
96 {
97 const auto s = c(0);
98 const FloatType phi_s_pts = phi_pts(phi_pts_max, GET_PROPERTY(Uptakeparticle_var::a_pts), s);
99 return phi_s_pts + phi_permease(phi_permease_specific,
100 GET_PROPERTY(Uptakeparticle_var::a_permease),
101 GET_PROPERTY(Uptakeparticle_var::a_permease),
102 s);
103 }
104
105 KOKKOS_INLINE_FUNCTION static FloatType uptake_step(FloatType phi_pts_max,
106 FloatType phi_permease_specific,
107 FloatType d_t,
108 std::size_t idx,
109 const SelfParticle& arr,
110 const MC::LocalConcentration& c)
111 {
112
113 constexpr FloatType apts_frequency = freq(tau_pts);
114 constexpr FloatType aperm_frequency_au = freq(tau_Au);
115 constexpr FloatType aperm_frequency_ad = freq(tau_Ad);
116 constexpr FloatType n_perm_frequence_new = freq(tau_new_permease);
117 constexpr FloatType n_perm_frequence_rm = freq(tau_rm_perm);
118
119 const auto s = c(0);
120 const FloatType phi_s_pts = phi_pts(phi_pts_max, GET_PROPERTY(Uptakeparticle_var::a_pts), s);
121 const FloatType gamma_PTS_S = phi_s_pts / phi_pts_max;
122 const FloatType phi_s = phi_s_pts + phi_permease(phi_permease_specific,
123 GET_PROPERTY(Uptakeparticle_var::n_permease),
124 GET_PROPERTY(Uptakeparticle_var::a_permease),
125 s);
126 GET_PROPERTY(Uptakeparticle_var::a_pts) +=
127 d_t * apts_frequency *
128 (MONOD_RATIO(FloatType(1), s, k_pts) - GET_PROPERTY(Uptakeparticle_var::a_pts));
129
130 GET_PROPERTY(Uptakeparticle_var::a_permease) +=
131 d_t *
132 ((aperm_frequency_au * gamma_PTS_S + aperm_frequency_ad * (FloatType(1) - gamma_PTS_S)) *
133 (FloatType(1) - gamma_PTS_S - GET_PROPERTY(Uptakeparticle_var::a_permease)));
134
135 GET_PROPERTY(Uptakeparticle_var::n_permease) +=
136 d_t *
137 (MONOD_RATIO(n_perm_frequence_new, k_pts, s) +
138 MONOD_RATIO(n_perm_frequence_rm, s, k_pts)) *
139 (MONOD_RATIO(NPermease_max, k_pts, s) - GET_PROPERTY(Uptakeparticle_var::n_permease));
140
141 return phi_s;
142 }
143
144 // TODO FIND OUT HOW TO MAKE THIS MODEL
145 // KOKKOS_INLINE_FUNCTION static MC::Status update(const MC::KPRNG::pool_type& random_pool,
146 // FloatType d_t,
147 // std::size_t idx,
148 // const SelfParticle& arr,
149 // const MC::LocalConcentration& c)
150 // {
151 // constexpr FloatType apts_frequency = freq(tau_pts);
152 // constexpr FloatType aperm_frequency_au = freq(tau_Au);
153 // constexpr FloatType aperm_frequency_ad = freq(tau_Ad);
154 // constexpr FloatType n_perm_frequence_new = freq(tau_new_permease);
155 // constexpr FloatType n_perm_frequence_rm = freq(tau_rm_perm);
156 // const auto s = c(0);
157
158 // GET_PROPERTY(Uptakeparticle_var::a_pts) +=
159 // d_t * apts_frequency *
160 // (MONOD_RATIO(FloatType(1), s, k_pts) - GET_PROPERTY(Uptakeparticle_var::a_pts));
161 // GET_PROPERTY(Uptakeparticle_var::a_permease) +=
162 // d_t *
163 // ((aperm_frequency_au * gamma_PTS_S + aperm_frequency_ad * (FloatType(1) - gamma_PTS_S))
164 // *
165 // (FloatType(1) - gamma_PTS_S - GET_PROPERTY(Uptakeparticle_var::a_permease)));
166
167 // GET_PROPERTY(Uptakeparticle_var::n_permease) +=
168 // d_t *
169 // (MONOD_RATIO(n_perm_frequence_new, k_pts, s) +
170 // MONOD_RATIO(n_perm_frequence_rm, s, k_pts)) *
171 // (MONOD_RATIO(NPermease_init, k_pts, s) - GET_PROPERTY(Uptakeparticle_var::n_permease));
172 // }
173
174 KOKKOS_INLINE_FUNCTION static void division(const MC::KPRNG::pool_type& random_pool,
175 std::size_t idx,
176 std::size_t idx2,
177 const SelfParticle& arr,
178 const SelfParticle& buffer_arr)
179 {
180
181 static constexpr FloatType half = FloatType(0.5);
182 auto generator = random_pool.get_state();
183 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::a_pts) =
185 generator,
186 GET_PROPERTY(Uptakeparticle_var::a_pts),
187 GET_PROPERTY(Uptakeparticle_var::a_pts) * half,
188 FloatType(0.),
189 FloatType(1.));
190
191 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::a_permease) =
193 generator,
194 GET_PROPERTY(Uptakeparticle_var::a_pts),
195 GET_PROPERTY(Uptakeparticle_var::a_permease) * half,
196 FloatType(0.),
197 FloatType(1.));
198
199 const auto new_n_permease = GET_PROPERTY(Uptakeparticle_var::n_permease) * half;
200 GET_PROPERTY(Uptakeparticle_var::n_permease) = new_n_permease;
201 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::n_permease) = new_n_permease;
202 random_pool.free_state(generator);
203 }
204
205 [[maybe_unused]] KOKKOS_INLINE_FUNCTION static void
206 contribution([[maybe_unused]] std::size_t idx,
207 [[maybe_unused]] std::size_t position,
208 [[maybe_unused]] double weight,
209 [[maybe_unused]] const SelfParticle& arr,
210 [[maybe_unused]] const MC::ContributionView& contributions)
211 {
212 }
213
214 KOKKOS_INLINE_FUNCTION static double mass(std::size_t idx, const SelfParticle& arr)
215 {
216 (void)idx;
217 (void)arr;
218 return 0.;
219 }
220
221 inline constexpr static std::array<std::string_view, n_var> names()
222 {
223 constexpr std::array<std::string_view, n_var> _names = {"a_pts", "a_permease", "n_permease"};
224 static_assert(_names.size() == n_var);
225 return _names;
226 }
227 };
228 // CHECK_MODEL(Uptake<DefaultModel>)
229} // namespace Models
230
231#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:42
Kokkos::Experimental::ScatterView< double **, Kokkos::LayoutRight > ContributionView
Definition alias.hpp:31
Kokkos::View< F *[Nd]> ParticlesModel
Definition traits.hpp:34
Models definition.
Definition config_loader.hpp:8
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:287
Definition uptake.hpp:27
MODEL_CONSTANT double tau_Au
Definition uptake.hpp:45
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition uptake.hpp:68
MODEL_CONSTANT FloatType NPermease_max
Definition uptake.hpp:38
MODEL_CONSTANT FloatType kppermease
Definition uptake.hpp:40
MODEL_CONSTANT FloatType NPermease_init
Definition uptake.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 uptake.hpp:206
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_permease(FloatType phi_permease_specific, FloatType n_permease, FloatType a_permease, FloatType S)
Definition uptake.hpp:59
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:105
static KOKKOS_INLINE_FUNCTION constexpr FloatType _k_pts()
Definition uptake.hpp:48
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition uptake.hpp:214
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:174
std::nullopt_t Config
Definition uptake.hpp:35
MODEL_CONSTANT double tau_new_permease
Definition uptake.hpp:42
MODEL_CONSTANT double tau_rm_perm
Definition uptake.hpp:43
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:91
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:46
MODEL_CONSTANT FloatType k_pts
Definition uptake.hpp:39
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_pts(const FloatType phi_pts_max, const FloatType a_pts, const FloatType S)
Definition uptake.hpp:54
MODEL_CONSTANT double tau_pts
Definition uptake.hpp:44
static constexpr std::array< std::string_view, n_var > names()
Definition uptake.hpp:221
std::true_type uniform_weight
Definition uptake.hpp:31