ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
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>
19
20#include <deal.II/base/parameter_acceptor.h>
21
22#include <limits>
23#include <numbers>
24#include <string>
25#include <vector>
26
27namespace ryujin
28{
39 none,
40
48
57 };
58
59
65 enum class TimeSteppingScheme {
93
98 erk_11,
99
111 erk_22,
112
125 erk_33,
126
139 erk_43,
140
145 erk_54,
146
152
158
164
169 imex_11,
170
196 imex_22,
197
227 imex_33,
228 };
229} // namespace ryujin
230
231#ifndef DOXYGEN
232DECLARE_ENUM(
236 {ryujin::CFLRecoveryStrategy::cruise_control, "cruise control"}, ));
237
238DECLARE_ENUM(
240 LIST({ryujin::TimeSteppingScheme::ssprk_22, "ssprk 22"},
253#endif
254
255namespace ryujin
256{
264 template <int dim, typename Number = double>
265 class TimeIntegrator final : public Interface::TimeIntegrator<dim, Number>
266 {
267 public:
272
277 const MPIEnsemble &mpi_ensemble,
278 const Interface::HyperbolicSystem &hyperbolic_system,
279 const Interface::ParabolicSystem &parabolic_system,
280 const Interface::HyperbolicModule<dim, Number> &hyperbolic_module,
281 const Interface::ParabolicModule<dim, Number> &parabolic_module,
282 const std::string &subsection = "/TimeIntegrator");
283
289 void prepare() override;
290
292
296
307 Number t) const override;
308
330 Number step(StateVector<Number> &state_vector,
331 Number t,
332 Number tau,
333 Number tau_max = std::numeric_limits<Number>::max()) override;
334
336
340
344 ACCESSOR_READ_ONLY(time_stepping_scheme)
345
346 private:
348
352
353 Number cfl_min_;
354 Number cfl_max_;
355
356 CFLRecoveryStrategy cfl_recovery_strategy_;
357
358 Number acceptable_tau_max_ratio_;
359 Number tau_max_;
360
361 TimeSteppingScheme time_stepping_scheme_;
362
364
368
369 const MPIEnsemble &mpi_ensemble_;
370
371 dealii::ObserverPointer<const Interface::HyperbolicSystem>
372 hyperbolic_system_;
373 dealii::ObserverPointer<const Interface::ParabolicSystem> parabolic_system_;
374 dealii::ObserverPointer<const Interface::HyperbolicModule<dim, Number>>
375 hyperbolic_module_;
376 dealii::ObserverPointer<const Interface::ParabolicModule<dim, Number>>
377 parabolic_module_;
378
379 std::vector<StateVector<Number>> temp_;
380
382
386
393 Number step_ssprk_22(StateVector<Number> &state_vector,
394 Number t,
395 Number tau,
396 Number tau_max);
397
404 Number step_ssprk_33(StateVector<Number> &state_vector,
405 Number t,
406 Number tau,
407 Number tau_max);
408
414 Number step_erk_11(StateVector<Number> &state_vector,
415 Number t,
416 Number tau,
417 Number tau_max);
418
424 Number step_erk_22(StateVector<Number> &state_vector,
425 Number t,
426 Number tau,
427 Number tau_max);
428
434 Number step_erk_33(StateVector<Number> &state_vector,
435 Number t,
436 Number tau,
437 Number tau_max);
438
445 Number step_erk_43(StateVector<Number> &state_vector,
446 Number t,
447 Number tau,
448 Number tau_max);
449
456 Number step_erk_54(StateVector<Number> &state_vector,
457 Number t,
458 Number tau,
459 Number tau_max);
460
468 Number step_strang_ssprk_33_cn(StateVector<Number> &state_vector,
469 Number t,
470 Number tau,
471 Number tau_max);
472
480 Number step_strang_erk_33_cn(StateVector<Number> &state_vector,
481 Number t,
482 Number tau,
483 Number tau_max);
484
492 Number step_strang_erk_43_cn(StateVector<Number> &state_vector,
493 Number t,
494 Number tau,
495 Number tau_max);
496
504 Number step_imex_11(StateVector<Number> &state_vector,
505 Number t,
506 Number tau,
507 Number tau_max);
508
515 Number step_imex_22(StateVector<Number> &state_vector,
516 Number t,
517 Number tau,
518 Number tau_max);
519
527 Number step_imex_33(StateVector<Number> &state_vector,
528 Number t,
529 Number tau,
530 Number tau_max);
531
533 };
534
535} // 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 tau, Number tau_max=std::numeric_limits< Number >::max()) override
void prepare() override
#define ACCESSOR_READ_ONLY(member)