BioCMAMC-ST
simple_model.hpp
1#ifndef __SIMPLE_MODEL_HPP__
2#define __SIMPLE_MODEL_HPP__
3
4#include "common/traits.hpp"
5#include "models/utils.hpp"
6#include <mc/prng/prng_extension.hpp>
7#include <mc/traits.hpp>
8#include <models/uptake.hpp>
9#include <optional>
10#include <string_view>
11
12namespace Models
13{
14 template <FloatingPointType F> static F consteval get_phi_s_max(F density, F dl)
15 {
16 // dl and density must be same unit, dl*density -> mass and y is mass yield
17 return (dl * density) * 0.5;
18 }
20 {
21 using uniform_weight = std::true_type; // Using type alias
23 using FloatType = float;
24 using Config = std::nullopt_t;
25
26 enum class particle_var : int
27 {
28 length = INDEX_FROM_ENUM(Uptakeparticle_var::COUNT),
29 age,
30 phi_s,
31 t_div,
32 COUNT
33 };
34
35 static constexpr std::size_t n_var = INDEX_FROM_ENUM(particle_var::COUNT);
36 static constexpr std::string_view name = "simple";
38
39 MODEL_CONSTANT FloatType l_max_m = 5e-6; // m
40 MODEL_CONSTANT FloatType l_c_m = 3e-6; // m
41 MODEL_CONSTANT FloatType d_m = 0.6e-6; // m
42 MODEL_CONSTANT FloatType l_min_m = 0.9e-6; // m
43 MODEL_CONSTANT FloatType lin_density = c_linear_density(static_cast<FloatType>(1000), d_m);
44
45 MODEL_CONSTANT FloatType phi_s_max = get_phi_s_max<FloatType>(lin_density, 8 * 2e-10); // kgS/s
46
47 MODEL_CONSTANT FloatType phi_perm_max = phi_s_max / 40.; // kgS/
48
49 MODEL_CONSTANT FloatType frequency_division = 1. / 1000; // Hz
50
51 KOKKOS_INLINE_FUNCTION static void
52 init(const MC::KPRNG::pool_type& random_pool, std::size_t idx, const SelfParticle& arr);
53
54 KOKKOS_INLINE_FUNCTION static MC::Status update(const MC::KPRNG::pool_type& random_pool,
55 FloatType d_t,
56 std::size_t idx,
57 const SelfParticle& arr,
58 const MC::LocalConcentration& c);
59
60 KOKKOS_INLINE_FUNCTION static void division(const MC::KPRNG::pool_type& random_pool,
61 std::size_t idx,
62 std::size_t idx2,
63 const SelfParticle& arr,
64 const SelfParticle& buffer_arr);
65
66 KOKKOS_INLINE_FUNCTION static void contribution(std::size_t idx,
67 std::size_t position,
68 double weight,
69 const SelfParticle& arr,
70 const MC::ContributionView& contributions);
71
72 KOKKOS_INLINE_FUNCTION static double mass(std::size_t idx, const SelfParticle& arr)
73 {
75 }
76
77 // inline constexpr static std::array<std::string_view, n_var> names()
78 // {
79 // constexpr std::size_t ln_var = n_var - Uptake<SimpleModel>::n_var;
80 // constexpr auto _names = concat_arrays<Uptake<SimpleModel>::n_var, ln_var>(
81 // Uptake<SimpleModel>::names(), {"length", "age", "phi_s", "t_div"});
82
83 // return _names;
84 // }
85
86
87
88
89 };
90
91 CHECK_MODEL(SimpleModel)
92
93 KOKKOS_INLINE_FUNCTION void
94 SimpleModel::init([[maybe_unused]] const MC::KPRNG::pool_type& random_pool,
95 std::size_t idx,
96 const SelfParticle& arr)
97 {
98 MODEL_CONSTANT auto division_time_d = MC::Distributions::TruncatedNormal<FloatType>(
99 500, 500./2.,10,1200); //-Kokkos::log(random_number) / frequency_division;
100 MODEL_CONSTANT auto l_distribution = MC::Distributions::TruncatedNormal<FloatType>(
101 l_min_m, l_min_m / 5., l_min_m * 0.5, l_max_m);
102 auto gen = random_pool.get_state();
103 arr(idx, static_cast<int>(particle_var::length)) = l_distribution.draw(gen);
104 GET_PROPERTY(SimpleModel::particle_var::t_div) = division_time_d.draw(gen);
105 random_pool.free_state(gen);
106 arr(idx, static_cast<int>(particle_var::age)) = 0;
107 arr(idx, static_cast<int>(particle_var::phi_s)) = 0;
108
109 Uptake<SimpleModel>::init(random_pool, idx, arr);
110 }
111
112 KOKKOS_INLINE_FUNCTION MC::Status SimpleModel::update([[maybe_unused]]const MC::KPRNG::pool_type& random_pool,
113 FloatType d_t,
114 std::size_t idx,
115 const SelfParticle& arr,
116 const MC::LocalConcentration& c)
117 {
118
119 const auto phi_s = Uptake<SimpleModel>::uptake_step(phi_s_max, phi_perm_max, d_t, idx, arr, c);
120
121 GET_PROPERTY(SimpleModel::particle_var::age) += d_t;
123
124 return (GET_PROPERTY(SimpleModel::particle_var::t_div) <=
125 GET_PROPERTY(SimpleModel::particle_var::age))
128 }
129
130 KOKKOS_INLINE_FUNCTION void SimpleModel::division(const MC::KPRNG::pool_type& random_pool,
131 std::size_t idx,
132 std::size_t idx2,
133 const SelfParticle& arr,
134 const SelfParticle& buffer_arr)
135 {
136 // for(size_t i=0;i<n_var;++i)
137 // {
138 // buffer_arr(idx,i)=arr(idx,i); //basic copy
139 // }
140 MODEL_CONSTANT auto division_time_d = MC::Distributions::TruncatedNormal<FloatType>(
141 500., 500./2.,10,1200); //-Kokkos::log(random_number) / frequency_division;
142
143 const FloatType new_current_length =
144 arr(idx, static_cast<int>(particle_var::length)) / static_cast<FloatType>(2.);
145 buffer_arr(idx2, static_cast<int>(particle_var::length)) = new_current_length;
146 arr(idx, static_cast<int>(particle_var::length)) = new_current_length;
147
148 arr(idx, static_cast<int>(particle_var::age)) = 0;
149 buffer_arr(idx2, static_cast<int>(particle_var::age)) = 0;
150
151 auto gen = random_pool.get_state();
152 GET_PROPERTY_FROM(idx2, buffer_arr, SimpleModel::particle_var::t_div) =
153 division_time_d.draw(gen);
154 GET_PROPERTY(SimpleModel::particle_var::t_div) = division_time_d.draw(gen);
155 random_pool.free_state(gen);
156
157 Uptake<SimpleModel>::division(random_pool, idx, idx2, arr, buffer_arr);
158 }
159
160 KOKKOS_INLINE_FUNCTION void SimpleModel::contribution([[maybe_unused]] std::size_t idx,
161 std::size_t position,
162 double weight,
163 [[maybe_unused]] const SelfParticle& arr,
164 const MC::ContributionView& contributions)
165 {
166 auto access = contributions.access();
167 access(position, 0) += -weight * GET_PROPERTY(SimpleModel::particle_var::phi_s); // NOLINT
168 }
169
170} // namespace Models
171
172#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
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
Models definition.
Definition config_loader.hpp:8
@ COUNT
Definition uptake.hpp:17
KOKKOS_INLINE_FUNCTION consteval F c_linear_density(F rho, F d)
Definition utils.hpp:39
static F consteval get_phi_s_max(F density, F dl)
Definition simple_model.hpp:14
Represents a TruncatedNormal (Gaussian) probability distribution.
Definition prng_extension.hpp:263
Definition simple_model.hpp:20
MODEL_CONSTANT FloatType lin_density
Definition simple_model.hpp:43
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 simple_model.hpp:130
MODEL_CONSTANT FloatType phi_s_max
Definition simple_model.hpp:45
MODEL_CONSTANT FloatType frequency_division
Definition simple_model.hpp:49
MODEL_CONSTANT FloatType phi_perm_max
Definition simple_model.hpp:47
static KOKKOS_INLINE_FUNCTION double mass(std::size_t idx, const SelfParticle &arr)
Definition simple_model.hpp:72
std::true_type uniform_weight
Definition simple_model.hpp:21
MODEL_CONSTANT FloatType l_min_m
Definition simple_model.hpp:42
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition simple_model.hpp:94
static constexpr std::string_view name
Definition simple_model.hpp:36
particle_var
Definition simple_model.hpp:27
MODEL_CONSTANT FloatType d_m
Definition simple_model.hpp:41
static constexpr std::size_t n_var
Definition simple_model.hpp:35
static KOKKOS_INLINE_FUNCTION void contribution(std::size_t idx, std::size_t position, double weight, const SelfParticle &arr, const MC::ContributionView &contributions)
Definition simple_model.hpp:160
MC::ParticlesModel< Self::n_var, Self::FloatType > SelfParticle
Definition simple_model.hpp:37
MODEL_CONSTANT FloatType l_c_m
Definition simple_model.hpp:40
std::nullopt_t Config
Definition simple_model.hpp:24
float FloatType
Definition simple_model.hpp:23
MODEL_CONSTANT FloatType l_max_m
Definition simple_model.hpp:39
static KOKKOS_INLINE_FUNCTION MC::Status update(const MC::KPRNG::pool_type &random_pool, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition simple_model.hpp:112
static KOKKOS_INLINE_FUNCTION void init(const MC::KPRNG::pool_type &random_pool, std::size_t idx, const SelfParticle &arr)
Definition uptake.hpp:68
static KOKKOS_INLINE_FUNCTION FloatType uptake_step(FloatType phi_pts_max, FloatType phi_permease_specific, FloatType d_t, std::size_t idx, const SelfParticle &arr, const MC::LocalConcentration &c)
Definition uptake.hpp:105
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.hpp:174