총압이 1,080 Pa 떨어진 곳의 소산은 0이었다 — 베르누이 상수가 유선을 가로지를 때
총압이 유선을 가로질러 변하는 것은 손실이 아니라 와도다. 손실은 총압이 유선을 따라 변할 때만 생긴다.
1738년, 아버지는 아들 책의 출판연도를 6년 앞당겼다#
Daniel Bernoulli는 1738년 『Hydrodynamica』를 냈다. 표지에는 "Johann의 아들"이라고 적었다. 아버지와 화해하고 싶었기 때문이다. 아버지 Johann은 거의 같은 내용을 『Hydraulica』로 따로 출판하면서 출판업자를 압박해 발행연도를 1732년으로 찍었다. 아들보다 6년 앞선 것처럼 보이게 만든 것이다.
한 세기 반 뒤 Horace Lamb이 정리를 붙였다. 오일러 방정식을 적분하면 베르누이 정리가 나온다는 것이다. 부자가 싸운 두 권이 사실 같은 식의 두 얼굴이었다. 그런데 이 "적분하면"에는 조건이 하나 붙어 있고, CFD 후처리에서 총압 컨투어를 오독하게 만드는 원인이 정확히 그 조건이다.
이 글은 그 조건을 Rankine 와류 하나로 잰다. 결론부터 적으면, 회전하는 코어 안에서 총압은 1,080 Pa 떨어지지만 점성 소산은 정확히 0이다. 그리고 총압이 완벽하게 평평한 바깥에서는 소산이 0이 아니다. 두 가지가 반대로 나온다.
아래 시뮬레이션에서 탐침을 코어 안팎으로 직접 옮겨보자.
probe r를 움직이면서 오른쪽 그래프의 초록색 곡선이 어디서 평평해지는지를 본다.
그리고 캔버스 왼쪽의 사각형이 언제 모양을 유지하고 언제 찌그러지는지를 같이 본다. 두 관찰이
서로 어긋나는 지점이 이 글의 주제다.
오일러 방정식을 적분하면 베르누이가 된다 — 어느 방향으로?#
밀도가 일정하고 체적력이 없는 정상 비점성 유동의 운동방정식은 이렇다.
는 속도, 는 압력, 는 밀도다. 좌변에 벡터 항등식을 쓴다.
는 와도다. 두 식을 합치고 총압 로 묶으면 남는 것은 한 줄이다.
이것이 Crocco 형태의 오일러 방정식이다(비압축·등엔트로피 조건). 오른쪽이 0이 아니면 총압은 공간에서 변한다. 그런데 어느 방향으로 변하는지가 핵심이다.
는 에 수직이다. 그래서 양변에 를 내적하면 오른쪽이 사라진다.
유선을 따라가면 는 언제나 상수다. 와도가 있든 없든 상관없다. 이것이 베르누이 정리의 정확한 범위다. 반대로 가 모든 곳에서 같으려면 이어야 하고, 실질적으로 비회전 유동을 뜻한다. 부자가 싸운 두 권의 차이는 여기에 없었고, 조건은 Lamb이 붙인 각주 쪽에 있었다.
Rankine 와류: 도는 코어와 돌지 않는 바깥#
이 조건이 한 유동 안에서 동시에 켜지고 꺼지는 예가 Rankine 와류다. 반지름 안쪽은 강체처럼 돌고, 바깥은 자유 와류다.
는 코어의 각속도, 는 원주방향 속도다. 압력은 반지름 방향 운동량 을 적분해서 얻는다. 바깥에서는 압력이 떨어지는 양과 동압이 오르는 양이 정확히 상쇄되어 가 로 고정된다. 코어 안에서는 상쇄되지 않는다.
에서 결손은 , 즉 코어 가장자리 속도의 제곱에 를 곱한 값이다. , , 이면 m/s이고 결손은 1,080 Pa다.
Python으로 두 변을 같은 반지름에서 재봤다#
를 중심차분으로 구해 와 맞춰본다. 소산함수 도 같이 잰다.
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^34번째와 5번째 열이 모든 반지름에서 같다. Crocco 관계가 소수점 자리까지 맞는다. 그리고 코어 안에서 과 사이의 총압 차이가 648 Pa다. 같은 반지름의 두 각도 사이에서는 0이다. 베르누이를 유선을 따라 쓰면 맞고, 가로질러 쓰면 648 Pa를 놓친다.
총압이 평평한 곳에서 소산이 0이 아니었다#
마지막 열이 뒤집혀 있다. 총압이 1,080 Pa 떨어지는 코어 안의 소산이 0이고, 총압이 정확히 평평한 바깥의 소산이 0이 아니다.
이유는 소산이 회전이 아니라 변형에 붙어 있기 때문이다. 강체회전은 유체 요소를 돌리기만 하고 찌그러뜨리지 않는다. 변형률 텐서가 0이므로 이다. 자유 와류는 반대다. 와도는 0이지만 이라 안쪽과 바깥쪽이 다른 속도로 지나간다. 요소는 계속 전단된다.
위 시뮬레이션의 사각형이 이것을 그대로 보여준다. 코어 안(빨간색)에서는 정사각형이 그대로 돌고, 바깥(보라색)에서는 평행사변형으로 무너진다. 회전계에서 무엇이 보존되고 무엇이 아닌지를 코리올리 힘과 로탈피에서 다룬 적이 있는데, 여기서도 축은 같다. 도는 것과 일하는 것은 다른 장부에 적힌다.
다섯 가지 유동을 같은 표에 올린다#
와도와 소산은 독립이다. 네 조합이 모두 실재한다.
| 유동 | 유선 따라 | 유선 가로질러 | 점성 소산 | |
|---|---|---|---|---|
| 균일류 | 0 | 일정 | 일정 | 0 |
| 자유 와류 () | 0 | 일정 | 일정 | > 0 |
| Rankine 코어 () | 일정 | 1,080 Pa 변함 | 0 | |
| 전단 입구, 비점성 | 일정 | 변함 | 0 | |
| 점성 웨이크 | 감소 | 변함 | > 0 |
표에서 굵게 표시한 칸이 하나뿐이라는 점이 중요하다. 손실이라고 부를 수 있는 것은 유선을 따라 가 줄어드는 경우뿐이다. 나머지 네 줄에서 가 공간적으로 변하는 것은 전부 와도의 기하학이지 에너지가 사라진 것이 아니다.
총압 컨투어가 두 가지 이유로 같아 보일 때#
실무에서 이 구분이 깨지는 자리는 출구 단면의 총압 컨투어다. 대기경계층이나 발달한 관유동을 입구조건으로 주면 첫 셀부터 가 방향으로 변한다. 손실은 아직 0이다. 웨이크가 만든 총압 결손도 같은 컨투어로 그려진다. 이쪽은 진짜 손실이다.
아래에서 두 채널을 같은 색 스케일로 나란히 돌려보자.
match outlet spread를 누르면 두 채널의 출구 범위가 같아진다. 출구 컨투어만으로는 구분이
불가능해진다는 뜻이다. 대신 점의 색이 흐르는 동안 바뀌는지를 본다. 위 채널의 점은 색을 그대로
유지하고, 아래 채널의 점만 물체를 지나면서 색이 바뀐다.
그래서 손실 계수를 계산할 때 기준값을 단면 평균 로 잡으면 전단 입구에서 손실이 없는데도 0이 아닌 값이 나온다. 기준은 그 유선의 입구 여야 한다. 유량가중 평균을 쓰더라도 입구와 출구 양쪽을 같은 방식으로 평균해야 차이가 손실만 남는다.
수치적으로 한 가지가 더 붙는다. 격자가 성기면 회전 영역에서 가 인공적으로 평탄해진다. 수치 확산이 와도를 뭉개면 의 오른쪽이 줄고, 코어의 결손이 실제보다 얕게 나온다. 와류 코어를 통과하는 격자를 볼 때 총압 결손의 깊이는 와도 해상도의 지표로 쓸 수 있다. 원관 검증에서 지름 오차가 유량에 네 제곱으로 실리던 것처럼, 여기서도 오차는 눈에 잘 띄지 않는 양을 통해 들어온다.
달랑베르가 1752년에 부딪힌 것도 같은 자리였다#
Johann은 뉴턴의 점성 이론을 끝까지 받아들이지 않았고, 그의 아들 Daniel과 제자 오일러도 마찬가지였다. 비점성 이론만으로 물체 주위 유동을 풀면 항력이 0으로 나온다. 1752년 달랑베르가 이것을 발표했을 때 학계가 패닉에 빠진 이유다. 달랑베르가 같은 시기 파동방정식에서 부딪힌 문제와 뿌리는 하나다. 방정식이 허용하는 해의 범위를 어디까지로 볼 것인가.
지금 우리가 쓰는 표현으로 다시 적으면 이렇다. 비회전 비점성 유동에서는 가 온 영역에서 하나의 상수이고, 그러면 물체 앞뒤의 압력이 대칭이 되어 적분이 0이 된다. 항력을 만들려면 어딘가에서 가 유선을 따라 떨어져야 한다. 그 자리를 만들어 주는 것이 점성과 그것이 벽에서 생산하는 와도다.
총압 컨투어를 열었을 때 물어볼 것은 그래서 "얼마나 떨어졌나"가 아니다. "유선을 따라 떨어졌나, 가로질러 떨어졌나"다. 앞이면 손실이고, 뒤면 와도다.
관련
도움이 됐다면 공유해주세요.