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