BioCMAMC-ST
api.hpp
1#ifndef __BIOMC_API_HPP__
2#define __BIOMC_API_HPP__
3
4#include <api/results.hpp>
5#include <common/execinfo.hpp>
6#include <common/logger.hpp>
7#include <core/case_data.hpp>
8#include <core/scalar_factory.hpp>
9#include <core/simulation_parameters.hpp>
10#include <cstdlib>
11#include <initializer_list>
12#include <memory>
13#include <mixture/species_descriptor.hpp>
14#include <optional>
15#include <ranges>
16#include <simulation/feed_descriptor.hpp>
17#include <simulation/mass_transfer.hpp>
18#include <string_view>
19#include <utility>
20
25namespace Api
26{
27 constexpr std::array<int, 3>
29 {
30 return { _BIOMC_VERSION_MAJOR, _BIOMC_VERSION_MINOR, _BIOMC_VERSION_DEV };
31 }
32
33 // concat 3*two bits
34 constexpr int
35 validate_version(int major, int minor, int dev)
36 {
37 auto cmp2 = [](int a, int b) -> int { return 1 + (a > b) - (a < b); };
38
39 return (cmp2(major, _BIOMC_VERSION_MAJOR) << 4)
40 | (cmp2(minor, _BIOMC_VERSION_MINOR) << 2)
41 | (cmp2(dev, _BIOMC_VERSION_DEV) << 0);
42 }
43
44 constexpr bool
45 version_is_compatible(int major, int minor, int dev)
46 {
47 // Reference value when all fields are equal
48 constexpr int VERSION_EQUAL = (1 << 4) | (1 << 2) | (1 << 0);
49 return validate_version(major, minor, dev) >= VERSION_EQUAL;
50 }
51
52 void finalise();
53
70 {
71 public:
89
98
106 ApiResult apply(bool to_load) noexcept;
107
113 ApiResult apply() noexcept;
114
121 ApiResult apply_load() noexcept;
122
124 register_mixture_composition(std::span<std::string> names) noexcept;
125
127 std::initializer_list<std::string_view> names) noexcept;
128
136 register_parameters(Core::UserControlParameters&& params) noexcept;
137
144 bool register_result_path(std::string_view path);
145
147 register_initial_condition(Core::ScalarFactory::ScalarVariant&& type);
148 ApiResult register_initialiser_file_path(std::string_view path);
156 ApiResult register_cma_path(std::string_view path);
157
164 bool register_serde(std::string_view path);
165
172 ApiResult register_model_name(std::string_view path);
173
174 ApiResult add_feed(Simulation::Feed::FeedDescriptor feed_type, Phase phase);
175
176 ApiResult set_mtr(Simulation::MassTransfer::Type::MtrTypeVariant&& variant);
177
178 void set_auto_mtr();
179
181 register_scalar_initiazer(Core::ScalarFactory::ScalarVariant&& var);
182
188 [[nodiscard]] int get_id() const;
189
190 [[nodiscard]] const ExecInfo& get_exec_info() const;
191
197 ApiResult exec() noexcept;
198
199 void
200 set_logger(std::shared_ptr<IO::Logger> _logger)
201 {
202
203 logger = std::move(_logger);
204 }
205
206 [[nodiscard]] auto&
208 {
209 return logger;
210 }
211
221 static std::optional<std::unique_ptr<SimulationInstance>>
222 init(int argc,
223 char** argv,
224 std::optional<std::size_t> run_id = std::nullopt) noexcept;
225
226 static std::vector<std::string> get_model_list() noexcept;
227
228 private:
229 int id{};
230
239 SimulationInstance(int argc,
240 char** argv,
241 std::optional<std::size_t> run_id);
242
243 std::shared_ptr<IO::Logger> logger;
244
245 std::shared_ptr<Mixture::SpecieTable> m_table;
246
247 std::optional<Core::ScalarFactory::ScalarVariant> scalar_initializer_variant
248 = std::nullopt;
251 bool loaded = false;
252 bool applied = false;
253 bool registered = false;
254 std::optional<Simulation::Feed::SimulationFeed> feed
255 = std::nullopt;
256 std::optional<Simulation::MassTransfer::Type::MtrTypeVariant> mtr_type
257 = std::nullopt;
258
260 };
261
262} // namespace Api
263#endif
Api This namespace contains classes and functions related to the simulation API.
Definition api.hpp:26
constexpr std::array< int, 3 > get_version()
Definition api.hpp:28
void finalise()
Definition api.cpp:144
constexpr int validate_version(int major, int minor, int dev)
Definition api.hpp:35
constexpr bool version_is_compatible(int major, int minor, int dev)
Definition api.hpp:45
Core component to perform simulation.
Definition data_exporter.hpp:38
Definition impl_post_process.hpp:11
Namespace that contains classes and structures related to simulation handling.
Definition host_specific.hpp:12
Definition results.hpp:8
ApiResult register_model_name(std::string_view path)
Register the model name for the simulation.
Definition api.cpp:490
SimulationInstance(SimulationInstance &&)=default
Defaulted move constructor for efficient resource transfer.
std::optional< Core::ScalarFactory::ScalarVariant > scalar_initializer_variant
Definition api.hpp:248
bool register_result_path(std::string_view path)
Register a result output path.
Definition api.cpp:458
static std::vector< std::string > get_model_list() noexcept
Definition api.cpp:497
bool registered
Flag indicating if resources are registered.
Definition api.hpp:253
std::shared_ptr< Mixture::SpecieTable > m_table
Definition api.hpp:245
const ExecInfo & get_exec_info() const
Definition api.cpp:503
ApiResult add_feed(Simulation::Feed::FeedDescriptor feed_type, Phase phase)
Definition api.cpp:367
ApiResult exec() noexcept
Execute the simulation.
Definition api.cpp:205
bool register_serde(std::string_view path)
Register a serialization/deserialization (serde) path.
Definition api.cpp:482
void set_logger(std::shared_ptr< IO::Logger > _logger)
Definition api.hpp:200
ApiResult register_mixture_composition(std::span< std::string > names) noexcept
Definition api.cpp:418
std::optional< Simulation::MassTransfer::Type::MtrTypeVariant > mtr_type
Definition api.hpp:257
void set_auto_mtr()
Definition api.cpp:274
SimulationInstance(const SimulationInstance &)=delete
Deleted copy constructor to prevent copying.
ApiResult register_initial_condition(Core::ScalarFactory::ScalarVariant &&type)
Definition api.cpp:474
auto & get_logger() const
Definition api.hpp:207
Core::CaseData _data
Case data for the simulation.
Definition api.hpp:249
bool auto_mtr
Definition api.hpp:259
SimulationInstance & operator=(SimulationInstance &&)=default
Defaulted move assignment operator for efficient resource transfer.
std::shared_ptr< IO::Logger > logger
Definition api.hpp:243
int get_id() const
Retrieve the simulation instance's unique identifier.
Definition api.cpp:161
static std::optional< std::unique_ptr< SimulationInstance > > init(int argc, char **argv, std::optional< std::size_t > run_id=std::nullopt) noexcept
Initialize a simulation instance.
Definition api.cpp:189
ApiResult register_cma_path(std::string_view path)
Register a path for CMA data.
Definition api.cpp:381
ApiResult apply_load() noexcept
Load ad apply the simulation configuration and prepare for execution based on file.
Definition api.cpp:239
ApiResult set_mtr(Simulation::MassTransfer::Type::MtrTypeVariant &&variant)
Definition api.cpp:431
ApiResult register_parameters(Core::UserControlParameters &&params) noexcept
Register user control parameters for the simulation.
Definition api.cpp:441
bool applied
Flag indicating if the configuration is applied.
Definition api.hpp:252
~SimulationInstance()
Default destructor.
Definition api.cpp:181
std::optional< Simulation::Feed::SimulationFeed > feed
Optional feed configuration.
Definition api.hpp:255
SimulationInstance & operator=(const SimulationInstance &)=delete
Deleted copy assignment operator to prevent copying.
Core::UserControlParameters params
User-defined control parameters.
Definition api.hpp:250
ApiResult apply() noexcept
Apply the simulation configuration and prepare for execution.
Definition api.cpp:280
bool loaded
Flag indicating if the instance is loaded.
Definition api.hpp:251
ApiResult register_initialiser_file_path(std::string_view path)
Definition api.cpp:467
ApiResult register_scalar_initiazer(Core::ScalarFactory::ScalarVariant &&var)
Definition api.cpp:450
SimulationInstance()=delete
Default constructor.
Holds the data required to execute a simulation case.
Definition case_data.hpp:40
A structure to hold user-defined control parameters for simulation settings.
Definition simulation_parameters.hpp:24
Definition execinfo.hpp:21