Skip to content
cfd-lab:~/ko/posts/2026-05-28-streamline-pa…● online
NOTE #055DAY THU 유체역학DATE 2026.05.28UPDATED 2026.10.19READ 5 min read#Flow-Visualization#Streamline#Material-Derivative#Euler-Lagrange#Flow-Phenomena

흐름의 세 가지 초상 — 유선·유적선·유맥선은 왜 갈라지는가

잉크 띠는 유맥선이다. 정상류에서도 가속은 대류항이 만들고, 국소항이 0이어도 목에서는 속도가 뛴다.

강물에 잉크를 한 줄기 흘리고 사진을 찍었다. 같은 순간 나뭇잎 하나의 궤적을 그렸다. 두 선은 달랐다. 흐름은 하나인데 그림이 둘이다. 유선·유적선·유맥선이 갈라지는 자리는 시간이고, 그 갈라짐은 물질미분(유체를 따라가며 보는 변화율)과 맞닿아 있다.

수축비 슬라이더를 0.25까지 내리면 목 근처 입자 속도가 4배로 뛴다.

Nothing in this field depends on time, so ∂u/∂t = 0 at every fixed point. Yet the pink parcel still accelerates into the throat — all of it from the convective term u·∂u/∂x.

그래도 ∂u/∂t\partial u/\partial t 막대는 0에 붙어 있다. 모든 가속이 파란 대류항에서 나온다는 뜻이다. 국소항이 0인데 입자는 빨라진다.

같은 흐름, 다른 세 장의 그림#

유동을 그림으로 남기는 방법은 하나가 아니다. 연구실에서는 보통 세 가지를 쓴다.

한 순간, 모든 점의 속도 방향을 잇는다. 입자 하나에 표식을 달고 발자취를 따라간다. 한 자리에서 염료를 계속 흘려 띠를 찍는다. 같은 흐름인데 결과가 늘 같지는 않다.

시간은 여기서 갈라진다. 흐름이 시간에 따라 변하면(비정상류), 세 그림은 서로 어긋난다. 변하지 않으면(정상류) 셋은 정확히 겹친다.

유선·유적선·유맥선 — 세 곡선의 정의#

세 곡선을 수식으로 분리해 보자. 속도장을 u(x,t)\mathbf{u}(\mathbf{x}, t)라 한다.

유선(streamline): 고정된 한 순간 tt에 모든 점에서 속도에 접하는 곡선이다.

dxu=dyv\frac{dx}{u} = \frac{dy}{v}

여기서 u,vu, v는 그 순간 속도의 성분이다. 시간을 멈춘 스냅사진이다.

유적선(pathline): 입자 하나를 시간 따라 적분한 실제 자취다.

dxdt=u(x,t)\frac{d\mathbf{x}}{dt} = \mathbf{u}(\mathbf{x}, t)

나뭇잎 한 장의 여행 기록이라고 보면 된다.

유맥선(streakline): 같은 점 x0\mathbf{x}_0를 거쳐 간 모든 입자들이 지금 어디에 있는지를 이은 선이다. 굴뚝에서 피어오르는 연기나 잉크 띠가 바로 이것이다. 관에 넣은 염료 줄도 같은 종류다. 물줄기가 흐트러지는 순간의 색소는 유선이 아니라 이 띠다.

정상류에서만 셋이 포개진다#

정상류는 속도장이 시간에 의존하지 않는 흐름, 즉 ∂u/∂t=0\partial \mathbf{u} / \partial t = 0인 경우다. 이때는 입자가 한번 어떤 점을 지나면, 뒤에 오는 입자도 똑같은 길을 밟는다. 길이 시간에 따라 바뀌지 않기 때문이다.

그래서 유적선과 유맥선이 같아진다. 유선도 매 순간 동일하므로 셋이 모두 겹친다. 우리가 교과서에서 보는 "깔끔한 유선 그림"은 사실 정상류라는 암묵적 가정 위에 서 있다.

비정상류에서는 이 가정이 깨진다. 먼저 지난 입자의 길과 나중 입자의 길이 다르고, 순간의 접선 방향도 매 순간 달라진다. 세 곡선은 그래서 벌어진다.

오일러와 라그랑주, 그리고 물질미분#

이 갈라짐의 뿌리에는 두 관점이 있다. 오일러 관점(공간의 고정점에서 관찰)과 라그랑주 관점(입자를 따라가며 관찰)이다. 유선은 오일러적이고, 유적선은 라그랑주적이다.

두 관점을 잇는 다리가 물질미분이다.

DϕDt=∂ϕ∂t+(u⋅∇)ϕ\frac{D\phi}{Dt} = \frac{\partial \phi}{\partial t} + (\mathbf{u}\cdot\nabla)\phi

ϕ\phi는 임의의 물리량, 우변 앞 항은 국소 변화율, 뒤 항은 대류 변화율이다. 앞항은 "고정점에서 시간에 따른 변화", 뒷항은 "입자가 자리를 옮겨서 생기는 변화"를 뜻한다.

직관이 어긋나기 쉬운 지점이 여기 있다. 정상류라 ∂u/∂t=0\partial \mathbf{u}/\partial t = 0이어도, 입자는 가속할 수 있다. 좁아지는 노즐을 생각해 보자. 고정점에서 보면 속도는 시간에 따라 변하지 않는다. 하지만 입자가 목으로 빨려 들어가면서 점점 빨라진다. 그 가속을 전부 만드는 것이 대류항 u ∂u/∂xu\,\partial u/\partial x다.

수축비 0.25의 4배와, 0에 붙은 국소항 막대는 글 앞의 슬라이더에서 이미 나왔다. 여기서 새로 볼 것은 그 4배를 만드는 항이 대류뿐이라는 점이다.

Python — 진동하는 흐름에서 세 곡선 그리기#

세 곡선을 한 번에 그려 보자. 횡방향 속도가 하류로 전파하는 파동인 흐름을 쓴다. u=Uu = U, v=V0cos⁡(ωt−kx)v = V_0\cos(\omega t - k x), 여기서 k=ω/Uk = \omega/U다. 이 흐름에서는 세 곡선이 깔끔하게 다른 모양을 가진다.

import numpy as np
 
U, V0, omega = 1.0, 0.6, 2.0
k = omega / U
 
def velocity(x, t):
    """하류로 전파하는 횡파동: (u, v) 반환"""
    return U, V0 * np.cos(omega * t - k * x)
 
def pathline(t0, t_end, dt=0.01):
    """t0에 원점에서 출발한 입자의 자취 (수치 적분)"""
    x, y, t = 0.0, 0.0, t0
    xs, ys = [x], [y]
    while t < t_end:
        u, v = velocity(x, t)
        x += u * dt; y += v * dt; t += dt
        xs.append(x); ys.append(y)
    return np.array(xs), np.array(ys)
 
def streakline(t_now, n=400):
    """t_now 시점 염료 띠: s<=t_now에 방출된 입자들의 현재 위치"""
    s = np.linspace(0.0, t_now, n)
    x = U * (t_now - s)
    y = V0 * np.cos(omega * s) * (t_now - s)   # 이 흐름에서의 정확해
    return x, y
 
def streamline_snapshot(t_now, x_max=10.0, n=400):
    """t_now 순간 원점을 지나는 유선"""
    x = np.linspace(0.0, x_max, n)
    y = (V0 / omega) * (np.sin(omega * t_now) - np.sin(omega * t_now - k * x))
    return x, y
 
t_now = 6.0
xp, yp = pathline(0.0, t_now)
xs, ys = streakline(t_now)
xl, yl = streamline_snapshot(t_now)
print(f"유적선 끝점   : ({xp[-1]:.2f}, {yp[-1]:.2f})")
print(f"유맥선 y 범위 : [{ys.min():.2f}, {ys.max():.2f}]")
print(f"유선   y 범위 : [{yl.min():.2f}, {yl.max():.2f}]")

출력은 세 곡선이 전혀 다른 영역을 차지함을 보여준다. 유적선은 직선으로 뻗고, 유선은 진폭 V0/ωV_0/\omega의 얕은 물결이며, 유맥선은 그보다 크게 출렁인다. 같은 흐름, 다른 세 그림이다.

코드의 숫자는 U=1, V0=0.6, ω=2, t_now=6이다. k=ω/U라 2다. 입자 위에서는 위상 ωt−kx가 상쇄된다. u가 U로 고정이면 x=Ut이고, kx=ωt가 되어 v=V0로 상수다. 그래서 유적선은 곡선이 아니라 직선 y=(V0/U)x=0.6x다. t=6이면 끝점은 (6, 3.6)이다. dt=0.01인 적분도 위상이 0인 한 매 스텝 같은 직선을 밟는다.

유선 식은 (V0/ω)에 사인 차이를 곱한다. V0/ω=0.6/2=0.3이다. 사인 차이는 −2와 2 사이라 y는 ±0.6을 넘지 못한다. 얕은 물결의 폭이 이 한계다. 그 끝에 닿으려면 kx가 한 바퀴 넘게 돌아야 한다. k=2이고 x는 0에서 10까지라 위상 폭은 20 라디안, 세 바퀴가 넘는다. t_now=6에서 ωt=12라 스냅샷 하나가 그 구간을 덮는다. ±0.6은 식의 장식이 아니라 이 창에서 닿는 끝이다.

유맥선은 y=V0 cos(ωs) 곱하기 (t−s)다. 코사인의 절댓값은 1을 넘지 않고, t−s는 6까지 자란다. |y|의 상한은 0.6 곱하기 6, 즉 3.6이다. 유선 한계 0.6의 여섯 배다. 같은 V0인데 유맥선만 크게 출렁이는 이유는, 방출 시각의 차이가 곱해지기 때문이다. 수축비 0.25는 면적비다. 비압축이면 속도는 면적의 역수라 목에서 4배가 된다. 그 4배는 국소항이 아니라 대류항이 전부 만든다.

직접 흔들어 보는 비정상성#

이제 시간을 살려서 세 곡선이 어떻게 벌어지는지 보자. 아래 시뮬레이션에서 진폭 V0V_0와 주파수 ω\omega를 조작해보자.

Field: u = U, v = V₀·cos(ωt − kx) with k = ω/U. Drag V₀ to 0 and the three curves collapse onto the axis — they only ever agree when the flow is steady.

V0V_0를 0으로 내리면 세 곡선이 축 위로 포개진다. 정상류로 돌아간 것이다. V0V_0와 ω\omega를 키우면 노란 유선은 빠르게 물결치고, 분홍 유적선은 곧게 뻗으며, 청록 유맥선은 또 다른 파형을 그린다. 비정상성이 클수록 세 초상은 멀어진다.

잉크 띠를 유선으로 읽으면 방향이 틀린다#

사진 속 잉크를 유선이라고 적으면, 속도의 접선을 지금 염료가 있는 곳으로 읽게 된다. 비정상류에서 그 둘은 다르다. 유선은 시간을 멈춘 단면이고, 유맥선은 한 자리를 지나간 입자들의 현재다. 물질미분 D/Dt=∂/∂t+u⋅∇D/Dt = \partial/\partial t + \mathbf{u}\cdot\nabla의 대류항은 정상류에서도 가속을 만든다. 국소항이 0이라는 이유만으로 입자가 등속이라고 쓰면, 노즐의 4배가 빠진다.

정상류라면 셋은 겹친다. 다르면 흐름이 시간에 따라 변하고 있다는 신호다. 굴뚝이 연기를 끌어올리는 부력을 재기 전에, 그 연기가 유맥선인지부터 고른다. 띠를 유선으로 두면 방향이 틀린다.

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