BioCMAMC-ST
model_kernel.hpp
1#ifndef __SIMULATION_MC_KERNEL_HPP
2#define __SIMULATION_MC_KERNEL_HPP
3
4#include <Kokkos_Assert.hpp>
5#include <Kokkos_Core.hpp>
6#include <Kokkos_Printf.hpp>
7#include <Kokkos_Random.hpp>
8#include <biocma_cst_config.hpp>
9#include <cassert>
10#include <mc/domain.hpp>
11#include <mc/events.hpp>
12#include <mc/particles_container.hpp>
13#include <mc/prng/prng.hpp>
14#include <mc/traits.hpp>
15#include <simulation/alias.hpp>
16#include <simulation/probability_leaving.hpp>
17#include <simulation/probe.hpp>
18#include <utility>
19
21{
23 {
24 };
26 {
27 };
28
30 {
32 std::size_t dead_total;
33 };
34
35 template <class Space> class CycleReducer
36 {
37 public:
38 // Required for Concept
41 using result_view_type = Kokkos::View<value_type, Space>;
42
43 KOKKOS_INLINE_FUNCTION
44 void join(value_type& dest, const value_type& src) const
45 {
46 dest.dead_total += src.dead_total;
48 }
49
50 KOKKOS_INLINE_FUNCTION
52 {
53 return *value.data();
54 }
55
56 KOKKOS_INLINE_FUNCTION
58 {
59 return value;
60 }
61
62 KOKKOS_INLINE_FUNCTION
63 bool references_scalar() const
64 {
66 }
67
68 // Optional
69 KOKKOS_INLINE_FUNCTION
70 void init(value_type& val) const
71 {
72 val.dead_total = 0;
74 }
75
76 // KOKKOS_INLINE_FUNCTION
77 // void final(value_type& val) const
78 // {
79 // // NOP
80 // }
81
82 // Part of Build-In reducers for Kokkos
83 KOKKOS_INLINE_FUNCTION
85 {
86 }
87
88 KOKKOS_INLINE_FUNCTION
90 : value(value_), references_scalar_v(false)
91 {
92 }
93
94 private:
97 };
98 template <ModelType M> struct CycleFunctor
99 {
100 using TeamPolicy = Kokkos::TeamPolicy<ComputeSpace>;
101 using TeamMember = TeamPolicy::member_type;
103
104 KOKKOS_INLINE_FUNCTION
106 MC::KPRNG::pool_type _random_pool,
107 MC::KernelConcentrationType&& _concentrations,
108 MC::ContributionView _contribs_scatter,
109 MC::EventContainer _event)
110 : d_t(0.), particles(_particles), random_pool(_random_pool),
111 concentrations(std::move(_concentrations)),
112 contribs_scatter(std::move(_contribs_scatter)),
113 events(std::move(_event))
114 {
115 }
116
117 void update(double _d_t, MC::ParticlesContainer<M> _particles)
118 {
119 this->d_t = _d_t;
120 this->particles = _particles;
121 }
122
124 {
125 this->block = _block;
126 }
127
128 KOKKOS_INLINE_FUNCTION
129 void operator()(const TagFirstPass _tag,
130 const TeamMember& team_handle) const
131 {
132 (void)_tag;
133 GET_INDEX(particles.n_particles());
134 if (particles.status(idx) != MC::Status::Idle) [[unlikely]]
135 {
136 return;
137 }
138 particles.get_contributions(idx, contribs_scatter);
139 }
140
141 KOKKOS_INLINE_FUNCTION void operator()(const TagSecondPass _tag,
142 const TeamMember& team_handle,
143 value_type& reduce_val) const
144 {
145 (void)_tag;
146 (void)reduce_val.dead_total; // Counter not used currently because there
147 // is no cell mortality
148 GET_INDEX(particles.n_particles());
149 if (particles.status(idx) != MC::Status::Idle) [[unlikely]]
150 {
151 return;
152 }
153
154 auto local_c =
155 Kokkos::subview(concentrations, Kokkos::ALL, particles.position(idx));
156
157 if (M::update(random_pool, d_t, idx, particles.model, local_c) ==
159 {
160 if (!particles.handle_division(random_pool, idx))
161 {
162 reduce_val.waiting_allocation_particle += 1;
163 Kokkos::printf("[KERNEL] Division Overflow\r\n");
164 events.wrap_incr<MC::EventType::Overflow>();
165 }
167 };
168
169 // particles.template get_contributions<ComputeSpace, TeamMember>(
170 // random_pool, idx, contribs_scatter, team_handle);
171 }
172
173 M::FloatType d_t;
178 // kernelContribution contribs;
182 };
183
184} // namespace Simulation::KernelInline
185#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:143
Kokkos::View< value_type, Space > result_view_type
Definition model_kernel.hpp:41
KOKKOS_INLINE_FUNCTION CycleReducer(const result_view_type &value_)
Definition model_kernel.hpp:89
KOKKOS_INLINE_FUNCTION bool references_scalar() const
Definition model_kernel.hpp:63
KOKKOS_INLINE_FUNCTION void init(value_type &val) const
Definition model_kernel.hpp:70
KOKKOS_INLINE_FUNCTION result_view_type view() const
Definition model_kernel.hpp:57
KOKKOS_INLINE_FUNCTION void join(value_type &dest, const value_type &src) const
Definition model_kernel.hpp:44
CycleReduceType value_type
Definition model_kernel.hpp:40
KOKKOS_INLINE_FUNCTION CycleReducer(value_type &value_)
Definition model_kernel.hpp:84
KOKKOS_INLINE_FUNCTION value_type & reference() const
Definition model_kernel.hpp:51
bool references_scalar_v
Definition model_kernel.hpp:96
CycleReducer reducer
Definition model_kernel.hpp:39
result_view_type value
Definition model_kernel.hpp:95
Kokkos::Experimental:: ScatterView< double **, Kokkos::LayoutRight > ContributionView
Definition alias.hpp:47
@ Overflow
Definition events.hpp:22
@ NewParticle
Spawn new particle.
Definition events.hpp:18
@ Division
Definition alias.hpp:13
@ Idle
Definition alias.hpp:12
Kokkos::View< const double **, Kokkos::LayoutLeft, ComputeSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > KernelConcentrationType
Definition alias.hpp:53
Definition kernels.hpp:8
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:43
MC::ContributionView block
Definition model_kernel.hpp:181
void sblock(MC::ContributionView _block)
Definition model_kernel.hpp:123
MC::EventContainer events
Definition model_kernel.hpp:180
M::FloatType d_t
Definition model_kernel.hpp:173
MC::ContributionView contribs_scatter
Definition model_kernel.hpp:177
MC::KernelConcentrationType concentrations
Definition model_kernel.hpp:176
KOKKOS_INLINE_FUNCTION CycleFunctor(MC::ParticlesContainer< M > _particles, MC::KPRNG::pool_type _random_pool, MC::KernelConcentrationType &&_concentrations, MC::ContributionView _contribs_scatter, MC::EventContainer _event)
Definition model_kernel.hpp:105
MC::ParticlesContainer< M > particles
Definition model_kernel.hpp:174
TeamPolicy::member_type TeamMember
Definition model_kernel.hpp:101
CycleReduceType value_type
Definition model_kernel.hpp:102
MC::KPRNG::pool_type random_pool
Definition model_kernel.hpp:175
KOKKOS_INLINE_FUNCTION void operator()(const TagFirstPass _tag, const TeamMember &team_handle) const
Definition model_kernel.hpp:129
KOKKOS_INLINE_FUNCTION void operator()(const TagSecondPass _tag, const TeamMember &team_handle, value_type &reduce_val) const
Definition model_kernel.hpp:141
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition model_kernel.hpp:100
void update(double _d_t, MC::ParticlesContainer< M > _particles)
Definition model_kernel.hpp:117
MC::KernelConcentrationType limitation_factor
Definition model_kernel.hpp:179
Definition model_kernel.hpp:30
std::size_t waiting_allocation_particle
Definition model_kernel.hpp:31
std::size_t dead_total
Definition model_kernel.hpp:32
Definition model_kernel.hpp:23
Definition model_kernel.hpp:26