21 #ifndef FUB_OTPUT_OUTPUT_AT_FREQ_AND_INTERV_HPP
22 #define FUB_OTPUT_OUTPUT_AT_FREQ_AND_INTERV_HPP
27 #include <pybind11/stl.h>
31 template <
typename Gr
iddingAlgorithm>
38 const std::map<std::string, pybind11::object>& options) {
40 std::vector<double> intervals =
41 GetOptionOr(options,
"intervals", std::vector<double>{});
42 std::transform(intervals.begin(), intervals.end(),
44 [](
double dur) { return Duration(dur); });
50 std::vector<std::ptrdiff_t> frequencies,
51 std::vector<fub::Duration> intervals,
57 Duration next_output_time(std::numeric_limits<double>::max());
58 for (std::size_t i = 0; i <
intervals_.size(); ++i) {
61 std::fmod(time_point.count(),
intervals_[i].count()));
63 next_output_time = std::min(next_output_time, time_point + dt);
66 return next_output_time;
70 const std::ptrdiff_t cycle = grid.GetCycles();
73 [cycle](std::ptrdiff_t freq) { return cycle % freq == 0; })) {
76 const Duration time_point = grid.GetTimePoint();
81 std::fmod(time_point.count(), freq.count())) <
82 2 * smallest_time_step_size_.count();
89 template <
typename Log>
91 BOOST_LOG(log) << fmt::format(
" - frequencies = {{{}}} [-]", fmt::join(
frequencies_,
", "));
92 std::vector<double> interval_counts(
intervals_.size());
96 BOOST_LOG(log) << fmt::format(
" - intervals = {{{}}} [s]", fmt::join(interval_counts,
", "));
Definition: OutputAtFrequencyOrInterval.hpp:32
std::vector< std::ptrdiff_t > frequencies_
Definition: OutputAtFrequencyOrInterval.hpp:101
OutputAtFrequencyOrInterval()=default
Duration NextOutputTime(Duration time_point) override
Returns the time point at which the simulation shall stop to do some output.
Definition: OutputAtFrequencyOrInterval.hpp:56
OutputAtFrequencyOrInterval(std::vector< std::ptrdiff_t > frequencies, std::vector< fub::Duration > intervals, Duration smallest_time_step_size=Duration(1e-12))
Definition: OutputAtFrequencyOrInterval.hpp:49
OutputAtFrequencyOrInterval(const std::map< std::string, pybind11::object > &options)
Initialize this module by a program options map.
Definition: OutputAtFrequencyOrInterval.hpp:37
void Print(Log &log)
Definition: OutputAtFrequencyOrInterval.hpp:90
Duration smallest_time_step_size_
Definition: OutputAtFrequencyOrInterval.hpp:103
bool ShallOutputNow(const GriddingAlgorithm &grid) override
Returns true if this output class shall be invoked at the specified time point.
Definition: OutputAtFrequencyOrInterval.hpp:69
std::vector< fub::Duration > intervals_
Definition: OutputAtFrequencyOrInterval.hpp:102
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
void Log(std::string message, Duration timepoint, boost::log::trivial::severity_level level=boost::log::trivial::severity_level::info)
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
This is a abstract base class for an output strategy.
Definition: BasicOutput.hpp:33