BioCMAMC-ST
simulation.hpp
1#ifndef __SIMULATIONS_UNIT_HPP__
2#define __SIMULATIONS_UNIT_HPP__
3
4#include "mc/domain.hpp"
5#include <Kokkos_Core.hpp>
6#include <Kokkos_ScatterView.hpp>
7#include <biocma_cst_config.hpp>
8#include <cassert>
9#include <cma_utils/iteration_state.hpp>
10#include <common/common.hpp>
11
12#include <cstddef>
13#include <cstdint>
14#include <mc/events.hpp>
15#include <mc/prng/prng.hpp>
16#include <mc/unit.hpp>
17#include <memory>
18#include <optional>
19#include <simulation/alias.hpp>
20#include <simulation/feed_descriptor.hpp>
21#include <simulation/mass_transfer.hpp>
22#include <simulation/move_kernel.hpp>
23#include <simulation/probe.hpp>
24#include <simulation/scalar_initializer.hpp>
25#include <simulation/simulation_kernel.hpp>
26// TODO Clean
27static constexpr size_t trigger_const_particle_number = 1e6;
28#define KERNEL_MOVE_ARGS_LIST \
29 d_t, container.position, container.status, n_particle, move_info, local_rng.random_pool, events
30
31#define LAUNCH_KERNEL_MOVE(b_move, b_leave) \
32 Kokkos::parallel_reduce( \
33 "cycle_move", \
34 _policy, \
35 Simulation::KernelInline::MoveFunctor<b_move, b_leave>(KERNEL_MOVE_ARGS_LIST), \
36 out_total);
37
38namespace CmaUtils
39{
40 class PreCalculatedHydroState;
41} // namespace CmaUtils
42
48namespace Simulation
49{
50
52 {
53 std::size_t n_species{};
54 std::size_t n_compartment{};
55
56 template <class Archive> void serialize(Archive& archive)
57 {
58 archive(n_species, n_compartment);
59 }
60 };
61
62 class ScalarSimulation;
63
65 {
66 public:
67 SimulationUnit(std::unique_ptr<MC::MonteCarloUnit>&& _unit,
68 const ScalarInitializer& scalar_init,
69 std::optional<Feed::SimulationFeed> _feed = std::nullopt);
70
72
73 SimulationUnit(SimulationUnit&& other) noexcept;
74 SimulationUnit(const SimulationUnit& other) = delete;
77
78 std::unique_ptr<MC::MonteCarloUnit> mc_unit;
79
80 [[nodiscard]] Kokkos::View<const double**,
81 Kokkos::LayoutLeft,
82 ComputeSpace,
83 Kokkos::MemoryTraits<Kokkos::RandomAccess>>
85 [[nodiscard]] std::span<double> getCliqData() const;
86 [[nodiscard]] std::optional<std::span<const double>> getCgasData() const;
87 [[nodiscard]] std::optional<std::span<const double>> getMTRData() const;
88 [[nodiscard]] Dimensions getDimensions() const noexcept;
89 [[nodiscard]] std::span<const double> getContributionData() const;
90 std::span<double> getContributionData_mut();
91 [[nodiscard]] const Simulation::Feed::SimulationFeed& get_feed() const;
93
95
96 // Simulation methods
97 void cycleProcess(auto&& container, double d_t);
98
99 void step(double d_t) const;
100
101 void reduceContribs(std::span<const double> data, size_t n_rank) const;
102
103 [[deprecated("perf:not useful")]] void
104 reduceContribs_per_rank(std::span<const double> data) const;
105
106 void clearContribution() const noexcept;
107
108 void update_feed(double t, double d_t, bool update_scalar = true) noexcept;
109
110 [[nodiscard]] bool two_phase_flow() const;
111
112 [[nodiscard]] std::size_t counter() const;
113
114 [[nodiscard]] double& get_start_time_mut();
115
116 [[nodiscard]] double& get_end_time_mut();
117
118 void update(CmaUtils::IterationState&& new_state);
119
120 const CmaUtils::IterationState& get_state() const;
121
122 // template <class ListType>
123 // inline void post_kernel_process(ListType& list,
124 // ListType& process_buffer,
125 // // MC::ReactorDomain::n_cells_view_type& n_cells,
126 // size_t _waiting_allocation_particle);
127 // Memory management
128 void clear_mc();
129
130 void reset();
132
133 private:
134 void setVolumes() const;
135 Kokkos::TeamPolicy<ComputeSpace> _policy;
136 bool set_policy = false;
137 void setLiquidFlow(CmaUtils::PreCalculatedHydroState* _flows_l);
138 void setGasFlow(CmaUtils::PreCalculatedHydroState* _flows_g);
139 // Attributes
142 Simulation::Feed::SimulationFeed feed;
143
144 CmaUtils::IterationState state;
147 double starting_time = 0.; // Not used within calculation, only for export purposes
148 double end_time{}; // Not used within calculation, only for export purposes
149
150 // Bounce methods to pimpl
153 [[nodiscard]] kernelContribution get_kernel_contribution() const;
154
156
157 void post_init_concentration(const ScalarInitializer& scalar_init);
158 void post_init_concentration_functor(const ScalarInitializer& scalar_init);
159 void post_init_concentration_file(const ScalarInitializer& scalar_init);
160
161 std::shared_ptr<ScalarSimulation> liquid_scalar;
162 std::shared_ptr<ScalarSimulation> gas_scalar;
165 };
166
171
173 {
174 return state;
175 }
176
177 void SimulationUnit::cycleProcess(auto&& container, double d_t)
178 {
179 PROFILE_SECTION("cycleProcess")
180 using CurrentModel = typename std::remove_reference<decltype(container)>::type::UsedModel;
181 const size_t n_particle = container.n_particles();
182
183 auto local_rng = mc_unit->rng;
184 auto events = mc_unit->events;
185 auto contribs = get_kernel_contribution();
186
187 MC::ContributionView contribs_scatter(contribs);
188
189
192 this->move_info.neighbors = mc_unit->domain.getNeighbors();
193
194 std::size_t out_total = 0;
195 std::size_t dead_total = 0;
196 std::size_t _waiting_allocation_particle = 0;
197
199 d_t, container, local_rng.random_pool, getkernel_concentration(), contribs_scatter, events);
200
201 _policy = MC::get_policy(f, n_particle, true);
202
203 bool enable_move = move_info.liquid_volume.size() > 1;
204 bool enable_leave = move_info.leaving_flow.size() != 0;
205
206 switch (static_cast<int>(enable_leave) * 2 + static_cast<int>(enable_move))
207 {
208 case 0:
209 // No need to move/leave
210 break;
211 case 1:
213 break;
214 case 2:
216 break;
217 case 3:
219 break;
220 }
221
222 Kokkos::fence("fence_mc_cycle_process_move");
223 Kokkos::parallel_reduce("cycle_model", _policy, f, _waiting_allocation_particle, dead_total);
224 Kokkos::fence("fence_mc_cycle_process_model");
225
226 internal_counter_dead += out_total;
227 internal_counter_dead += dead_total;
228 Kokkos::Experimental::contribute(contribs, contribs_scatter);
229
230 static constexpr uint64_t minimum_dead_particle_removal = 100;
231 const auto threshold =
232 std::max(minimum_dead_particle_removal,
233 static_cast<uint64_t>(static_cast<double>(n_particle) *
234 AutoGenerated::dead_particle_ratio_threshold));
235
236 if (internal_counter_dead > threshold)
237 {
238 container.clean_dead(internal_counter_dead);
240 }
241
242 container.merge_buffer();
243
244 if (_waiting_allocation_particle != 0)
245 {
246 std::cout << "TODO: Overflow not implemented" << std::endl;
247 }
248
250 }
251
252 // template <class ListType>
253 // inline void SimulationUnit::post_kernel_process(ListType& list,
254 // ListType& process_buffer,
255 // // MC::ReactorDomain::n_cells_view_type&
256 // n_cells, size_t _waiting_allocation_particle)
257 // {
258
259 // // Kokkos::parallel_for(
260 // // "update_compartment_number", process_buffer.size(), KOKKOS_LAMBDA(const int i) {
261 // // Kokkos::atomic_increment(
262 // // &n_cells(process_buffer._owned_data(i).properties.current_container));
263 // // });
264
265 // static constexpr uint64_t minimum_dead_particle_removal = 100;
266 // const auto threshold =
267 // std::max(minimum_dead_particle_removal,
268 // static_cast<uint64_t>(static_cast<double>(list.size()) *
269 // AutoGenerated::dead_particle_ratio_threshold));
270
271 // // Use commented line to remove dead when there is no particle.
272 // // This lead to stop exporting state for next time steps. (id: n_step=50 but only 40
273 // biological
274 // // export)
275 // // if (_internal_counter > threshold || _internal_counter==list.size())
276 // if (internal_counter_dead > threshold)
277 // {
278 // #ifndef NDEBUG
279 // const auto old_size = list.size();
280 // #endif
281 // list.remove_dead(internal_counter_dead);
282 // #ifndef NDEBUG
283 // KOKKOS_ASSERT(list.size() == old_size - internal_counter_dead);
284 // #endif
285 // internal_counter_dead = 0;
286 // }
287
288 // list.insert(process_buffer);
289 // process_buffer.clear();
290 // const size_t n_new_alloc = _waiting_allocation_particle;
291 // if (n_new_alloc != 0)
292 // {
293 // const double new_weight = this->mc_unit->init_weight;
294 // list._spawn_alloc(n_new_alloc, new_weight);
295
296 // // Kokkos::parallel_for(
297 // // "add_new_alloc",
298 // // Kokkos::RangePolicy<ComputeSpace>(0, n_new_alloc),
299 // // KOKKOS_LAMBDA(const int) { Kokkos::atomic_increment(&n_cells(0)); });
300
301 // Kokkos::fence("Fence cycle process ");
302 // }
303
304 // set_kernel_contribs_to_host();
305 // }
306
307} // namespace Simulation
308
309#endif //__SIMULATIONS_UNIT_HPP__
Definition mass_transfer.hpp:47
Definition simulation.hpp:65
ProbeAutogeneratedBuffer & get_probes()
Definition simulation.hpp:167
const Simulation::Feed::SimulationFeed & get_feed() const
Definition simulation.cpp:288
MassTransfer::MassTransferModel mt_model
Definition simulation.hpp:163
double & get_start_time_mut()
Definition simulation.cpp:279
SimulationUnit & operator=(const SimulationUnit &rhs)=delete
void clear_mc()
Definition simulation.cpp:129
Simulation::Feed::SimulationFeed feed
Definition simulation.hpp:142
double starting_time
Definition simulation.hpp:147
std::span< const double > getContributionData() const
Definition simulation.model.cpp:15
SimulationUnit(std::unique_ptr< MC::MonteCarloUnit > &&_unit, const ScalarInitializer &scalar_init, std::optional< Feed::SimulationFeed > _feed=std::nullopt)
Definition simulation.cpp:30
std::span< double > getCliqData() const
Definition simulation.model.cpp:25
std::span< double > getContributionData_mut()
Definition simulation.model.cpp:20
bool const_number_simulation
Definition simulation.hpp:145
void post_init_concentration_file(const ScalarInitializer &scalar_init)
Definition simulation.cpp:102
void post_init_compartments()
Definition simulation.cpp:220
void reduceContribs_per_rank(std::span< const double > data) const
Definition simulation.model.cpp:50
void setLiquidFlow(CmaUtils::PreCalculatedHydroState *_flows_l)
const CmaUtils::IterationState & get_state() const
Definition simulation.hpp:172
KernelInline::MoveInfo< ComputeSpace > move_info
Definition simulation.hpp:164
std::unique_ptr< MC::MonteCarloUnit > mc_unit
Definition simulation.hpp:78
void setGasFlow(CmaUtils::PreCalculatedHydroState *_flows_g)
void reduceContribs(std::span< const double > data, size_t n_rank) const
Definition simulation.model.cpp:57
void update_feed(double t, double d_t, bool update_scalar=true) noexcept
Definition simulation.model.cpp:80
Dimensions getDimensions() const noexcept
Definition simulation.model.cpp:39
DiagonalView< ComputeSpace > get_kernel_diagonal() const
Definition simulation.cpp:239
bool two_phase_flow() const
Definition simulation.cpp:151
SimulationUnit(const SimulationUnit &other)=delete
std::shared_ptr< ScalarSimulation > gas_scalar
Definition simulation.hpp:162
std::optional< std::span< const double > > getMTRData() const
Definition simulation.model.cpp:44
double & get_end_time_mut()
Definition simulation.cpp:283
double end_time
Definition simulation.hpp:148
kernelContribution get_kernel_contribution() const
Definition simulation.cpp:255
void reset()
Definition simulation.cpp:134
SimulationUnit(SimulationUnit &&other) noexcept
SimulationUnit & operator=(SimulationUnit &&rhs)=delete
CmaUtils::IterationState state
Definition simulation.hpp:144
void cycleProcess(auto &&container, double d_t)
Definition simulation.hpp:177
std::size_t internal_counter_dead
Definition simulation.hpp:140
void set_probes(ProbeAutogeneratedBuffer &&_probes)
Definition simulation.cpp:146
const bool is_two_phase_flow
Definition simulation.hpp:146
std::size_t counter() const
Definition simulation.cpp:141
std::optional< std::span< const double > > getCgasData() const
Definition simulation.model.cpp:30
void set_kernel_contribs_to_host()
Definition simulation.cpp:260
CumulativeProbabilityView< ComputeSpace > get_kernel_cumulative_proba() const
Definition simulation.cpp:245
std::shared_ptr< ScalarSimulation > liquid_scalar
Definition simulation.hpp:161
void post_init_concentration_functor(const ScalarInitializer &scalar_init)
Definition simulation.cpp:156
Kokkos::TeamPolicy< ComputeSpace > _policy
Definition simulation.hpp:135
void post_init_concentration(const ScalarInitializer &scalar_init)
Definition simulation.cpp:184
void update(CmaUtils::IterationState &&new_state)
Definition simulation.cpp:67
ProbeAutogeneratedBuffer probes
Definition simulation.hpp:141
void setVolumes() const
Definition simulation.cpp:75
void clearContribution() const noexcept
Definition simulation.model.cpp:68
Kokkos::View< const double **, Kokkos::LayoutLeft, ComputeSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > getkernel_concentration() const
Definition simulation.cpp:269
void step(double d_t) const
Definition simulation.model.cpp:144
bool set_policy
Definition simulation.hpp:136
Namespace to handle algorithms and structures related to reading compartment mesh.
Definition host_specific.hpp:17
Kokkos::Experimental::ScatterView< double **, Kokkos::LayoutRight > ContributionView
Definition alias.hpp:30
Kokkos::TeamPolicy< ComputeSpace > get_policy(FunctorType &f, std::size_t range, bool reduce=false)
Definition unit.hpp:38
constexpr bool enable_leave
Definition move_kernel.hpp:20
constexpr bool enable_move
Definition move_kernel.hpp:23
constexpr bool disable_leave
Definition move_kernel.hpp:21
constexpr bool disable_move
Definition move_kernel.hpp:22
Namespace that contains classes and structures related to simulation handling.
Definition host_specific.hpp:12
Kokkos:: View< double *, Kokkos::LayoutLeft, ExecSpace, Kokkos::MemoryTraits< Kokkos::RandomAccess > > DiagonalView
Definition alias.hpp:14
Kokkos:: View< const double **, Kokkos::LayoutRight, Space, Kokkos::MemoryTraits< Kokkos::RandomAccess > > CumulativeProbabilityView
Definition alias.hpp:20
Structure to store information about the reactor state during simulation.
Definition iteration_state.hpp:21
Definition simulation.hpp:52
std::size_t n_species
Definition simulation.hpp:53
std::size_t n_compartment
Definition simulation.hpp:54
void serialize(Archive &archive)
Definition simulation.hpp:56
Definition simulation_kernel.hpp:23
Definition move_kernel.hpp:26
DiagonalView< ExecSpace > diag_transition
Definition move_kernel.hpp:28
LeavingFlowType leaving_flow
Definition move_kernel.hpp:30
CumulativeProbabilityView< ExecSpace > cumulative_probability
Definition move_kernel.hpp:29
ConstNeighborsView< ExecSpace > neighbors
Definition move_kernel.hpp:27
Kokkos::View< double *, ExecSpace > liquid_volume
Definition move_kernel.hpp:32
Definition scalar_initializer.hpp:30