ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
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 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
199 Number forward_euler_step(
200 const StateVector<Number> &old_state_vector,
201 StageVectors stage_state_vectors,
202 StageWeights stage_weights,
203 StateVector<Number> &new_state_vector,
204 Number t,
205 Number tau,
206 Number tau_max = std::numeric_limits<Number>::max()) const override;
207
209
213
218 void print_solver_statistics(std::ostream & /*output*/) const override
219 {
220 // do nothing
221 }
222
226 ACCESSOR_READ_ONLY(offline_data)
227
228
231 ACCESSOR_READ_ONLY(hyperbolic_system)
232
233
236 ACCESSOR_READ_ONLY(initial_precomputed)
237
238
243 ACCESSOR_READ_ONLY(alpha)
244
245 private:
247
251
257 template <int stages>
258 Number forward_euler_step(const StateVector<Number> &old_state_vector,
259 StageVectors stage_state_vectors,
260 StageWeights stage_weights,
261 StateVector<Number> &new_state_vector,
262 Number t,
263 Number tau,
264 Number tau_max) const;
265
279 template <typename MemorySpace>
280 void apply_boundary_conditions(MultiComponentVector<Number> &U,
281 const Number t) const;
282
284
288 Indicator indicator_;
289
290 Limiter limiter_;
291
292 WaveSpeedEstimator wave_speed_estimator_;
293
295
299
300 const MPIEnsemble &mpi_ensemble_;
301
302 dealii::ObserverPointer<const OfflineData<dim, Number>> offline_data_;
303 dealii::ObserverPointer<const HyperbolicSystem> hyperbolic_system_;
304 dealii::ObserverPointer<
306 initial_values_;
307
308 MultiComponentVector<Number> initial_precomputed_;
309
310 mutable ScalarVector<Number> alpha_;
311
312 static constexpr auto n_bounds =
313 decltype(std::declval<const Limiter &>()
314 .template view<dim, Number>())::n_bounds;
315 mutable MultiComponentVector<Number> bounds_;
316
318
319 /* A buffer holding all boundary states of the hyperbolic state vector. */
320 mutable Mirrored<Number *> boundary_states_{
321 "hyperbolic_module_boundary_states"};
322
323 mutable SparseMatrix<Number> dij_matrix_;
324 mutable SparseMatrix<Number> lij_matrix_;
325 mutable SparseMatrix<Number> lij_matrix_next_;
326 mutable SparseMatrix<Number, problem_dimension> pij_matrix_;
327
329 };
330
331} // 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
Number forward_euler_step(const StateVector< Number > &old_state_vector, StageVectors stage_state_vectors, StageWeights stage_weights, StateVector< Number > &new_state_vector, Number t, Number tau, Number tau_max=std::numeric_limits< Number >::max()) const override
void fill_precomputed_values(StateVector< Number > &state_vector) const override
static constexpr auto n_initial_precomputed_values
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)