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]] \
51 KOKKOS_INLINE_FUNCTION
59 KOKKOS_INLINE_FUNCTION
66 KOKKOS_INLINE_FUNCTION
73 KOKKOS_INLINE_FUNCTION
81 KOKKOS_INLINE_FUNCTION
96 KOKKOS_INLINE_FUNCTION
101 KOKKOS_INLINE_FUNCTION
120 KOKKOS_INLINE_FUNCTION
148 KOKKOS_INLINE_FUNCTION
164 constexpr int PARTICLES_PER_TEAM = 256;
167 const std::size_t p0 = team.league_rank() * PARTICLES_PER_TEAM;
169 Kokkos::parallel_for(
170 Kokkos::TeamThreadRange(team, PARTICLES_PER_TEAM),
173 const std::size_t p = p0 + i;
186 const double weight =
particles.get_weight(p);
190 Kokkos::parallel_for(
194 const int rel = j - particles.begin;
195 access(rel, pos) += weight * particles.model(p, j);
266 KOKKOS_INLINE_FUNCTION
void
268 const Kokkos::TeamPolicy<ComputeSpace>::member_type& team,
272 const auto team_size = team.team_size();
274 const auto work_stride = team_size * team.league_size();
275 const auto work_start = team.league_rank() * team_size + team.team_rank();
277 for (
auto idx = work_start; idx <
particles.n_particles();
280 CHECK_STATUS_OR_RETURN(idx);
285 KOKKOS_FORCEINLINE_FUNCTION
void
287 const std::size_t idx,
296 KOKKOS_INLINE_FUNCTION
void
299 using mem_space = ComputeSpace::memory_space;
301 const auto local_c = Kokkos::subview(
303 const auto new_status
307 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
311 const auto _ = this->
probes.template set<mem_space>(
319 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:49
KOKKOS_INLINE_FUNCTION CycleReducer(const result_view_type &value_)
Definition model_kernel.hpp:102
KOKKOS_INLINE_FUNCTION bool references_scalar() const
Definition model_kernel.hpp:75
KOKKOS_INLINE_FUNCTION void init(value_type &val) const
Definition model_kernel.hpp:83
KOKKOS_INLINE_FUNCTION result_view_type view() const
Definition model_kernel.hpp:68
KOKKOS_INLINE_FUNCTION void join(value_type &dest, const value_type &src) const
Definition model_kernel.hpp:53
CycleReduceType value_type
Definition model_kernel.hpp:48
KOKKOS_INLINE_FUNCTION CycleReducer(value_type &value_)
Definition model_kernel.hpp:97
KOKKOS_INLINE_FUNCTION value_type & reference() const
Definition model_kernel.hpp:61
bool references_scalar_v
Definition model_kernel.hpp:109
CycleReducer reducer
Definition model_kernel.hpp:47
result_view_type value
Definition model_kernel.hpp:108
@ Overflow
Definition events.hpp:22
@ NewParticle
Spawn new particle.
Definition events.hpp:18
decltype(Kokkos::Experimental::create_scatter_view( kernelContribution())) ContributionView
Definition alias.hpp:90
@ Division
Definition alias.hpp:60
@ Idle
Definition alias.hpp:59
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:39
Kokkos::View< const double **, Kokkos::LayoutLeft, ComputeSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > KernelConcentrationType
Definition alias.hpp:93
Definition kernels.hpp:12
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:144
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:45
KOKKOS_INLINE_FUNCTION CycleFunctor(MC::ParticlesContainer< M > _particles, MC::pool_type _random_pool, MC::KernelConcentrationType &&_concentrations, MC::ContributionView _contribs_scatter, MC::EventContainer _event, ProbeAutogeneratedBuffer _probes)
Definition model_kernel.hpp:121
bool do_contribs() const
Definition model_kernel.hpp:136
KOKKOS_FORCEINLINE_FUNCTION void operator()(const TagCycle _tag, const std::size_t idx, value_type &reduce_val) const
Definition model_kernel.hpp:286
MC::EventContainer events
Definition model_kernel.hpp:339
M::FloatType d_t
Definition model_kernel.hpp:332
MC::ContributionView contribs_scatter
Definition model_kernel.hpp:336
MC::KernelConcentrationType concentrations
Definition model_kernel.hpp:335
MC::ParticlesContainer< M > particles
Definition model_kernel.hpp:333
TeamPolicy::member_type TeamMember
Definition model_kernel.hpp:115
CycleReduceType value_type
Definition model_kernel.hpp:116
KOKKOS_INLINE_FUNCTION void operator()(TagCycle _tag, const Kokkos::TeamPolicy< ComputeSpace >::member_type &team, value_type &reduce_val) const
Definition model_kernel.hpp:267
ProbeAutogeneratedBuffer probes
Definition model_kernel.hpp:340
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition model_kernel.hpp:114
KOKKOS_INLINE_FUNCTION void exec_per_particle(const std::size_t idx, value_type &reduce_val) const
Definition model_kernel.hpp:297
void update(double _d_t, MC::ParticlesContainer< M > _particles)
Definition model_kernel.hpp:142
MC::KernelConcentrationType limitation_factor
Definition model_kernel.hpp:338
MC::pool_type random_pool
Definition model_kernel.hpp:334
KOKKOS_INLINE_FUNCTION void operator()(const TagContribution _tag, const TeamMember &team) const
Definition model_kernel.hpp:150
Definition model_kernel.hpp:38
std::size_t waiting_allocation_particle
Definition model_kernel.hpp:39
std::size_t dead_total
Definition model_kernel.hpp:40
Definition model_kernel.hpp:31
Definition model_kernel.hpp:34