Skip to content
cfd-lab:~/ko/posts/2026-08-06-oblique-shock…● online
NOTE #124DAY THU 유체역학DATE 2026.08.06UPDATED 2026.10.19READ 5 min read#Gas-Dynamics#Oblique-Shock#Supersonic-Inlet#Stagnation-Pressure#Flow-Phenomena

충격파 하나보다 네 개가 낫다 — 초음속 흡입구의 사교충격파 열

감속을 약한 사교충격파로 나누면 엔트로피가 세제곱으로 줄고, 종단 수직충격파는 그래도 남는다.

1944년 괴팅겐에서 Oswatitsch는 램제트 흡입구를 붙잡고 있었다. Mach 3 흐름을 한 번에 세우면 압력의 3분의 2가 사라졌다. 그가 고른 길은 압축을 세게 하는 것이 아니라, 경사면 몇 장으로 꺾임을 나누는 것이었다.

M1 슬라이더를 올리면 θ–β 곡선의 무릎이 오른쪽으로 밀리고, 꺾임각 θ를 최대각 너머로 밀면 부착된 충격파가 코 앞으로 떨어진다. Weak와 Strong 버튼은 같은 θ에 대한 두 파각을 오간다.

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.

빠른 M1일수록 더 많이 꺾인다. θ가 무릎을 넘는 순간 p02/p01p_{02}/p_{01}이 무너지고, 접선 화살표의 길이는 충격파 앞뒤에서 그대로다. 깎이는 것은 법선 성분뿐이다.

충격파는 무엇을 가져가는가#

충격파를 지나도 질량·운동량·에너지는 남는다. 정체 온도 T0T_0도 그대로다. 사라지는 것은 정체 압력 p0p_0 하나다.

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

Δs\Delta s는 늘어난 엔트로피, RR은 기체상수다. 엔트로피가 늘어난 만큼 전압력이 깎인다.

흡입구가 엔진에 넘길 수 있는 일의 상한이 전압력이다. 정체 압력이 줄면 노즐의 팽창비도 같이 죽는다. 그 팽창이 목에 걸리는 조건은 수축 뒤에 확장이 필요한 노즐의 문제다. 흡입구 성적은 회수율 πd=p0e/p0∞\pi_d = p_{0e}/p_{0\infty} 하나로 둔다.

Mach 3의 수직충격파 하나에서 이 값은 0.3283이다. 전압력의 67%가 열로 흩어진다.

비스듬히 때리면 수직 성분만 남는다#

충격파를 흐름에 비스듬히 세우면, 면에 나란한 속도는 그대로 통과한다. 압력 구배가 면에 수직으로만 서기 때문이다. 사교충격파는 수직 성분만 겪는 수직충격파다. 파각 β\beta가 정해지면 유효 Mach 수는

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

이다. β\beta가 작을수록 M1nM_{1n}은 1에 가깝다. Mach 3이라도 β=25.6°\beta = 25.6°면 충격파가 느끼는 것은 Mach 1.30이다.

꺾임각 θ\theta와 파각 β\beta는 한 식으로 묶인다.

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는 비열비다. 공기는 1.4. 이 식이 뒤의 램프 계산을 전부 결정한다.

θ–β–M 하나에 답이 두 개다#

M1M_1과 θ\theta를 주고 β\beta를 풀면 근이 둘이다. 파각이 작은 쪽이 약한 해, 큰 쪽이 강한 해다. 약한 해의 뒤는 대개 초음속으로 남고, 강한 해의 뒤는 아음속이 된다. 뒤 압력이 특별히 높지 않으면 쐐기에 붙은 충격파는 약한 쪽이다. 앞의 Strong 버튼이 그 다른 근이다.

θ\theta를 키우다 보면 근이 사라진다. Mach마다 최대 꺾임각 θmax⁡\theta_{\max}가 있다.

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

θ>θmax⁡\theta > \theta_{\max}이면 충격파는 물체에 붙어 있지 못하고 이탈충격파가 된다. 코 앞은 사실상 수직충격파이고, 회수율은 그 자리에서 떨어진다.

손실은 세제곱으로 줄어든다#

약한 충격파의 엔트로피 증가는 M1n−1M_{1n}-1에 비례하지 않는다. 세제곱이다.

Δ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

γ=1.4\gamma = 1.4에서 계수는 0.162다. M1n2−1M_{1n}^2 - 1이 절반이면 손실은 8분의 1이다.

Mach 3을 한 번에 세울 때 충격파가 감당하는 Mn2−1M_n^2-1은 8이다. 네 조각으로 나누면 각 조각의 손실은 세제곱으로 작아지고, 개수를 곱해도 합은 원래보다 작다. M1n=1.30M_{1n} = 1.30 한 번의 전압력 손실은 2.1%다. 같은 일을 M1n=1.15M_{1n} = 1.15 두 번으로 나누면 각각 0.33%, 합쳐도 0.7%에 못 미친다.

Mach 3 흡입구를 조각내 본다#

8° 램프를 하나씩 늘리고 마지막에 수직충격파를 세운 구성이다. 각 램프는 앞 램프가 남긴 국소 Mach로 다시 푼다.

import math
 
GAMMA = 1.4
 
def stagnation_ratio(mn):
    """수직 Mach 수 mn을 겪는 충격파의 전압력 비 p02/p01"""
    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):
    """주어진 파각 beta(rad)가 만드는 꺾임각 theta(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):
    """theta를 만드는 약한 해 beta. 꺾을 수 없으면 None"""
    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):
    """램프 n개 + 종단 수직충격파를 지난 뒤의 전압력 회수율"""
    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}개: 회수율 {inlet_recovery(3.0, n, 8.0):.4f}")

출력은 이렇다.

램프 0개: 회수율 0.3283
램프 1개: 회수율 0.4497
램프 2개: 회수율 0.5808
램프 3개: 회수율 0.7101
램프 4개: 회수율 0.8235

램프 개수, 램프당 꺾임각, 자유류 Mach를 바꾸면 회수율 막대가 위 표에 없는 조합으로 다시 계산된다. 종단 충격파 토글을 끄면 마지막에 깎이던 몫이 막대에서 빠진다.

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.

Mach 3, 8°, 램프 4에서 막대는 0.82 근처에 선다. 꺾임각을 14°까지 밀면 뒤쪽 램프가 빨갛게 바뀐다. 흐름이 이미 느려져 그 각의 약한 해가 없다는 신호다.

회수율을 엔트로피로 되돌리면 2.5배가 달라 보인다. Δs/R=−ln⁡πd\Delta s/R=-\ln\pi_d다. 0.3283은 1.114, 0.8235는 0.194다. 회수율은 2.51배인데 엔트로피 증가는 5.7배로 줄었다. 지수가 작은 손실을 회수율 숫자 안에 숨긴다.

램프마다 오르는 폭은 0.121, 0.131, 0.129, 0.113이다. 네 번째 장도 0.11을 더한다.

종단 충격파의 13%를 배수 0.87로 읽으면, 그 직전 회수율은 0.8235/0.87≈0.950.8235/0.87\approx 0.95다. 사교충격파 네 장이 깎은 몫은 0.05, 마지막 수직충격파가 깎은 몫은 0.12다. 지울 수 없는 한 장이 램프 합보다 두 배 넘게 가져간다.

Mn=1.30M_n=1.30의 2.1%와 Mn=1.15M_n=1.15의 0.33%를 세제곱에 대면, Mn2−1M_n^2-1의 비 0.69 대 0.3225를 세제곱한 값은 약 9.8이다. 손실 비는 6.4다. Mach 1.30은 그 근사가 편한 구간을 이미 벗어난다.

Mach 2.4, 6°의 0.5401과 0.9096은 Δs/R\Delta s/R로 0.616과 0.095다. 엔트로피는 6.5배 줄고, 회수율은 1.68배만 오른다. 수직충격파 하나가 처음부터 덜 나빴다.

차이가 네 칸 모두 0.11 위에 있다는 것은, 이 8°가 아직 한계 꺾임에서 멀리 있지 않다는 뜻만은 아니다. Mach 3의 θmax⁡\theta_{\max}는 표의 34.1°이고, 네 장의 합 32°는 그 바로 아래다. 한 장을 더해 40°가 되면 그 34.1°를 넘는다.

8° 램프 네 장이면 회수율은 0.33에서 0.82로 올라가고, 총 꺾임은 32°다. 더한 것은 경사면 네 장이다. Mach 2.4에서 6°로 반복하면 0.5401, 램프 둘에 0.7440, 넷에 0.9096이다.

램프 수를 무한히 늘리고 각 꺾임을 0으로 보내면 압축은 등엔트로피에 가까워진다. 회수율 1이 이론상 열린다. Concorde와 SR-71이 곡면 램프와 이동 스파이크를 쓰는 자리다.

쪼개기는 공짜가 아니다#

램프를 스무 장 세우지 않는 이유가 따로 있다. 장을 더할 때마다 충격파가 카울 립에 닿는 점이 뒤로 밀린다. 흡입구가 길어지면 무게와 마찰이 붙는다. 회수율 몇 퍼센트를 동체 길이로 사는 거래는 대개 남는다.

각도는 특정 Mach에서 충격파가 립에 모이도록 맞춘다. 그 Mach를 벗어나면 충격파가 립 앞이나 안으로 어긋나고, 유출 항력이 생긴다. 장이 많을수록 이 어긋남에 민감하다.

각 충격파는 벽 경계층을 만나 압력을 갑자기 올린다. 그 간섭이 박리를 일으키면 계산된 회수율은 의미를 잃는다. 흡입구가 램프 근처에 흡입 슬롯을 두는 이유다.

엔진 압축기는 아음속 유입을 요구한다. 어딘가에서 음속을 지나야 하므로 종단 수직충격파는 지울 수 없다. 램프는 그 마지막 충격파의 Mach를 낮출 뿐, 충격파를 없애지 않는다. 램프 4개의 종단 충격파는 Mach 1.67에서 일어나고, 그 한 장이 13%를 가져간다.

마지막 수직충격파를 램프로 착각한 설계#

램프를 더 세워 회수율을 1에 붙이려는 선택은, 종단 충격파가 아직 0.12를 가져가는 자리를 못 본 것이다. 네 장이 깎은 0.05보다 그 한 장이 크다. 길이와 설계점 이탈을 더 주고 다섯 번째 장을 세우기 전에, 음속을 통과하는 그 장을 어느 Mach에서 만날지가 먼저다.

0.82는 충격파가 벽에 붙은 채로 센 숫자다. 경계층이 그 압력 상승을 못 버티고 떨어지면 표는 끝이다. 층이 갈라져 난류로 넘어가는 두께에서 그 박리가 어떤 높이로 시작하는지, 이 회수율은 말하지 않는다.

도움이 됐다면 공유해주세요.