1#ifndef __SIMULATION_MOVE_KERNEL_HPP__
2#define __SIMULATION_MOVE_KERNEL_HPP__
4#include "Kokkos_Assert.hpp"
5#include "Kokkos_Printf.hpp"
7#include <Kokkos_Core.hpp>
8#include <Kokkos_Random.hpp>
9#include <biocma_cst_config.hpp>
11#include <mc/domain.hpp>
12#include <mc/events.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>
44 KOKKOS_INLINE_FUNCTION std::size_t
47 const std::size_t i_compartment,
48 const double random_number)
50 const int max_neighbor =
static_cast<int>(neighbors.extent(1));
52 std::size_t next = neighbors(i_compartment, 0);
55 for (
int k_neighbor = 0; k_neighbor < max_neighbor - 1; ++k_neighbor)
59 const auto pi = cumulative_probability(i_compartment, k_neighbor);
60 const auto pn = cumulative_probability(i_compartment, k_neighbor + 1);
63 next = (random_number <= pn && pi <= random_number) ? neighbors(i_compartment, k_neighbor + 1)
70 template <
bool enable_leave,
bool enable_move>
struct MoveFunctor
85 KOKKOS_INLINE_FUNCTION
void
86 operator()(
const Kokkos::TeamPolicy<ComputeSpace>::member_type& team_handle,
87 std::size_t& dead_count)
const
112 const float rng1 = generator.frand(0., 1.);
113 const double rng2 = generator.drand(0., 1.);
116 const std::size_t i_current_compartment =
positions(idx);
127 : i_current_compartment;
131 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
140 KOKKOS_FUNCTION
void handle_exit(std::size_t idx, std::size_t& dead_count)
const
147 const float random_number = generator.frand(0., 1.);
152 if (position != index)
162 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
167 Kokkos::printf(
"PROBES OVERFLOW\r\n");
Kokkos::Random_XorShift1024_Pool< Kokkos::DefaultExecutionSpace > pool_type
Definition prng.hpp:17
KOKKOS_INLINE_FUNCTION bool set(double val) const
Definition probe.hpp:80
Kokkos::View< Status *, ComputeSpace > ParticleStatus
Definition alias.hpp:20
Kokkos::View< double *[2], Kokkos::LayoutLeft, ComputeSpace > ParticleAges
Definition alias.hpp:22
Kokkos::View< uint64_t *, ComputeSpace > ParticlePositions
Definition alias.hpp:19
@ Exit
Remove particle from list due to move in domain.
Definition move_kernel.hpp:22
constexpr bool enable_leave
Definition move_kernel.hpp:23
constexpr bool enable_move
Definition move_kernel.hpp:26
constexpr bool disable_leave
Definition move_kernel.hpp:24
KOKKOS_INLINE_FUNCTION std::size_t __find_next_compartment(const ConstNeighborsView< ComputeSpace > &neighbors, const CumulativeProbabilityView< ComputeSpace > &cumulative_probability, const std::size_t i_compartment, const double random_number)
Definition move_kernel.hpp:45
KOKKOS_INLINE_FUNCTION bool probability_leaving(float random_number, double volume, double flow, double dt)
Definition probability_leaving.hpp:31
constexpr bool disable_move
Definition move_kernel.hpp:25
Kokkos::View< std::size_t *, Kokkos::SharedHostPinnedSpace > LeavingFlowIndexType
Definition alias.hpp:25
Kokkos:: View< double *, Kokkos::LayoutLeft, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > DiagonalView
Definition alias.hpp:14
Kokkos::View< double *, Kokkos::SharedHostPinnedSpace > LeavingFlowType
Definition alias.hpp:26
Kokkos:: View< const double **, Kokkos::LayoutRight, Space, Kokkos::MemoryTraits< Kokkos::RandomAccess > > CumulativeProbabilityView
Definition alias.hpp:20
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 move_kernel.hpp:71
MC::ParticleAges ages
Definition move_kernel.hpp:184
KOKKOS_INLINE_FUNCTION void operator()(const Kokkos::TeamPolicy< ComputeSpace >::member_type &team_handle, std::size_t &dead_count) const
Definition move_kernel.hpp:86
MC::ParticleStatus status
Definition move_kernel.hpp:181
ProbeAutogeneratedBuffer probes
Definition move_kernel.hpp:183
MoveFunctor(double _d_t, MC::ParticlePositions p, MC::ParticleStatus _status, std::size_t n_p, MoveInfo< ComputeSpace > m, MC::KPRNG::pool_type _random_pool, MC::EventContainer _events, ProbeAutogeneratedBuffer _probes, MC::ParticleAges _ages)
Definition move_kernel.hpp:72
MC::ParticlePositions positions
Definition move_kernel.hpp:177
MC::EventContainer events
Definition move_kernel.hpp:182
std::size_t n_particles
Definition move_kernel.hpp:178
MoveInfo< ComputeSpace > move
Definition move_kernel.hpp:179
KOKKOS_FUNCTION void handle_move(const std::size_t idx) const
Definition move_kernel.hpp:109
double d_t
Definition move_kernel.hpp:176
MC::KPRNG::pool_type random_pool
Definition move_kernel.hpp:180
KOKKOS_FUNCTION void handle_exit(std::size_t idx, std::size_t &dead_count) const
Definition move_kernel.hpp:140
Definition move_kernel.hpp:29
MoveInfo()
Definition move_kernel.hpp:37
DiagonalView< ExecSpace > diag_transition
Definition move_kernel.hpp:31
LeavingFlowType leaving_flow
Definition move_kernel.hpp:33
LeavingFlowIndexType index_leaving_flow
Definition move_kernel.hpp:34
CumulativeProbabilityView< ExecSpace > cumulative_probability
Definition move_kernel.hpp:32
ConstNeighborsView< ExecSpace > neighbors
Definition move_kernel.hpp:30
Kokkos::View< double *, ExecSpace > liquid_volume
Definition move_kernel.hpp:35