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 <mc/alias.hpp>
13#include <mc/domain.hpp>
14#include <mc/events.hpp>
15#include <mc/prng/prng.hpp>
16#include <mc/traits.hpp>
18#include <simulation/probability_leaving.hpp>
19#include <simulation/probe.hpp>
67 KOKKOS_INLINE_FUNCTION std::size_t
72 cumulative_probability,
73 const std::size_t i_compartment,
74 const double random_number)
76 const int mask_do_serch =
static_cast<int>(do_serch);
77 const int max_neighbor =
static_cast<int>(neighbors.extent(1));
79 KOKKOS_ASSERT(max_neighbor >= 1);
80 KOKKOS_ASSERT(random_number <= 1. && random_number >= 0.);
81 KOKKOS_ASSERT(neighbors.extent(1) == cumulative_probability.extent(1));
85 KOKKOS_ASSERT(cumulative_probability(i_compartment, max_neighbor - 1)
89 int right = mask_do_serch * (max_neighbor - 1);
92 const int mid = (left + right) >> 1;
93 const auto pm = cumulative_probability(i_compartment, mid);
94 const int mask =
static_cast<int>(random_number > pm);
95 left = mask * (mid + 1) + (1 - mask) * left;
96 right = mask * right + (1 - mask) * mid;
99 const auto ret = i_compartment * (1 - mask_do_serch)
100 + neighbors(i_compartment, left) * mask_do_serch;
127 std::
move(_random_pool),
169 this->enable_leave = b_leave;
170 this->enable_move = b_move;
171 this->
move = std::move(move_i);
172 this->
random = std::move(_random);
184 this->
status = std::move(_status);
185 this->
ages = std::move(_ages);
190 KOKKOS_INLINE_FUNCTION
void
193 const Kokkos::TeamPolicy<ComputeSpace>::member_type& team_handle)
const
204 KOKKOS_INLINE_FUNCTION
void
234 KOKKOS_INLINE_FUNCTION
void
236 const std::size_t& idx,
237 std::size_t& local_dead_count)
const
283 const auto rng1 =
static_cast<float>(
random(idx, 0));
284 const auto rng2 =
static_cast<float>(
random(idx, 1));
286 KOKKOS_ASSERT(rng1 >= 0. && rng1 <= 1 && rng2 >= 0. && rng2 <= 1);
288 const std::size_t i_current_compartment =
positions(idx);
291 i_current_compartment <
move.liquid_volume.extent(0)
292 &&
"Particle position is incorect (greater than compartment number)");
296 move.liquid_volume(i_current_compartment),
297 move.diag_transition(i_current_compartment),
302 move.cumulative_probability,
303 i_current_compartment,
315 &&
" Position after move is greater than compartment number");
317 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
467 KOKKOS_FORCEINLINE_FUNCTION
void
470 std::size_t& dead_count)
const
473 using mem_space = ComputeSpace::memory_space;
475 const std::size_t position =
positions(idx);
476 const double liquid_volume = liquid_volumes(position);
478 const std::size_t n_flow = leaving_flow.size();
486 std::size_t i_flow = 0;
487 double val_flow = 0.;
492 const auto& [index, flow] = leaving_flow(i_flow++);
493 if (position == index)
498 }
while (i_flow < n_flow);
509 rng1, liquid_volume, val_flow,
d_t);
511 leave_mask =
static_cast<int>(p);
515 dead_count += leave_mask;
517 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
521 const auto _ =
probes.set<mem_space>(
ages(idx, 0));
524 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
528 ages(idx, 0) *= (1 - leave_mask);
530 static_cast<int>(
status(idx)) * (1 - leave_mask)
std::conditional_t< is_const, Kokkos::View< const std::size_t **, Kokkos::LayoutRight, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< std::size_t **, Kokkos::LayoutRight, ExecSpace > > NeighborsView
Definition alias.hpp:132
Kokkos::View< float **, Kokkos::LayoutRight, ComputeSpace > ParticleSamples
Definition alias.hpp:81
Kokkos::View< Status *, ComputeSpace > ParticleStatus
Definition alias.hpp:74
Kokkos::View< uint64_t *, ComputeSpace > ParticlePositions
Definition alias.hpp:73
@ 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:58
@ Idle
Definition alias.hpp:59
@ Exit
Definition alias.hpp:61
ParticleAgesBase< ComputeSpace > ParticleAges
Definition alias.hpp:76
std::conditional_t< is_const, Kokkos::View< const double *, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< double *, ExecSpace > > VolumeView
Definition alias.hpp:100
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:39
std::conditional_t< is_const, Kokkos::View< const LeavingFlow *, Kokkos::SharedHostPinnedSpace >, Kokkos::View< LeavingFlow *, Kokkos::SharedHostPinnedSpace > > LeavingFlowView
Definition alias.hpp:117
std::conditional_t< is_const, Kokkos::View< const double **, Kokkos::LayoutRight, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > >, Kokkos::View< double **, Kokkos::LayoutRight, ExecSpace > > CumulativeProbabilityView
Definition alias.hpp:123
Definition kernels.hpp:12
constexpr bool enable_leave
Definition move_kernel.hpp:24
constexpr bool enable_move
Definition move_kernel.hpp:27
KOKKOS_INLINE_FUNCTION std::size_t __find_next_compartment(const bool do_serch, const MC::NeighborsView< ComputeSpace, true > &neighbors, const MC::CumulativeProbabilityView< ComputeSpace, true > &cumulative_probability, const std::size_t i_compartment, const double random_number)
probably overkill binary search to find next compartment
Definition move_kernel.hpp:68
constexpr bool disable_leave
Definition move_kernel.hpp:25
KOKKOS_INLINE_FUNCTION bool probability_leaving(float random_number, double volume, double flow, double dt)
Definition probability_leaving.hpp:18
KOKKOS_INLINE_FUNCTION bool probability_leaving< fast_tag >(float random_number, double volume, double flow, double dt)
Definition probability_leaving.hpp:35
constexpr bool disable_move
Definition move_kernel.hpp:26
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:148
Structure to store information about domain needed during MC cycle data is likely to change between e...
Definition domain.hpp:27
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:45
KOKKOS_INLINE_FUNCTION void operator()(TagMove, const std::size_t &idx) const
Definition move_kernel.hpp:205
bool enable_leave
Definition move_kernel.hpp:549
KOKKOS_INLINE_FUNCTION void operator()(TagLeave _tag, const std::size_t &idx, std::size_t &local_dead_count) const
Definition move_kernel.hpp:235
KOKKOS_FUNCTION void handle_move(const std::size_t idx) const
Definition move_kernel.hpp:280
KOKKOS_INLINE_FUNCTION void operator()(TagMove, const Kokkos::TeamPolicy< ComputeSpace >::member_type &team_handle) const
Definition move_kernel.hpp:191
KOKKOS_FORCEINLINE_FUNCTION void handle_exit(std::size_t idx, const MC::VolumeView< ComputeSpace, true > &liquid_volumes, std::size_t &dead_count) const
Definition move_kernel.hpp:468
MC::ParticleSamples random
Definition move_kernel.hpp:546
MoveFunctor(MC::ParticlePositions p, MC::ParticleStatus _status, MC::DomainState< ComputeSpace > m, MC::pool_type _random_pool, MC::EventContainer _events, ProbeAutogeneratedBuffer _probes, MC::ParticleAges _ages, MC::ParticleSamples _random)
Definition move_kernel.hpp:114
bool need_launch() const
Definition move_kernel.hpp:274
MC::ParticlePositions positions
Definition move_kernel.hpp:536
double d_t
Definition move_kernel.hpp:535
MC::DomainState< ComputeSpace, true > move
Definition move_kernel.hpp:538
void update(const ComputeSpace &ex, double _d_t, std::size_t n_p, MC::DomainState< 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:155
std::size_t index_random_leave
Definition move_kernel.hpp:550
std::size_t n_particles
Definition move_kernel.hpp:537
MC::EventContainer events
Definition move_kernel.hpp:541
ProbeAutogeneratedBuffer probes
Definition move_kernel.hpp:542
MC::ParticleStatus status
Definition move_kernel.hpp:540
bool enable_move
Definition move_kernel.hpp:548
MC::ParticleAges ages
Definition move_kernel.hpp:543
MC::pool_type random_pool
Definition move_kernel.hpp:539
MoveFunctor(double _d_t, MC::ParticlePositions p, MC::ParticleStatus _status, std::size_t n_p, MC::DomainState< 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:135
Definition move_kernel.hpp:108
Definition move_kernel.hpp:105