BioCMAMC-ST
simulation_kernel.hpp
1#ifndef __SIMULATION_MC_KERNEL_HPP
2#define __SIMULATION_MC_KERNEL_HPP
3#include "Kokkos_Assert.hpp"
4#include "Kokkos_Printf.hpp"
5#include <mc/particles_container.hpp>
6#include <Kokkos_Core.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/prng/prng.hpp>
13#include <mc/traits.hpp>
14#include <simulation/alias.hpp>
15#include <simulation/probability_leaving.hpp>
16#include <simulation/probe.hpp>
17#include <utility>
18
20{
21
22 template <ModelType M> struct CycleFunctor
23 {
24 using TeamPolicy = Kokkos::TeamPolicy<ComputeSpace>;
25 using TeamMember = TeamPolicy::member_type;
26
27 KOKKOS_INLINE_FUNCTION CycleFunctor(M::FloatType dt,
29 MC::KPRNG::pool_type _random_pool,
30 MC::KernelConcentrationType&& _concentrations,
31 MC::ContributionView _contribs_scatter,
32 MC::EventContainer _event)
33 : d_t(dt), particles(_particles), random_pool(_random_pool),
34 concentrations(std::move(_concentrations)),
35 contribs_scatter(std::move(_contribs_scatter)), events(std::move(_event))
36 {
37 }
38
39 KOKKOS_INLINE_FUNCTION void operator()(const TeamMember& team_handle,
40 std::size_t& waiting_allocation_particle,
41 [[maybe_unused]] std::size_t& dead_total) const
42 {
43 (void)dead_total; // Counter not used currently because there is no cell mortality
44 GET_INDEX(particles.n_particles());
45 if (particles.status(idx) != MC::Status::Idle) [[unlikely]]
46 {
47 // Kokkos::printf("Skip %ld", idx);
48 return;
49 }
50
51 if (M::update(random_pool,
52 d_t,
53 idx,
55 Kokkos::subview(concentrations, Kokkos::ALL, particles.position(idx))) ==
57 {
59 {
60 waiting_allocation_particle += 1;
61 Kokkos::printf("Division Overflow\r\n");
63
64 // KOKKOS_ASSERT(false && "Division Overflow Not implemented");
65 }
67 };
68
70 }
71
72 M::FloatType d_t;
78 };
79
80} // namespace Simulation::KernelInline
81#endif
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:128
Model::SelfParticle model
Definition particles_container.hpp:139
KOKKOS_INLINE_FUNCTION void get_contributions(std::size_t idx, const ContributionView &contributions) const
Definition particles_container.hpp:457
KOKKOS_INLINE_FUNCTION std::size_t n_particles() const
Gets the number of particles in the container.
Definition particles_container.hpp:161
KOKKOS_INLINE_FUNCTION bool handle_division(const MC::KPRNG::pool_type &random_pool, std::size_t idx1) const
Definition particles_container.hpp:228
MC::ParticlePositions position
Definition particles_container.hpp:140
MC::ParticleStatus status
Definition particles_container.hpp:141
@ NewParticle
Spawn new particle.
Kokkos::Experimental::ScatterView< double **, Kokkos::LayoutRight > ContributionView
Definition alias.hpp:30
Kokkos::View< const double **, Kokkos::LayoutLeft, ComputeSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > KernelConcentrationType
Definition alias.hpp:37
Definition move_kernel.hpp:19
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:43
KOKKOS_FORCEINLINE_FUNCTION constexpr void wrap_incr() const
Definition events.hpp:109
Definition simulation_kernel.hpp:23
MC::EventContainer events
Definition simulation_kernel.hpp:77
M::FloatType d_t
Definition simulation_kernel.hpp:72
MC::ContributionView contribs_scatter
Definition simulation_kernel.hpp:76
MC::KernelConcentrationType concentrations
Definition simulation_kernel.hpp:75
MC::ParticlesContainer< M > particles
Definition simulation_kernel.hpp:73
TeamPolicy::member_type TeamMember
Definition simulation_kernel.hpp:25
MC::KPRNG::pool_type random_pool
Definition simulation_kernel.hpp:74
KOKKOS_INLINE_FUNCTION void operator()(const TeamMember &team_handle, std::size_t &waiting_allocation_particle, std::size_t &dead_total) const
Definition simulation_kernel.hpp:39
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition simulation_kernel.hpp:24
KOKKOS_INLINE_FUNCTION CycleFunctor(M::FloatType dt, MC::ParticlesContainer< M > _particles, MC::KPRNG::pool_type _random_pool, MC::KernelConcentrationType &&_concentrations, MC::ContributionView _contribs_scatter, MC::EventContainer _event)
Definition simulation_kernel.hpp:27