ryujin 2.5.0 revision c64172211cf21344cb9b9b0f3a1266aa6400d392
Loading...
Searching...
No Matches
initial_state_exact_riemann_solution.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// Copyright (C) 2025 - 2026 by the ryujin authors
4// Copyright (C) 2025 by Triad National Security, LLC
5//
6
7#pragma once
8
9#include <ryujin/base/compile_time_options.h>
12
13#include <deal.II/base/tensor.h>
14
15namespace ryujin
16{
17 namespace EulerInitialStates
18 {
44 template <typename Description, int dim, typename Number>
45 class ExactRiemannSolution : public InitialState<Description, dim, Number>
46 {
47 public:
52
53 using HyperbolicSystem = typename Description::HyperbolicSystem;
54 using View = typename HyperbolicSystem::template View<dim, Number>;
55 using state_type = typename View::state_type;
56
57 using ScalarNumber = typename View::ScalarNumber;
58
66 riemann_solver_options{.covolume = View::have_covolume_constant,
67 .pinf = View::have_covolume_constant,
68 .safe_division = true,
69 .variable_gamma = false};
70
76
77
78 ExactRiemannSolution(const HyperbolicSystem &hyperbolic_system,
79 const std::string subsection)
80 : InitialState<Description, dim, Number>("exact riemann solution",
81 subsection)
82 , hyperbolic_system_(hyperbolic_system)
83 , riemann_solver_(subsection +
84 "/exact riemann solution/riemann solver")
85 {
86 gamma_ = 1.4;
87 if constexpr (!View::have_gamma) {
88 this->add_parameter("gamma", gamma_, "The ratio of specific heats");
89 }
90
91 primitive_left_[0] = 1.4;
92 primitive_left_[1] = 0.0;
93 primitive_left_[2] = 1.0;
94 this->add_parameter("primitive state left",
95 primitive_left_,
96 "1d primitive state [rho, u, p] on the left");
97
98 primitive_right_[0] = 1.4;
99 primitive_right_[1] = 0.0;
100 primitive_right_[2] = 1.0;
101 this->add_parameter("primitive state right",
102 primitive_right_,
103 "1d primitive state [rho, u, p] on the right");
104
105 // Convert the primitive states to a full Riemann solution:
106 const auto prepare_riemann_data = [&]() {
107 const auto view = hyperbolic_system_.template view<dim, Number>();
108 if constexpr (View::have_gamma) {
109 gamma_ = view.gamma();
110 }
111
112 riemann_solver_.set_gamma(gamma_);
113
114 if constexpr (View::have_covolume_constant) {
115 riemann_solver_.set_equation_of_state(
116 view.eos_covolume_constant(),
117 view.eos_interpolation_pinfty(),
118 /*compute_expensive_bounds*/ false);
119 }
120
121 const auto riemann_solver_view =
122 riemann_solver_.template view<Number>();
123
124 riemann_data_left_ =
125 expand_state(riemann_solver_view, primitive_left_);
126 riemann_data_right_ =
127 expand_state(riemann_solver_view, primitive_right_);
128
129 riemann_solution_ = riemann_solver_view.solve(riemann_data_left_,
130 riemann_data_right_);
131 };
132
133 this->parse_parameters_call_back.connect(prepare_riemann_data);
134 prepare_riemann_data();
135 }
136
137
138 state_type compute(const dealii::Point<dim> &point, Number t) final
139 {
140 const auto view = hyperbolic_system_.template view<dim, Number>();
141
142 const double &x = point[0];
143
144 dealii::Tensor<1, 3, Number> primitive_state;
145
146 if (t < 1.e-14 && x < 0.) {
147 /* Left state: */
148 primitive_state = primitive_left_;
149
150 } else if (t < 1.e-14 && x > 0.) {
151 /* Right state: */
152 primitive_state = primitive_right_;
153
154 } else {
155 const Number xi = x / t;
156
157 const auto riemann_solver_view =
158 riemann_solver_.template view<Number>();
159 const auto sampled =
160 riemann_solver_view.sample(riemann_solution_, xi);
161
162 for (unsigned int i = 0; i < 3; ++i)
163 primitive_state[i] = sampled[i];
164 }
165
166 using state_type_1d =
167 typename HyperbolicSystem::template View<1, Number>::state_type;
168 static_assert(state_type_1d::dimension <=
169 dealii::Tensor<1, 3, Number>::dimension);
170
171 state_type_1d result;
172 for (unsigned int i = 0; i < state_type_1d::dimension; ++i)
173 result[i] = primitive_state[i];
174 return view.from_initial_state(result);
175 }
176
177 private:
179
183
184 Number gamma_;
185
186 dealii::Tensor<1, 3, Number> primitive_left_;
187 dealii::Tensor<1, 3, Number> primitive_right_;
188
190
194
195 const HyperbolicSystem &hyperbolic_system_;
196
197 RiemannSolver riemann_solver_;
198
199 primitive_type riemann_data_left_;
200 primitive_type riemann_data_right_;
201 typename RiemannSolverView::RiemannSolution riemann_solution_;
202
204
208
215 expand_state(const RiemannSolverView &riemann_solver_view,
216 const dealii::Tensor<1, 3, Number> &primitive_state) const
217 {
218 primitive_type result;
219 result[0] = primitive_state[0];
220 result[1] = primitive_state[1];
221 result[2] = primitive_state[2];
222 result[3] = gamma_;
223 result[4] =
224 riemann_solver_view.speed_of_sound(result[0], result[2], result[3]);
225 return result;
226 }
227
229 };
230 } // namespace EulerInitialStates
231} // namespace ryujin
std::array< Number, riemann_data_size > primitive_type
void set_equation_of_state(const double covolume_b, const double pinf, const bool compute_expensive_bounds)
EulerAEOS::NASGRiemannSolver< ScalarNumber, riemann_solver_options > RiemannSolver
typename HyperbolicSystem::template View< dim, Number > View
EulerAEOS::NASGRiemannSolverView< Number, riemann_solver_options > RiemannSolverView
ExactRiemannSolution(const HyperbolicSystem &hyperbolic_system, const std::string subsection)
state_type compute(const dealii::Point< dim > &point, Number t) final
static constexpr EulerAEOS::NASGRiemannSolverOptions riemann_solver_options