ryujin 2.5.0 revision 3a6c8d57210175dea14d8116e1fe878f349f8c1c
Loading...
Searching...
No Matches
hyperbolic_module.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2020 - 2026 by the ryujin authors
4//
5
6#pragma once
7
8#include <ryujin/base/compile_time_options.h>
17
18#include <deal.II/base/parameter_acceptor.h>
19#include <deal.II/lac/sparse_matrix.templates.h>
20#include <deal.II/lac/vector.h>
21
22#include <limits>
23#include <ostream>
24#include <utility>
25
26namespace ryujin
27{
36 template <typename HyperbolicDescription, int dim, typename Number = double>
37 class HyperbolicModule final : public Interface::HyperbolicModule<dim, Number>
38 {
39 public:
44
46 typename Interface::HyperbolicModule<dim, Number>::StageVectors;
47
49 typename Interface::HyperbolicModule<dim, Number>::StageWeights;
50
51 using HyperbolicSystem = typename HyperbolicDescription::HyperbolicSystem;
52
53 using View = typename HyperbolicSystem::template View<dim, Number>;
54
55 using Indicator =
56 typename HyperbolicDescription::template Indicator<Number>;
57
58 using Limiter = typename HyperbolicDescription::template Limiter<Number>;
59
61 typename HyperbolicDescription::template WaveSpeedEstimator<Number>;
62
63 static constexpr auto problem_dimension = View::problem_dimension;
64
65 using state_type = typename View::state_type;
66
67 static constexpr auto n_precomputed_values = View::n_precomputed_values;
68
69 using precomputed_type = typename View::precomputed_type;
70
71 static constexpr auto n_initial_precomputed_values =
72 View::n_initial_precomputed_values;
73
74 using initial_precomputed_type = typename View::initial_precomputed_type;
75
77
81
86 const MPIEnsemble &mpi_ensemble,
87 const Interface::OfflineData<dim, Number> &offline_data,
88 const HyperbolicSystem &hyperbolic_system,
90 const std::string &subsection = "/HyperbolicModule");
91
97 void prepare() override;
98
100
104
111 void reinit_state_vector(StateVector<Number> &state_vector) const override;
112
128 void prepare_state_vector(StateVector<Number> &state_vector,
129 Number t) const override;
130
131 void
132 fill_precomputed_values(StateVector<Number> &state_vector) const override;
133
202 Number
203 step(const StateVector<Number> &old_state_vector,
204 StageVectors stage_state_vectors,
205 StageWeights stage_weights,
206 StateVector<Number> &new_state_vector,
207 Number tau = Number(0.),
208 Number tau_max = std::numeric_limits<Number>::max()) const override;
209
211
215
220 void print_solver_statistics(std::ostream & /*output*/) const override
221 {
222 // do nothing
223 }
224
228 ACCESSOR_READ_ONLY(offline_data)
229
230
233 ACCESSOR_READ_ONLY(hyperbolic_system)
234
235
238 ACCESSOR_READ_ONLY(initial_precomputed)
239
240
245 ACCESSOR_READ_ONLY(alpha)
246
247 private:
249
253
259 template <int stages>
260 Number step(const StateVector<Number> &old_state_vector,
261 StageVectors stage_state_vectors,
262 StageWeights stage_weights,
263 StateVector<Number> &new_state_vector,
264 Number tau,
265 Number tau_max) const;
266
280 template <typename MemorySpace>
281 void apply_boundary_conditions(MultiComponentVector<Number> &U,
282 const Number t) const;
283
285
289 Indicator indicator_;
290
291 Limiter limiter_;
292
293 WaveSpeedEstimator wave_speed_estimator_;
294
296
300
301 const MPIEnsemble &mpi_ensemble_;
302
303 dealii::ObserverPointer<const Interface::OfflineData<dim, Number>>
304 offline_data_;
305 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
306 dealii::ObserverPointer<
308 initial_values_;
309
310 MultiComponentVector<Number> initial_precomputed_;
311
312 mutable ScalarVector<Number> alpha_;
313
314 static constexpr auto n_bounds =
315 decltype(std::declval<const Limiter &>()
316 .template view<dim, Number>())::n_bounds;
317 mutable MultiComponentVector<Number> bounds_;
318
320
321 /* A buffer holding all boundary states of the hyperbolic state vector. */
322 mutable Mirrored<Number *> boundary_states_{
323 "hyperbolic_module_boundary_states"};
324
325 mutable SparseMatrix<Number> dij_matrix_;
326 mutable SparseMatrix<Number> lij_matrix_;
327 mutable SparseMatrix<Number> lij_matrix_next_;
328 mutable SparseMatrix<Number, problem_dimension> pij_matrix_;
329
331 };
332
333} // namespace ryujin
typename Interface::HyperbolicModule< dim, Number >::StageWeights StageWeights
typename HyperbolicSystem::template View< dim, Number > View
typename HyperbolicDescription::HyperbolicSystem HyperbolicSystem
static constexpr auto problem_dimension
typename Interface::HyperbolicModule< dim, Number >::StageVectors StageVectors
static constexpr auto n_precomputed_values
typename View::precomputed_type precomputed_type
void print_solver_statistics(std::ostream &) const override
typename View::state_type state_type
void prepare_state_vector(StateVector< Number > &state_vector, Number t) const override
void reinit_state_vector(StateVector< Number > &state_vector) const override
void fill_precomputed_values(StateVector< Number > &state_vector) const override
static constexpr auto n_initial_precomputed_values
Number step(const StateVector< Number > &old_state_vector, StageVectors stage_state_vectors, StageWeights stage_weights, StateVector< Number > &new_state_vector, Number tau=Number(0.), Number tau_max=std::numeric_limits< Number >::max()) const override
typename HyperbolicDescription::template Indicator< Number > Indicator
typename HyperbolicDescription::template WaveSpeedEstimator< Number > WaveSpeedEstimator
typename HyperbolicDescription::template Limiter< Number > Limiter
typename View::initial_precomputed_type initial_precomputed_type
#define ACCESSOR_READ_ONLY(member)