ryujin 2.1.1 revision 350e54cc11f3d21282bddcf3e6517944dbc508bf
time_integrator.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2022 - 2024 by the ryujin authors
4//
5
6#pragma once
7
8#include <compile_time_options.h>
9
10#include "convenience_macros.h"
11#include "hyperbolic_module.h"
12#include "mpi_ensemble.h"
13#include "offline_data.h"
14#include "parabolic_module.h"
15#include "patterns_conversion.h"
16
17#include <deal.II/base/smartpointer.h>
18
19namespace ryujin
20{
31 none,
32
40
49 };
50
51
57 enum class TimeSteppingScheme {
85
90 erk_11,
91
103 erk_22,
104
117 erk_33,
118
131 erk_43,
132
137 erk_54,
138
144
150
156
161 imex_11,
162
186 imex_22,
187
215 imex_33,
216 };
217} // namespace ryujin
218
219#ifndef DOXYGEN
220DECLARE_ENUM(
224 {ryujin::CFLRecoveryStrategy::cruise_control, "cruise control"}, ));
225
226DECLARE_ENUM(
228 LIST({ryujin::TimeSteppingScheme::ssprk_22, "ssprk 22"},
241#endif
242
243namespace ryujin
244{
251 template <typename Description, int dim, typename Number = double>
252 class TimeIntegrator final : public dealii::ParameterAcceptor
253 {
254 public:
259
261
262 using View =
263 typename Description::template HyperbolicSystemView<dim, Number>;
264
266
268
270
274
279 const MPIEnsemble &mpi_ensemble,
280 const OfflineData<dim, Number> &offline_data,
281 const HyperbolicModule<Description, dim, Number> &hyperbolic_module,
282 const ParabolicModule<Description, dim, Number> &parabolic_module,
283 const std::string &subsection = "/TimeIntegrator");
284
290 void prepare();
291
293
297
307 void prepare_state_vector(StateVector &state_vector, Number t) const;
308
326 Number step(StateVector &state_vector,
327 Number t,
328 Number t_final = std::numeric_limits<Number>::max());
329
334
342
343 protected:
351 Number step_ssprk_22(StateVector &state_vector, Number t, Number tau_max);
352
360 Number step_ssprk_33(StateVector &state_vector, Number t, Number tau_max);
361
368 Number step_erk_11(StateVector &state_vector, Number t, Number tau_max);
369
376 Number step_erk_22(StateVector &state_vector, Number t, Number tau_max);
377
384 Number step_erk_33(StateVector &state_vector, Number t, Number tau_max);
385
393 Number step_erk_43(StateVector &state_vector, Number t, Number tau_max);
394
402 Number step_erk_54(StateVector &state_vector, Number t, Number tau_max);
403
412 Number step_strang_ssprk_33_cn(StateVector &state_vector,
413 Number t,
414 Number tau_max);
415
424 Number
425 step_strang_erk_33_cn(StateVector &state_vector, Number t, Number tau_max);
426
435 Number
436 step_strang_erk_43_cn(StateVector &state_vector, Number t, Number tau_max);
437
442 Number step_imex_11(StateVector &state_vector, Number t, Number tau_max);
443
450 Number step_imex_22(StateVector &state_vector, Number t, Number tau_max);
451
458 Number step_imex_33(StateVector &state_vector, Number t, Number tau_max);
459
460 private:
462
466
467 Number cfl_min_;
468 Number cfl_max_;
469
470 CFLRecoveryStrategy cfl_recovery_strategy_;
471
472 Number acceptable_tau_max_ratio_;
473
474 TimeSteppingScheme time_stepping_scheme_;
475 Number efficiency_;
476
478
480
484
485 const MPIEnsemble &mpi_ensemble_;
486
487 dealii::SmartPointer<const OfflineData<dim, Number>> offline_data_;
488 dealii::SmartPointer<const HyperbolicModule<Description, dim, Number>>
489 hyperbolic_module_;
490 dealii::SmartPointer<const ParabolicModule<Description, dim, Number>>
491 parabolic_module_;
492
493 std::vector<StateVector> temp_;
494
496 };
497
498} /* namespace ryujin */
Number step_imex_33(StateVector &state_vector, Number t, Number tau_max)
TimeIntegrator(const MPIEnsemble &mpi_ensemble, const OfflineData< dim, Number > &offline_data, const HyperbolicModule< Description, dim, Number > &hyperbolic_module, const ParabolicModule< Description, dim, Number > &parabolic_module, const std::string &subsection="/TimeIntegrator")
Number step_strang_ssprk_33_cn(StateVector &state_vector, Number t, Number tau_max)
Number step_erk_22(StateVector &state_vector, Number t, Number tau_max)
Number step_imex_11(StateVector &state_vector, Number t, Number tau_max)
Number step_strang_erk_43_cn(StateVector &state_vector, Number t, Number tau_max)
const auto & time_stepping_scheme() const
Number step_erk_54(StateVector &state_vector, Number t, Number tau_max)
Number step_erk_33(StateVector &state_vector, Number t, Number tau_max)
typename Description::HyperbolicSystem HyperbolicSystem
Number step_erk_43(StateVector &state_vector, Number t, Number tau_max)
Number step_imex_22(StateVector &state_vector, Number t, Number tau_max)
typename View::StateVector StateVector
typename Description::ParabolicSystem ParabolicSystem
Number step_erk_11(StateVector &state_vector, Number t, Number tau_max)
Number step_ssprk_22(StateVector &state_vector, Number t, Number tau_max)
Number step_ssprk_33(StateVector &state_vector, Number t, Number tau_max)
typename Description::template HyperbolicSystemView< dim, Number > View
const auto & efficiency() const
void prepare_state_vector(StateVector &state_vector, Number t) const
Number step(StateVector &state_vector, Number t, Number t_final=std::numeric_limits< Number >::max())
Number step_strang_erk_33_cn(StateVector &state_vector, Number t, Number tau_max)
#define ACCESSOR_READ_ONLY(member)
std::tuple< MultiComponentVector< Number, problem_dim >, MultiComponentVector< Number, prec_dim >, BlockVector< Number > > StateVector
Definition: state_vector.h:51
Euler::HyperbolicSystem HyperbolicSystem
Definition: description.h:32
ryujin::StubParabolicSystem ParabolicSystem
Definition: description.h:37