Skip to content
cfd-lab:~/en/posts/2026-08-06-oblique-shock…● online

Translated from the author's Korean original. Read the original (한국어)

NOTE #124DAY THU 유체역학DATE 2026.08.06UPDATED 2026.10.19READ 6 min read#Gas-Dynamics#Oblique-Shock#Supersonic-Inlet#Stagnation-Pressure#Flow-Phenomena

Four Shocks Beat One — The Oblique Shock Train in a Supersonic Inlet

Splitting the slowdown across weak oblique shocks cuts the entropy rise with the cube. The terminal normal shock still has to stand.

Göttingen, 1944. Oswatitsch was stuck on a ramjet inlet. Standing Mach 3 flow up in one shock threw away two thirds of the pressure. He did not compress harder. He split the turn across a few ramps.

Raise the M1 slider and the knee of the θ–β curve slides right. Push the deflection θ past the maximum and the attached shock jumps off the nose. The Weak and Strong buttons swap the two wave angles that share one θ.

drag theta and watch the amber Vn arrow grow while the slate Vt arrow never changes — that is why p02/p01 falls. push theta past the amber thetamax line and the shock detaches. then drag M1: the whole theta-beta knee slides right, so a faster inlet can turn the flow harder.

A higher M1 can be turned farther. The moment θ passes the knee, p02/p01p_{02}/p_{01} collapses, while the tangential arrows keep the same length across the shock. Only the normal component is cut.

What a Shock Takes From You#

Mass, momentum, and energy survive a shock. So does the stagnation temperature T0T_0. What disappears is the stagnation pressure p0p_0.

p02p01=exp⁡ ⁣(−ΔsR)\frac{p_{02}}{p_{01}} = \exp\!\left(-\frac{\Delta s}{R}\right)

Δs\Delta s is the entropy gained, RR the gas constant. Total pressure falls as entropy rises.

Stagnation pressure is the ceiling on the work the inlet can hand to the engine. Cut it and the nozzle expansion ratio dies with it. Whether that expansion actually chokes is the question in a nozzle that must widen after the throat. Inlet performance is the single recovery πd=p0e/p0∞\pi_d = p_{0e}/p_{0\infty}.

One normal shock at Mach 3 gives 0.3283. Sixty-seven percent of the total pressure scatters into heat.

Hit It at an Angle and Only the Normal Component Survives#

Tilt the shock and the velocity parallel to the face passes through unchanged. The pressure gradient stands only normal to the face. An oblique shock is a normal shock that feels only the normal component. With wave angle β\beta fixed, the effective Mach number is

M1n=M1sin⁡βM_{1n} = M_1 \sin\beta

A smaller β\beta pulls M1nM_{1n} toward 1. Mach 3 flow at β=25.6°\beta = 25.6° is a shock that feels Mach 1.30.

Deflection θ\theta and wave angle β\beta are tied by one relation.

tan⁡θ=2cot⁡β M12sin⁡2β−1M12(γ+cos⁡2β)+2\tan\theta = 2\cot\beta \, \frac{M_1^2 \sin^2\beta - 1}{M_1^2 (\gamma + \cos 2\beta) + 2}

γ\gamma is the ratio of specific heats, 1.4 for air. This relation decides every ramp calculation below.

One θ–β–M Relation, Two Answers#

Give M1M_1 and θ\theta, solve for β\beta, and two roots come out. The smaller wave angle is the weak solution, the larger one the strong solution. Behind the weak root the flow usually stays supersonic. Behind the strong root it goes subsonic. Unless the back pressure is high, a wedge carries the weak root. The Strong button above is that other root.

Keep raising θ\theta and the roots vanish. Every Mach number has a maximum deflection θmax⁡\theta_{\max}.

M1M_11.52.03.05.0
θmax⁡\theta_{\max}12.1°23.0°34.1°41.1°

If θ>θmax⁡\theta > \theta_{\max}, the shock cannot stay on the body. It detaches. The nose is then essentially a normal shock, and the recovery drops there.

The Loss Falls as a Cube#

Entropy rise across a weak shock is not proportional to M1n−1M_{1n}-1. It goes as the cube.

ΔsR≃2γ3(γ+1)2(M1n2−1)3\frac{\Delta s}{R} \simeq \frac{2\gamma}{3(\gamma+1)^2}\left(M_{1n}^2 - 1\right)^3

At γ=1.4\gamma = 1.4 the coefficient is 0.162. Halve M1n2−1M_{1n}^2 - 1 and the loss drops to one eighth.

A single Mach 3 shock has to swallow Mn2−1=8M_n^2-1 = 8. Split into four pieces and each piece's loss falls by the cube. Multiply the pieces back and the sum is still smaller. One shock at M1n=1.30M_{1n} = 1.30 loses 2.1% of total pressure. The same job as two shocks at M1n=1.15M_{1n} = 1.15 loses 0.33% each, under 0.7% together.

Slicing Up a Mach 3 Inlet#

The setup adds 8° ramps one at a time and finishes with a normal shock. Each ramp is recomputed at the local Mach left by the ramp ahead.

import math
 
GAMMA = 1.4
 
def stagnation_ratio(mn):
    """Total pressure ratio p02/p01 across a shock seeing normal Mach number mn"""
    g = GAMMA
    a = ((g + 1) * mn**2 / 2) / (1 + (g - 1) * mn**2 / 2)
    b = (g + 1) / (2 * g * mn**2 - (g - 1))
    return a ** (g / (g - 1)) * b ** (1 / (g - 1))
 
def downstream_normal_mach(mn):
    g = GAMMA
    return math.sqrt((1 + (g - 1) / 2 * mn**2) / (g * mn**2 - (g - 1) / 2))
 
def deflection(mach, beta):
    """Deflection angle theta(rad) produced by a given wave angle beta(rad)"""
    g = GAMMA
    num = mach**2 * math.sin(beta) ** 2 - 1
    den = mach**2 * (g + math.cos(2 * beta)) + 2
    return math.atan(2 / math.tan(beta) * num / den)
 
def wave_angle_weak(mach, theta):
    """Weak-solution beta that produces theta. None if the flow cannot turn that far"""
    lo, hi = math.asin(1 / mach), math.pi / 2
    grid = [lo + (hi - lo) * i / 4000 for i in range(4001)]
    peak = max(grid, key=lambda b: deflection(mach, b))
    if theta > deflection(mach, peak):
        return None
    a, b = lo, peak
    for _ in range(80):
        mid = 0.5 * (a + b)
        if deflection(mach, mid) < theta:
            a = mid
        else:
            b = mid
    return 0.5 * (a + b)
 
def inlet_recovery(mach_inf, n_ramps, ramp_deg):
    """Total pressure recovery after n ramps plus a terminal normal shock"""
    theta = math.radians(ramp_deg)
    total, mach = 1.0, mach_inf
    for _ in range(n_ramps):
        beta = wave_angle_weak(mach, theta)
        if beta is None:
            break
        mn = mach * math.sin(beta)
        total *= stagnation_ratio(mn)
        mach = downstream_normal_mach(mn) / math.sin(beta - theta)
    return total * stagnation_ratio(mach)
 
for n in range(5):
    print(f"{n} ramps: recovery {inlet_recovery(3.0, n, 8.0):.4f}")

The run prints this.

0 ramps: recovery 0.3283
1 ramps: recovery 0.4497
2 ramps: recovery 0.5808
3 ramps: recovery 0.7101
4 ramps: recovery 0.8235

Change the ramp count, the turning per ramp, and the freestream Mach, and the recovery bar is recomputed for combinations that are not in the table. Turn the terminal-shock toggle off and the last slice drops out of the bar.

keep M inf = 3.00 and delta = 8 deg, then drag N from 0 to 4 and watch the bottom number climb 0.3283 → 0.8235 while the red terminal shock bar gets visibly thinner. now push delta up: each ramp bites harder, the chain runs out of Mach, and it turns red.

At Mach 3, 8°, and four ramps the bar sits near 0.82. Push the turning to 14° and the rear ramps go red. The flow has already slowed past a weak solution at that angle.

Read as entropy, the factor 2.5 looks different. Δs/R=−ln⁡πd\Delta s/R=-\ln\pi_d. Then 0.3283 is 1.114 and 0.8235 is 0.194. Recovery rose by 2.51 while the entropy rise fell by 5.7. The exponential hides a small loss inside the recovery number.

The steps up are 0.121, 0.131, 0.129, 0.113. The fourth ramp still adds 0.11.

Read the terminal shock's 13% as a factor 0.87. The recovery just upstream is 0.8235/0.87≈0.950.8235/0.87\approx 0.95. Four oblique shocks removed about 0.05. The last normal shock removed about 0.12, more than twice the ramps combined.

Set the stated losses 2.1% at Mn=1.30M_n=1.30 and 0.33% at Mn=1.15M_n=1.15 next to the cube. The ratio of Mn2−1M_n^2-1, 0.69 to 0.3225, cubes to about 9.8. The loss ratio is 6.4. Mach 1.30 is already past where that approximation is comfortable.

At Mach 2.4 and 6°, 0.5401 and 0.9096 are Δs/R\Delta s/R of 0.616 and 0.095. Entropy falls by 6.5 while recovery rises only 1.68, because the single normal shock was less bad to start with.

Four 8° ramps lift recovery from 0.33 to 0.82. Total turning is 32°. What was added is four inclined faces. At Mach 2.4 with 6° ramps the line is 0.5401, then 0.7440 at two ramps, then 0.9096 at four.

Send the ramp count to infinity and each angle to zero, and the compression approaches isentropic. Recovery of 1 is open in the limit. That is the slot filled by the curved ramps and translating spikes on Concorde and the SR-71.

Splitting Is Not Free#

Twenty ramps are not free. Each added ramp pushes the shock's meeting with the cowl lip farther aft. A longer inlet brings weight and friction. Buying a few points of recovery with fuselage length usually loses.

The angles are set so the shocks meet the lip at one Mach number. Off that Mach the shocks land ahead of the lip or inside it, and spillage drag shows up. More ramps make that mismatch sharper.

Each shock meets the wall boundary layer and raises the pressure in a jump. If that interaction separates the layer, the computed recovery stops meaning anything. Bleed slots near the ramps are there for that.

The compressor wants subsonic inflow. The flow has to cross the speed of sound somewhere, so the terminal normal shock cannot be deleted. Ramps lower the Mach number at which that last shock happens. They do not remove it. With four ramps the terminal shock sits at Mach 1.67 and that one sheet takes 13%.

Treating the terminal normal shock as another ramp#

Adding ramps to push recovery toward 1 misses the sheet that still removes 0.12. That one sheet is larger than the 0.05 the four ramps removed together. Before paying length and off-design sensitivity for a fifth ramp, the Mach number at which the flow crosses sonic has to be chosen.

The number 0.82 assumes the shocks stay attached to the wall. If the boundary layer cannot hold the pressure rise and separates, the table is finished. The thickness where a layer breaks into turbulence is where that separation would start, and this recovery does not say.

Share if you found it helpful.