BioCMAMC-ST
simulation.hpp
1#ifndef __SIMULATIONS_UNIT_HPP__
2#define __SIMULATIONS_UNIT_HPP__
3
4#include <Kokkos_Core.hpp>
5#include <Kokkos_ScatterView.hpp>
6#include <biocma_cst_config.hpp>
7#include <cassert>
8#include <cma_utils/alias.hpp>
9#include <common/common.hpp>
10#include <common/logger.hpp>
11#include <cstddef>
12#include <mc/domain.hpp>
13#include <mc/events.hpp>
14#include <mc/prng/prng.hpp>
15#include <mc/unit.hpp>
16#include <memory>
17#include <optional>
18#include <simulation/descriptors/dimensions.hpp>
19#include <simulation/feed_descriptor.hpp>
20#include <simulation/kernels/kernels.hpp>
21#include <simulation/mass_transfer.hpp>
22#include <simulation/probe.hpp>
23#include <simulation/scalar_initializer.hpp>
24#include <simulation/simulation_getter.hpp>
25
26// TODO Clean
27static constexpr size_t trigger_const_particle_number = 1e6;
28
29namespace CmaUtils
30{
31 class PreCalculatedHydroState;
32} // namespace CmaUtils
33
39namespace Simulation
40{
41 class ScalarSimulation;
42
44 {
45 private:
47
48 public:
49 friend class Getter;
50
51 // Getter get() const;
52
53 SimulationUnit(std::unique_ptr<MC::MonteCarloUnit>&& _unit,
54 ScalarInitializer&& scalar_init,
55 std::optional<Feed::SimulationFeed> _feed = std::nullopt);
56
58
59 SimulationUnit(SimulationUnit&& other) noexcept;
60 SimulationUnit(const SimulationUnit& other) = delete;
63
64 // Setters
65 void setEndTime(double _end_time) noexcept;
66 void overwriteStartTime(double _start_time) noexcept;
67 void setProbes(ProbeType type, ProbeAutogeneratedBuffer&& _probes);
69 void setLogger(std::shared_ptr<IO::Logger>);
70
71 Getter getter() const noexcept;
72
73 // Getters
74
75 // Simulation methods
76 void cycleProcess(auto& container, double d_t, auto& _functors);
77 void step(double d_t) const;
78 void clearContribution() const noexcept;
79 void update_feed(double t, double d_t, bool update_scalar = true) noexcept;
80 void updateHydro(const CmaUtils::IterationStatePtrType& newstate);
81 void updateMCHydro(std::span<const double> newliquid_volume,
82 std::span<const std::size_t> neighors_flat,
83 std::span<const double> proba_flat,
84 std::span<const double> out_flows) const;
85
86 bool checkScalar() const;
87
88 // Memory management
89 [[deprecated]] void reset();
90
91 template <typename Space, ModelType Model>
92 KernelInline::CycleFunctors<Space, Model>
93 init_functors(MC::ParticlesContainer<Model> container,
94 KernelDispatchOptions options);
95
96 private:
97 std::unique_ptr<MC::MonteCarloUnit> mc_unit; // NOLINT
98
99 void updateScalarHydro(const CmaUtils::IterationStatePtrType& newstate);
100
101 void setLiquidFlow(CmaUtils::PreCalculatedHydroState* _flows_l);
102 void setGasFlow(CmaUtils::PreCalculatedHydroState* _flows_g);
104
105 [[nodiscard]] MC::KernelConcentrationType getkernel_concentration() const;
106
107 MC::ContributionView contribs_scatter;
110
111 // Attributes
112 Simulation::Feed::SimulationFeed feed;
113
116 // Not used within calculation, only for export purposes
118 // Not used within calculation, only for export purposes
119 double end_time;
120 bool f_reaction = true; // FIXME
121 void scatter_contribute();
122 // void set_kernel_contribs_to_host();
123
124 [[nodiscard]] MC::kernelContribution get_kernel_contribution() const;
125
126 void post_init_concentration(ScalarInitializer&& scalar_init);
127
129 std::shared_ptr<ScalarSimulation> gas_scalar;
130 // TODO add default null value (no model)
131 MassTransfer::MassTransferModel mt_model;
132
133 std::shared_ptr<IO::Logger> logger;
134
135 template <ModelType Model>
136 void post_cycle(MC::ParticlesContainer<Model>& container,
137 auto& cycle_functors);
138
139 template <ModelType Model>
140 void pre_cycle(MC::ParticlesContainer<Model>& container,
141 double d_t,
142 auto& functors);
143 };
144
145 template <ModelType Model>
146 void
147 SimulationUnit::pre_cycle(MC::ParticlesContainer<Model>& container,
148 double d_t,
149 auto& cycle_functors)
150 {
151 PROFILE_SECTION("Simulation::pre_cycle")
152
153 cycle_functors.update(
154 d_t, container, this->mc_unit->domain.get_const_inner());
155 }
156
157 template <typename Space, ModelType Model>
160 KernelDispatchOptions options)
161 {
162
164 options,
165 container,
166 mc_unit->rng.random_pool,
169 mc_unit->events,
170 mc_unit->domain.get_const_inner(),
171 probes[ProbeType ::LeavingTime],
172 probes[ProbeType ::DivisionTime]);
173 }
174
175 void
177 double d_t,
178 auto& cycle_functors)
179 {
180 PROFILE_SECTION("cycleProcess")
181 using CurrentModel =
182 typename std::remove_reference<decltype(container)>::type::UsedModel;
183 const size_t n_particle = container.n_particles();
184 if (n_particle == 0)
185 {
186 return;
187 }
188
189 pre_cycle(container, d_t, cycle_functors);
190
191 if (f_reaction)
192 {
193 this->contribs_scatter.reset();
194 cycle_functors.launch_model(n_particle);
195 }
196
197 if (cycle_functors.move_kernel.need_launch())
198 {
199 cycle_functors.launch_move(n_particle);
200 }
201
202 post_cycle<CurrentModel>(container, cycle_functors);
203 }
204
205 template <ModelType Model>
206 void
208 auto& cycle_functors)
209 {
210 PROFILE_SECTION("Simulation::post_cycle")
211 Kokkos::fence();
212 this->scatter_contribute();
213 const auto [host_red, host_out_counter]
214 = cycle_functors.get_host_reduction();
215
216 container.update_and_remove_inactive(host_out_counter, host_red.dead_total);
217
218 container.merge_buffer();
219
220 if (host_red.waiting_allocation_particle != 0)
221 {
222 if (logger)
223 {
224 logger->alert("Simulation",
225 "Overflow of particle not implemented yet (ignore "
226 "_waiting_allocation_particle)");
227 }
228 }
229
230 // set_kernel_contribs_to_host();
231 }
232
233} // namespace Simulation
234
235#endif //__SIMULATIONS_UNIT_HPP__
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:57
void update_and_remove_inactive(std::size_t out, std::size_t dead)
Update the number of non-idle particle and remove if total number exceeds threshold May call : remove...
Definition particles_container.hpp:541
void merge_buffer()
Insert particle buffer into the main container.
Definition particles_container.hpp:577
Definition scalar_simulation.hpp:29
Getter accesor
Definition simulation.hpp:46
SimulationUnit(std::unique_ptr< MC::MonteCarloUnit > &&_unit, ScalarInitializer &&scalar_init, std::optional< Feed::SimulationFeed > _feed=std::nullopt)
Definition simulation.cpp:47
MassTransfer::MassTransferModel mt_model
Definition simulation.hpp:131
SimulationUnit & operator=(const SimulationUnit &rhs)=delete
Simulation::Feed::SimulationFeed feed
Definition simulation.hpp:112
bool f_reaction
Definition simulation.hpp:120
void updateMCHydro(std::span< const double > newliquid_volume, std::span< const std::size_t > neighors_flat, std::span< const double > proba_flat, std::span< const double > out_flows) const
Definition simulation.cpp:111
void updateScalarHydro(const CmaUtils::IterationStatePtrType &newstate)
Definition simulation.cpp:122
double starting_time
Definition simulation.hpp:117
void post_init_concentration(ScalarInitializer &&scalar_init)
Definition simulation.cpp:154
void setLogger(std::shared_ptr< IO::Logger >)
Definition simulation.getset.cpp:151
MC::KernelConcentrationType getkernel_concentration() const
Definition simulation.getset.cpp:179
bool const_number_simulation
Definition simulation.hpp:114
MapProbes probes
Definition simulation.hpp:108
Getter getter() const noexcept
Definition simulation.getset.cpp:145
void cycleProcess(auto &container, double d_t, auto &_functors)
Definition simulation.hpp:176
Dimensions dims
Definition simulation.hpp:109
void updateHydro(const CmaUtils::IterationStatePtrType &newstate)
Definition simulation.cpp:95
void setLiquidFlow(CmaUtils::PreCalculatedHydroState *_flows_l)
std::unique_ptr< MC::MonteCarloUnit > mc_unit
Definition simulation.hpp:97
void setGasFlow(CmaUtils::PreCalculatedHydroState *_flows_g)
void update_feed(double t, double d_t, bool update_scalar=true) noexcept
Definition simulation.model.cpp:54
void setProbes(ProbeType type, ProbeAutogeneratedBuffer &&_probes)
Definition simulation.getset.cpp:167
void overwriteStartTime(double _start_time) noexcept
Definition simulation.getset.cpp:191
KernelInline::CycleFunctors< Space, Model > init_functors(MC::ParticlesContainer< Model > container, KernelDispatchOptions options)
Definition simulation.hpp:159
SimulationUnit(const SimulationUnit &other)=delete
std::shared_ptr< ScalarSimulation > gas_scalar
Definition simulation.hpp:129
void setMtrModel(MassTransfer::Type::MtrTypeVariant &&variant)
Definition simulation.getset.cpp:157
void post_cycle(MC::ParticlesContainer< Model > &container, auto &cycle_functors)
Definition simulation.hpp:207
double end_time
Definition simulation.hpp:119
void reset()
Definition simulation.cpp:86
SimulationUnit & operator=(SimulationUnit &&rhs)=delete
bool is_two_phase_flow
Definition simulation.hpp:115
void setEndTime(double _end_time) noexcept
Definition simulation.getset.cpp:185
std::shared_ptr< ScalarSimulation > liquid_scalar
Definition simulation.hpp:128
friend class Getter
Definition simulation.hpp:49
bool checkScalar() const
Definition simulation.model.cpp:21
void pre_cycle(MC::ParticlesContainer< Model > &container, double d_t, auto &functors)
Definition simulation.hpp:147
void scatter_contribute()
Definition simulation.cpp:143
std::shared_ptr< IO::Logger > logger
Definition simulation.hpp:133
void clearContribution() const noexcept
Definition simulation.model.cpp:43
void step(double d_t) const
Definition simulation.model.cpp:111
MC::kernelContribution get_kernel_contribution() const
Definition simulation.getset.cpp:197
MC::ContributionView contribs_scatter
Definition simulation.hpp:107
Model type.
Definition traits.hpp:141
Definition host_specific.hpp:17
Definition impl_post_process.hpp:11
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:16
Definition feed_descriptor.hpp:36
Definition kernels.hpp:16
std::variant< FlowmapTurbulence, FixedKla, FlowmapKla > MtrTypeVariant
Definition mass_transfer.hpp:39
Definition impl_mass_transfer.hpp:23
Namespace that contains classes and structures related to simulation handling.
Definition host_specific.hpp:12
ProbeType
Definition probe.hpp:15
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:148
std::unordered_map< ProbeType, ProbeAutogeneratedBuffer > MapProbes
Definition probe.hpp:150
Definition execinfo.hpp:12
Definition dimensions.hpp:9
Definition scalar_initializer.hpp:29