Source code for jf1uids.shock_finder.shock_finder
import jax.numpy as jnp
[docs]
def shock_sensor(primitive_state):
"""
WENO-JS smoothness indicator for shock detection.
"""
_, _, p = primitive_state
return (1/4 * (p[2:] - p[:-2])**2 + 13 / 12 * (p[2:] - 2 * p[1:-1] + p[:-2]))
[docs]
def strongest_shock_radius(primitive_state, helper_data, padL, padR):
"""
Compute the radius of the strongest shock in the domain.
"""
r = helper_data.geometric_centers[padL + 1: -padR - 1]
shock_sensors = shock_sensor(primitive_state)[padL: -padR]
max_shock_idx = jnp.argmax(shock_sensors)
return (r[max_shock_idx - 1] * shock_sensors[max_shock_idx - 1] + r[max_shock_idx] * shock_sensors[max_shock_idx] + r[max_shock_idx + 1] * shock_sensors[max_shock_idx + 1]) / (shock_sensors[max_shock_idx - 1] + shock_sensors[max_shock_idx] + shock_sensors[max_shock_idx + 1])
[docs]
def strongest_shock_dissipated_energy_flux(primitive_state, gamma, padL, padR, statePad):
"""
Compute the dissipated energy flux due to the strongest shock in the domain.
"""
shock_sensors = shock_sensor(primitive_state)[padL: -padR]
primitive_state = primitive_state[:, padL + 1: -padR - 1]
max_shock_idx = jnp.argmax(shock_sensors)
# get the pre and post shock states
rho1, v1, P1 = primitive_state[:, max_shock_idx + statePad]
rho2, v2, P2 = primitive_state[:, max_shock_idx - statePad]
c1 = jnp.sqrt(gamma * P1 / rho1)
e_th1 = P1 / ((gamma - 1))
e_th2 = P2 / ((gamma - 1))
x_s = rho2 / rho1
e_diss = e_th2 - e_th1 * x_s ** gamma
M_1_sq = (P2 / P1 - 1) * x_s / (gamma * (x_s - 1))
f_diss = e_diss * jnp.sqrt(M_1_sq) * c1 / x_s
return f_diss