ryujin 2.1.1 revision 46bf70e400e423a8ffffe8300887eeb35b8dfb2c
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 "observer_pointer.h"
14#include "offline_data.h"
15#include "parabolic_module.h"
16#include "patterns_conversion.h"
17
18#include <numbers>
19
20namespace ryujin
21{
32 none,
33
41
50 };
51
52
58 enum class TimeSteppingScheme {
86
91 erk_11,
92
104 erk_22,
105
118 erk_33,
119
132 erk_43,
133
138 erk_54,
139
145
151
157
162 imex_11,
163
187 imex_22,
188
216 imex_33,
217 };
218} // namespace ryujin
219
220#ifndef DOXYGEN
221DECLARE_ENUM(
225 {ryujin::CFLRecoveryStrategy::cruise_control, "cruise control"}, ));
226
227DECLARE_ENUM(
229 LIST({ryujin::TimeSteppingScheme::ssprk_22, "ssprk 22"},
242#endif
243
244namespace ryujin
245{
252 template <typename Description, int dim, typename Number = double>
253 class TimeIntegrator final : public dealii::ParameterAcceptor
254 {
255 public:
260
262
263 using View =
264 typename Description::template HyperbolicSystemView<dim, Number>;
265
267
269
271
275
280 const MPIEnsemble &mpi_ensemble,
281 const OfflineData<dim, Number> &offline_data,
282 const HyperbolicModule<Description, dim, Number> &hyperbolic_module,
283 const ParabolicModule<Description, dim, Number> &parabolic_module,
284 const std::string &subsection = "/TimeIntegrator");
285
291 void prepare();
292
294
298
308 void prepare_state_vector(StateVector &state_vector, Number t) const;
309
327 Number step(StateVector &state_vector,
328 Number t,
329 Number t_final = std::numeric_limits<Number>::max());
330
335
343
344 protected:
352 Number step_ssprk_22(StateVector &state_vector, Number t, Number tau_max);
353
361 Number step_ssprk_33(StateVector &state_vector, Number t, Number tau_max);
362
369 Number step_erk_11(StateVector &state_vector, Number t, Number tau_max);
370
377 Number step_erk_22(StateVector &state_vector, Number t, Number tau_max);
378
385 Number step_erk_33(StateVector &state_vector, Number t, Number tau_max);
386
394 Number step_erk_43(StateVector &state_vector, Number t, Number tau_max);
395
403 Number step_erk_54(StateVector &state_vector, Number t, Number tau_max);
404
413 Number step_strang_ssprk_33_cn(StateVector &state_vector,
414 Number t,
415 Number tau_max);
416
425 Number
426 step_strang_erk_33_cn(StateVector &state_vector, Number t, Number tau_max);
427
436 Number
437 step_strang_erk_43_cn(StateVector &state_vector, Number t, Number tau_max);
438
443 Number step_imex_11(StateVector &state_vector, Number t, Number tau_max);
444
451 Number step_imex_22(StateVector &state_vector, Number t, Number tau_max);
452
459 Number step_imex_33(StateVector &state_vector, Number t, Number tau_max);
460
461 private:
463
467
468 Number cfl_min_;
469 Number cfl_max_;
470
471 CFLRecoveryStrategy cfl_recovery_strategy_;
472
473 Number acceptable_tau_max_ratio_;
474 Number tau_max_;
475
476 TimeSteppingScheme time_stepping_scheme_;
477 Number efficiency_;
478
480
482
486
487 const MPIEnsemble &mpi_ensemble_;
488
489 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
490 dealii::ObserverPointer<const HyperbolicModule<Description, dim, Number>>
491 hyperbolic_module_;
492 dealii::ObserverPointer<const ParabolicModule<Description, dim, Number>>
493 parabolic_module_;
494
495 std::vector<StateVector> temp_;
496
498 };
499
500} /* 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:53
Euler::HyperbolicSystem HyperbolicSystem
Definition: description.h:34
ryujin::StubParabolicSystem ParabolicSystem
Definition: description.h:39