81 const std::string subsection)
82 :
InitialState<Description, dim, Number>(
"exact riemann solution",
84 , hyperbolic_system_(hyperbolic_system)
85 , riemann_solver_(subsection +
86 "/exact riemann solution/riemann solver")
89 if constexpr (!View::have_gamma) {
90 this->add_parameter(
"gamma", gamma_,
"The ratio of specific heats");
93 primitive_left_[0] = 1.4;
94 primitive_left_[1] = 0.0;
95 primitive_left_[2] = 1.0;
96 this->add_parameter(
"primitive state left",
98 "1d primitive state [rho, u, p] on the left");
100 primitive_right_[0] = 1.4;
101 primitive_right_[1] = 0.0;
102 primitive_right_[2] = 1.0;
103 this->add_parameter(
"primitive state right",
105 "1d primitive state [rho, u, p] on the right");
108 const auto prepare_riemann_data = [&]() {
109 const auto view = hyperbolic_system_.template view<dim, Number>();
110 if constexpr (View::have_gamma) {
111 gamma_ = view.gamma();
116 if constexpr (View::have_covolume_constant) {
118 view.eos_covolume_constant(),
119 view.eos_interpolation_pinfty(),
123 const auto riemann_solver_view =
124 riemann_solver_.template view<Number>();
127 expand_state(riemann_solver_view, primitive_left_);
128 riemann_data_right_ =
129 expand_state(riemann_solver_view, primitive_right_);
131 riemann_solution_ = riemann_solver_view.solve(riemann_data_left_,
132 riemann_data_right_);
135 this->parse_parameters_call_back.connect(prepare_riemann_data);
136 prepare_riemann_data();
142 const auto view = hyperbolic_system_.template view<dim, Number>();
144 const double &x = point[0];
146 dealii::Tensor<1, 3, Number> primitive_state;
148 if (t < 1.e-14 && x < 0.) {
150 primitive_state = primitive_left_;
152 }
else if (t < 1.e-14 && x > 0.) {
154 primitive_state = primitive_right_;
157 const Number xi = x / t;
159 const auto riemann_solver_view =
160 riemann_solver_.template view<Number>();
162 riemann_solver_view.sample(riemann_solution_, xi);
164 for (
unsigned int i = 0; i < 3; ++i)
165 primitive_state[i] = sampled[i];
168 using state_type_1d =
170 static_assert(state_type_1d::dimension <=
171 dealii::Tensor<1, 3, Number>::dimension);
173 state_type_1d result;
174 for (
unsigned int i = 0; i < state_type_1d::dimension; ++i)
175 result[i] = primitive_state[i];
176 return view.from_initial_state(result);