39 const std::string subsection)
40 :
InitialState<Description, dim, Number>(
"icf like", subsection)
41 , hyperbolic_system_(hyperbolic_system)
44 if constexpr (!View::have_gamma) {
45 this->add_parameter(
"gamma", gamma_,
"The ratio of specific heats");
48 primitive_inside_[0] = 0.1;
49 primitive_inside_[1] = 0.0;
50 primitive_inside_[2] = 1.0;
51 this->add_parameter(
"primitive state inside",
53 "1d primitive state [rho, u, p] (for the "
54 "Noble-Abel gas EOS) inside perturbed interface");
56 primitive_outside_[0] = 1.0;
57 primitive_outside_[1] = 0.0;
58 primitive_outside_[2] = 1.0;
59 this->add_parameter(
"primitive state outside",
61 "1d primitive state [rho, u, p] (for the "
62 "Noble-Abel gas EOS) outside perturbed interface");
64 interface_radius_ = 1.0;
66 "interface radius", interface_radius_,
"Radius of interface");
69 this->add_parameter(
"number of modes",
71 "Number of modes for pertburation of interface");
75 "amplitude", amplitude_,
"Amplitude for interface pertburation");
79 "mach number", mach_number_,
"Mach number of incoming shock front");
82 this->add_parameter(
"shock radius",
84 "Radial location of incoming shock front");
86 const auto convert_states = [&]() {
87 const auto view = hyperbolic_system_.template view<dim, Number>();
91 static_assert(state_type_1d::dimension <=
92 dealii::Tensor<1, 3, Number>::dimension);
96 for (
unsigned int i = 0; i < state_type_1d::dimension; ++i) {
97 result_inside[i] = primitive_inside_[i];
98 result_outside[i] = primitive_outside_[i];
100 state_inside_ = view.from_initial_state(result_inside);
101 state_outside_ = view.from_initial_state(result_outside);
103 this->parse_parameters_call_back.connect(convert_states);
109 const auto view = hyperbolic_system_.template view<dim, Number>();
112 const auto x = point[0];
113 const auto y = dim > 1 ? point[1] : 0.;
114 const double theta = std::atan2(y, x);
116 if constexpr (dim == 3)
117 phi = std::atan2(point[2], std::sqrt(x * x + y * y));
120 const auto omega = num_modes_;
121 const double perturbation =
122 amplitude_ * std::cos(omega * theta) * std::cos(omega * phi);
124 if (point.norm() > shock_radius_) {
129 const auto r_hat = point / point.norm();
132 if constexpr (View::have_covolume_constant)
133 b = view.eos_covolume_constant();
135 const auto &rho_R = primitive_outside_[0];
136 const auto &u_R = primitive_outside_[1];
137 const auto &p_R = primitive_outside_[2];
139 const Number a_R = std::sqrt(gamma_ * p_R / rho_R / (1 - b * rho_R));
140 const Number mach_R = u_R / a_R;
142 auto S3_ = mach_number_ * a_R;
143 const Number delta_mach = mach_R - mach_number_;
146 rho_R * (gamma_ + Number(1.)) * delta_mach * delta_mach /
147 ((gamma_ - Number(1.)) * delta_mach * delta_mach + Number(2.));
149 (Number(1.) - rho_R / rho_L) * S3_ + rho_R / rho_L * u_R;
150 const Number p_L = p_R *
151 (Number(2.) * gamma_ * delta_mach * delta_mach -
152 (gamma_ - Number(1.))) /
153 (gamma_ + Number(1.));
156 primitive_shock_state[0] = rho_L;
158 for (
unsigned int i = 0; i < dim; ++i) {
159 primitive_shock_state[i + 1] = 0.;
162 if (point.norm() > 0.) {
163 for (
unsigned int i = 0; i < dim; ++i) {
164 primitive_shock_state[i + 1] = -u_L * r_hat[i];
167 if constexpr (View::have_energy_equation)
168 primitive_shock_state[1 + dim] = p_L;
170 return view.from_initial_state(primitive_shock_state);
172 }
else if (point.norm() > interface_radius_ + perturbation) {
177 return state_outside_;
184 return state_inside_;