21 #ifndef FUB_NO_SUBCYCLE_SOLVER_HPP
22 #define FUB_NO_SUBCYCLE_SOLVER_HPP
36 template <
typename LevelIntegrator>
43 :
Base(std::move(integrator)) {}
57 template <
typename LevelIntegrator>
59 Duration min_dt(std::numeric_limits<double>::max());
60 for (
int level_num = 0; Base::LevelExists(level_num); ++level_num) {
61 min_dt = std::min(min_dt, Base::ComputeStableDt(level_num));
63 MPI_Comm comm = Base::GetMpiCommunicator();
68 template <
typename LevelIntegrator>
71 return AdvanceLevel(0, time_step_size);
74 template <
typename LevelIntegrator>
79 const int next_level = level + 1;
80 if (Base::LevelExists(next_level)) {
81 Base::ResetCoarseFineFluxes(next_level, level);
83 AdvanceLevel(next_level, time_step_size);
89 Base::AdvanceLevelNonRecursively(level, time_step_size, {0, 1});
93 if (Base::LevelExists(next_level)) {
94 Base::ApplyFluxCorrection(next_level, level, time_step_size);
95 Base::CoarsenConservatively(next_level, level);
98 Base::CopyScratchToData(level);
This is a solver class which does a AMR integration scheme without subcycling on finer levels.
Definition: NoSubcycleSolver.hpp:37
Duration ComputeStableDt()
Definition: NoSubcycleSolver.hpp:58
NoSubcycleSolver(const LevelIntegrator &integrator)
Definition: NoSubcycleSolver.hpp:45
NoSubcycleSolver(LevelIntegrator &&integrator)
Definition: NoSubcycleSolver.hpp:42
Result< void, TimeStepTooLarge > AdvanceHierarchy(Duration time_step_size)
Definition: NoSubcycleSolver.hpp:70
Result< void, TimeStepTooLarge > AdvanceLevel(int level, Duration time_step_size)
Definition: NoSubcycleSolver.hpp:76
Definition: SolverFacade.hpp:29
void CompleteFromCons(Equation &&equation, Complete< std::decay_t< Equation >> &complete, const Conservative< std::decay_t< Equation >> &cons)
Definition: CompleteFromCons.hpp:42
The fub namespace.
Definition: AnyBoundaryCondition.hpp:31
Duration MinAll(MPI_Comm comm, Duration local_duration)
std::chrono::duration< double > Duration
Definition: Duration.hpp:31
boost::outcome_v2::result< T, E > Result
Definition: outcome.hpp:32