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>
consteval F freq(F tau)
30 template <FloatingPo
intType F>
31 KOKKOS_INLINE_FUNCTION
constexpr F
f_saturation(
const F x,
const F k)
noexcept
42 { T::k } -> std::convertible_to<typename T::FloatType>;
43 { T::k_perm } -> std::convertible_to<typename T::FloatType>;
45 { T::beta } -> std::convertible_to<typename T::FloatType>;
46 { T::tau_ap_1 } -> std::convertible_to<typename T::FloatType>;
47 { T::tau_ap_2 } -> std::convertible_to<typename T::FloatType>;
48 { T::tau_ap_2 } -> std::convertible_to<typename T::FloatType>;
63 template <UptakeModel U, ModelType M = U>
struct Uptake
65 static constexpr std::size_t
n_var =
66 static_cast<std::size_t
>(Uptakeparticle_var::COUNT);
67 static constexpr std::string_view
name =
"uptake";
74 static KOKKOS_INLINE_FUNCTION
constexpr FloatType
80 static KOKKOS_INLINE_FUNCTION
constexpr FloatType
83 return a_pts * phi_max *
f_G(S);
86 static KOKKOS_INLINE_FUNCTION
constexpr FloatType
89 return ap_2 * ap_3 * phi_max * U::beta *
f_saturation(S, U::k_perm);
104 KOKKOS_INLINE_FUNCTION
111 auto gen = random_pool.get_state();
113 GET_PROPERTY(Uptakeparticle_var::ap_1) =
121 GET_PROPERTY(Uptakeparticle_var::ap_2) =
129 GET_PROPERTY(Uptakeparticle_var::ap_3) =
138 random_pool.free_state(gen);
141 KOKKOS_INLINE_FUNCTION
static FloatType
152 phi_pts(phi_max, GET_PROPERTY(Uptakeparticle_var::ap_1), s);
153 if (r_phi_pts !=
nullptr)
155 *r_phi_pts = phi_s_pts;
157 const auto phi_s_perm =
159 GET_PROPERTY(Uptakeparticle_var::ap_1),
160 GET_PROPERTY(Uptakeparticle_var::ap_2),
162 if (r_phi_perm !=
nullptr)
164 *r_phi_perm = phi_s_perm;
167 return phi_s_pts + phi_s_perm;
170 KOKKOS_INLINE_FUNCTION
static FloatType
180 constexpr FloatType f_ap_1 = 1. / U::tau_ap_1;
181 constexpr FloatType f_ap_2 = 1. / U::tau_ap_2;
182 constexpr FloatType f_ap_3 = 1. / U::tau_ap_3;
184 auto& ap_1 = GET_PROPERTY(Uptakeparticle_var::ap_1);
185 auto& ap_2 = GET_PROPERTY(Uptakeparticle_var::ap_2);
186 auto& ap_3 = GET_PROPERTY(Uptakeparticle_var::ap_3);
188 auto phi_s =
uptake(phi_max, idx, arr, c, r_phi_pts, r_phi_perm);
191 KOKKOS_ASSERT(s >= 0.F);
192 const auto G =
f_G(s);
201 constexpr auto yon = U::k_perm / 10.;
202 constexpr auto yoff = U::k_perm * 5.;
203 constexpr auto alpha = (1. - 0.) / (yoff - yon);
204 constexpr auto beta = -yon * alpha;
206 const FloatType ap2_star = (s >= yon) & (s < yoff);
207 const FloatType ap3_star = (one - ap_1 * G);
209 ap_1 += d_t * f_ap_1 * (ap1_star - ap_1);
211 ap_2 += d_t * f_ap_2 * (ap2_star - ap_2);
213 ap_3 += d_t * f_ap_3 * (ap3_star - ap_3);
218 KOKKOS_INLINE_FUNCTION
static void
226 auto generator = random_pool.get_state();
227 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_1) =
230 GET_PROPERTY(Uptakeparticle_var::ap_1),
231 GET_PROPERTY(Uptakeparticle_var::ap_1) * half,
235 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_2) =
238 GET_PROPERTY(Uptakeparticle_var::ap_1),
239 GET_PROPERTY(Uptakeparticle_var::ap_2) * half,
243 const auto new_n_permease = GET_PROPERTY(Uptakeparticle_var::ap_3) * half;
244 GET_PROPERTY(Uptakeparticle_var::ap_3) = new_n_permease;
245 GET_PROPERTY_FROM(idx2, buffer_arr, Uptakeparticle_var::ap_3) =
247 random_pool.free_state(generator);
250 [[maybe_unused]] KOKKOS_INLINE_FUNCTION
static void
252 [[maybe_unused]] std::size_t position,
253 [[maybe_unused]]
double weight,
259 KOKKOS_INLINE_FUNCTION
static double mass(std::size_t idx,
267 inline constexpr static std::array<std::string_view, n_var>
names()
269 constexpr std::array<std::string_view, n_var> _names = {
270 "a_pts",
"a_permease_1",
"a_permease_2"};
271 static_assert(_names.size() ==
n_var);
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:33
Definition uptake_dyn.hpp:37
decltype(Kokkos::Experimental::create_scatter_view(kernelContribution())) ContributionView
Definition alias.hpp:64
Kokkos::Subview< KernelConcentrationType, int, decltype(Kokkos::ALL)> LocalConcentration
Definition alias.hpp:72
Kokkos::View< F *[Nd], Kokkos::LayoutRight > ParticlesModel
Definition traits.hpp:34
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:31
static KOKKOS_INLINE_FUNCTION F draw_from(Kokkos::Random_XorShift1024< DeviceType > &gen, F mu, F sigma, F lower, F upper)
Definition prng_extension.hpp:303
Definition uptake_dyn.hpp:64
M::FloatType FloatType
Definition uptake_dyn.hpp:70
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:251
MC::ParticlesModel< M::n_var, Self::FloatType > SelfParticle
Definition uptake_dyn.hpp:71
std::nullopt_t Config
Definition uptake_dyn.hpp:72
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition uptake_dyn.hpp:259
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_dyn.hpp:219
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition uptake_dyn.hpp:105
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_pts(const FloatType phi_max, const FloatType a_pts, const FloatType S)
Definition uptake_dyn.hpp:81
static KOKKOS_INLINE_FUNCTION constexpr FloatType f_G(const FloatType x) noexcept
Definition uptake_dyn.hpp:75
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:142
static KOKKOS_INLINE_FUNCTION constexpr FloatType phi_permease(FloatType phi_max, FloatType ap_2, FloatType ap_3, FloatType S)
Definition uptake_dyn.hpp:87
static constexpr std::array< std::string_view, n_var > names()
Definition uptake_dyn.hpp:267
static constexpr std::string_view name
Definition uptake_dyn.hpp:67
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:171
Uptake Self
Definition uptake_dyn.hpp:69
std::true_type uniform_weight
Definition uptake_dyn.hpp:68
static constexpr std::size_t n_var
Definition uptake_dyn.hpp:65