1#ifndef __SIMULATION_MOVE_KERNEL_HPP__
2#define __SIMULATION_MOVE_KERNEL_HPP__
4#include <Kokkos_Assert.hpp>
5#include <Kokkos_Core.hpp>
6#include <Kokkos_Printf.hpp>
7#include <Kokkos_Random.hpp>
8#include <biocma_cst_config.hpp>
10#include <common/common.hpp>
11#include <mc/alias.hpp>
12#include <mc/domain.hpp>
13#include <mc/events.hpp>
14#include <mc/prng/prng.hpp>
15#include <mc/traits.hpp>
16#include <simulation/probability_leaving.hpp>
17#include <simulation/probe.hpp>
27 template <
class ExecutionSpace,
30 class IndexType = int64_t,
31 const std::size_t CHUNK_SIZE>
36 typename ViewType::const_value_type begin,
37 typename ViewType::const_value_type end)
39 int64_t LDA = a.extent(0);
44 "Kokkos::fill_random",
45 Kokkos::RangePolicy<ExecutionSpace>(
46 exec, 0, (LDA + (CHUNK_SIZE - 1)) / CHUNK_SIZE),
47 Kokkos::Impl::fill_random_functor_begin_end<ViewType,
61 KOKKOS_INLINE_FUNCTION std::size_t
66 cumulative_probability,
67 const std::size_t i_compartment,
68 const double random_number)
70 const int mask_do_serch =
static_cast<int>(do_serch);
71 const int max_neighbor =
static_cast<int>(neighbors.extent(1));
73 KOKKOS_ASSERT(max_neighbor >= 1);
74 KOKKOS_ASSERT(random_number <= 1. && random_number >= 0.);
75 KOKKOS_ASSERT(neighbors.extent(1) == cumulative_probability.extent(1));
90 int right = mask_do_serch * (max_neighbor - 1);
93 const int mid = (left + right) >> 1;
94 const auto pm = cumulative_probability(i_compartment, mid);
95 const int mask =
static_cast<int>(random_number > pm);
96 left = mask * (mid + 1) + (1 - mask) * left;
97 right = mask * right + (1 - mask) * mid;
99 KOKKOS_ASSERT(left >= 0 &&
static_cast<size_t>(left) < neighbors.extent(1));
100 const auto ret = i_compartment * (1 - mask_do_serch)
101 + neighbors(i_compartment, left) * mask_do_serch;
120 std::size_t p_team_leave,
135 std::
move(_random_pool),
143 std::size_t p_team_leave,
175 this->enable_leave = b_leave;
176 this->enable_move = b_move;
177 this->
move = std::move(move_i);
180 this->
status = std::move(_status);
181 this->
ages = std::move(_ages);
184 KOKKOS_INLINE_FUNCTION
void
186 const Kokkos::TeamPolicy<ComputeSpace>::member_type& team)
const
189 = Kokkos::TeamPolicy<>::execution_space::scratch_memory_space;
190 using ScratchView = Kokkos::View<float*, ScratchSpace>;
193 const std::size_t p0 = team.league_rank() * count;
196 const auto upper_bound
197 = ((p0 + count) >= n_particle) ? n_particle - p0 : count;
198 KOKKOS_ASSERT(upper_bound > 0 && upper_bound < n_particle);
201 const std::size_t N = count * 2;
204 const std::size_t p = team.team_size();
205 const std::size_t m = (N + p - 1) / p;
207 ScratchView rng(team.team_scratch(0), N);
212 Kokkos::parallel_for(Kokkos::TeamThreadRange(team, 0, m),
213 [&rp, &rng, p, N](
const std::size_t idx)
217 auto gen = rp.get_state();
219 const std::size_t base = idx * p;
222 for (std::size_t k = 0; k < p; ++k)
224 const std::size_t i = base + k;
230 rng(i) = gen.frand(0., 1.);
238 Kokkos::parallel_for(Kokkos::TeamThreadRange(team, 0, upper_bound),
239 [&](
const std::size_t idx)
241 const auto flat_index = p0 + idx;
242 const std::size_t base = idx * 2;
243 KOKKOS_ASSERT(base + 1 < N);
244 const auto rng1 = rng(base);
245 const auto rng2 = rng(base + 1);
322 KOKKOS_INLINE_FUNCTION
void
324 const std::size_t& idx,
325 std::size_t& local_dead_count)
const
368 handle_move(
const std::size_t idx,
const float rng1,
const float rng2)
const
374 KOKKOS_ASSERT(rng1 >= 0. && rng1 <= 1 && rng2 >= 0. && rng2 <= 1);
376 const std::size_t i_current_compartment =
positions(idx);
379 i_current_compartment <
move.liquid_volume.extent(0)
380 &&
"Particle position is incorect (greater than compartment number)");
384 move.liquid_volume(i_current_compartment),
385 move.diag_transition(i_current_compartment),
390 move.cumulative_probability,
391 i_current_compartment,
403 &&
" Position after move is greater than compartment number");
405 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
554 template <
typename ExecSpace>
555 KOKKOS_FORCEINLINE_FUNCTION std::size_t
557 const std::size_t idx,
558 const Kokkos::View<const MC::LeavingFlow*, ExecSpace>& leaving_flow,
559 std::size_t& dead_count)
const
562 using mem_space = ComputeSpace::memory_space;
564 const std::size_t position =
positions(idx);
566 const std::size_t n_flow = leaving_flow.size();
574 std::size_t i_flow = 0;
575 double val_flow = 0.;
576 double _liquid_volume = 0.;
581 const auto& [index, flow, liquid_volume] = leaving_flow(i_flow++);
582 if (position == index)
585 _liquid_volume = liquid_volume;
588 }
while (i_flow < n_flow);
598 const auto rng1 = gen.frand(0., 1.);
601 KOKKOS_ASSERT(_liquid_volume > 0.);
602 KOKKOS_ASSERT(val_flow > 0.);
604 rng1, _liquid_volume, val_flow,
d_t);
606 leave_mask =
static_cast<int>(p);
610 dead_count += leave_mask;
612 if constexpr (AutoGenerated::FlagCompileTime::use_probe)
616 const auto _ =
probes.set<mem_space>(
ages(idx, 0));
619 ages(idx, 0) *= (1 - leave_mask);
621 static_cast<int>(
status(idx)) * (1 - leave_mask)
624 if constexpr (AutoGenerated::FlagCompileTime::enable_event_counter)
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:206
Kokkos::View< Status *, ComputeSpace > ParticleStatus
Definition alias.hpp:141
Kokkos::View< uint64_t *, ComputeSpace > ParticlePositions
Definition alias.hpp:140
@ Move
Move in domain.
Definition events.hpp:21
@ Exit
Remove particle from list due to move in domain.
Definition events.hpp:20
Status
Definition alias.hpp:125
@ Idle
Definition alias.hpp:126
@ Exit
Definition alias.hpp:128
ParticleAgesBase< ComputeSpace > ParticleAges
Definition alias.hpp:144
gen_pool_type< Kokkos::DefaultExecutionSpace > pool_type
Definition alias.hpp:100
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:197
Definition kernels.hpp:16
void fill_random(const ExecutionSpace &exec, ViewType a, RandomPool g, typename ViewType::const_value_type begin, typename ViewType::const_value_type end)
Definition move_kernel.hpp:33
constexpr bool enable_leave
Definition move_kernel.hpp:22
constexpr bool enable_move
Definition move_kernel.hpp:25
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:62
constexpr bool disable_leave
Definition move_kernel.hpp:23
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:24
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:28
Use to count events that occurs during Monte-Carlo processing cycles.
Definition events.hpp:150
MoveFunctor(std::size_t p_team_move, std::size_t p_team_leave, 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, bool b_move, bool b_leave)
Definition move_kernel.hpp:142
KOKKOS_FUNCTION void handle_move(const std::size_t idx, const float rng1, const float rng2) const
Definition move_kernel.hpp:368
bool enable_leave
Definition move_kernel.hpp:648
KOKKOS_INLINE_FUNCTION void operator()(TagLeave _tag, const std::size_t &idx, std::size_t &local_dead_count) const
Definition move_kernel.hpp:323
MoveFunctor(std::size_t p_team_move, std::size_t p_team_leave, MC::ParticlePositions p, MC::ParticleStatus _status, MC::DomainState< ComputeSpace > m, MC::pool_type _random_pool, MC::EventContainer _events, ProbeAutogeneratedBuffer _probes, MC::ParticleAges _ages)
Definition move_kernel.hpp:119
bool need_launch() const
Definition move_kernel.hpp:362
Kokkos::TeamPolicy< ComputeSpace > TeamPolicy
Definition move_kernel.hpp:116
TeamPolicy::member_type TeamMember
Definition move_kernel.hpp:117
MC::ParticlePositions positions
Definition move_kernel.hpp:634
std::size_t m_p_team_move
Definition move_kernel.hpp:643
double d_t
Definition move_kernel.hpp:633
MC::DomainState< ComputeSpace, true > move
Definition move_kernel.hpp:636
KOKKOS_FORCEINLINE_FUNCTION std::size_t handle_exit(const std::size_t idx, const Kokkos::View< const MC::LeavingFlow *, ExecSpace > &leaving_flow, std::size_t &dead_count) const
Definition move_kernel.hpp:556
std::size_t n_particles
Definition move_kernel.hpp:635
MC::EventContainer events
Definition move_kernel.hpp:639
ProbeAutogeneratedBuffer probes
Definition move_kernel.hpp:640
void update(double _d_t, std::size_t n_p, MC::DomainState< ComputeSpace > move_i, MC::ParticlePositions _positions, MC::ParticleStatus _status, MC::ParticleAges _ages, bool b_move, bool b_leave)
Definition move_kernel.hpp:163
MC::ParticleStatus status
Definition move_kernel.hpp:638
KOKKOS_INLINE_FUNCTION void operator()(TagMove, const Kokkos::TeamPolicy< ComputeSpace >::member_type &team) const
Definition move_kernel.hpp:185
bool enable_move
Definition move_kernel.hpp:647
MC::ParticleAges ages
Definition move_kernel.hpp:641
std::size_t m_p_team_leave
Definition move_kernel.hpp:642
MC::pool_type random_pool
Definition move_kernel.hpp:637
Definition move_kernel.hpp:111
Definition move_kernel.hpp:108
Definition move_kernel.hpp:105