77 Tscal tol = Tscal{1.0e-6},
80 RiemannResult<Tscal> result;
83 const Tscal smallp = Tscal{1.0e-25};
84 const Tscal smallrho = Tscal{1.0e-25};
86 if (rho_L < smallrho || rho_R < smallrho || p_L < smallp || p_R < smallp) {
88 result.p_star = sycl::fmax(smallp, Tscal{0.5} * (p_L + p_R));
89 result.v_star = Tscal{0.5} * (u_L + u_R);
94 const Tscal gm1 = gamma - Tscal{1};
95 const Tscal gp1 = gamma + Tscal{1};
96 const Tscal gamma1 = Tscal{0.5} * gp1 / gamma;
99 const Tscal V_L = Tscal{1} / rho_L;
100 const Tscal V_R = Tscal{1} / rho_R;
103 const Tscal c_L = sycl::sqrt(gamma * p_L * rho_L);
104 const Tscal c_R = sycl::sqrt(gamma * p_R * rho_R);
108 Tscal p_star = p_R - p_L - c_R * (u_R - u_L);
109 p_star = p_L + p_star * c_L / (c_L + c_R);
110 p_star = sycl::fmax(p_star, smallp);
113 for (
u32 iter = 0; iter < max_iter; ++iter) {
114 const Tscal p_star_old = p_star;
117 Tscal W_L = Tscal{1} + gamma1 * (p_star - p_L) / p_L;
118 W_L = c_L * sycl::sqrt(sycl::fmax(W_L, smallp));
121 Tscal W_R = Tscal{1} + gamma1 * (p_star - p_R) / p_R;
122 W_R = c_R * sycl::sqrt(sycl::fmax(W_R, smallp));
127 Tscal Z_L = Tscal{4} * V_L * W_L * W_L;
128 Z_L = -Z_L * W_L / (Z_L - gp1 * (p_star - p_L) + smallp);
131 Tscal Z_R = Tscal{4} * V_R * W_R * W_R;
132 Z_R = Z_R * W_R / (Z_R - gp1 * (p_star - p_R) + smallp);
137 const Tscal ustar_L = u_L - (p_star - p_L) / W_L;
138 const Tscal ustar_R = u_R + (p_star - p_R) / W_R;
143 const Tscal denom = Z_R - Z_L;
144 if (sycl::fabs(denom) > smallp) {
145 p_star = p_star + (ustar_R - ustar_L) * (Z_L * Z_R) / denom;
147 p_star = sycl::fmax(smallp, p_star);
150 if (sycl::fabs(p_star - p_star_old) / p_star < tol) {
156 Tscal W_L = Tscal{1} + gamma1 * (p_star - p_L) / p_L;
157 W_L = c_L * sycl::sqrt(sycl::fmax(W_L, smallp));
159 Tscal W_R = Tscal{1} + gamma1 * (p_star - p_R) / p_R;
160 W_R = c_R * sycl::sqrt(sycl::fmax(W_R, smallp));
163 const Tscal ustar_L = u_L - (p_star - p_L) / W_L;
164 const Tscal ustar_R = u_R + (p_star - p_R) / W_R;
165 const Tscal u_star = Tscal{0.5} * (ustar_L + ustar_R);
167 result.p_star = p_star;
168 result.v_star = u_star;
191 Tscal u_L, Tscal rho_L, Tscal p_L, Tscal u_R, Tscal rho_R, Tscal p_R, Tscal gamma) {
194 const Tscal smallval = Tscal{1.0e-25};
197 const Tscal c_L = sycl::sqrt(gamma * p_L / sycl::fmax(rho_L, smallval));
198 const Tscal c_R = sycl::sqrt(gamma * p_R / sycl::fmax(rho_R, smallval));
201 const Tscal sqrt_rho_L = sycl::sqrt(rho_L);
202 const Tscal sqrt_rho_R = sycl::sqrt(rho_R);
203 const Tscal roe_inv = Tscal{1} / (sqrt_rho_L + sqrt_rho_R + smallval);
205 const Tscal u_roe = (sqrt_rho_L * u_L + sqrt_rho_R * u_R) * roe_inv;
206 const Tscal c_roe = (sqrt_rho_L * c_L + sqrt_rho_R * c_R) * roe_inv;
209 const Tscal S_L = sycl::fmin(u_L - c_L, u_roe - c_roe);
210 const Tscal S_R = sycl::fmax(u_R + c_R, u_roe + c_roe);
220 const Tscal c1 = rho_L * (S_L - u_L);
221 const Tscal c2 = rho_R * (S_R - u_R);
222 const Tscal c3 = Tscal{1} / (c1 - c2 + smallval);
223 const Tscal c4 = p_L - u_L * c1;
224 const Tscal c5 = p_R - u_R * c2;
226 result.
v_star = (c5 - c4) * c3;
227 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)
Iterative Riemann solver (van Leer 1997)