Skip to content
cfd-lab:~/ko/posts/2026-05-26-jet-in-crossf…online
NOTE #055DAY TUE 유체역학DATE 2026.05.26READ 5 min readWORDS 2,408#Jet-in-Crossflow#Vortex#Wake#Strouhal#유동현상

굴뚝 연기는 왜 곧장 눕지 않고 말려 올라가는가 — 횡단류 제트와 역회전 와류쌍

옆바람을 가로지르는 제트가 콩팥 모양 와류쌍을 만드는 이유.

겨울 아침, 화력발전소 굴뚝에서 솟은 연기를 떠올려 보자. 처음엔 똑바로 오른다. 그러다 어느 높이에서 옆으로 꺾인다. 그 기둥을 가로로 잘라 보면 도넛도 원도 아닌, 콩팥 한 쌍처럼 생긴 소용돌이가 박혀 있다. 이 글은 옆바람을 가로지르는 제트(jet in crossflow, JICF)가 왜 이렇게 행동하는지를 따라간다. 궤적을 쥐고 흔드는 손잡이가 Reynolds 수가 아니라 속도비 rr이라는 것, 네 종류의 와류가 한 분류구에서 동시에 태어난다는 것, 그 주인공인 역회전 와류쌍(CVP)이 버섯 단면을 빚는 방식, 그리고 그 후류가 단단한 실린더보다 느린 박자로 와류를 떨군다는 사실까지 짚는다. 끝에는 NumPy 한 토막으로 궤적과 와류쌍의 유도장을 직접 찍어 본다.

굴뚝 연기는 왜 곧장 눕지 않고 말려 올라가는가#

옆바람 속으로 분사되는 제트는 우리 주변에 흔하다. 굴뚝 연기, 가스터빈 연소기의 연료 분사, 터빈 블레이드를 식히는 막냉각(film cooling), 강물이 바다로 쏟아지는 하구, 화산재 기둥, 수직이착륙기의 제트가 모두 같은 문제다.

핵심은 두 운동량의 싸움이다. 분류구 근처에서는 제트의 운동량이 세다. 그래서 거의 수직으로 솟는다. 위로 올라갈수록 옆바람이 제트를 계속 밀어붙인다. 어느 지점부터 옆바람이 이긴다. 기둥은 옆으로 꺾이고, 결국 옆바람 방향으로 눕는다.

그런데 그냥 눕기만 하는 게 아니다. 단면이 변형된다. 둥근 제트가 콩팥처럼 말린다. 그 말림 안에는 서로 반대로 도는 한 쌍의 소용돌이가 숨어 있다.

한 분류구에 네 개의 와류가 산다#

JICF의 와류는 한 종류가 아니다. Fric와 Roshko(1994)는 네 가지 서로 다른 와류계를 정리했다.

  • 전단층 와류(jet shear-layer vortices): 분류구 바로 위, 제트 경계의 원통형 전단층이 말려 만드는 고리. 가장 먼저 생긴다.
  • 역회전 와류쌍(counter-rotating vortex pair, CVP): 멀리 가서 단면을 지배하는 주인공. 콩팥/버섯 모양의 정체.
  • 말굽 와류(horseshoe vortex): 벽에 박힌 제트 기둥 앞에서, 마치 벽에 세운 장애물처럼 경계층이 감겨 만드는 말굽.
  • 후류 와류(wake vortices): 제트 뒤쪽에서 벽까지 이어지는 세로 와류. 단단한 실린더 뒤의 와열과 헷갈리지만, Fric와 Roshko는 이것이 제트가 아니라 벽 경계층의 박리에서 나온다는 것을 보였다.

이 네 개가 동시에 살아 있다는 점이 JICF를 단순한 실린더 후류와 결정적으로 다르게 만든다.

진짜 손잡이는 Reynolds가 아니다 — 속도비 r과 운동량 플럭스비 J#

제트가 얼마나 높이 뚫고 들어가는지를 정하는 것은 점성비, 즉 Reynolds 수가 아니다. 지배 변수는 속도비(velocity ratio)다.

r=vjur = \frac{v_j}{u_\infty}

여기서 vjv_j는 분류구 출구 속도, uu_\infty는 옆바람 속도다. 밀도가 다른 두 유체라면 더 적절한 척도는 운동량 플럭스비(momentum flux ratio)다.

J=ρjvj2ρu2J = \frac{\rho_j\, v_j^2}{\rho_\infty\, u_\infty^2}

여기서 ρj, ρ\rho_j,\ \rho_\infty는 각각 제트와 옆바람의 밀도다. 밀도가 같으면 J=r2J = r^2이 된다. Reynolds 수는 전단층이 언제 난류로 천이하는지, 와류의 잔주름이 얼마나 잘게 부서지는지 같은 디테일을 정할 뿐, 큰 그림인 궤적과 침투 깊이는 rr(또는 JJ)이 쥐고 있다.

궤적은 rd를 자로 삼는다#

수많은 실험이 한 결론으로 모인다. 제트 중심선의 평균 궤적은 거듭제곱 법칙을 따른다.

zrd=A(xrd)B\frac{z}{r d} = A \left( \frac{x}{r d} \right)^{B}

여기서 xx는 옆바람 방향 거리, zz는 높이, dd는 분류구 지름이다. 계수는 실험마다 A1.62.1A \approx 1.6\text{–}2.1, 지수는 B0.280.34B \approx 0.28\text{–}0.34 범위에 모인다(Pratte–Baines 1967, Margason 1993). 결정적인 것은 자(尺)다. 길이를 dd 하나가 아니라 **rdr d**로 재면 서로 다른 속도비의 궤적이 한 곡선으로 포개진다. 속도비가 크면 같은 x/dx/d에서 더 높이 올라간다.

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

The natural length scale is r·d, not d alone. Raise r and the plume punches higher before the crossflow bends it; the three pink ghosts are the trajectories for r = 2, 6, 10.

r을 2에서 10으로 올리면 제트가 꺾이기 전에 훨씬 높이 솟는다. 분홍색 유령 곡선 세 개는 r=2,6,10r = 2, 6, 10의 궤적이다. B를 바꾸면 굽는 모양새가 어떻게 휘는지 비교된다.

역회전 와류쌍 — 버섯 단면은 어떻게 생기나#

CVP는 제트의 원통형 전단층이 옆바람에 기울고 접히면서 만들어진다. 제트의 양옆 전단층이 재배열되어, 단면에서 서로 반대로 도는 두 와류가 된다. 둘 사이에서 유체는 위로 솟고, 바깥으로 말려 내려온다. 그 결과가 콩팥/버섯 단면이다.

세기는 제트의 순환 Γjvjd\Gamma_j \propto v_j d에 비례한다. 즉 제트가 빠를수록 와류쌍이 강하다. 그리고 소스 문서가 말하듯, CVP는 분류구 출구 아주 가까이에서 생겨나고, 후류로 갈수록 와도(渦度)가 확산되며 약해진다.

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

Left vortex spins counter-clockwise (+Γ), right clockwise (−Γ): between them the dye is pumped upward and folds outward into the kidney-shaped mushroom. Push the downstream slider toward 1 and diffusion saps Γ — the mushroom stalls, just as the real CVP weakens far from the exit.

왼쪽 와류는 반시계(+Γ+\Gamma), 오른쪽은 시계(Γ-\Gamma)로 돈다. 가운데 염료가 위로 솟아 바깥으로 접히며 버섯이 자란다. downstream 슬라이더를 1쪽으로 밀면 확산이 Γ\Gamma를 갉아먹어 버섯이 멈춘다 — 실제 CVP가 하류로 갈수록 약해지는 것과 같다.

실린더보다 게으른 박자 — JICF의 Strouhal 수#

후류 와류가 떨어지는 주파수 ff는 무차원 Strouhal 수로 정리된다.

St=fduSt = \frac{f\, d}{u_\infty}

여기서 ff는 와류 흘림 주파수, dd는 분류구 지름이다. 단단한 원기둥 뒤에서는 넓은 Reynolds 범위에서 St0.21St \approx 0.21로 거의 일정하다. 그런데 Hester 등(1971)이 아음속 풍동에서 측정한 JICF의 후류는 같은 크기 실린더의 절반에도 못 미치는 Strouhal 수를 보였다.

왜 게으른가. 실린더는 단단한 벽에서 깔끔하게 박리해 한 박자로 와류를 떨군다. JICF의 "장애물"은 단단한 벽이 아니라, 옆바람이 스며들 수 있는 휘청대는 유체 기둥이다. 게다가 후류 와류의 뿌리는 제트 자체가 아니라 벽 경계층이다. 유효 장애물이 물렁하니, 떨어지는 박자도 느려진다.

Python — 궤적과 CVP 유도장#

import numpy as np
 
def jet_trajectory(x, r, d=1.0, A=1.6, B=0.33):
    """횡단류 제트 평균 궤적: z/(rd) = A (x/(rd))^B,  x>=0."""
    rd = r * d
    x = np.asarray(x, dtype=float)
    return np.where(x > 0, A * rd * (x / rd) ** B, 0.0)
 
def cvp_velocity(y, z, gamma, b, zc=2.0, core=0.15):
    """역회전 와류쌍이 (y, z)에 유도하는 속도 (u_y, u_z).
    왼쪽 +Γ(반시계), 오른쪽 -Γ(시계) → 가운데서 위로 솟는다."""
    def one(y0, z0, g):
        dy, dz = y - y0, z - z0
        r2 = dy**2 + dz**2 + core**2
        return -g / (2 * np.pi) * dz / r2, g / (2 * np.pi) * dy / r2
    uy1, uz1 = one(-b / 2, zc, +gamma)
    uy2, uz2 = one(+b / 2, zc, -gamma)
    return uy1 + uy2, uz1 + uz2
 
if __name__ == "__main__":
    # 1) 같은 분류구라도 속도비 r이 크면 더 높이 뚫는다
    for r in (2, 4, 8):
        print(f"r={r:>2}: z(x=10d) = {jet_trajectory(10.0, r):.2f} d")
 
    # 2) 두 와류 사이 중심선은 위로, 바깥은 아래로 (mushroom)
    _, uz_c = cvp_velocity(0.0, 2.0, gamma=3.0, b=1.5)
    _, uz_e = cvp_velocity(1.5, 2.0, gamma=3.0, b=1.5)
    print(f"center (y=0): u_z = {uz_c:+.3f}  (>0 → 상승)")
    print(f"edge   (y=b): u_z = {uz_e:+.3f}  (<0 → 하강)")

실행하면 다음이 찍힌다.

r= 2: z(x=10d) = 5.44 d
r= 4: z(x=10d) = 8.66 d
r= 8: z(x=10d) = 13.78 d
center (y=0): u_z = +1.224  (>0 → 상승)
edge   (y=b): u_z = -0.401  (<0 → 하강)

속도비가 두 배, 네 배가 될수록 같은 하류 거리에서 더 높이 뚫는다. 그리고 와류쌍 한가운데는 위로, 가장자리는 아래로 — 버섯이 자라는 셈을 숫자가 그대로 보여준다.

다음에 굴뚝 연기를 보면#

  • JICF의 궤적을 쥔 손잡이는 Reynolds가 아니라 속도비 r=vj/ur = v_j/u_\infty(또는 운동량 플럭스비 JJ)다. 길이를 rdrd로 재면 서로 다른 제트의 궤적이 한 곡선으로 포개진다.
  • 한 분류구에서 네 와류(전단층 고리·CVP·말굽·후류)가 동시에 태어나고, 멀리서 단면을 지배하는 주인공은 가운데를 위로 퍼올리는 역회전 와류쌍이다.
  • JICF 후류의 Strouhal 수가 실린더의 절반에도 못 미치는 이유는, 유효 장애물이 단단한 벽이 아니라 옆바람이 스며드는 물렁한 유체 기둥이기 때문이다.

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