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