1#ifndef __TWOMETA_MODEL_NB_HPP__
2#define __TWOMETA_MODEL_NB_HPP__
4#include <common/traits.hpp>
5#include <mc/macros.hpp>
6#include <mc/prng/prng_extension.hpp>
7#include <mc/traits.hpp>
8#include <models/uptake_dyn.hpp>
9#include <models/utils.hpp>
24 age = INDEX_FROM_ENUM(Uptakeparticle_var::COUNT),
40 static constexpr std::string_view
name =
"two_mode_nb";
96 KOKKOS_INLINE_FUNCTION
static double mass(std::size_t idx,
102 static std::vector<std::string_view>
names()
126 INDEX_FROM_ENUM(Uptakeparticle_var::ap_1),
127 INDEX_FROM_ENUM(Uptakeparticle_var::ap_2),
128 INDEX_FROM_ENUM(Uptakeparticle_var::ap_3),
136 Kokkos::printf(
"[Model]: PRENINIT:BEGIN\r\n");
141 KOKKOS_INLINE_FUNCTION
static void
153 KOKKOS_INLINE_FUNCTION
static void
160 KOKKOS_INLINE_FUNCTION
static void
162 std::size_t position,
168 CHECK_MODEL(TwoMetaNb)
170 KOKKOS_INLINE_FUNCTION
void
183 constexpr auto nu_1_initial_dist =
185 mu_nu_dist, mu_nu_dist / 7., 0.,
static_cast<double>(
nu_max_kg_s));
187 auto gen = random_pool.get_state();
188 auto l = length_dist.draw(gen);
193 random_pool.free_state(gen);
214 const auto o = Kokkos::max(
static_cast<FloatType>(concentrations(1)), 0.F);
218 const auto nu_1_star =
223 const auto s_1_star = (1.F /
y_sx_1 * nu_1_star);
225 const auto phi_s_residual_1_star = Kokkos::max(phi_s - s_1_star, 0.F);
226 KOKKOS_ASSERT(phi_s_residual_1_star >= 0.F);
228 const auto nu_2_star =
y_sx_2 * phi_s_residual_1_star;
235 nu_eff_1 = Kokkos::min(nu_1_star, nu_1);
238 const auto phi_s_residual_1 = Kokkos::max(phi_s - s_1, 0.F);
247 const auto s_overflow = phi_s - s_growth;
263 nu_1 += d_t * ((nu_1_star - nu_1) /
tau_1);
265 nu_2 += d_t * ((nu_2_star - nu_2) /
tau_2);
277 KOKKOS_INLINE_FUNCTION
void
302 auto gen = random_pool.get_state();
305 new_current_length + local_ac.draw(gen);
311 gen, nu_1_o, nu_1_o * half, 0.F, 1.F);
318 gen, nu_2_o, nu_2_o * half, 0.F, 1.F);
322 new_current_length + local_ac.draw(gen);
323 random_pool.free_state(gen);
328 KOKKOS_INLINE_FUNCTION
void
330 std::size_t position,
335 auto access = contributions.access();
336 access(0, position) +=
338 access(1, position) +=
340 access(2, position) +=
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
Model that can export properties.
Definition traits.hpp:159
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
Status
Definition alias.hpp:11
@ Division
Definition alias.hpp:13
@ Idle
Definition alias.hpp:12
constexpr T glucose
Definition utils.hpp:21
constexpr T dioxygen
Definition utils.hpp:22
Models definition.
Definition config_loader.hpp:8
KOKKOS_INLINE_FUNCTION consteval F c_linear_density(F rho, F d)
Definition utils.hpp:40
Represents a TruncatedNormal (Gaussian) probability distribution.
Definition prng_extension.hpp:263
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
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 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