Skip to content
cfd-lab:~/ko/posts/2026-09-03-bernoulli-con…online
NOTE #149DAY THU 유체역학DATE 2026.09.03READ 5 min read#Crocco-Theorem#Bernoulli#Vorticity#Total-Pressure#Historical

총압이 1,080 Pa 떨어진 곳의 소산은 0이었다 — 베르누이 상수가 유선을 가로지를 때

총압이 유선을 가로질러 변하는 것은 손실이 아니라 와도다. 손실은 총압이 유선을 따라 변할 때만 생긴다.

1738년, 아버지는 아들 책의 출판연도를 6년 앞당겼다#

Daniel Bernoulli는 1738년 『Hydrodynamica』를 냈다. 표지에는 "Johann의 아들"이라고 적었다. 아버지와 화해하고 싶었기 때문이다. 아버지 Johann은 거의 같은 내용을 『Hydraulica』로 따로 출판하면서 출판업자를 압박해 발행연도를 1732년으로 찍었다. 아들보다 6년 앞선 것처럼 보이게 만든 것이다.

한 세기 반 뒤 Horace Lamb이 정리를 붙였다. 오일러 방정식을 적분하면 베르누이 정리가 나온다는 것이다. 부자가 싸운 두 권이 사실 같은 식의 두 얼굴이었다. 그런데 이 "적분하면"에는 조건이 하나 붙어 있고, CFD 후처리에서 총압 컨투어를 오독하게 만드는 원인이 정확히 그 조건이다.

이 글은 그 조건을 Rankine 와류 하나로 잰다. 결론부터 적으면, 회전하는 코어 안에서 총압은 1,080 Pa 떨어지지만 점성 소산은 정확히 0이다. 그리고 총압이 완벽하게 평평한 바깥에서는 소산이 0이 아니다. 두 가지가 반대로 나온다.

아래 시뮬레이션에서 탐침을 코어 안팎으로 직접 옮겨보자.

u = 0.00 m/sp = 0.0 Pap0 = 0.0 Pad(p0)/dr = 0.0rho u omega = 0.0phi = 0.0000 W/m^3
Drag probe r across the dashed core edge. Inside the core the two right-hand numbers stay equal and nonzero, so p0 climbs with r while the red element rotates without changing shape. Outside, both go to zero — p0 is perfectly flat — yet the purple element keeps shearing, which is where a viscous fluid would actually lose energy.

probe r를 움직이면서 오른쪽 그래프의 초록색 p0p_0 곡선이 어디서 평평해지는지를 본다. 그리고 캔버스 왼쪽의 사각형이 언제 모양을 유지하고 언제 찌그러지는지를 같이 본다. 두 관찰이 서로 어긋나는 지점이 이 글의 주제다.

오일러 방정식을 적분하면 베르누이가 된다 — 어느 방향으로?#

밀도가 일정하고 체적력이 없는 정상 비점성 유동의 운동방정식은 이렇다.

(u)u=1ρp(\mathbf{u}\cdot\nabla)\mathbf{u} = -\frac{1}{\rho}\nabla p

u\mathbf{u}는 속도, pp는 압력, ρ\rho는 밀도다. 좌변에 벡터 항등식을 쓴다.

(u)u= ⁣(u22)u×ω(\mathbf{u}\cdot\nabla)\mathbf{u} = \nabla\!\left(\frac{|\mathbf{u}|^2}{2}\right) - \mathbf{u}\times\boldsymbol{\omega}

ω=×u\boldsymbol{\omega} = \nabla\times\mathbf{u}는 와도다. 두 식을 합치고 총압 p0=p+12ρu2p_0 = p + \tfrac{1}{2}\rho|\mathbf{u}|^2로 묶으면 남는 것은 한 줄이다.

p0=ρu×ω\nabla p_0 = \rho\,\mathbf{u}\times\boldsymbol{\omega}

이것이 Crocco 형태의 오일러 방정식이다(비압축·등엔트로피 조건). 오른쪽이 0이 아니면 총압은 공간에서 변한다. 그런데 어느 방향으로 변하는지가 핵심이다.

u×ω\mathbf{u}\times\boldsymbol{\omega}u\mathbf{u}에 수직이다. 그래서 양변에 u\mathbf{u}를 내적하면 오른쪽이 사라진다.

up0=0\mathbf{u}\cdot\nabla p_0 = 0

유선을 따라가면 p0p_0는 언제나 상수다. 와도가 있든 없든 상관없다. 이것이 베르누이 정리의 정확한 범위다. 반대로 p0p_0모든 곳에서 같으려면 u×ω=0\mathbf{u}\times\boldsymbol{\omega} = 0이어야 하고, 실질적으로 비회전 유동을 뜻한다. 부자가 싸운 두 권의 차이는 여기에 없었고, 조건은 Lamb이 붙인 각주 쪽에 있었다.

Rankine 와류: 도는 코어와 돌지 않는 바깥#

이 조건이 한 유동 안에서 동시에 켜지고 꺼지는 예가 Rankine 와류다. 반지름 aa 안쪽은 강체처럼 돌고, 바깥은 자유 와류다.

uθ(r)={Ωr,r<aΩa2/r,raωz(r)={2Ω,r<a0,rau_\theta(r) = \begin{cases} \Omega r, & r < a \\ \Omega a^2 / r, & r \ge a \end{cases} \qquad \omega_z(r) = \begin{cases} 2\Omega, & r < a \\ 0, & r \ge a \end{cases}

Ω\Omega는 코어의 각속도, uθu_\theta는 원주방향 속도다. 압력은 반지름 방향 운동량 dp/dr=ρuθ2/r\mathrm{d}p/\mathrm{d}r = \rho u_\theta^2 / r을 적분해서 얻는다. 바깥에서는 압력이 떨어지는 양과 동압이 오르는 양이 정확히 상쇄되어 p0p_0pp_\infty로 고정된다. 코어 안에서는 상쇄되지 않는다.

p0(r)p=ρΩ2(r2a2),r<ap_0(r) - p_\infty = \rho\Omega^2 (r^2 - a^2), \qquad r < a

r=0r = 0에서 결손은 ρΩ2a2\rho\Omega^2 a^2, 즉 코어 가장자리 속도의 제곱에 ρ\rho를 곱한 값이다. ρ=1.2\rho = 1.2, Ω=60s1\Omega = 60\,\mathrm{s^{-1}}, a=0.5ma = 0.5\,\mathrm{m}이면 umax=30u_{\max} = 30 m/s이고 결손은 1,080 Pa다.

Python으로 두 변을 같은 반지름에서 재봤다#

p0\nabla p_0를 중심차분으로 구해 ρuθωz\rho\,u_\theta\omega_z와 맞춰본다. 소산함수 ϕ=μ(2Srθ)2\phi = \mu(2S_{r\theta})^2도 같이 잰다.

import math
 
RHO, MU = 1.2, 1.8e-5      # kg/m^3, Pa*s
OMEGA, A = 60.0, 0.5       # 1/s, m   -> u_max = 30 m/s
P_INF = 101325.0           # Pa
 
def rankine_velocity(r):
    return OMEGA * r if r < A else OMEGA * A * A / r
 
def rankine_spin(r):
    return 2.0 * OMEGA if r < A else 0.0
 
def rankine_pressure(r):
    if r >= A:
        return P_INF - 0.5 * RHO * (OMEGA * A * A / r) ** 2
    return P_INF - RHO * OMEGA**2 * A**2 + 0.5 * RHO * OMEGA**2 * r**2
 
def total_head(r):
    return rankine_pressure(r) + 0.5 * RHO * rankine_velocity(r) ** 2
 
def shear_dissipation(r):
    s = 0.0 if r < A else -OMEGA * A * A / r**2   # 2*S_rtheta
    return MU * s * s
 
def crocco_residual(r, h=1e-6):
    lhs = (total_head(r + h) - total_head(r - h)) / (2 * h)   # d(p0)/dr
    rhs = RHO * rankine_velocity(r) * rankine_spin(r)         # rho*(u x omega)_r
    return lhs, rhs
 
print("  r[m]   u[m/s]   p[Pa]      p0[Pa]     dp0/dr    rho*u*w    phi[W/m^3]")
for r in (0.10, 0.25, 0.40, 0.60, 1.00):
    lhs, rhs = crocco_residual(r)
    print("%6.2f %8.2f %10.1f %10.1f %9.1f %10.1f %11.4f"
          % (r, rankine_velocity(r), rankine_pressure(r), total_head(r),
             lhs, rhs, shear_dissipation(r)))
 
def bernoulli_gap(r1, r2):
    return total_head(r2) - total_head(r1)
 
print()
print("core  p0(0.00) - p0(%.2f) = %8.1f Pa" % (A, total_head(0.0) - total_head(A)))
print("outer p0(%.2f) - p0(1.00) = %8.1f Pa" % (A, total_head(A) - total_head(1.0)))
print("cross-streamline gap r=0.10 -> 0.40 : %8.1f Pa" % bernoulli_gap(0.10, 0.40))
print("along-streamline  gap r=0.40 -> 0.40 : %8.1f Pa" % bernoulli_gap(0.40, 0.40))
print("dissipation at r=0.25 (core)  : %.4f W/m^3" % shear_dissipation(0.25))
print("dissipation at r=0.60 (outer) : %.4f W/m^3" % shear_dissipation(0.60))
  r[m]   u[m/s]   p[Pa]      p0[Pa]     dp0/dr    rho*u*w    phi[W/m^3]
  0.10     6.00   100266.6   100288.2     864.0      864.0      0.0000
  0.25    15.00   100380.0   100515.0    2160.0     2160.0      0.0000
  0.40    24.00   100590.6   100936.2    3456.0     3456.0      0.0000
  0.60    25.00   100950.0   101325.0       0.0        0.0      0.0313
  1.00    15.00   101190.0   101325.0       0.0        0.0      0.0040
 
core  p0(0.00) - p0(0.50) =  -1080.0 Pa
outer p0(0.50) - p0(1.00) =      0.0 Pa
cross-streamline gap r=0.10 -> 0.40 :    648.0 Pa
along-streamline  gap r=0.40 -> 0.40 :      0.0 Pa
dissipation at r=0.25 (core)  : 0.0000 W/m^3
dissipation at r=0.60 (outer) : 0.0313 W/m^3

4번째와 5번째 열이 모든 반지름에서 같다. Crocco 관계가 소수점 자리까지 맞는다. 그리고 코어 안에서 r=0.10r = 0.10r=0.40r = 0.40 사이의 총압 차이가 648 Pa다. 같은 반지름의 두 각도 사이에서는 0이다. 베르누이를 유선을 따라 쓰면 맞고, 가로질러 쓰면 648 Pa를 놓친다.

총압이 평평한 곳에서 소산이 0이 아니었다#

마지막 열이 뒤집혀 있다. 총압이 1,080 Pa 떨어지는 코어 안의 소산이 0이고, 총압이 정확히 평평한 바깥의 소산이 0이 아니다.

이유는 소산이 회전이 아니라 변형에 붙어 있기 때문이다. 강체회전은 유체 요소를 돌리기만 하고 찌그러뜨리지 않는다. 변형률 텐서가 0이므로 ϕ=0\phi = 0이다. 자유 와류는 반대다. 와도는 0이지만 uθ1/ru_\theta \propto 1/r이라 안쪽과 바깥쪽이 다른 속도로 지나간다. 요소는 계속 전단된다.

위 시뮬레이션의 사각형이 이것을 그대로 보여준다. 코어 안(빨간색)에서는 정사각형이 그대로 돌고, 바깥(보라색)에서는 평행사변형으로 무너진다. 회전계에서 무엇이 보존되고 무엇이 아닌지를 코리올리 힘과 로탈피에서 다룬 적이 있는데, 여기서도 축은 같다. 도는 것과 일하는 것은 다른 장부에 적힌다.

다섯 가지 유동을 같은 표에 올린다#

와도와 소산은 독립이다. 네 조합이 모두 실재한다.

유동ω\boldsymbol{\omega}유선 따라 p0p_0유선 가로질러 p0p_0점성 소산
균일류0일정일정0
자유 와류 (r>ar > a)0일정일정> 0
Rankine 코어 (r<ar < a)2Ω2\Omega일정1,080 Pa 변함0
전단 입구, 비점성0\ne 0일정변함0
점성 웨이크0\ne 0감소변함> 0

표에서 굵게 표시한 칸이 하나뿐이라는 점이 중요하다. 손실이라고 부를 수 있는 것은 유선을 따라 p0p_0가 줄어드는 경우뿐이다. 나머지 네 줄에서 p0p_0가 공간적으로 변하는 것은 전부 와도의 기하학이지 에너지가 사라진 것이 아니다.

총압 컨투어가 두 가지 이유로 같아 보일 때#

실무에서 이 구분이 깨지는 자리는 출구 단면의 총압 컨투어다. 대기경계층이나 발달한 관유동을 입구조건으로 주면 첫 셀부터 p0p_0yy 방향으로 변한다. 손실은 아직 0이다. 웨이크가 만든 총압 결손도 같은 컨투어로 그려진다. 이쪽은 진짜 손실이다.

아래에서 두 채널을 같은 색 스케일로 나란히 돌려보자.

A spread 0 PaA loss 0 PaB spread 0 PaB loss 0 Pa
Press match outlet spread — the two outlet profiles now cover the same range of p0, so a contour plot of the outlet cannot tell them apart. The dots can: in A every parcel keeps the color it entered with, in B the parcels that pass the body change color on the way out. Only a color change along a streamline is a loss.

match outlet spread를 누르면 두 채널의 출구 p0p_0 범위가 같아진다. 출구 컨투어만으로는 구분이 불가능해진다는 뜻이다. 대신 점의 색이 흐르는 동안 바뀌는지를 본다. 위 채널의 점은 색을 그대로 유지하고, 아래 채널의 점만 물체를 지나면서 색이 바뀐다.

그래서 손실 계수를 계산할 때 기준값을 단면 평균 p0p_0로 잡으면 전단 입구에서 손실이 없는데도 0이 아닌 값이 나온다. 기준은 그 유선의 입구 p0p_0여야 한다. 유량가중 평균을 쓰더라도 입구와 출구 양쪽을 같은 방식으로 평균해야 차이가 손실만 남는다.

수치적으로 한 가지가 더 붙는다. 격자가 성기면 회전 영역에서 p0p_0가 인공적으로 평탄해진다. 수치 확산이 와도를 뭉개면 p0=ρu×ω\nabla p_0 = \rho\,\mathbf{u}\times\boldsymbol{\omega}의 오른쪽이 줄고, 코어의 결손이 실제보다 얕게 나온다. 와류 코어를 통과하는 격자를 볼 때 총압 결손의 깊이는 와도 해상도의 지표로 쓸 수 있다. 원관 검증에서 지름 오차가 유량에 네 제곱으로 실리던 것처럼, 여기서도 오차는 눈에 잘 띄지 않는 양을 통해 들어온다.

달랑베르가 1752년에 부딪힌 것도 같은 자리였다#

Johann은 뉴턴의 점성 이론을 끝까지 받아들이지 않았고, 그의 아들 Daniel과 제자 오일러도 마찬가지였다. 비점성 이론만으로 물체 주위 유동을 풀면 항력이 0으로 나온다. 1752년 달랑베르가 이것을 발표했을 때 학계가 패닉에 빠진 이유다. 달랑베르가 같은 시기 파동방정식에서 부딪힌 문제와 뿌리는 하나다. 방정식이 허용하는 해의 범위를 어디까지로 볼 것인가.

지금 우리가 쓰는 표현으로 다시 적으면 이렇다. 비회전 비점성 유동에서는 p0p_0가 온 영역에서 하나의 상수이고, 그러면 물체 앞뒤의 압력이 대칭이 되어 적분이 0이 된다. 항력을 만들려면 어딘가에서 p0p_0가 유선을 따라 떨어져야 한다. 그 자리를 만들어 주는 것이 점성과 그것이 벽에서 생산하는 와도다.

총압 컨투어를 열었을 때 물어볼 것은 그래서 "얼마나 떨어졌나"가 아니다. "유선을 따라 떨어졌나, 가로질러 떨어졌나"다. 앞이면 손실이고, 뒤면 와도다.

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