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 <ranges>
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// TODO Clean
25static constexpr size_t trigger_const_particle_number = 1e6;
26
27namespace CmaUtils
28{
29 class PreCalculatedHydroState;
30} // namespace CmaUtils
31
37namespace Simulation
38{
39
41 {
42 std::size_t n_species{};
43 std::size_t n_compartment{};
44
45 template <class Archive>
46 void
47 serialize(Archive& archive)
48 {
49 archive(n_species, n_compartment);
50 }
51 };
52
53 class ScalarSimulation;
54
56 {
57 public:
58 SimulationUnit(std::unique_ptr<MC::MonteCarloUnit>&& _unit,
59 const ScalarInitializer& scalar_init,
60 std::optional<Feed::SimulationFeed> _feed = std::nullopt);
61
63
64 SimulationUnit(SimulationUnit&& other) noexcept;
65 SimulationUnit(const SimulationUnit& other) = delete;
68
69 std::unique_ptr<MC::MonteCarloUnit> mc_unit; // NOLINT
70
71 [[nodiscard]] const Simulation::Feed::SimulationFeed& get_feed() const;
72
73 // ProbeAutogeneratedBuffer& get_probes(ProbeType type);
74
75 // std::span<double> getContributionData_mut();
76
77 // Setters
78 void setProbes(ProbeType type, ProbeAutogeneratedBuffer&& _probes);
80 void setLogger(std::shared_ptr<IO::Logger>);
81
82 // Getters
83
84 [[nodiscard]] double& get_start_time_mut();
85 [[nodiscard]] double& get_end_time_mut();
86 [[nodiscard]] Dimensions getDimensions() const noexcept;
87 [[nodiscard]] std::span<double> getCliqData() const;
88 [[nodiscard]] std::optional<std::span<const double>> getCgasData() const;
89 [[nodiscard]] std::span<const double> getContributionData() const;
90 [[nodiscard]] bool two_phase_flow() const;
91 [[nodiscard]] std::optional<std::span<const double>> getMTRData() const;
92 std::span<double> getContributionData_mut();
93
94 // Simulation methods
95 void cycleProcess(auto& container, double d_t, auto& _functors);
96 void step(double d_t) const;
97 void clearContribution() const noexcept;
98 void update_feed(double t, double d_t, bool update_scalar = true) noexcept;
99 void updateHydro(const CmaUtils::IterationStatePtrType& newstate);
100 void updateMCHydro(std::span<const double> newliquid_volume,
101 std::span<const std::size_t> neighors_flat,
102 std::span<const double> proba_flat,
103 std::span<const double> out_flows) const;
104
105 bool checkScalar() const;
106
107 // Memory management
108 void reset();
109
110 template <typename Space, ModelType Model>
111 KernelInline::CycleFunctors<Space, Model>
112 init_functors(MC::ParticlesContainer<Model> container);
113
114 std::ranges::subrange<ProbeIterator, ProbeIterator> it_probes() const;
115
116 private:
117 void updateScalarHydro(const CmaUtils::IterationStatePtrType& newstate);
118
119 void setLiquidFlow(CmaUtils::PreCalculatedHydroState* _flows_l);
120 void setGasFlow(CmaUtils::PreCalculatedHydroState* _flows_g);
122
123 [[nodiscard]] MC::KernelConcentrationType getkernel_concentration() const;
124
125 MC::ContributionView contribs_scatter;
127
128 // Attributes
129 Simulation::Feed::SimulationFeed feed;
130
134 = 0.; // Not used within calculation, only for export purposes
135 double end_time{}; // Not used within calculation, only for export purposes
136 bool f_reaction = true; // FIXME
137 void scatter_contribute();
139
140 [[nodiscard]] kernelContribution get_kernel_contribution() const;
141
142 void post_init_concentration(const ScalarInitializer& scalar_init);
143
144 // std::unique_ptr<ScalarSimulationProxyBase> scalar_proxy;
145
146 std::shared_ptr<ScalarSimulation> liquid_scalar;
147 std::shared_ptr<ScalarSimulation> gas_scalar;
149 mt_model; // TODO add default null value (no model)
150
151 std::shared_ptr<IO::Logger> logger;
152
153 template <ModelType Model>
155 auto& cycle_functors);
156
157 template <ModelType Model>
159 double d_t,
160 auto& functors);
161 };
162
163 template <ModelType Model>
164 void
166 double d_t,
167 auto& cycle_functors)
168 {
169 PROFILE_SECTION("Simulation::pre_cycle")
170
171 cycle_functors.update(
172 d_t, container, this->mc_unit->domain.get_const_inner());
173 }
174
175 template <typename Space, ModelType Model>
178 {
179
181 container,
182 mc_unit->rng.random_pool,
185 mc_unit->events,
186 mc_unit->domain.get_const_inner(),
187 probes[ProbeType ::LeavingTime],
188 probes[ProbeType ::DivisionTime]);
189 }
190
191 void
193 double d_t,
194 auto& cycle_functors)
195 {
196 PROFILE_SECTION("cycleProcess")
197 using CurrentModel =
198 typename std::remove_reference<decltype(container)>::type::UsedModel;
199 const size_t n_particle = container.n_particles();
200 if (n_particle == 0)
201 {
202 return;
203 }
204
205 pre_cycle(container, d_t, cycle_functors);
206
207 if (f_reaction)
208 {
209 this->contribs_scatter.reset();
210 cycle_functors.launch_model(n_particle);
211 }
212
213 cycle_functors.move_space.fence();
214 if (cycle_functors.move_kernel.need_launch())
215 {
216
217 cycle_functors.launch_move(n_particle);
218 }
219
220 post_cycle<CurrentModel>(container, cycle_functors);
221 }
222
223 template <ModelType Model>
224 void
226 auto& cycle_functors)
227 {
228 PROFILE_SECTION("Simulation::post_cycle")
229 Kokkos::fence();
230 this->scatter_contribute();
231 auto [host_red, host_out_counter] = cycle_functors.get_host_reduction();
232
233 container.update_and_remove_inactive(host_out_counter, host_red.dead_total);
234
235 container.merge_buffer();
236
237 if (host_red.waiting_allocation_particle != 0)
238 {
239 if (logger)
240 {
241 logger->alert("Simulation",
242 "Overflow of particle not implemented yet (ignore "
243 "_waiting_allocation_particle)");
244 }
245 }
246
248 }
249
250} // namespace Simulation
251
252#endif //__SIMULATIONS_UNIT_HPP__
Main owning object for Monte-Carlo particles.
Definition particles_container.hpp:56
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:551
void merge_buffer()
Insert particle buffer into the main container.
Definition particles_container.hpp:587
Definition feed_descriptor.hpp:113
Definition mass_transfer.hpp:54
const Simulation::Feed::SimulationFeed & get_feed() const
Definition simulation.getset.cpp:68
MassTransfer::MassTransferModel mt_model
Definition simulation.hpp:149
double & get_start_time_mut()
Definition simulation.getset.cpp:57
SimulationUnit & operator=(const SimulationUnit &rhs)=delete
std::ranges::subrange< ProbeIterator, ProbeIterator > it_probes() const
Definition simulation.getset.cpp:149
Simulation::Feed::SimulationFeed feed
Definition simulation.hpp:129
bool f_reaction
Definition simulation.hpp:136
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:78
void updateScalarHydro(const CmaUtils::IterationStatePtrType &newstate)
Definition simulation.cpp:89
double starting_time
Definition simulation.hpp:134
std::span< const double > getContributionData() const
Definition simulation.getset.cpp:108
SimulationUnit(std::unique_ptr< MC::MonteCarloUnit > &&_unit, const ScalarInitializer &scalar_init, std::optional< Feed::SimulationFeed > _feed=std::nullopt)
Definition simulation.cpp:31
std::span< double > getCliqData() const
Definition simulation.getset.cpp:120
void setLogger(std::shared_ptr< IO::Logger >)
Definition simulation.getset.cpp:74
std::span< double > getContributionData_mut()
Definition simulation.getset.cpp:114
MC::KernelConcentrationType getkernel_concentration() const
Definition simulation.getset.cpp:102
bool const_number_simulation
Definition simulation.hpp:131
MapProbes probes
Definition simulation.hpp:126
KernelInline::CycleFunctors< Space, Model > init_functors(MC::ParticlesContainer< Model > container)
Definition simulation.hpp:177
void cycleProcess(auto &container, double d_t, auto &_functors)
Definition simulation.hpp:192
void updateHydro(const CmaUtils::IterationStatePtrType &newstate)
Definition simulation.cpp:62
void setLiquidFlow(CmaUtils::PreCalculatedHydroState *_flows_l)
std::unique_ptr< MC::MonteCarloUnit > mc_unit
Definition simulation.hpp:69
void setGasFlow(CmaUtils::PreCalculatedHydroState *_flows_g)
void update_feed(double t, double d_t, bool update_scalar=true) noexcept
Definition simulation.model.cpp:55
void setProbes(ProbeType type, ProbeAutogeneratedBuffer &&_probes)
Definition simulation.getset.cpp:90
Dimensions getDimensions() const noexcept
Definition simulation.getset.cpp:136
bool two_phase_flow() const
Definition simulation.getset.cpp:45
SimulationUnit(const SimulationUnit &other)=delete
std::shared_ptr< ScalarSimulation > gas_scalar
Definition simulation.hpp:147
void setMtrModel(MassTransfer::Type::MtrTypeVariant &&variant)
Definition simulation.getset.cpp:80
std::optional< std::span< const double > > getMTRData() const
Definition simulation.getset.cpp:143
double & get_end_time_mut()
Definition simulation.getset.cpp:62
void post_cycle(MC::ParticlesContainer< Model > &container, auto &cycle_functors)
Definition simulation.hpp:225
double end_time
Definition simulation.hpp:135
kernelContribution get_kernel_contribution() const
Definition simulation.getset.cpp:51
void reset()
Definition simulation.cpp:121
SimulationUnit(SimulationUnit &&other) noexcept
SimulationUnit & operator=(SimulationUnit &&rhs)=delete
bool is_two_phase_flow
Definition simulation.hpp:132
std::optional< std::span< const double > > getCgasData() const
Definition simulation.getset.cpp:126
void set_kernel_contribs_to_host()
Definition simulation.getset.cpp:96
std::shared_ptr< ScalarSimulation > liquid_scalar
Definition simulation.hpp:146
void post_init_concentration(const ScalarInitializer &scalar_init)
Definition simulation.cpp:129
bool checkScalar() const
Definition simulation.model.cpp:24
void pre_cycle(MC::ParticlesContainer< Model > &container, double d_t, auto &functors)
Definition simulation.hpp:165
void scatter_contribute()
Definition simulation.cpp:110
std::shared_ptr< IO::Logger > logger
Definition simulation.hpp:151
void clearContribution() const noexcept
Definition simulation.model.cpp:45
void step(double d_t) const
Definition simulation.model.cpp:170
MC::ContributionView contribs_scatter
Definition simulation.hpp:125
Model type.
Definition traits.hpp:135
Definition host_specific.hpp:19
Namespace that contains classes and structures related to Monte Carlo (MC) simulations.
Definition alias.hpp:15
Definition feed_descriptor.hpp:34
Definition kernels.hpp:12
std::variant< FlowmapTurbulence, FixedKla, FlowmapKla > MtrTypeVariant
Definition mass_transfer.hpp:39
Namespace that contains classes and structures related to simulation handling.
Definition main_exporter.hpp:18
MapProbes::const_iterator ProbeIterator
Definition probe.hpp:59
ProbeType
Definition probe.hpp:15
Probes< AutoGenerated::probe_buffer_size > ProbeAutogeneratedBuffer
Definition probe.hpp:55
std::unordered_map< ProbeType, ProbeAutogeneratedBuffer > MapProbes
Definition probe.hpp:57
Definition simulation.hpp:41
std::size_t n_species
Definition simulation.hpp:42
std::size_t n_compartment
Definition simulation.hpp:43
void serialize(Archive &archive)
Definition simulation.hpp:47
Definition scalar_initializer.hpp:28