1#ifndef __MODELS_UPTAKES_DYN_HPP__
2#define __MODELS_UPTAKES_DYN_HPP__
4#include "Kokkos_Assert.hpp"
5#include <common/traits.hpp>
7#include <mc/prng/prng_extension.hpp>
8#include <mc/traits.hpp>
9#include <models/uptake.hpp>
11enum Uptakeparticle_var :
int
20template <FloatingPo
intType F>
32 template <FloatingPo
intType F>
33 KOKKOS_INLINE_FUNCTION
constexpr F
45 { T::k } -> std::convertible_to<typename T::FloatType>;
46 { T::k_perm } -> std::convertible_to<typename T::FloatType>;
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>;
66 template <UptakeModel U, ModelType M = U>
struct Uptake
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";
77 static KOKKOS_INLINE_FUNCTION
constexpr FloatType
83 static KOKKOS_INLINE_FUNCTION
constexpr FloatType
86 return a_pts * phi_max *
f_G(S);
89 static KOKKOS_INLINE_FUNCTION
constexpr FloatType
92 return ap_2 * ap_3 * phi_max * U::beta *
f_saturation(S, U::k_perm);
107 KOKKOS_INLINE_FUNCTION
115 auto gen = random_pool.get_state();
117 GET_PROPERTY(Uptakeparticle_var::ap_1)
125 GET_PROPERTY(Uptakeparticle_var::ap_2)
133 GET_PROPERTY(Uptakeparticle_var::ap_3)
142 random_pool.free_state(gen);
156 =
phi_pts(phi_max, GET_PROPERTY(Uptakeparticle_var::ap_1), s);
157 if (r_phi_pts !=
nullptr)
159 *r_phi_pts = phi_s_pts;
161 const auto phi_s_perm
163 GET_PROPERTY(Uptakeparticle_var::ap_1),
164 GET_PROPERTY(Uptakeparticle_var::ap_2),
166 if (r_phi_perm !=
nullptr)
168 *r_phi_perm = phi_s_perm;
171 return phi_s_pts + phi_s_perm;
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;
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);
192 auto phi_s =
uptake(phi_max, idx, arr, c, r_phi_pts, r_phi_perm);
195 KOKKOS_ASSERT(s >= 0.F);
196 const auto G =
f_G(s);
205 constexpr auto yon = U::k_perm / 10.;
206 constexpr auto yoff = U::k_perm * 5.;
210 const FloatType ap2_star = (s >= yon) & (s < yoff);
211 const FloatType ap3_star = (one - ap_1 * G);
213 ap_1 += d_t * f_ap_1 * (ap1_star - ap_1);
215 ap_2 += d_t * f_ap_2 * (ap2_star - ap_2);
217 ap_3 += d_t * f_ap_3 * (ap3_star - ap_3);
222 KOKKOS_INLINE_FUNCTION
static void
230 auto generator = random_pool.get_state();
231 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_1)
234 GET_PROPERTY(Uptakeparticle_var::ap_1),
235 GET_PROPERTY(Uptakeparticle_var::ap_1) * half,
239 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_2)
242 GET_PROPERTY(Uptakeparticle_var::ap_1),
243 GET_PROPERTY(Uptakeparticle_var::ap_2) * half,
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)
251 random_pool.free_state(generator);
254 [[maybe_unused]] KOKKOS_INLINE_FUNCTION
static void
256 [[maybe_unused]] std::size_t position,
257 [[maybe_unused]]
double weight,
263 KOKKOS_INLINE_FUNCTION
static double
271 inline constexpr static std::array<std::string_view, n_var>
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);
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