ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
Loading...
Searching...
No Matches
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 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
18
19#include <numbers>
20
21namespace ryujin
22{
33 none,
34
42
51 };
52
53
59 enum class TimeSteppingScheme {
87
92 erk_11,
93
105 erk_22,
106
119 erk_33,
120
133 erk_43,
134
139 erk_54,
140
146
152
158
163 imex_11,
164
190 imex_22,
191
221 imex_33,
222 };
223} // namespace ryujin
224
225#ifndef DOXYGEN
226DECLARE_ENUM(
230 {ryujin::CFLRecoveryStrategy::cruise_control, "cruise control"}, ));
231
232DECLARE_ENUM(
234 LIST({ryujin::TimeSteppingScheme::ssprk_22, "ssprk 22"},
247#endif
248
249namespace ryujin
250{
257 template <int dim, typename Number = double>
258 class TimeIntegrator final : public Interface::TimeIntegrator<dim, Number>
259 {
260 public:
265
270 const MPIEnsemble &mpi_ensemble,
271 const Interface::HyperbolicSystem &hyperbolic_system,
272 const Interface::ParabolicSystem &parabolic_system,
273 const Interface::HyperbolicModule<dim, Number> &hyperbolic_module,
274 const Interface::ParabolicModule<dim, Number> &parabolic_module,
275 const std::string &subsection = "/TimeIntegrator");
276
282 void prepare() override;
283
285
289
300 Number t) const override;
301
319 Number step(StateVector<Number> &state_vector,
320 Number t,
321 Number t_final = std::numeric_limits<Number>::max()) override;
322
324
328
332 ACCESSOR_READ_ONLY(time_stepping_scheme)
333
334 private:
336
340
341 Number cfl_min_;
342 Number cfl_max_;
343
344 CFLRecoveryStrategy cfl_recovery_strategy_;
345
346 Number acceptable_tau_max_ratio_;
347 Number tau_max_;
348
349 TimeSteppingScheme time_stepping_scheme_;
350
352
356
357 const MPIEnsemble &mpi_ensemble_;
358
359 dealii::ObserverPointer<const Interface::HyperbolicSystem>
360 hyperbolic_system_;
361 dealii::ObserverPointer<const Interface::ParabolicSystem> parabolic_system_;
362 dealii::ObserverPointer<const Interface::HyperbolicModule<dim, Number>>
363 hyperbolic_module_;
364 dealii::ObserverPointer<const Interface::ParabolicModule<dim, Number>>
365 parabolic_module_;
366
367 std::vector<StateVector<Number>> temp_;
368
370
374
382 Number
383 step_ssprk_22(StateVector<Number> &state_vector, Number t, Number tau_max);
384
392 Number
393 step_ssprk_33(StateVector<Number> &state_vector, Number t, Number tau_max);
394
401 Number
402 step_erk_11(StateVector<Number> &state_vector, Number t, Number tau_max);
403
410 Number
411 step_erk_22(StateVector<Number> &state_vector, Number t, Number tau_max);
412
419 Number
420 step_erk_33(StateVector<Number> &state_vector, Number t, Number tau_max);
421
429 Number
430 step_erk_43(StateVector<Number> &state_vector, Number t, Number tau_max);
431
439 Number
440 step_erk_54(StateVector<Number> &state_vector, Number t, Number tau_max);
441
450 Number step_strang_ssprk_33_cn(StateVector<Number> &state_vector,
451 Number t,
452 Number tau_max);
453
462 Number step_strang_erk_33_cn(StateVector<Number> &state_vector,
463 Number t,
464 Number tau_max);
465
474 Number step_strang_erk_43_cn(StateVector<Number> &state_vector,
475 Number t,
476 Number tau_max);
477
485 Number
486 step_imex_11(StateVector<Number> &state_vector, Number t, Number tau_max);
487
494 Number
495 step_imex_22(StateVector<Number> &state_vector, Number t, Number tau_max);
496
503 Number
504 step_imex_33(StateVector<Number> &state_vector, Number t, Number tau_max);
505
507 };
508
509} // namespace ryujin
TimeIntegrator(const MPIEnsemble &mpi_ensemble, const Interface::HyperbolicSystem &hyperbolic_system, const Interface::ParabolicSystem &parabolic_system, const Interface::HyperbolicModule< dim, Number > &hyperbolic_module, const Interface::ParabolicModule< dim, Number > &parabolic_module, const std::string &subsection="/TimeIntegrator")
void prepare_state_vector(StateVector< Number > &state_vector, Number t) const override
Number step(StateVector< Number > &state_vector, Number t, Number t_final=std::numeric_limits< Number >::max()) override
void prepare() override
#define ACCESSOR_READ_ONLY(member)