BioCMAMC-ST
fixed_length.hpp
1
2#ifndef __FIXED_LENGTH_MODEL_HPP__
3#define __FIXED_LENGTH_MODEL_HPP__
4
5#include "Kokkos_Core_fwd.hpp"
6#include "Kokkos_Macros.hpp"
7#include "common/common.hpp"
8#include "common/traits.hpp"
9#include "mc/alias.hpp"
10#include "mc/macros.hpp"
11#include "models/utils.hpp"
12#include <mc/prng/prng_extension.hpp>
13#include <mc/traits.hpp>
14#include <string_view>
15
16namespace Models
17{
18 // template <FloatingPointType F>
19 // static F consteval _get_phi_s_max(F density,
20 // F dl,
21 // F glucose_to_biomass_yield = 0.5)
22 // {
23 // // dl and density must be same unit, dl*density -> mass and y is mass
24 // yield return (dl * density) / glucose_to_biomass_yield;
25 // }
27 {
28 using uniform_weight = std::true_type;
30 using FloatType = float;
31
32 using Config = Kokkos::View<const FloatType*, ComputeSpace>;
33
34 enum class particle_var : int // NOLINT
35 {
36 length = 0,
39 };
40
41 static constexpr std::size_t n_var
42 = INDEX_FROM_ENUM(particle_var::__COUNT__);
43
44 static constexpr std::size_t n_c = 1;
45
46 static constexpr std::string_view name = "fixed-length";
49
50 MODEL_CONSTANT FloatType l_dot_max = 2e-6 / 3600.; // m
51 MODEL_CONSTANT FloatType l_max_m = 2e-6; // m
52 MODEL_CONSTANT FloatType l_min_m = l_max_m / 2.; // m
53 MODEL_CONSTANT FloatType k = 1e-3; // m
54 MODEL_CONSTANT FloatType d_m = 0.6e-6; // m
55 MODEL_CONSTANT FloatType lin_density
56 = c_linear_density(static_cast<FloatType>(1000), d_m);
57
58 MODEL_CONSTANT FloatType phi_s_max
60
62
63 static Self::Config get_config(std::size_t n);
64
65 KOKKOS_INLINE_FUNCTION static void init(const MC::pool_type& random_pool,
66 std::size_t idx,
67 const SelfParticle& arr,
68 const Config& params);
69
70 KOKKOS_INLINE_FUNCTION static MC::Status
71 update(const MC::pool_type& random_pool,
72 FloatType d_t,
73 std::size_t idx,
74 const SelfParticle& arr,
75 const SelfContribs& arr_contribs,
76 std::size_t position_index,
77 const MC::LocalConcentration& c);
78
79 KOKKOS_INLINE_FUNCTION static void
80 division(const MC::pool_type& random_pool,
81 std::size_t idx,
82 std::size_t idx2,
83 const SelfParticle& arr,
84 const SelfParticle& buffer_arr);
85
86 KOKKOS_INLINE_FUNCTION static double
87 mass(std::size_t idx, const SelfParticle& arr)
88 {
89 return GET_PROPERTY(Self::particle_var::length) * lin_density;
90 }
91
92 static std::vector<std::string_view>
94 {
95 return {
96
97 "length",
98 };
99 }
100
101 static std::vector<std::size_t>
103 {
104 return { INDEX_FROM_ENUM(particle_var::length) };
105 }
106 };
107
108 CHECK_MODEL(FixedLength)
109
110 KOKKOS_INLINE_FUNCTION void
111 FixedLength::init([[maybe_unused]] const MC::pool_type& random_pool,
112 std::size_t idx,
113 const SelfParticle& arr,
114 const Config& config)
115 {
116 auto gen = random_pool.get_state();
117 const auto linit = config(idx);
118 random_pool.free_state(gen);
119 GET_PROPERTY(particle_var::length) = linit;
120 GET_PROPERTY(particle_var::l_max) = l_max_m;
121 // GET_PROPERTY(particle_var::phi_s) = 0.;
122 }
123
124 KOKKOS_INLINE_FUNCTION MC::Status
125 FixedLength::update([[maybe_unused]] const MC::pool_type& random_pool,
126 FloatType d_t,
127 std::size_t idx,
128 const SelfParticle& arr,
129 const SelfContribs& arr_contribs,
130 const std::size_t position_index,
131 const MC::LocalConcentration& c)
132 {
133 auto& l = GET_PROPERTY(Self::particle_var::length);
134 const auto l_max = GET_PROPERTY(Self::particle_var::l_max);
135 const auto s = static_cast<FloatType>(GET_CONCENTRATION(0));
136 auto& c_phi_s = GET_CONTRIBS(0);
137
138 const FloatType g = s / (k + s);
139 const FloatType phi_s = phi_s_max * g;
140 const FloatType ldot = l_dot_max * g;
141 l += d_t * ldot;
142 c_phi_s = -phi_s;
143 return check_div(l, l_max);
144 }
145
146 KOKKOS_INLINE_FUNCTION void
147 FixedLength::division([[maybe_unused]] const MC::pool_type& random_pool,
148 std::size_t idx,
149 std::size_t idx2,
150 const SelfParticle& arr,
151 const SelfParticle& buffer_arr)
152 {
153
154 const FloatType new_current_length
155 = GET_PROPERTY(particle_var::length) / 2.F;
156
157 GET_PROPERTY(particle_var::length) = new_current_length;
158 GET_PROPERTY(particle_var::l_max) = l_max_m;
159
160 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::length)
161 = new_current_length;
162 GET_PROPERTY_FROM(idx2, buffer_arr, particle_var::l_max) = l_max_m;
163 }
164
165} // namespace Models
166
167#endif
Status
Definition alias.hpp:125
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:100
KernelConcentrationType LocalConcentration
Definition alias.hpp:170
Kokkos::View< F *[Nc], ComputeSpace::array_layout, ComputeSpace, Kokkos::MemoryTraits< Kokkos::MemoryTraitsFlags::Restrict > > ParticlesContribs
Definition alias.hpp:66
Kokkos::View< F *[Nd], ComputeSpace::array_layout, ComputeSpace, Kokkos::MemoryTraits< Kokkos::MemoryTraitsFlags::Restrict > > ParticlesModel
Definition alias.hpp:52
Models definition.
Definition config_loader.hpp:9
KOKKOS_INLINE_FUNCTION MC::Status check_div(const T l, const T lc)
Definition utils.hpp:64
static F consteval _get_phi_s_max(F density, F dl, F glucose_to_biomass_yield=0.5)
Definition utils.hpp:45
KOKKOS_INLINE_FUNCTION consteval F c_linear_density(F rho, F d)
Definition utils.hpp:94
Definition alias.hpp:133
Definition fixed_length.hpp:27
MC::ParticlesModel< Self::n_var, Self::FloatType > SelfParticle
Definition fixed_length.hpp:47
FixedLength Self
Definition fixed_length.hpp:29
static constexpr std::string_view name
Definition fixed_length.hpp:46
particle_var
Definition fixed_length.hpp:35
@ length
Definition fixed_length.hpp:36
@ l_max
Definition fixed_length.hpp:37
@ __COUNT__
Definition fixed_length.hpp:38
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 fixed_length.hpp:147
static constexpr std::size_t n_c
Definition fixed_length.hpp:44
MODEL_CONSTANT FloatType l_max_m
Definition fixed_length.hpp:51
static std::vector< std::size_t > get_number()
Definition fixed_length.hpp:102
MODEL_CONSTANT FloatType l_dot_max
Definition fixed_length.hpp:50
MODEL_CONSTANT FloatType l_min_m
Definition fixed_length.hpp:52
MODEL_CONSTANT FloatType d_m
Definition fixed_length.hpp:54
MODEL_CONSTANT FloatType phi_s_max
Definition fixed_length.hpp:59
MODEL_CONSTANT FloatType lin_density
Definition fixed_length.hpp:56
static std::vector< std::string_view > names()
Definition fixed_length.hpp:93
static MC::ContribIndexBounds get_bounds()
MODEL_CONSTANT FloatType k
Definition fixed_length.hpp:53
MC::ParticlesContribs< Self::n_c, Self::FloatType > SelfContribs
Definition fixed_length.hpp:48
float FloatType
Definition fixed_length.hpp:30
std::true_type uniform_weight
Definition fixed_length.hpp:28
static Self::Config get_config(std::size_t n)
Definition config_loader.cpp:13
static KOKKOS_INLINE_FUNCTION MC::Status update(const MC::pool_type &random_pool, FloatType d_t, std::size_t idx, const SelfParticle &arr, const SelfContribs &arr_contribs, std::size_t position_index, const MC::LocalConcentration &c)
Definition fixed_length.hpp:125
static constexpr std::size_t n_var
Definition fixed_length.hpp:42
static KOKKOS_INLINE_FUNCTION void init(const MC::pool_type &random_pool, std::size_t idx, const SelfParticle &arr, const Config &params)
Definition fixed_length.hpp:111
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition fixed_length.hpp:87
Kokkos::View< const FloatType *, ComputeSpace > Config
Definition fixed_length.hpp:32