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