BioCMAMC-ST
uptake_dyn.hpp
1#ifndef __MODELS_UPTAKES_DYN_HPP__
2#define __MODELS_UPTAKES_DYN_HPP__
3
4#include "Kokkos_Assert.hpp"
5#include <common/traits.hpp>
6#include <cstddef>
7#include <mc/prng/prng_extension.hpp>
8#include <mc/traits.hpp>
9#include <models/uptake.hpp>
10
11enum Uptakeparticle_var : int
12{
13 ap_1 = 0,
14 ap_2,
15 ap_3,
16 COUNT
17};
18
19// TODO Put ELSEWHERE
20template <FloatingPointType F>
21consteval F
22freq(F tau)
23{
24 return F(1) / tau;
25}
26
27namespace Models
28{
29
30 // TODO Put ELSEWHERE
31
32 template <FloatingPointType F>
33 KOKKOS_INLINE_FUNCTION constexpr F
34 f_saturation(const F x, const F k) noexcept
35 {
36 return x / (x + k);
37 }
38
39 template <typename T>
40 concept UptakeModel = requires(T model) {
41 // { T::NPermease_init } -> std::convertible_to<typename T::FloatType>;
42
43 // { T::NPermease_max } -> std::convertible_to<typename T::FloatType>;
44
45 { T::k } -> std::convertible_to<typename T::FloatType>;
46 { T::k_perm } -> std::convertible_to<typename T::FloatType>;
47
48 { T::beta } -> std::convertible_to<typename T::FloatType>;
49 { T::tau_ap_1 } -> std::convertible_to<typename T::FloatType>;
50 { T::tau_ap_2 } -> std::convertible_to<typename T::FloatType>;
51 { T::tau_ap_2 } -> std::convertible_to<typename T::FloatType>;
52
53 // { T::tau_new_permease } -> std::convertible_to<typename T::FloatType>;
54
55 // { T::tau_rm_perm } -> std::convertible_to<typename T::FloatType>;
56
57 // { T::tau_pts } -> std::convertible_to<typename T::FloatType>;
58
59 // { T::tau_Au } -> std::convertible_to<typename T::FloatType>;
60
61 // { T::tau_Ad } -> std::convertible_to<typename T::FloatType>;
62
63 // { T::delta } -> std::convertible_to<typename T::FloatType>;
64 };
65
66 template <UptakeModel U, ModelType M = U> struct Uptake
67 {
68 static constexpr std::size_t n_var
69 = static_cast<std::size_t>(Uptakeparticle_var::COUNT);
70 static constexpr std::string_view name = "uptake";
71 using uniform_weight = std::true_type;
72 using Self = Uptake;
73 using FloatType = M::FloatType;
75 using Config = std::nullopt_t;
76
77 static KOKKOS_INLINE_FUNCTION constexpr FloatType
78 f_G(const FloatType x) noexcept
79 {
80 return f_saturation(x, U::k);
81 }
82
83 static KOKKOS_INLINE_FUNCTION constexpr FloatType
84 phi_pts(const FloatType phi_max, const FloatType a_pts, const FloatType S)
85 {
86 return a_pts * phi_max * f_G(S);
87 }
88
89 static KOKKOS_INLINE_FUNCTION constexpr FloatType
91 {
92 return ap_2 * ap_3 * phi_max * U::beta * f_saturation(S, U::k_perm);
93 }
94
95 // static KOKKOS_INLINE_FUNCTION consexpr FloatType phi(FloatType phi_max,
96 // FloatType s)
97 //{
98 // constexpr FloatType k_perm = U::k / 10;
99 // constexpr FloatType sigma = k_perm / 10.;
100 // const FloatType innerexp = (s - k_perm) / sigma;
101 // return a_permease * a_permease_2 * phi_max * U::beta *
102 // Kokkos::exp(-innerexp * innerexp);
103 //
104 // return phi_max * (a_pts * f_G(s) + )
105 //}
106 //
107 KOKKOS_INLINE_FUNCTION
108 static void
109 init(const MC::pool_type& random_pool,
110 std::size_t idx,
111 const SelfParticle& arr)
112 {
113
114 // static constexpr FloatType half = FloatType(0.5);
115 auto gen = random_pool.get_state();
116 // NOLINTBEGIN(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
117 GET_PROPERTY(Uptakeparticle_var::ap_1)
119 gen,
120 FloatType(1e-3),
121 FloatType(1e-4),
122 FloatType(0.),
123 FloatType(1.));
124
125 GET_PROPERTY(Uptakeparticle_var::ap_2)
127 gen,
128 FloatType(0.8),
129 FloatType(0.1),
130 FloatType(0.),
131 FloatType(1.));
132
133 GET_PROPERTY(Uptakeparticle_var::ap_3)
135 gen,
136 FloatType(0.8),
137 FloatType(0.1),
138 FloatType(0.),
139 FloatType(1.));
140
141 // NOLINTEND(cppcoreguidelines-avoid-magic-numbers,readability-magic-numbers)
142 random_pool.free_state(gen);
143 }
144
145 KOKKOS_INLINE_FUNCTION static FloatType
147 std::size_t idx,
148 const SelfParticle& arr,
149 const MC::LocalConcentration& c,
150 FloatType* r_phi_pts = nullptr,
151 FloatType* r_phi_perm = nullptr)
152 {
153 const auto s = c(0);
154
155 const FloatType phi_s_pts
156 = phi_pts(phi_max, GET_PROPERTY(Uptakeparticle_var::ap_1), s);
157 if (r_phi_pts != nullptr)
158 {
159 *r_phi_pts = phi_s_pts;
160 }
161 const auto phi_s_perm
162 = phi_permease(phi_max,
163 GET_PROPERTY(Uptakeparticle_var::ap_1),
164 GET_PROPERTY(Uptakeparticle_var::ap_2),
165 s);
166 if (r_phi_perm != nullptr)
167 {
168 *r_phi_perm = phi_s_perm;
169 }
170
171 return phi_s_pts + phi_s_perm;
172 }
173
174 KOKKOS_INLINE_FUNCTION static FloatType
176 FloatType d_t,
177 std::size_t idx,
178 const SelfParticle& arr,
179 const MC::LocalConcentration& c,
180 FloatType* r_phi_pts = nullptr,
181 FloatType* r_phi_perm = nullptr)
182 {
183 constexpr FloatType one = FloatType(1);
184 constexpr FloatType f_ap_1 = 1. / U::tau_ap_1;
185 constexpr FloatType f_ap_2 = 1. / U::tau_ap_2;
186 constexpr FloatType f_ap_3 = 1. / U::tau_ap_3;
187
188 auto& ap_1 = GET_PROPERTY(Uptakeparticle_var::ap_1);
189 auto& ap_2 = GET_PROPERTY(Uptakeparticle_var::ap_2);
190 auto& ap_3 = GET_PROPERTY(Uptakeparticle_var::ap_3);
191
192 auto phi_s = uptake(phi_max, idx, arr, c, r_phi_pts, r_phi_perm);
193
194 const auto s = c(0);
195 KOKKOS_ASSERT(s >= 0.F);
196 const auto G = f_G(s);
197
198 // constexpr FloatType k_perm = U::k_perm;
199 // constexpr FloatType sigma = k_perm;
200 // const FloatType innerexp = (s - 10*k_perm) / sigma;
201
202 const FloatType ap1_star = G;
203 // const FloatType ap2_star = Kokkos::exp(-innerexp*innerexp);
204
205 constexpr auto yon = U::k_perm / 10.;
206 constexpr auto yoff = U::k_perm * 5.;
207 // constexpr auto alpha = (1. - 0.) / (yoff - yon);
208 // constexpr auto beta = -yon * alpha;
209
210 const FloatType ap2_star = (s >= yon) & (s < yoff);
211 const FloatType ap3_star = (one - ap_1 * G);
212
213 ap_1 += d_t * f_ap_1 * (ap1_star - ap_1);
214
215 ap_2 += d_t * f_ap_2 * (ap2_star - ap_2);
216
217 ap_3 += d_t * f_ap_3 * (ap3_star - ap_3);
218
219 return phi_s;
220 }
221
222 KOKKOS_INLINE_FUNCTION static void
223 division(const MC::pool_type& random_pool,
224 std::size_t idx,
225 std::size_t idx2,
226 const SelfParticle& arr,
227 const SelfParticle& buffer_arr)
228 {
229 static constexpr FloatType half = FloatType(0.5);
230 auto generator = random_pool.get_state();
231 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_1)
233 generator,
234 GET_PROPERTY(Uptakeparticle_var::ap_1),
235 GET_PROPERTY(Uptakeparticle_var::ap_1) * half,
236 FloatType(0.),
237 FloatType(1.));
238
239 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_2)
241 generator,
242 GET_PROPERTY(Uptakeparticle_var::ap_1),
243 GET_PROPERTY(Uptakeparticle_var::ap_2) * half,
244 FloatType(0.),
245 FloatType(1.));
246
247 const auto new_n_permease = GET_PROPERTY(Uptakeparticle_var::ap_3) * half;
248 GET_PROPERTY(Uptakeparticle_var::ap_3) = new_n_permease;
249 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_3)
250 = new_n_permease;
251 random_pool.free_state(generator);
252 }
253
254 [[maybe_unused]] KOKKOS_INLINE_FUNCTION static void
255 contribution([[maybe_unused]] std::size_t idx,
256 [[maybe_unused]] std::size_t position,
257 [[maybe_unused]] double weight,
258 [[maybe_unused]] const SelfParticle& arr,
259 [[maybe_unused]] const MC::ContributionView& contributions)
260 {
261 }
262
263 KOKKOS_INLINE_FUNCTION static double
264 mass(std::size_t idx, const SelfParticle& arr)
265 {
266 (void)idx;
267 (void)arr;
268 return 0.;
269 }
270
271 inline constexpr static std::array<std::string_view, n_var>
273 {
274 constexpr std::array<std::string_view, n_var> _names
275 = { "a_pts", "a_permease_1", "a_permease_2" };
276 static_assert(_names.size() == n_var);
277 return _names;
278 }
279 };
280
281 // CHECK_MODEL(Uptake<DefaultModel>)
282} // namespace Models
283
284#endif
Definition uptake_dyn.hpp:40
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:95
decltype(Kokkos::Experimental::create_scatter_view( kernelContribution())) ContributionView
Definition alias.hpp:88
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 constexpr F f_saturation(const F x, const F k) noexcept
Definition uptake_dyn.hpp:34
static KOKKOS_INLINE_FUNCTION F draw_from(Kokkos::Random_XorShift1024< DeviceType > &gen, F mu, F sigma, F lower, F upper)
Definition prng_extension.hpp:380
Definition uptake_dyn.hpp:67
M::FloatType FloatType
Definition uptake_dyn.hpp:73
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_dyn.hpp:255
MC::ParticlesModel< M::n_var, Self::FloatType > SelfParticle
Definition uptake_dyn.hpp:74
std::nullopt_t Config
Definition uptake_dyn.hpp:75
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition uptake_dyn.hpp:264
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_pts(const FloatType phi_max, const FloatType a_pts, const FloatType S)
Definition uptake_dyn.hpp:84
static KOKKOS_INLINE_FUNCTION constexpr FloatType f_G(const FloatType x) noexcept
Definition uptake_dyn.hpp:78
static KOKKOS_INLINE_FUNCTION FloatType uptake(FloatType phi_max, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c, FloatType *r_phi_pts=nullptr, FloatType *r_phi_perm=nullptr)
Definition uptake_dyn.hpp:146
static KOKKOS_INLINE_FUNCTION void init(const MC::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition uptake_dyn.hpp:109
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_permease(FloatType phi_max, FloatType ap_2, FloatType ap_3, FloatType S)
Definition uptake_dyn.hpp:90
static constexpr std::array< std::string_view, n_var > names()
Definition uptake_dyn.hpp:272
static constexpr std::string_view name
Definition uptake_dyn.hpp:70
static KOKKOS_INLINE_FUNCTION FloatType uptake_step(FloatType phi_max, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c, FloatType *r_phi_pts=nullptr, FloatType *r_phi_perm=nullptr)
Definition uptake_dyn.hpp:175
Uptake Self
Definition uptake_dyn.hpp:72
std::true_type uniform_weight
Definition uptake_dyn.hpp:71
static constexpr std::size_t n_var
Definition uptake_dyn.hpp:69
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 uptake_dyn.hpp:223