21 #ifndef FUB_OUTPUT_MULTIPLE_OUTPUTS_HPP
22 #define FUB_OUTPUT_MULTIPLE_OUTPUTS_HPP
27 #include <pybind11/stl.h>
44 std::vector<int> frequencies =
45 GetOptionOr(opts,
"frequencies", std::vector<int>{});
46 std::vector<double> intervals =
47 GetOptionOr(opts,
"intervals", std::vector<double>{});
48 std::vector<pybind11::dict> outputs{};
50 for (
const pybind11::dict& output : outputs) {
51 auto opts =
ToMap(output);
52 if (
auto type = opts.find(
"type"); type != opts.end()) {
53 using namespace std::literals;
54 const std::string type_name = type->second.cast<std::string>();
55 opts.emplace(std::pair{
"frequencies", pybind11::cast(frequencies)});
56 opts.emplace(std::pair{
"intervals", pybind11::cast(intervals)});
62 template <
typename T>
void AddOutput(std::unique_ptr<T>&& output) {
63 outputs_.emplace_back(output.release());
69 return std::accumulate(
71 Duration(std::numeric_limits<double>::max()),
74 return output ? std::min(min, output->NextOutputTime(time_point))
83 [&grid](
const auto& output) {
84 return output && output->ShallOutputNow(grid);
90 for (
const auto& output :
outputs_) {
91 if (output && output->ShallOutputNow(grid)) {
99 std::vector<std::unique_ptr<BasicOutput<Grid>>>
outputs_{};
Definition: MultipleOutputs.hpp:36
void operator()(const Grid &grid) override
Invoke the actual output logic.
Definition: MultipleOutputs.hpp:89
MultipleOutputs()=default
std::vector< std::unique_ptr< BasicOutput< Grid > > > outputs_
Definition: MultipleOutputs.hpp:99
MultipleOutputs(OutputFactory< Grid > factory, const ProgramOptions &opts)
Definition: MultipleOutputs.hpp:42
Duration NextOutputTime(Duration time_point) override
Returns the time point at which the simulation shall stop to do some output.
Definition: MultipleOutputs.hpp:68
OutputFactory< Grid > factory_
Definition: MultipleOutputs.hpp:98
void AddOutput(std::unique_ptr< T > &&output)
Definition: MultipleOutputs.hpp:62
bool ShallOutputNow(const Grid &grid) override
Returns true if this output class shall be invoked at the specified time point.
Definition: MultipleOutputs.hpp:81
std::map< std::string, pybind11::object > ProgramOptions
Definition: MultipleOutputs.hpp:38
Definition: OutputFactory.hpp:33
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
T GetOptionOr(const ProgramOptions &map, const std::string &name, const T &value)
Definition: ProgramOptions.hpp:48
ProgramOptions ToMap(const pybind11::dict &dict)
This is a abstract base class for an output strategy.
Definition: BasicOutput.hpp:33