ryujin 2.1.1 revision ee5cbcbf2346c1299c942d0e1f13b46449973c18
Loading...
Searching...
No Matches
initial_state_icf_like.h
Go to the documentation of this file.
1//
2// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
3// [LANL Copyright Statement]
4// Copyright (C) 2024 - 2025 by the ryujin authors
5// Copyright (C) 2024 by Triad National Security, LLC
6//
7
8#pragma once
9
10#include <compile_time_options.h>
11
13
14namespace ryujin
15{
16 namespace EulerInitialStates
17 {
29 template <typename Description, int dim, typename Number>
30 class ICFLike : public InitialState<Description, dim, Number>
31 {
32 public:
34 using View = typename HyperbolicSystem::template View<dim, Number>;
35 using state_type = typename View::state_type;
37 typename HyperbolicSystem::template View<1, Number>::state_type;
38
39 ICFLike(const HyperbolicSystem &hyperbolic_system,
40 const std::string subsection)
41 : InitialState<Description, dim, Number>("icf like", subsection)
42 , hyperbolic_system_(hyperbolic_system)
43 {
44 gamma_ = 1.4;
45 if constexpr (!View::have_gamma) {
46 this->add_parameter("gamma", gamma_, "The ratio of specific heats");
47 }
48
49 primitive_inside_[0] = 0.1;
50 primitive_inside_[1] = 0.0;
51 primitive_inside_[2] = 1.0;
52 this->add_parameter("primitive state inside",
53 primitive_inside_,
54 "1d primitive state [rho, u, p] (for the "
55 "Noble-Abel gas EOS) inside perturbed interface");
56
57 primitive_outside_[0] = 1.0;
58 primitive_outside_[1] = 0.0;
59 primitive_outside_[2] = 1.0;
60 this->add_parameter("primitive state outside",
61 primitive_outside_,
62 "1d primitive state [rho, u, p] (for the "
63 "Noble-Abel gas EOS) outside perturbed interface");
64
65 interface_radius_ = 1.0;
66 this->add_parameter(
67 "interface radius", interface_radius_, "Radius of interface");
68
69 num_modes_ = 8.0;
70 this->add_parameter("number of modes",
71 num_modes_,
72 "Number of modes for pertburation of interface");
73
74 amplitude_ = 0.02;
75 this->add_parameter(
76 "amplitude", amplitude_, "Amplitude for interface pertburation");
77
78 mach_number_ = 3.0;
79 this->add_parameter(
80 "mach number", mach_number_, "Mach number of incoming shock front");
81
82 shock_radius_ = 1.2;
83 this->add_parameter("shock radius",
84 shock_radius_,
85 "Radial location of incoming shock front");
86
87 const auto convert_states = [&]() {
88 const auto view = hyperbolic_system_.template view<dim, Number>();
89
90 using state_type_1d =
91 typename HyperbolicSystem::template View<1, Number>::state_type;
92 static_assert(state_type_1d::dimension <=
93 dealii::Tensor<1, 3, Number>::dimension);
94
95 state_type_1d result_inside;
96 state_type_1d result_outside;
97 for (unsigned int i = 0; i < state_type_1d::dimension; ++i) {
98 result_inside[i] = primitive_inside_[i];
99 result_outside[i] = primitive_outside_[i];
100 }
101 state_inside_ = view.from_initial_state(result_inside);
102 state_outside_ = view.from_initial_state(result_outside);
103 };
104 this->parse_parameters_call_back.connect(convert_states);
105 convert_states();
106 };
107
108 state_type compute(const dealii::Point<dim> &point, Number) final
109 {
110 const auto view = hyperbolic_system_.template view<dim, Number>();
111
112 /* Compute polar (and potentially azimuthal) angle: */
113 const auto x = point[0];
114 const auto y = dim > 1 ? point[1] : 0.;
115 const double theta = std::atan2(y, x);
116 double phi = 0.;
117 if constexpr (dim == 3)
118 phi = std::atan2(point[2], std::sqrt(x * x + y * y));
119
120 /* Compute perturbation for interface */
121 const auto omega = num_modes_;
122 const double perturbation =
123 amplitude_ * std::cos(omega * theta) * std::cos(omega * phi);
124
125 if (point.norm() > shock_radius_) {
126 /*
127 * Inside the incoming shock front:
128 */
129
130 const auto r_hat = point / point.norm();
131
132 auto b = Number(0.);
133 if constexpr (View::have_covolume_constant)
134 b = view.eos_covolume_constant();
135
136 const auto &rho_R = primitive_outside_[0];
137 const auto &u_R = primitive_outside_[1];
138 const auto &p_R = primitive_outside_[2];
139 /* a_R^2 = gamma * p / rho / (1 - b * rho) */
140 const Number a_R = std::sqrt(gamma_ * p_R / rho_R / (1 - b * rho_R));
141 const Number mach_R = u_R / a_R;
142
143 auto S3_ = mach_number_ * a_R;
144 const Number delta_mach = mach_R - mach_number_;
145
146 const Number rho_L =
147 rho_R * (gamma_ + Number(1.)) * delta_mach * delta_mach /
148 ((gamma_ - Number(1.)) * delta_mach * delta_mach + Number(2.));
149 const Number u_L =
150 (Number(1.) - rho_R / rho_L) * S3_ + rho_R / rho_L * u_R;
151 const Number p_L = p_R *
152 (Number(2.) * gamma_ * delta_mach * delta_mach -
153 (gamma_ - Number(1.))) /
154 (gamma_ + Number(1.));
155
156 state_type primitive_shock_state;
157 primitive_shock_state[0] = rho_L;
158
159 for (unsigned int i = 0; i < dim; ++i) {
160 primitive_shock_state[i + 1] = 0.;
161 }
162
163 if (point.norm() > 0.) {
164 for (unsigned int i = 0; i < dim; ++i) {
165 primitive_shock_state[i + 1] = -u_L * r_hat[i];
166 }
167 }
168 if constexpr (View::have_energy_equation)
169 primitive_shock_state[1 + dim] = p_L;
170
171 return view.from_initial_state(primitive_shock_state);
172
173 } else if (point.norm() > interface_radius_ + perturbation) {
174 /*
175 * Outside annulus between inner disc and outer shock annulus:
176 */
177
178 return state_outside_;
179
180 } else {
181 /*
182 * Inner disc:
183 */
184
185 return state_inside_;
186 }
187 }
188
189 private:
190 const HyperbolicSystem &hyperbolic_system_;
191
192 Number gamma_;
193
194 dealii::Tensor<1, 3, Number> primitive_inside_;
195 dealii::Tensor<1, 3, Number> primitive_outside_;
196 state_type state_inside_;
197 state_type state_outside_;
198
199 double interface_radius_;
200 double num_modes_;
201 double amplitude_;
202 double shock_radius_;
203 double mach_number_;
204 };
205
206
207 } // namespace EulerInitialStates
208} // namespace ryujin
typename HyperbolicSystem::template View< dim, Number > View
ICFLike(const HyperbolicSystem &hyperbolic_system, const std::string subsection)
state_type compute(const dealii::Point< dim > &point, Number) final
typename Description::HyperbolicSystem HyperbolicSystem
typename HyperbolicSystem::template View< 1, Number >::state_type state_type_1d
Euler::HyperbolicSystem HyperbolicSystem
Definition description.h:34