83 Tscal tol = Tscal{1.0e-6},
86 RiemannResult<Tscal> result;
89 const Tscal smallp = Tscal{1.0e-25};
90 const Tscal smallrho = Tscal{1.0e-25};
92 if (rho_L < smallrho || rho_R < smallrho || p_L < smallp || p_R < smallp) {
94 result.p_star = sycl::fmax(smallp, Tscal{0.5} * (p_L + p_R));
95 result.v_star = Tscal{0.5} * (u_L + u_R);
100 const Tscal gm1 = gamma - Tscal{1};
101 const Tscal gp1 = gamma + Tscal{1};
102 const Tscal gamma1 = Tscal{0.5} * gp1 / gamma;
105 const Tscal V_L = Tscal{1} / rho_L;
106 const Tscal V_R = Tscal{1} / rho_R;
109 const Tscal c_L = sycl::sqrt(gamma * p_L * rho_L);
110 const Tscal c_R = sycl::sqrt(gamma * p_R * rho_R);
114 Tscal p_star = p_R - p_L - c_R * (u_R - u_L);
115 p_star = p_L + p_star * c_L / (c_L + c_R);
116 p_star = sycl::fmax(p_star, smallp);
119 for (
u32 iter = 0; iter < max_iter; ++iter) {
120 const Tscal p_star_old = p_star;
123 Tscal W_L = Tscal{1} + gamma1 * (p_star - p_L) / p_L;
124 W_L = c_L * sycl::sqrt(sycl::fmax(W_L, smallp));
127 Tscal W_R = Tscal{1} + gamma1 * (p_star - p_R) / p_R;
128 W_R = c_R * sycl::sqrt(sycl::fmax(W_R, smallp));
133 Tscal Z_L = Tscal{4} * V_L * W_L * W_L;
134 Z_L = -Z_L * W_L / (Z_L - gp1 * (p_star - p_L) + smallp);
137 Tscal Z_R = Tscal{4} * V_R * W_R * W_R;
138 Z_R = Z_R * W_R / (Z_R - gp1 * (p_star - p_R) + smallp);
143 const Tscal ustar_L = u_L - (p_star - p_L) / W_L;
144 const Tscal ustar_R = u_R + (p_star - p_R) / W_R;
149 const Tscal denom = Z_R - Z_L;
150 if (sycl::fabs(denom) > smallp) {
151 p_star = p_star + (ustar_R - ustar_L) * (Z_L * Z_R) / denom;
153 p_star = sycl::fmax(smallp, p_star);
156 if (sycl::fabs(p_star - p_star_old) / p_star < tol) {
162 Tscal W_L = Tscal{1} + gamma1 * (p_star - p_L) / p_L;
163 W_L = c_L * sycl::sqrt(sycl::fmax(W_L, smallp));
165 Tscal W_R = Tscal{1} + gamma1 * (p_star - p_R) / p_R;
166 W_R = c_R * sycl::sqrt(sycl::fmax(W_R, smallp));
169 const Tscal ustar_L = u_L - (p_star - p_L) / W_L;
170 const Tscal ustar_R = u_R + (p_star - p_R) / W_R;
171 const Tscal u_star = Tscal{0.5} * (ustar_L + ustar_R);
173 result.p_star = p_star;
174 result.v_star = u_star;
197 Tscal u_L, Tscal rho_L, Tscal p_L, Tscal u_R, Tscal rho_R, Tscal p_R, Tscal gamma) {
200 const Tscal smallval = Tscal{1.0e-25};
203 const Tscal c_L = sycl::sqrt(gamma * p_L / sycl::fmax(rho_L, smallval));
204 const Tscal c_R = sycl::sqrt(gamma * p_R / sycl::fmax(rho_R, smallval));
207 const Tscal sqrt_rho_L = sycl::sqrt(rho_L);
208 const Tscal sqrt_rho_R = sycl::sqrt(rho_R);
209 const Tscal roe_inv = Tscal{1} / (sqrt_rho_L + sqrt_rho_R + smallval);
211 const Tscal u_roe = (sqrt_rho_L * u_L + sqrt_rho_R * u_R) * roe_inv;
212 const Tscal c_roe = (sqrt_rho_L * c_L + sqrt_rho_R * c_R) * roe_inv;
215 const Tscal S_L = sycl::fmin(u_L - c_L, u_roe - c_roe);
216 const Tscal S_R = sycl::fmax(u_R + c_R, u_roe + c_roe);
226 const Tscal c1 = rho_L * (S_L - u_L);
227 const Tscal c2 = rho_R * (S_R - u_R);
228 const Tscal c3 = Tscal{1} / (c1 - c2 + smallval);
229 const Tscal c4 = p_L - u_L * c1;
230 const Tscal c5 = p_R - u_R * c2;
232 result.
v_star = (c5 - c4) * c3;
233 result.
p_star = sycl::fmax(smallval, (c1 * c5 - c2 * c4) * c3);
RiemannResult< Tscal > hllc_solver(Tscal u_L, Tscal rho_L, Tscal p_L, Tscal u_R, Tscal rho_R, Tscal p_R, Tscal gamma)
HLL approximate Riemann solver.
RiemannResult< Tscal > iterative_solver(Tscal u_L, Tscal rho_L, Tscal p_L, Tscal u_R, Tscal rho_R, Tscal p_R, Tscal gamma, Tscal tol=Tscal{1.0e-6}, u32 max_iter=20)
Approximate ("two-shock") iterative Riemann solver (van Leer 1997).