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>
19#include <simulation/kernels/cycle_reducer.hpp>
20#include <simulation/probe.hpp>
23#define CHECK_STATUS_OR_RETURN(__idx__) \
24 if (particles.status(__idx__) != MC::Status::Idle) [[unlikely]] \
53 KOKKOS_INLINE_FUNCTION
67 [[nodiscard]]
constexpr bool
81 KOKKOS_INLINE_FUNCTION
void
89 const std::size_t p0 = team.league_rank() * count;
90 const std::size_t n_particle =
n_p;
91 const auto _d_t =
d_t;
94 const auto upper_bound
95 = ((p0 + count) >= n_particle) ? n_particle - p0 : count;
97 KOKKOS_ASSERT(upper_bound > 0);
98 KOKKOS_ASSERT(upper_bound <= n_particle);
101 const auto& contribs =
particles.contribs;
104 Kokkos::parallel_reduce(
105 Kokkos::TeamThreadRange(team, 0, upper_bound),
106 [&](std::size_t relative_index,
value_type& lv)
108 const std::size_t flatten_index = p0 + relative_index;
109 KOKKOS_ASSERT(flatten_index < upper_bound);
114 const auto pos =
particles.position(flatten_index);
137 Kokkos::single(Kokkos::PerTeam(team), [&]() { reduce_val += local; });
140 KOKKOS_INLINE_FUNCTION
void
143 using mem_space = ComputeSpace::memory_space;
144 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
148 const auto _ = this->
probes.template set<mem_space>(
156 Kokkos::printf(
"[KERNEL] Division Overflow\r\n");
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:59
@ Overflow
Definition events.hpp:25
@ NewParticle
Spawn new particle.
Definition events.hpp:21
@ 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 cycle_reducer.hpp:13
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:150
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:168
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:54
MC::EventContainer events
Definition model_kernel.hpp:173
M::FloatType d_t
Definition model_kernel.hpp:169
CycleReducerType value_type
Definition model_kernel.hpp:45
MC::KernelConcentrationType concentrations
Definition model_kernel.hpp:172
MC::ParticlesContainer< M > particles
Definition model_kernel.hpp:170
TeamPolicy::member_type TeamMember
Definition model_kernel.hpp:44
std::size_t n_p
Definition model_kernel.hpp:49
KOKKOS_INLINE_FUNCTION void operator()(TagCycle _tag, const TeamMember &team, value_type &reduce_val) const
Definition model_kernel.hpp:82
ProbeAutogeneratedBuffer probes
Definition model_kernel.hpp:174
KOKKOS_INLINE_FUNCTION void division(const std::size_t idx, value_type &reduce_val) const
Definition model_kernel.hpp:141
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition model_kernel.hpp:43
std::size_t m_p_team
Definition model_kernel.hpp:51
void update(double _d_t, MC::ParticlesContainer< M > _particles)
Definition model_kernel.hpp:74
MC::pool_type random_pool
Definition model_kernel.hpp:171
constexpr bool do_contribs() const
Definition model_kernel.hpp:68
Definition cycle_reducer.hpp:15
std::size_t waiting_allocation_particle
Definition cycle_reducer.hpp:16
Definition model_kernel.hpp:35
Definition model_kernel.hpp:32
Definition model_kernel.hpp:38