1#ifndef __SIMULATION_MC_KERNEL_HPP
2#define __SIMULATION_MC_KERNEL_HPP
4#include <Kokkos_Assert.hpp>
5#include <Kokkos_Core.hpp>
6#include <Kokkos_Macros.hpp>
7#include <Kokkos_Printf.hpp>
8#include <Kokkos_Random.hpp>
9#include <biocma_cst_config.hpp>
11#include <common/common.hpp>
12#include <mc/alias.hpp>
13#include <mc/domain.hpp>
14#include <mc/events.hpp>
15#include <mc/particles_container.hpp>
16#include <mc/prng/prng.hpp>
17#include <mc/traits.hpp>
18#include <simulation/probability_leaving.hpp>
19#include <simulation/probe.hpp>
22#define CHECK_STATUS_OR_RETURN(__idx__) \
23 if (particles.status(__idx__) != MC::Status::Idle) [[unlikely]] \
62 KOKKOS_INLINE_FUNCTION
71 [[nodiscard]] KOKKOS_INLINE_FUNCTION
value_type&
77 KOKKOS_INLINE_FUNCTION
84 [[nodiscard]] KOKKOS_INLINE_FUNCTION
bool
91 KOKKOS_INLINE_FUNCTION
106 KOKKOS_INLINE_FUNCTION
112 KOKKOS_INLINE_FUNCTION
135 KOKKOS_INLINE_FUNCTION
145 probes(std::move(_probes))
149 [[nodiscard]]
constexpr bool
163 KOKKOS_INLINE_FUNCTION
void
171 const std::size_t p0 = team.league_rank() * count;
172 const std::size_t n_particle =
n_p;
173 const auto _d_t =
d_t;
177 const auto upper_bound
178 = ((p0 + count) >= n_particle) ? n_particle - p0 : count;
180 KOKKOS_ASSERT(upper_bound > 0);
181 KOKKOS_ASSERT(upper_bound < n_particle);
184 Kokkos::parallel_reduce(
185 Kokkos::TeamThreadRange(team, 0, upper_bound),
186 [&](std::size_t relative_index,
value_type& lv)
188 const std::size_t flatten_index = p0 + relative_index;
193 ages(flatten_index, 1) += _d_t;
219 KOKKOS_FORCEINLINE_FUNCTION
void
221 const std::size_t idx,
230 KOKKOS_INLINE_FUNCTION
void
233 using mem_space = ComputeSpace::memory_space;
245 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
249 const auto _ = this->
probes.template set<mem_space>(
257 Kokkos::printf(
"[KERNEL] Division Overflow\r\n");
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:57
Kokkos::View< value_type, Space > result_view_type
Definition model_kernel.hpp:60
KOKKOS_INLINE_FUNCTION CycleReducer(const result_view_type &value_)
Definition model_kernel.hpp:113
KOKKOS_INLINE_FUNCTION bool references_scalar() const
Definition model_kernel.hpp:85
KOKKOS_INLINE_FUNCTION void init(value_type &val) const
Definition model_kernel.hpp:93
KOKKOS_INLINE_FUNCTION result_view_type view() const
Definition model_kernel.hpp:79
KOKKOS_INLINE_FUNCTION void join(value_type &dest, const value_type &src) const
Definition model_kernel.hpp:64
CycleReduceType value_type
Definition model_kernel.hpp:59
KOKKOS_INLINE_FUNCTION CycleReducer(value_type &value_)
Definition model_kernel.hpp:107
KOKKOS_INLINE_FUNCTION value_type & reference() const
Definition model_kernel.hpp:72
bool references_scalar_v
Definition model_kernel.hpp:120
CycleReducer reducer
Definition model_kernel.hpp:58
result_view_type value
Definition model_kernel.hpp:119
@ Overflow
Definition events.hpp:23
@ NewParticle
Spawn new particle.
Definition events.hpp:19
@ Division
Definition alias.hpp:127
@ Idle
Definition alias.hpp:126
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:100
Kokkos::View< const double **, Kokkos::LayoutLeft, ComputeSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > KernelConcentrationType
Definition alias.hpp:165
Definition kernels.hpp:16
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:148
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:150
KOKKOS_FORCEINLINE_FUNCTION void operator()(const TagCycle _tag, const std::size_t idx, value_type &reduce_val) const
Definition model_kernel.hpp:220
MC::EventContainer events
Definition model_kernel.hpp:274
M::FloatType d_t
Definition model_kernel.hpp:270
MC::KernelConcentrationType concentrations
Definition model_kernel.hpp:273
MC::ParticlesContainer< M > particles
Definition model_kernel.hpp:271
TeamPolicy::member_type TeamMember
Definition model_kernel.hpp:126
CycleReduceType value_type
Definition model_kernel.hpp:127
KOKKOS_INLINE_FUNCTION CycleFunctor(std::size_t p_per_team, MC::ParticlesContainer< M > _particles, MC::pool_type _random_pool, MC::KernelConcentrationType &&_concentrations, MC::EventContainer _event, ProbeAutogeneratedBuffer _probes)
Definition model_kernel.hpp:136
std::size_t n_p
Definition model_kernel.hpp:131
KOKKOS_INLINE_FUNCTION void operator()(TagCycle _tag, const TeamMember &team, value_type &reduce_val) const
Definition model_kernel.hpp:164
ProbeAutogeneratedBuffer probes
Definition model_kernel.hpp:275
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition model_kernel.hpp:125
std::size_t m_p_team
Definition model_kernel.hpp:133
KOKKOS_INLINE_FUNCTION void exec_per_particle(const std::size_t idx, value_type &reduce_val) const
Definition model_kernel.hpp:231
void update(double _d_t, MC::ParticlesContainer< M > _particles)
Definition model_kernel.hpp:156
MC::pool_type random_pool
Definition model_kernel.hpp:272
constexpr bool do_contribs() const
Definition model_kernel.hpp:150
Definition model_kernel.hpp:41
std::size_t waiting_allocation_particle
Definition model_kernel.hpp:42
std::size_t dead_total
Definition model_kernel.hpp:43
KOKKOS_INLINE_FUNCTION CycleReduceType & operator+=(const CycleReduceType &a)
Definition model_kernel.hpp:46
Definition model_kernel.hpp:34
Definition model_kernel.hpp:31
Definition model_kernel.hpp:37