21 #ifndef FUB_SAMRAI_RUN_SIMULATION_HPP
22 #define FUB_SAMRAI_RUN_SIMULATION_HPP
29 #include "fub/counter/CounterRegistry.hpp"
30 #include "fub/counter/Timer.hpp"
34 #include <boost/log/common.hpp>
35 #include <boost/log/sources/severity_logger.hpp>
36 #include <boost/log/trivial.hpp>
37 #include <boost/outcome.hpp>
39 #include <fmt/format.h>
51 template <
typename Logger>
void Print(Logger& log) {
52 BOOST_LOG(log) <<
" - final_time = " <<
final_time.count() <<
" [s]";
53 BOOST_LOG(log) <<
" - max_cycles = " <<
max_cycles <<
" [-]";
54 BOOST_LOG(log) <<
" - smallest_time_step_size = "
56 BOOST_LOG(log) <<
" - cfl = " <<
cfl <<
" [-]";
57 BOOST_LOG(log) <<
" - do_backup = " <<
do_backup <<
" [-]";
69 std::chrono::duration<double> time_point,
70 std::chrono::duration<double> time_step_size,
71 std::chrono::duration<double> final_time,
72 std::chrono::steady_clock::duration wall_time,
73 std::chrono::steady_clock::duration wall_time_difference);
75 template <
typename DestGr
id,
typename SrcGr
id>
77 const std::shared_ptr<SrcGrid>& src,
78 CounterRegistry& counter_database) {
79 Timer counter = counter_database.get_timer(
"RunSimulation::MakeBackup");
80 dest = std::make_shared<DestGrid>(*src);
83 template <
typename Solver,
84 typename Grid = std::decay_t<
85 decltype(*std::declval<Solver&>().GetGriddingAlgorithm())>>
87 std::chrono::steady_clock::time_point wall_time_reference,
89 namespace logger = boost::log;
90 using namespace logger::trivial;
91 logger::sources::severity_logger<severity_level> log(
92 logger::keywords::severity = info);
95 std::chrono::steady_clock::time_point now = std::chrono::steady_clock::now();
96 std::chrono::steady_clock::duration wall_time = wall_time_reference - now;
98 std::decay_t<decltype(*std::declval<Solver&>().GetGriddingAlgorithm())>;
100 std::shared_ptr<GriddingAlgorithm> backup{};
102 MakeBackup(backup, solver.GetGriddingAlgorithm(),
103 *solver.GetCounterRegistry());
105 std::optional<Duration> failure_dt{};
106 while (time_point + eps < options.
final_time &&
111 solver.PreAdvanceHierarchy();
115 failure_dt ? *failure_dt : solver.ComputeStableDt();
119 next_output_time - time_point, options.
cfl * stable_dt});
122 boost::outcome_v2::result<void, TimeStepTooLarge> result =
123 solver.AdvanceHierarchy(limited_dt);
125 if (result.has_error() && options.
do_backup) {
128 failure_dt = result.error().dt;
129 BOOST_LOG_SCOPED_LOGGER_TAG(log,
"Time", time_point.count());
130 BOOST_LOG_SEV(log, warning) << fmt::format(
131 "Pre-estimated coarse time step size (dt_old = {}s) "
132 "was too large.\nRestarting this time step with a "
133 "smaller coarse time step size (dt_new = {}s).\n",
134 limited_dt.count(), options.
cfl * failure_dt->count());
135 solver.ResetHierarchyConfiguration(backup);
136 MakeBackup(backup, backup, *solver.GetCounterRegistry());
137 }
else if (result.has_error() && !options.
do_backup) {
138 BOOST_LOG_SCOPED_LOGGER_TAG(log,
"Time", time_point.count());
139 BOOST_LOG_SEV(log, error) << fmt::format(
140 "Pre-estimated coarse time step size (dt_old = {}s) was too large "
141 "but no backup present. Aborting.",
145 solver.PostAdvanceHierarchy(limited_dt);
148 now = std::chrono::steady_clock::now();
149 time_point = solver.GetTimePoint();
150 std::chrono::steady_clock::duration wall_time_difference =
151 (now - wall_time_reference) - wall_time;
152 wall_time = now - wall_time_reference;
153 const std::ptrdiff_t cycle = solver.GetCycles();
154 BOOST_LOG_SCOPED_LOGGER_TAG(log,
"Time", time_point.count());
157 wall_time_difference);
160 MakeBackup(backup, solver.GetGriddingAlgorithm(),
161 *solver.GetCounterRegistry());
168 output(*solver.GetGriddingAlgorithm());
#define FUB_ASSERT(x)
Definition: assert.hpp:39
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
std::string FormatTimeStepLine(std::ptrdiff_t cycle, std::chrono::duration< double > time_point, std::chrono::duration< double > time_step_size, std::chrono::duration< double > final_time, std::chrono::steady_clock::duration wall_time, std::chrono::steady_clock::duration wall_time_difference)
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
void RunSimulation(Solver &solver, RunOptions options, std::chrono::steady_clock::time_point wall_time_reference, BasicOutput< Grid > &output)
Definition: RunSimulation.hpp:86
void MakeBackup(std::shared_ptr< DestGrid > &dest, const std::shared_ptr< SrcGrid > &src, CounterRegistry &counter_database)
Definition: RunSimulation.hpp:76
std::map< std::string, pybind11::object > ProgramOptions
Definition: ProgramOptions.hpp:40
virtual bool ShallOutputNow(const GriddingAlgorithm &grid)=0
Returns true if this output class shall be invoked at the specified time point.
virtual Duration NextOutputTime(Duration time_point)=0
Returns the time point at which the simulation shall stop to do some output.
Definition: RunSimulation.hpp:46
double cfl
Definition: RunSimulation.hpp:63
std::ptrdiff_t max_cycles
Definition: RunSimulation.hpp:61
int do_backup
Definition: RunSimulation.hpp:64
RunOptions(const ProgramOptions &vm)
void Print(Logger &log)
Definition: RunSimulation.hpp:51
Duration smallest_time_step_size
Definition: RunSimulation.hpp:62
Duration final_time
Definition: RunSimulation.hpp:60