BioCMAMC-ST
feed_descriptor.hpp
1#ifndef __SIMULATION_FEED_DESCRIPTOR_HPP__
2#define __SIMULATION_FEED_DESCRIPTOR_HPP__
3
4#include <cstddef>
5#include <cstdint>
6#include <optional>
7#include <ranges>
8#include <variant>
9#include <vector>
10
11enum class Phase
12{
13 Liquid,
14 Gas
15};
16
17enum class FeedType : std::uint8_t
18{
19 Constant,
20 Exponential,
21 Linear,
22 // DelayedConstant,
23 // Step,
24 // Pulse,
25 // Custom
26};
27
28template <typename T>
29constexpr decltype(auto)
30move_allow_trivial(T&& t) noexcept
31{
32 return std::move(t); // NOLINT
33}
34
36{
37
38 struct Constant
39 {
40 };
41
43 {
44 double f0;
45 double alpha;
46 };
47
48 struct Linear
49 {
50 double f0;
51 double df;
52 };
53
54 // struct DelayedConstant
55 // {
56 // double t_init;
57 // double t_end;
58 // double stored_value;
59 // };
60
61 // struct Step
62 // {
63 // double t_init = 0.;
64 // };
65
66 // struct Pulse
67 // {
68 // double t_init;
69 // double t_end;
70 // double frequency;
71 // double stored_value;
72 // };
73
74 // struct Custom
75 // {
76 // };
77
78 // using FeedTypeVariant
79 // = std::variant<Constant, Step, Pulse, Custom, DelayedConstant>;
80
81 using FeedTypeVariant = std::variant<Constant, Linear, Exponential>;
82
83 FeedType get_type(const FeedTypeVariant& v);
84
85 struct FeedValue
86 {
88 std::size_t species_index;
89 };
90
92 {
93 double flow{};
94 std::vector<FeedValue> values;
95 std::size_t input_position{};
96 std::optional<std::size_t> output_position;
98 void update(double t, double d_t) noexcept;
99 };
100
102 {
103 static FeedDescriptor constant(double flow,
104 double concentration,
105 std::size_t species_index,
106 std::size_t input_position,
107 std::optional<std::size_t> _ouput_position
108 = std::nullopt,
109 bool set_output = true) noexcept;
110 };
111
113 {
114 public:
115 std::optional<std::vector<FeedDescriptor>> liquid;
116 std::optional<std::vector<FeedDescriptor>> gas;
117
118 void add_liquid(FeedDescriptor&& fd);
119
120 void add_gas(FeedDescriptor&& fd);
121
122 void add_feed(FeedDescriptor&& fd, Phase phase);
123
124 [[nodiscard]] std::size_t n_liquid_flow() const noexcept;
125 [[nodiscard]] std::size_t n_gas_flow() const noexcept;
126
127 auto
129 {
130 if (liquid)
131 {
132 return std::ranges::subrange(liquid->begin(), liquid->end());
133 }
134 return std::ranges::subrange(std::vector<FeedDescriptor>::iterator(),
135 std::vector<FeedDescriptor>::iterator());
136 }
137
138 auto
140 {
141 if (gas)
142 {
143 return std::ranges::subrange(gas->begin(), gas->end());
144 }
145 return std::ranges::subrange(std::vector<FeedDescriptor>::iterator(),
146 std::vector<FeedDescriptor>::iterator());
147 }
148
149 static SimulationFeed empty() noexcept;
150 };
151
152} // namespace Simulation::Feed
153
154#endif
Definition feed_descriptor.hpp:113
std::size_t n_liquid_flow() const noexcept
Definition feed_descriptor.cpp:142
std::optional< std::vector< FeedDescriptor > > gas
Definition feed_descriptor.hpp:116
std::size_t n_gas_flow() const noexcept
Definition feed_descriptor.cpp:147
static SimulationFeed empty() noexcept
Definition feed_descriptor.cpp:153
auto liquid_feeds()
Definition feed_descriptor.hpp:128
void add_liquid(FeedDescriptor &&fd)
Definition feed_descriptor.cpp:130
void add_feed(FeedDescriptor &&fd, Phase phase)
Definition feed_descriptor.cpp:115
std::optional< std::vector< FeedDescriptor > > liquid
Definition feed_descriptor.hpp:115
void add_gas(FeedDescriptor &&fd)
Definition feed_descriptor.cpp:136
auto gas_feeds()
Definition feed_descriptor.hpp:139
Definition feed_descriptor.hpp:36
std::variant< Constant, Linear, Exponential > FeedTypeVariant
Definition feed_descriptor.hpp:81
FeedType get_type(const FeedTypeVariant &v)
Definition feed_descriptor.cpp:82
Definition feed_descriptor.hpp:39
Definition feed_descriptor.hpp:43
double alpha
Definition feed_descriptor.hpp:45
double f0
Definition feed_descriptor.hpp:44
Definition feed_descriptor.hpp:92
std::size_t input_position
Definition feed_descriptor.hpp:95
FeedTypeVariant extra
Definition feed_descriptor.hpp:97
std::vector< FeedValue > values
Definition feed_descriptor.hpp:94
void update(double t, double d_t) noexcept
Definition feed_descriptor.cpp:91
std::optional< std::size_t > output_position
Definition feed_descriptor.hpp:96
double flow
Definition feed_descriptor.hpp:93
Definition feed_descriptor.hpp:102
static FeedDescriptor constant(double flow, double concentration, std::size_t species_index, std::size_t input_position, std::optional< std::size_t > _ouput_position=std::nullopt, bool set_output=true) noexcept
Definition feed_descriptor.cpp:97
Definition feed_descriptor.hpp:86
double concentration
Definition feed_descriptor.hpp:87
std::size_t species_index
Definition feed_descriptor.hpp:88
Definition feed_descriptor.hpp:49
double f0
Definition feed_descriptor.hpp:50
double df
Definition feed_descriptor.hpp:51
Definition mixture.hpp:10