79 const std::string subsection)
80 :
InitialState<Description, dim, Number>(
"exact riemann solution",
82 , hyperbolic_system_(hyperbolic_system)
83 , riemann_solver_(subsection +
84 "/exact riemann solution/riemann solver")
87 if constexpr (!View::have_gamma) {
88 this->add_parameter(
"gamma", gamma_,
"The ratio of specific heats");
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",
96 "1d primitive state [rho, u, p] on the left");
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",
103 "1d primitive state [rho, u, p] on the right");
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();
114 if constexpr (View::have_covolume_constant) {
116 view.eos_covolume_constant(),
117 view.eos_interpolation_pinfty(),
121 const auto riemann_solver_view =
122 riemann_solver_.template view<Number>();
125 expand_state(riemann_solver_view, primitive_left_);
126 riemann_data_right_ =
127 expand_state(riemann_solver_view, primitive_right_);
129 riemann_solution_ = riemann_solver_view.solve(riemann_data_left_,
130 riemann_data_right_);
133 this->parse_parameters_call_back.connect(prepare_riemann_data);
134 prepare_riemann_data();
140 const auto view = hyperbolic_system_.template view<dim, Number>();
142 const double &x = point[0];
144 dealii::Tensor<1, 3, Number> primitive_state;
146 if (t < 1.e-14 && x < 0.) {
148 primitive_state = primitive_left_;
150 }
else if (t < 1.e-14 && x > 0.) {
152 primitive_state = primitive_right_;
155 const Number xi = x / t;
157 const auto riemann_solver_view =
158 riemann_solver_.template view<Number>();
160 riemann_solver_view.sample(riemann_solution_, xi);
162 for (
unsigned int i = 0; i < 3; ++i)
163 primitive_state[i] = sampled[i];
166 using state_type_1d =
168 static_assert(state_type_1d::dimension <=
169 dealii::Tensor<1, 3, Number>::dimension);
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);