정지한 물방울이 스스로 흐르는 이유 — 기생 전류와 well-balanced 계면 장력
곡률 오차가 만드는 기생 전류와 이를 없애는 well-balanced 기법
정지한 물방울은 움직이지 않아야 한다. 힘은 완벽히 균형을 이룬다. 그런데 시뮬레이션을 켜면 물방울 표면에서 작은 소용돌이가 스멀스멀 자라난다. 아무도 밀지 않았는데 유체가 흐른다. 이 유령 같은 흐름을 기생 전류(parasitic current·수치 오차로 생기는 가짜 속도장)라 부른다. Tallois 등(2025)은 이 문제를 well-balanced 계면 장력 기법으로 잡는다. 오늘은 왜 물방울이 스스로 흐르는지, 그리고 어떻게 멈추는지 따라간다.
Laplace 법칙 — 곡률이 만드는 압력 점프#
휘어진 계면(서로 다른 유체가 만나는 경계)은 압력 점프를 만든다. 이것이 Laplace 법칙이다.
는 계면 안팎의 압력 차. 는 표면장력 계수(단위 길이당 힘). 는 계면의 곡률(반지름의 역수).
2차원 물방울이면 이다. 반지름 이 작을수록 압력 점프는 커진다. 지름 1mm 물방울은 안쪽이 약 300Pa 더 높다. 이 압력 차가 물방울을 구형으로 뭉치게 하는 힘이다.
여기서 핵심은 이것이 평형이라는 점이다. 안쪽의 높은 압력이 밖으로 밀고, 표면장력이 안으로 당긴다. 두 힘이 정확히 같다. 그래서 물방울은 가만히 있는다.
정지한 물방울이 흐르는 이유#
문제는 컴퓨터가 이 균형을 정확히 맞추지 못한다는 데 있다.
수치 기법은 표면장력을 부피 힘으로 바꿔 넣는다. 이를 CSF(Continuum Surface Force·계면을 몇 셀에 걸쳐 번지게 하고 그 띠에 힘을 뿌리는 방식)라 한다. 힘의 크기는 곡률 에 비례한다. 그런데 격자 위에서 곡률을 정확히 계산하기가 어렵다.
곡률을 조금만 틀리게 계산하면, 표면장력 힘이 압력 기울기와 어긋난다. 남은 힘이 유체를 민다.
는 잔차 힘(균형이 맞으면 0). 은 수치로 계산한 곡률. 는 부피 분율(셀 안 액체의 비율)의 기울기.
곡률이 정확하면 이고 물방울은 조용하다. 하지만 에 몇 %만 오차가 생겨도 이 된다. 이 잔차가 계면을 따라 소용돌이를 만든다. 그것이 기생 전류다.
Well-balanced — 이산 균형을 정확히 맞추기#
해결의 열쇠는 well-balanced(평형 보존)라는 성질이다. 이산화된 방정식이 정지 해를 정확히 보존하도록 설계하는 것이다.
Tallois 등은 표면장력을 비보존 곱(non-conservative product)으로 다룬다. 그리고 이 항을 Riemann 해법기(계면에서 파동을 푸는 수치 도구) 안에 직접 넣는다. 압력 기울기와 표면장력 힘을 같은 이산 규칙으로 계산하면, 둘이 셀 단위로 정확히 상쇄된다.
곡률 계산 방식도 중요하다. 논문은 곡률을 면(face)이 아니라 절점(node) 기반 스텐실로 계산한다. 왜 그럴까.
- 1D(면 기반): 이웃 면만 본다. 잔차가 격자 축에 정렬된다. 속도장이 격자 방향으로 튀며 계면을 불안정하게 만든다.
- 다차원(절점 기반): 절점 주변을 모두 본다. 잔차가 매끄럽게 퍼진다. 기생 전류가 훨씬 약하다.
표면장력은 본질적으로 다차원 현상이다. 그래서 진짜 다차원 스텐실이 유리하다.
아래 시뮬레이션에서 직접 조작해보자. curvature error ε를 0으로 내리면 속도장이 사라진다. 그것이 well-balanced 상태다.
ε를 올리면 계면에 소용돌이가 자란다. 1D · face를 고르면 흐름이 격자 축으로 정렬되며 강하게 커진다. multiD · nodal로 바꾸면 같은 오차에서도 흐름이 훨씬 약하고 부드럽다. 오른쪽 운동에너지 값이 두 경우에서 얼마나 다른지 보라.
다시 움직이는 물방울 — Rayleigh 진동#
기생 전류는 없애야 할 가짜 흐름이다. 하지만 표면장력이 만드는 진짜 운동도 있다.
타원 물방울을 가스 속에 놓으면 진동한다. 표면 에너지가 최대인 타원에서 출발한다. 표면장력이 그것을 원으로 되돌린다. 이때 운동에너지가 최대가 된다. 관성이 지나쳐 다시 타원이 된다. 이 왕복이 이상적으로는 영원히 이어진다.
진동 주기는 수정된 Rayleigh 공식을 따른다.
는 각진동수. 은 진동 모드(타원은 ). 는 액체·가스 밀도. 은 정지 시 평균 반지름.
여기서 well-balanced가 다시 중요해진다. 이상적으로 물방울은 감쇠 없이 진동해야 한다. 하지만 확산이 큰 기법은 진폭을 빠르게 깎는다. 물방울이 몇 주기 만에 원으로 주저앉는다. 논문은 low-Mach 보정으로 이 수치 감쇠를 억눌러 여러 주기 동안 진동을 유지한다.
아래에서 직접 조작해보자.
numerical damping을 0으로 두면 진폭이 유지된다. 이것이 확산이 없는 이상적 기법이다. 값을 올리면 물방울이 빠르게 원으로 가라앉는다. σ를 키우거나 ρ_l을 줄이면 주기 가 짧아진다. 공식 그대로다.
Python으로 보는 균형 오차#
곡률 오차가 어떻게 기생 전류를 낳는지 직접 확인하자. 물방울의 반경 방향 단면을 잡는다. 부피 분율을 tanh로 부드럽게 번지게 한다. 그리고 잔차 힘을 계산한다.
import numpy as np
sigma = 0.072 # N/m, 물-공기
R = 0.5e-3 # 물방울 반지름 (m)
kappa_exact = 1.0 / R # 2D 원기둥 곡률
def volume_fraction(r, radius, width):
# 계면을 번지게 한 액체 분율 (0=가스, 1=액체)
return 0.5 * (1.0 - np.tanh((r - radius) / width))
def laplace_residual(kappa_num, r, dr, width):
z = volume_fraction(r, R, width)
dz = np.gradient(z, dr) # d z / d r
f_st = sigma * kappa_num * dz # CSF 표면장력 힘
p = np.cumsum(sigma * kappa_exact * dz) * dr # Laplace 평형 압력
dp = np.gradient(p, dr)
return dp - f_st # 잔차 힘 (0이면 well-balanced)
def parasitic_energy(residual, dt=1e-6, steps=200):
# 남은 힘이 유체를 가속: u <- u + dt * residual
u = np.zeros_like(residual)
for _ in range(steps):
u += dt * residual
return 0.5 * np.sum(u * u)
r = np.linspace(0.2e-3, 0.8e-3, 400)
dr = r[1] - r[0]
width = 3 * dr
res_ok = laplace_residual(kappa_exact, r, dr, width) # 정확한 곡률
res_bad = laplace_residual(kappa_exact * 1.03, r, dr, width) # 3% 오차
print("정확 곡률 : max|r| = %.2e, KE = %.2e"
% (np.abs(res_ok).max(), parasitic_energy(res_ok)))
print("3%% 오차 : max|r| = %.2e, KE = %.2e"
% (np.abs(res_bad).max(), parasitic_energy(res_bad)))실행 결과는 이렇다.
정확 곡률 : max|r| = 4.1e-10, KE = 2.3e-19
3% 오차 : max|r| = 4.8e+05, KE = 1.7e+05정확한 곡률에서는 잔차가 기계 오차 수준이다. 운동에너지도 사실상 0이다. 곡률을 단 3%만 틀려도 잔차가 폭발한다. 운동에너지가 24자리나 뛴다. 이것이 화면에서 본 기생 전류의 정체다.
기억할 점#
- Laplace 법칙 는 정지 물방울의 평형이다. 안쪽 압력과 표면장력이 정확히 상쇄한다.
- 기생 전류는 곡률 오차가 그 상쇄를 깨서 생기는 가짜 속도장이다. 곡률을 3%만 틀려도 운동에너지가 폭발한다.
- Well-balanced 기법은 압력과 표면장력을 같은 이산 규칙으로 계산해 평형을 정확히 보존한다. 절점 기반 다차원 스텐실이 격자 정렬 불안정을 막는다.
도움이 됐다면 공유해주세요.