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 DelayedConstant,
21 Step,
22 Pulse,
23 Custom
24};
25
26template <typename T>
27constexpr decltype(auto)
28move_allow_trivial(T&& t) noexcept
29{
30 return std::move(t); // NOLINT
31}
32
34{
35
36 struct Constant
37 {
38 };
39
41 {
42 double t_init;
43 double t_end;
45 };
46
47 struct Step
48 {
49 double t_init = 0.;
50 };
51
52 struct Pulse
53 {
54 double t_init;
55 double t_end;
56 double frequency;
58 };
59
60 struct Custom
61 {
62 };
63
65 = std::variant<Constant, Step, Pulse, Custom, DelayedConstant>;
66
67 FeedType get_type(const FeedTypeVariant& v);
69 struct FeedValue
70 {
72 std::size_t species_index;
73 };
75 struct FeedDescriptor
76 {
77 double flow{};
78 std::vector<FeedValue> values;
79 std::size_t input_position{};
80 std::optional<std::size_t> output_position;
82 void update(double t, double d_t) noexcept;
83 };
85 struct FeedFactory
86 {
87 static FeedDescriptor constant(double flow,
88 double concentration,
89 std::size_t species_index,
90 std::size_t input_position,
91 std::optional<std::size_t> _ouput_position
92 = std::nullopt,
93 bool set_output = true);
94
95 // static FeedDescriptor delayedconstant(double _f,
96 // feed_value_t&& _target,
97 // feed_position_t&& _position,
98 // feed_species_t _species,
99 // double t_init,
100 // double t_end,
101 // bool set_output = true);
102
103 // static FeedDescriptor pulse(double _f,
104 // feed_value_t&& _target,
105 // feed_position_t&& _position,
106 // feed_species_t _species,
107 // double t_init,
108 // double t_end,
109 // double frequency,
110 // bool set_output = true);
111 };
113 class SimulationFeed
114 {
115 public:
116 std::optional<std::vector<FeedDescriptor>> liquid;
117 std::optional<std::vector<FeedDescriptor>> gas;
118
119 void add_liquid(FeedDescriptor&& fd);
120
121 void add_gas(FeedDescriptor&& fd);
122
123 void add_feed(FeedDescriptor&& fd, Phase phase);
124
125 [[nodiscard]] std::size_t n_liquid_flow() const;
126 [[nodiscard]] std::size_t n_gas_flow() const;
127
128 auto
130 {
131 if (liquid)
132 {
133 return std::ranges::subrange(liquid->begin(), liquid->end());
134 }
135 return std::ranges::subrange(std::vector<FeedDescriptor>::iterator(),
136 std::vector<FeedDescriptor>::iterator());
137 }
138
139 auto
140 gas_feeds()
141 {
142 if (gas)
143 {
144 return std::ranges::subrange(gas->begin(), gas->end());
145 }
146 return std::ranges::subrange(std::vector<FeedDescriptor>::iterator(),
147 std::vector<FeedDescriptor>::iterator());
148 }
149
151 empty()
152 {
153 return { .liquid = std::nullopt, .gas = std::nullopt };
154 }
155 };
156
157} // namespace Simulation::Feed
158
159#endif
Definition feed_descriptor.hpp:113
std::size_t n_gas_flow() const
Definition feed_descriptor.cpp:205
std::optional< std::vector< FeedDescriptor > > gas
Definition feed_descriptor.hpp:116
auto liquid_feeds()
Definition feed_descriptor.hpp:128
static SimulationFeed empty()
Definition feed_descriptor.hpp:150
void add_liquid(FeedDescriptor &&fd)
Definition feed_descriptor.cpp:188
void add_feed(FeedDescriptor &&fd, Phase phase)
Definition feed_descriptor.cpp:175
std::size_t n_liquid_flow() const
Definition feed_descriptor.cpp:200
std::optional< std::vector< FeedDescriptor > > liquid
Definition feed_descriptor.hpp:115
void add_gas(FeedDescriptor &&fd)
Definition feed_descriptor.cpp:194
auto gas_feeds()
Definition feed_descriptor.hpp:139
Definition feed_descriptor.hpp:34
std::variant< Constant, Step, Pulse, Custom, DelayedConstant > FeedTypeVariant
Definition feed_descriptor.hpp:64
FeedType get_type(const FeedTypeVariant &v)
Definition feed_descriptor.cpp:12
Definition feed_descriptor.hpp:37
Definition feed_descriptor.hpp:61
Definition feed_descriptor.hpp:41
double t_end
Definition feed_descriptor.hpp:43
double stored_value
Definition feed_descriptor.hpp:44
double t_init
Definition feed_descriptor.hpp:42
Definition feed_descriptor.hpp:75
std::size_t input_position
Definition feed_descriptor.hpp:78
FeedTypeVariant extra
Definition feed_descriptor.hpp:80
std::vector< FeedValue > values
Definition feed_descriptor.hpp:77
void update(double t, double d_t) noexcept
Definition feed_descriptor.cpp:42
std::optional< std::size_t > output_position
Definition feed_descriptor.hpp:79
double flow
Definition feed_descriptor.hpp:76
Definition feed_descriptor.hpp:85
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)
Definition feed_descriptor.cpp:123
Definition feed_descriptor.hpp:69
double concentration
Definition feed_descriptor.hpp:70
std::size_t species_index
Definition feed_descriptor.hpp:71
Definition feed_descriptor.hpp:53
double t_init
Definition feed_descriptor.hpp:54
double frequency
Definition feed_descriptor.hpp:56
double stored_value
Definition feed_descriptor.hpp:57
double t_end
Definition feed_descriptor.hpp:55
Definition feed_descriptor.hpp:48
double t_init
Definition feed_descriptor.hpp:49
Definition mixture.hpp:10