Skip to content
cfd-lab:~/ko/posts/2026-09-05-hypersonic-sp…online
NOTE #151DAY SAT 논문리뷰DATE 2026.09.05READ 6 min read#Shock-Surfing#Hypersonic#FSI#Compressible#Paper-Review

[논문 리뷰] 두 파편은 밀어내지 않고 붙어서 날았다 — Mach 20 구 쌍의 144° 평형각

파편 쌍의 분리 속도를 정하는 것은 반발력의 크기가 아니라, 접촉을 유지시키는 모멘트의 부호다.

운석이 대기권에서 두 조각으로 깨졌다고 하자. 두 조각은 서로 멀어질까? 답이 "항상 그렇다"였다면 지상의 크레이터 밭을 역산하는 일은 훨씬 쉬웠을 것이다. Whalen·Deiterding·Laurence가 JFM 2026(vol. 1029, A35)에 실은 Mach 20 계산은 그 답을 흔든다. 어떤 정렬각에서는 두 구가 붙은 채로 함께 날아가고, 심지어 쌍 전체가 양력을 낸다. 이 글은 그 각도가 어디서 오는지를 30줄짜리 Newton 근사로 재현한다. 나온 값은 143.6°였고, 논문의 안정 구간 132°–145.7° 안에 들어 있었다.

Q1. 파편 두 개짜리 문제가 왜 아직 열려 있는가#

운석 파편 계산에는 오래된 두 갈래가 있다. 조각이 몇 개뿐이면 각 조각을 따로 추적하는 discrete-fragment 접근을 쓴다. 조각이 사실상 무한하면 덩어리를 액체처럼 눌러 퍼뜨리는 debris-cloud(파편운) 접근을 쓴다. Passey와 Melosh가 1980년에 제시한 이체 모형이 전자의 원형이다. 두 구가 순수하게 옆으로만 밀려난다고 놓으면 최종 횡방향 속도는 다음 비례식으로 정리된다.

VTVρa/ρmV_T \propto V\sqrt{\rho_a/\rho_m}

VV는 진입 속도, ρa\rho_a는 대기 밀도, ρm\rho_m은 운석 밀도다. 남는 것은 비례상수 하나인데, 지상 크레이터 밭에서 역산한 값이 0.03에서 2.28까지 벌어졌다. 두 자릿수 폭이다.

문제는 그 사이다. 조각이 2개도 아니고 수천 개도 아닌 중간 개체수 영역은 거의 비어 있었다. 논문은 그 구간을 정면으로 겨눈다. 같은 크기의 구를 2개·4개·13개로 규칙 배열해 놓고, 초기 자세만 바꿔가며 83번을 계산했다. 유동은 AMROC이 Euler 방정식을 embedded boundary로 풀고, 구는 DYNA3D가 접촉까지 포함해 푼다. 기체는 γ=1.4\gamma=1.4 완전기체, 유입 Mach 20, 구와 기체의 밀도비는 10410^4이다. 격자는 밀도 구배를 따라 자동으로 세밀해진다. 이 방식의 비용 구조는 AMR 태깅과 리플럭싱에서 다룬 것과 같다.

아래 시뮬레이션에서 직접 조작해보자.

theta 170.0°C_M 0.0000L/D 0.000C_D 0.000omega 0.00°/tequilibrium 0.0°
Set theta_0 anywhere and press release. Watch the curved torque arrow: it is green wherever the pair is being opened and red wherever it is being closed, and it vanishes only on the dashed line. Drop damping to zero and the pair never settles — it swings through the equilibrium angle forever. Start at exactly 180° and nothing happens at all, until you nudge it.

정렬각 θ0\theta_0를 아무 데나 놓고 release를 누르면 된다. 굽은 화살표가 초록이면 쌍이 벌어지는 방향, 빨강이면 닫히는 방향이다. 오른쪽 곡선이 0을 가로지르는 한 점으로 모든 초기 각도가 빨려 들어간다.

Q2. 붙어 있는 쌍은 왜 하필 한 각도로 가는가#

정렬각 θ\theta는 자유류 방향과 "이차 구 → 일차 구" 선분 사이의 각으로 정의한다. θ=180\theta = 180^\circ면 뒤쪽 구가 앞쪽 구의 후류에 정확히 들어앉는다. θ=90\theta = 90^\circ면 나란히 선다.

두 구가 접촉을 유지하는 동안은 하나의 강체로 봐도 된다. 이때 접촉력은 내력이라 쌍 전체의 모멘트에서 사라진다. 남는 것은 공력 모멘트뿐이다.

Mcom=i=12Si(xxcom)×(Cpn^)dA\mathbf{M}_{\rm com} = \sum_{i=1}^{2}\oint_{S_i}(\mathbf{x}-\mathbf{x}_{\rm com})\times\bigl(-C_p\,\hat{n}\bigr)\,\mathrm{d}A

SiS_i는 각 구의 표면, n^\hat{n}은 바깥 법선, xcom\mathbf{x}_{\rm com}은 쌍의 질량중심이다. 평형 조건은 이 값이 0이라는 것뿐이고, 안정성은 그 근처에서의 부호가 결정한다.

θ=180\theta = 180^\circ부터 보자. 상류 구는 자유류를 정면으로 받고, 하류 구는 완전히 가려져 항력이 거의 0이다. 두 구의 항력 차이가 질량중심에서 벗어난 위치에 걸리므로, 각도가 조금만 틀어지면 그 틀어짐을 키우는 방향으로 모멘트가 생긴다. 불안정 평형이다. 논문도 180°에서는 자세 변화가 관측되지 않았다고 적으면서, 상류 구의 항력이 더 크므로 불안정할 것이라고 덧붙인다.

반대편 θ=90\theta = 90^\circ는 대칭이라 모멘트가 정확히 0이다. 그렇다면 그 사이 어딘가에 부호가 뒤집히는 지점이 있어야 한다. 그 지점이 안정 평형각이다.

Q3. Newton 근사만으로 그 각도가 나오는가#

극초음속에서는 압력 분포를 Newton 충돌 이론으로 근사할 수 있다. 유동 입자가 표면에 부딪혀 법선 방향 운동량을 모두 잃는다고 보면 압력계수는 다음과 같다.

Cp=Cp,max(u^n^)2,Cp,max=1.8394C_p = C_{p,\max}\,(\hat{u}\cdot\hat{n})^2, \qquad C_{p,\max} = 1.8394

u^\hat{u}는 자유류 단위벡터, n^\hat{n}은 표면 바깥 법선이고, u^n^<0\hat{u}\cdot\hat{n}<0인 바람받이 면에서만 유효하다. Cp,maxC_{p,\max}γ=1.4\gamma=1.4, MM\to\infty의 정체점 값이다. 여기에 가림 판정 한 줄만 더한다. 어떤 면이 다른 구 뒤에 숨어 있으면 압력은 0으로 둔다.

구면을 Fibonacci 격자로 2.4만 개 패널로 쪼개고 90°부터 180°까지 1°씩 훑었다.

import math
 
CP_MAX = 1.8394          # 수정 Newton 이론, gamma=1.4, M -> 무한대
R = 1.0                  # 구 반지름
N_PANEL = 24000
 
 
def fib_sphere(n):
    """단위 구면 위의 거의 균일한 점들 + 패널 하나의 면적."""
    pts, ga = [], math.pi * (3.0 - math.sqrt(5.0))
    for i in range(n):
        z = 1.0 - 2.0 * (i + 0.5) / n
        rho = math.sqrt(max(0.0, 1.0 - z * z))
        a = ga * i
        pts.append((rho * math.cos(a), rho * math.sin(a), z))
    return pts, 4.0 * math.pi / n
 
 
PANELS, DA = fib_sphere(N_PANEL)
 
 
def pair_geometry(theta_deg):
    """이차(하류) 구가 원점, 일차 구는 n_hat 방향으로 2R.
    theta = 자유류 x_hat 과 '이차 -> 일차' 선분 사이의 각."""
    t = math.radians(theta_deg)
    n_hat = (math.cos(t), math.sin(t), 0.0)
    return (0.0, 0.0, 0.0), tuple(2.0 * R * c for c in n_hat), n_hat
 
 
def shadowed(px, py, pz, cx, cy, cz):
    """c에 있는 구에 가려 자유류를 못 보는 점인가?
    광선은 +x로 흐르므로 -x로 거슬러 올라가 원기둥 판정을 한다."""
    if cx >= px:
        return False
    return (py - cy) ** 2 + (pz - cz) ** 2 < R * R
 
 
def newtonian_cp(nx):
    """nx = 바깥 법선의 x성분. nx < 0 이면 바람받이 면."""
    return CP_MAX * nx * nx if nx < 0.0 else 0.0
 
 
def pair_loads(theta_deg):
    """각 구의 힘계수와 쌍의 질량중심 기준 모멘트.
    기준값: 힘은 q_inf * pi * R^2, 모멘트는 거기에 2R을 곱한 값."""
    cs, cp, _ = pair_geometry(theta_deg)
    com = tuple(0.5 * (a + b) for a, b in zip(cs, cp))
    out = []
    for me, other in ((cs, cp), (cp, cs)):
        fx = fy = mz = 0.0
        for ux, uy, uz in PANELS:
            cpv = newtonian_cp(ux)
            if cpv == 0.0:
                continue
            x, y, z = me[0] + R * ux, me[1] + R * uy, me[2] + R * uz
            if shadowed(x, y, z, other[0], other[1], other[2]):
                continue
            dfx, dfy = -cpv * ux * DA * R * R, -cpv * uy * DA * R * R
            fx += dfx
            fy += dfy
            mz += (x - com[0]) * dfy - (y - com[1]) * dfx
        s = math.pi * R * R
        out.append((fx / s, fy / s, mz / (s * 2.0 * R)))
    return out
 
 
def sweep_alignment(lo, hi, step):
    rows, t = [], lo
    while t <= hi + 1e-9:
        (dxs, dys, ms), (dxp, dyp, mp) = pair_loads(t)
        cd, cl, cm = dxs + dxp, dys + dyp, ms + mp
        rows.append((t, cd, cl, cm, dxp, dxs))
        t += step
    return rows
 
 
SLOPE_FLOOR = 5.0e-5     # 적분 잡음. 진짜 교차는 이보다 훨씬 가파르다
 
 
def stable_window(rows):
    """C_M의 영점 중 기울기가 잡음을 넘는 것만 남긴다."""
    hits = []
    for (t0, _, _, m0, _, _), (t1, _, _, m1, _, _) in zip(rows, rows[1:]):
        if m0 * m1 >= 0.0 or abs(m1 - m0) < SLOPE_FLOOR * (t1 - t0):
            continue
        te = t0 + (t1 - t0) * (-m0) / (m1 - m0)
        hits.append((te, "stable" if m1 < m0 else "unstable", m1 - m0))
    return hits
 
 
rows = sweep_alignment(90.0, 180.0, 1.0)
 
print("theta   C_D    C_L     C_M      L/D    C_D,up  C_D,down")
for t, cd, cl, cm, dxp, dxs in rows:
    if abs(t % 7.5) < 1e-9:
        print(f"{t:5.1f} {cd:6.3f} {cl:7.3f} {cm:8.4f} {cl / cd:7.3f} "
              f"{dxp:7.3f} {dxs:8.3f}")
 
print()
for te, kind, slope in stable_window(rows):
    print(f"C_M = 0 at theta = {te:6.2f} deg  slope {slope:+.2e}/deg  -> {kind}")
 
eq = [h[0] for h in stable_window(rows) if h[1] == "stable"][0]
near = min(rows, key=lambda r: abs(r[0] - eq))
print(f"\nat the stable angle: L/D = {near[2] / near[1]:.3f}, C_D = {near[1]:.3f}")
lo = min(r[0] for r in rows if r[3] > SLOPE_FLOOR)
print(f"restoring sign holds from theta = {lo:.1f} deg up to the equilibrium")
print(f"tandem (180 deg): C_D,up = {rows[-1][4]:.3f}, C_D,down = {rows[-1][5]:.3f}")
theta   C_D    C_L     C_M      L/D    C_D,up  C_D,down
 90.0  1.839   0.000   0.0000   0.000   0.920    0.920
105.0  1.839   0.003   0.0000   0.002   0.920    0.919
120.0  1.819   0.037   0.0003   0.020   0.920    0.899
135.0  1.714   0.128   0.0007   0.075   0.920    0.794
150.0  1.459   0.215  -0.0020   0.147   0.920    0.539
165.0  1.112   0.170  -0.0122   0.152   0.920    0.193
180.0  0.920   0.000  -0.0000   0.000   0.920    0.000
 
C_M = 0 at theta = 143.61 deg  slope -2.09e-04/deg  -> stable
 
at the stable angle: L/D = 0.119, C_D = 1.580
restoring sign holds from theta = 111.0 deg up to the equilibrium
tandem (180 deg): C_D,up = 0.920, C_D,down = 0.000

143.61°가 나왔다. 논문이 계수·모멘트 이력을 뒤져 찾아낸 안정 구간은 132°–145.7°이고, 접촉 쌍의 양항비 최대점은 141.5°다. 격자도 없고 충격파도 없는 30줄이 그 안에 들어갔다.

양항비는 0.119로, 논문의 안정 구간 평균 0.197과 최대 0.22보다 낮다. 차이가 나는 이유는 분명하다. Newton 근사는 충격파-충격파 간섭을 모른다. 논문 그림에서 두 구 사이 안쪽 면에 생기는 고압 반점은 두 활꼴 충격파가 만나 만든 것인데, 이 모형에는 그런 자리가 없다. 사교충격파 열에서 봤듯이 충격파가 겹치는 자리의 압력은 단순 합보다 크다. 그러니 이 코드가 맞힌 것은 크기가 아니라 부호와 위치다.

표에서 부호가 바뀌는 곳도 읽어둘 만하다. CLC_L은 150°에서 0.215로 최대인데 CMC_M은 그보다 앞선 143.6°에서 0을 지난다. 양력이 가장 큰 자세와 스스로 유지되는 자세는 같지 않다.

Q4. 떨어진 뒤 옆으로 미는 힘은 어디서 오는가#

접촉이 끊기면 이야기가 바뀐다. 두 구가 처음부터 나란히 서 있었다면(90° 근처) 공통 활꼴 충격파가 안쪽 면을 눌러 서로 밀어낸다. 이 상호 반발은 간격이 벌어지면 금방 사라지고, 논문의 무차원 횡방향 속도는 0.2 언저리에서 멈춘다.

그런데 뒤쪽 구가 앞쪽 구의 충격파에 걸터앉으면 다른 일이 벌어진다. 충격파 바로 뒤는 압력이 높고 바깥쪽은 자유류다. 구가 그 경계를 반씩 물고 가면 바깥으로 미는 힘이 계속 걸린다. Laurence와 Deiterding이 2011년에 shock surfing(충격파 서핑)이라 이름 붙인 현상이다. 논문에서 이 효과는 최종 횡방향 속도를 0.2에서 0.25로 올리고, 분리에 걸리는 시간을 1.7τs1.7\tau_s에서 4τs4\tau_s로 늘린다.

시간과 속도의 기준은 다음과 같다.

τs=ρsphρrcu\tau_s = \sqrt{\frac{\rho_{\rm sph}}{\rho_\infty}}\,\frac{r_c}{u_\infty}

rcr_c는 클러스터 외접 반지름이다. 밀도비가 10410^4이므로 τs\tau_s는 통과 시간의 100배다. 이 척도로 무차원화하면 상대 운동방정식은 계수 하나만 남는다.

dVdt=38(CF,trailCF,lead)\frac{\mathrm{d}V'}{\mathrm{d}t'} = \frac{3}{8}\bigl(C_{F,\rm trail} - C_{F,\rm lead}\bigr)

3/83/8은 구의 부피와 단면적 비에서 나온 값이고, 밀도비는 척도 안으로 전부 흡수됐다. 아래 애니메이션은 이 방정식을 그대로 적분한다.

t' 0.00V'_T 0.000no surf 0.000gap 0.00 rtheta 150°free
Drag the release angle from 90° upward. Near 90° the two curves sit on top of each other — the shared bow shock does all the work and surfing has nothing to add. Past about 135° the amber curve lifts off the dashed one, and the sphere outline glows exactly while it is straddling the pink shock line. At 180° nothing separates at all.

release angle을 90°에서 위로 끌어보자. 90° 부근에서는 실선과 점선이 겹쳐 있다. 공통 충격파가 일을 다 하고 서핑이 보탤 것이 없다는 뜻이다. 135°를 넘기면서 두 곡선이 갈라지고, 구의 테두리는 분홍 충격파 선을 물고 있는 동안에만 밝아진다.

접촉 구간의 거동도 이 모형에 들어 있다. 165°에서 놓으면 두 구는 3–4τs\tau_s 동안 붙어서 구르다가 정렬각이 120° 근처로 내려온 뒤에야 떨어진다. 논문이 보고한 접촉 지속 4–6τs\tau_s, 접촉 해제 각 130° 부근과 대체로 맞는다. 항력이 후류에서 급감하는 방식은 항력 위기에서 본 단일 구의 항력 곡선과는 다른 문제다. 여기서는 박리점이 아니라 가림이 원인이다.

Q5. 그래서 180°에서는 왜 아무 일도 없는가#

정확히 정렬된 탠덤은 대칭이다. 횡방향 힘도 0, 모멘트도 0이다. 계산은 8τs\tau_s 동안 두 구가 붙은 채 자세를 전혀 바꾸지 않는 것으로 끝난다. 논문의 관측도 같다.

하지만 이것은 연필을 세워둔 것과 같은 평형이다. 상류 구의 항력이 하류 구보다 크므로(위 표에서 0.920 대 0.000) 조금만 기울면 그 기울기를 키우는 모멘트가 붙는다. 실제 계산에서는 172.5°에서 놓아도 초기에는 거의 움직이지 않다가 점점 빨라지는 "구르는" 운동이 나타나고, 결국 접촉이 끊긴다.

여기서 실무적으로 중요한 값이 하나 나온다. 접촉을 유지한 채 양력을 낸 쌍은 질량중심 자체가 옆으로 밀린다. 논문은 150°·157.5°·172.5°에서 놓은 쌍의 질량중심 횡방향 속도가 각각 0.42·0.32·0.28로, 개별 파편의 상대 속도보다 크다고 적는다. 파편 하나하나의 반발만 세면 이 성분은 통째로 빠진다.

13개까지 갔을 때 남는 것#

논문은 4개 사면체 배열 38가지, 13개 면심입방 배열 34가지로 같은 조사를 이어간다. 개별 구의 최종 횡방향 속도는 초기 극각 하나로 꽤 잘 정리되고, 이 경향은 4개와 13개에서 비슷하게 나타난다. 다만 클러스터 전체의 뭉툭함이 벌크 거동에 미치는 영향은 개체수가 늘수록 옅어진다. 조각이 많아질수록 분리가 균질해진다는 뜻이고, 이는 debris-cloud 접근이 어디서부터 쓸 만해지는지에 대한 힌트다.

정리하면, 파편 쌍의 분리를 지배하는 것은 반발력의 크기가 아니다. 접촉이 언제 끊기느냐이고, 그것을 정하는 것은 모멘트의 부호다. 그리고 그 부호는 격자 없이도 알 수 있다. 표면 압력을 Newton 근사로 놓고 가림만 제대로 세면, 두 구가 스스로 찾아가는 각도가 143.6°라는 답이 30줄 안에서 나온다.

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