1#ifndef __SIMULATION_MOVE_KERNEL_HPP__
2#define __SIMULATION_MOVE_KERNEL_HPP__
4#include "Kokkos_Macros.hpp"
5#include "common/common.hpp"
6#include <Kokkos_Assert.hpp>
7#include <Kokkos_Core.hpp>
8#include <Kokkos_Printf.hpp>
9#include <Kokkos_Random.hpp>
10#include <biocma_cst_config.hpp>
12#include <decl/Kokkos_Declare_OPENMP.hpp>
13#include <mc/alias.hpp>
14#include <mc/domain.hpp>
15#include <mc/events.hpp>
16#include <mc/prng/prng.hpp>
17#include <mc/traits.hpp>
18#include <simulation/alias.hpp>
19#include <simulation/move_info.hpp>
20#include <simulation/probability_leaving.hpp>
21#include <simulation/probe.hpp>
66 const ConstNeighborsView<ComputeSpace>& neighbors,
68 const std::size_t i_compartment,
69 const double random_number)
71 const int mask_do_serch =
static_cast<int>(do_serch);
73 const int max_neighbor =
static_cast<int>(neighbors.extent(1));
76 int right = mask_do_serch * (max_neighbor - 1);
79 int mid = (left + right) >> 1;
80 const auto pm = cumulative_probability(i_compartment, mid);
81 const int mask =
static_cast<int>(random_number > pm);
82 left = mask * (mid + 1) + (1 - mask) * left;
83 right = mask * right + (1 - mask) * mid;
86 const auto ret = i_compartment * (1 - mask_do_serch) +
87 neighbors(i_compartment, left) * mask_do_serch;
148 std::
move(_random_pool),
189 this->enable_leave = b_leave;
190 this->enable_move = b_move;
191 this->
move = std::move(move_i);
192 this->
random = std::move(_random);
195 this->
status = std::move(_status);
196 this->
ages = std::move(_ages);
203 const Kokkos::TeamPolicy<ComputeSpace>::member_type& team_handle)
const
234 const std::size_t& idx,
235 std::size_t& local_dead_count)
const
279 const auto rng1 =
static_cast<float>(
random(idx, 0));
280 const auto rng2 =
static_cast<float>(
random(idx, 1));
282 const std::size_t i_current_compartment =
positions(idx);
284 KOKKOS_ASSERT(i_current_compartment <
move.liquid_volume.extent(0));
286 const bool mask_next =
288 move.liquid_volume(i_current_compartment),
289 move.diag_transition(i_current_compartment),
294 move.cumulative_probability,
295 i_current_compartment,
305 KOKKOS_ASSERT(
positions(idx) <
move.liquid_volume.extent(0));
307 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
316 KOKKOS_INLINE_FUNCTION
void
318 const std::size_t idx,
319 std ::size_t& dead_count,
320 const double liquid_volume,
321 const std::size_t position)
const
331 const auto random_number =
static_cast<float>(
random(idx, 0));
332 const auto& [index, flow] =
move.leaving_flow(i_flow);
334 const bool is_leaving =
335 (position == index) &&
338 const int leave_mask =
static_cast<int>(is_leaving);
341 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
355 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
364 dead_count += leave_mask;
365 ages(idx, 0) = leave_mask * 0 + (1 - leave_mask) *
ages(idx, 0);
369 (1 - leave_mask) *
static_cast<int>(
status(idx)));
373 std::size_t& dead_count)
const
376 const std::size_t n_flow =
move.leaving_flow.size();
377 const auto liquid_volume =
move.liquid_volume(position);
378 for (std::size_t i_flow = 0LU; i_flow < n_flow; ++i_flow)
Kokkos::View< Status *, ComputeSpace > ParticleStatus
Definition alias.hpp:71
Kokkos::View< uint64_t *, ComputeSpace > ParticlePositions
Definition alias.hpp:70
@ Move
Move in domain.
Definition events.hpp:20
@ Exit
Remove particle from list due to move in domain.
Definition events.hpp:19
Status
Definition alias.hpp:57
@ Idle
Definition alias.hpp:58
@ Exit
Definition alias.hpp:60
ParticleAgesBase< ComputeSpace > ParticleAges
Definition alias.hpp:73
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:38
Kokkos:: View< Kokkos::Experimental::half_t **, Kokkos::LayoutRight, ComputeSpace > ParticleSamples
Definition alias.hpp:75
Definition kernels.hpp:11
constexpr bool enable_leave
Definition move_kernel.hpp:26
constexpr bool enable_move
Definition move_kernel.hpp:29
constexpr bool disable_leave
Definition move_kernel.hpp:27
KOKKOS_INLINE_FUNCTION bool probability_leaving(float random_number, double volume, double flow, double dt)
Definition probability_leaving.hpp:21
KOKKOS_INLINE_FUNCTION bool probability_leaving< void >(float random_number, double volume, double flow, double dt)
Definition probability_leaving.hpp:33
KOKKOS_INLINE_FUNCTION std::size_t __find_next_compartment(const bool do_serch, const ConstNeighborsView< ComputeSpace > &neighbors, const CumulativeProbabilityView< ComputeSpace > &cumulative_probability, const std::size_t i_compartment, const double random_number)
probably overkill binary search to find next compartment
Definition move_kernel.hpp:64
constexpr bool disable_move
Definition move_kernel.hpp:28
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:61
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:44
KOKKOS_FORCEINLINE_FUNCTION void handle_exit(std::size_t idx, std::size_t &dead_count) const
Definition move_kernel.hpp:372
KOKKOS_INLINE_FUNCTION void inner_handle_exit(const std::size_t i_flow, const std::size_t idx, std ::size_t &dead_count, const double liquid_volume, const std::size_t position) const
Definition move_kernel.hpp:317
bool enable_leave
Definition move_kernel.hpp:398
KOKKOS_INLINE_FUNCTION void operator()(TagLeave _tag, const std::size_t &idx, std::size_t &local_dead_count) const
Definition move_kernel.hpp:233
MoveFunctor(MC::ParticlePositions p, MC::ParticleStatus _status, MoveInfo< ComputeSpace > m, MC::pool_type _random_pool, MC::EventContainer _events, ProbeAutogeneratedBuffer _probes, MC::ParticleAges _ages, MC::ParticleSamples _random)
Definition move_kernel.hpp:135
MoveFunctor(double _d_t, MC::ParticlePositions p, MC::ParticleStatus _status, std::size_t n_p, MoveInfo< ComputeSpace > m, MC::pool_type _random_pool, MC::EventContainer _events, ProbeAutogeneratedBuffer _probes, MC::ParticleAges _ages, MC::ParticleSamples _random, bool b_move, bool b_leave)
Definition move_kernel.hpp:156
KOKKOS_FUNCTION void handle_move(const std::size_t idx) const
Definition move_kernel.hpp:272
void update(const ComputeSpace &ex, double _d_t, std::size_t n_p, MoveInfo< ComputeSpace > &&move_i, MC::ParticlePositions _positions, MC::ParticleStatus _status, MC::ParticleAges _ages, MC::ParticleSamples _random, bool b_move, bool b_leave)
Definition move_kernel.hpp:175
MC::ParticleSamples random
Definition move_kernel.hpp:395
bool need_launch() const
Definition move_kernel.hpp:267
MC::ParticlePositions positions
Definition move_kernel.hpp:385
double d_t
Definition move_kernel.hpp:384
std::size_t n_particles
Definition move_kernel.hpp:386
MoveInfo< ComputeSpace > move
Definition move_kernel.hpp:387
MC::EventContainer events
Definition move_kernel.hpp:390
ProbeAutogeneratedBuffer probes
Definition move_kernel.hpp:391
MC::ParticleStatus status
Definition move_kernel.hpp:389
bool enable_move
Definition move_kernel.hpp:397
MC::ParticleAges ages
Definition move_kernel.hpp:392
MC::pool_type random_pool
Definition move_kernel.hpp:388
KOKKOS_INLINE_FUNCTION void operator()(TagMove _tag, const Kokkos::TeamPolicy< ComputeSpace >::member_type &team_handle) const
Definition move_kernel.hpp:201
Definition move_info.hpp:19
Definition move_kernel.hpp:129
Definition move_kernel.hpp:126