[논문 리뷰] 언더릴랙세이션을 없애는 법 — 압력기반 완전연성 솔버의 선형화
고정계수 대 Newton 선형화가 전마하 수렴을 가르는 이유
수렴하지 않는 계산 앞에서 가장 먼저 손이 가는 손잡이는 언더릴랙세이션 계수다. 0.7에서 0.5로, 다시 0.3으로 내린다. 반복 횟수는 늘고 계산 시간은 두 배가 되지만 어쨌든 답은 나온다.
Denner(2018)는 그 손잡이를 아예 떼어내자고 말한다. 대신 손대야 할 곳은 비선형 항을 자르는 방식, 곧 선형화다. 이 글은 그 주장을 따라간다. 고정계수 선형화와 Newton 선형화가 이산화된 연속방정식에서 각각 무엇을 남기고 무엇을 지우는지 보고, 지워진 항이 언제부터 치명적이 되는지 장난감 모형으로 눈금을 매긴다.
논문: F. Denner, Fully-coupled pressure-based algorithm for compressible flows: linearisation and iterative solution strategies, arXiv:1807.04232 (2018). Imperial College London. 전마하 압축성 유동을 위한 완전연성(fully-coupled) 압력기반 알고리즘에서, 선형화 전략과 반복 해법이 성능·안정성에 미치는 영향을 체계적으로 비교한 논문.
초음속에서 멈춘 것은 솔버가 아니라 반복이었다#
압축성 솔버는 크게 두 갈래다. 밀도기반(density-based)은 연속방정식을 밀도의 수송방정식으로 본다. 충격파가 있는 초음속에서 잘 돈다. 대신 저마하에서 무너진다. 마하수가 0으로 가면 밀도와 압력의 결합이 사라지기 때문이다.
압력기반(pressure-based)은 반대다. 연속방정식을 압력 방정식으로 쓰고, 밀도는 상태방정식으로 따로 구한다. 저마하에서 강하다.
문제는 그 사이다. 천음속(transonic·마하수 1 부근) 영역에서는 압력-속도 결합과 압력-밀도 결합이 동시에 세다. 두 비선형성이 겹치는 이 구간에서 압력기반 알고리즘의 수렴이 흔들린다. SIMPLE 같은 분리형(segregated) 해법이 언더릴랙세이션 없이 못 도는 이유이기도 하다.
완전연성 해법은 연속·운동량·에너지 방정식을 하나의 선형계에 넣고 동시에 푼다. 메모리는 더 먹지만 결합이 강해진다. 그런데 "하나의 선형계에 넣는다"는 말 자체가 이미 선택을 포함한다. 원래 방정식은 비선형이다. 무엇을 미지수로 두고 무엇을 계수로 넘길지 정해야 선형계가 만들어진다.
압력은 두 개의 일을 동시에 한다#
압력기반 알고리즘의 성공은 압력이 두 가지 역할을 겸한다는 데서 나온다.
저마하에서 압력은 속도장에 대한 구속조건이다. 연속방정식은 타원형(elliptic·해가 전 영역에 즉시 영향을 주는 성질) 압력 방정식이 된다. 밀도는 거의 상수다.
초음속에서는 반대다. 압력은 밀도와 직접 묶이고, 연속방정식은 쌍곡형(hyperbolic·정보가 유한 속도로 전파되는 성질)에 가까워진다. 압력-속도 결합은 뒷전이 된다.
면(face)에서의 질량유속 를 압력으로 미분하면 두 결합의 무게가 그대로 나온다.
는 이송 속도(advecting velocity·면을 통과하는 유속으로, 운동량가중보간으로 얻는다), 는 그 보간에 들어가는 압력 감쇠 계수다. 이상기체 등온 근사에서 이므로 두 항의 비는 다음 한 숫자로 줄어든다.
는 마하수, 는 음향 Courant 수(음파가 한 스텝에 격자 몇 칸을 지나는지)다. 아래 시소에서 두 슬라이더를 직접 움직여보자.
마하수를 0.001에서 3까지 끌어올리면 오른쪽(밀도 쪽) 추가 무거워지면서 빔이 기운다. 아래 막대의 흰 표시가 타원형에서 쌍곡형으로 미끄러지는 것도 같은 이유다. fixed-coefficient 버튼을 누르면 오른쪽 추가 통째로 사라진다 — 그 항이 행렬에 아예 없다는 뜻이다.
비선형 항을 자르는 두 가지 방법#
일반적인 비선형 항 을 생각한다. 은 비선형 반복 횟수다. 고정계수 선형화(fixed-coefficient·계수를 지연시킨다)는 주 변수만 음함수로 둔다.
구현이 쉽다. 계수를 이전 반복 값으로 채우기만 하면 된다.
Newton 선형화는 두 변수 모두에 대해 1차 전개한다.
항이 하나 늘고, 대신 도 음함수로 다뤄야 한다. 압력기반 알고리즘에서 가 밀도라면 이는 곧 를 통해 압력에 대한 음함수 의존성을 행렬에 넣는다는 뜻이다. 압력은 이미 모든 방정식의 주 미지수이므로 새로운 0이 아닌 행렬 성분은 생기지 않는다. 공짜에 가깝다는 것이 이 논문의 중요한 실무적 관찰이다.
연속방정식에서 무엇이 사라지는가#
이산화된 연속방정식에 두 선형화를 각각 적용한다. 고정계수는 이렇게 된다.
Newton은 항이 늘어난다.
는 셀 부피, 는 면적, 위첨자 는 이전 시간층이다. 앞 절의 시소가 그대로 여기 들어 있다. 은 속도 쪽, 은 밀도 쪽이다.
고정계수는 밀도 쪽 항을 통째로 버린다. 저마하에서는 문제가 없다. 버린 쪽이 가벼웠기 때문이다. 마하수가 커지면 버린 쪽이 무거운 쪽이 된다. 논문의 표현대로, 고정계수 선형화는 비압축성 압력기반 틀에서 유도된 것이라 큰 마하수에서 성능과 안정성이 극히 제한된다.
운동량·에너지 방정식의 네 갈래#
운동량·에너지 방정식의 이송항 에는 미지수가 셋이라 선택지가 넷으로 늘어난다. 는 속도 성분 또는 비전엔탈피다.
| 이름 | 음함수로 두는 것 | 성격 |
|---|---|---|
| 고정계수 | 만 | 비압축성 관행 그대로 |
| -Newton | , | 압력-밀도 결합을 음함수로 |
| -Newton | , | 유속 자체를 음함수로 |
| full-Newton | 셋 모두 | 완전 전개 |
논문의 결과가 갈리는 지점이 여기다. 시간항에 Newton 선형화를 쓰는 것만으로 음파 전파 문제에서 1.4~1.5배 빨라진다. 이송항의 선택은 저마하에서는 거의 티가 나지 않다가, 마하 3 전방계단 문제에서 로 시간스텝을 키우면 결정적으로 변한다. 그 조건에서 단일 루프 해법으로 수렴한 것은 -Newton 계열뿐이었다. -Newton을 더한 full-Newton은 수렴률의 음수 구간을 없애지만 실행 시간 이득은 작았다.
온도를 언제 갱신하는가 — 단일 루프와 이중 루프#
선형화만이 변수는 아니다. 비선형 반복의 구조도 갈린다.
단일 루프는 단순하다. 선형계를 풀고, 엔탈피에서 온도를 갱신하고, 과 로 밀도를 갱신하고, 이송 속도를 갱신한 뒤 잔차를 본다.
는 잔차 벡터 크기에 따른 정규화 인자다.
이중 루프는 Xiao 등의 처방을 따른다. 안쪽 루프에서는 밀도 갱신에 쓰는 온도를 상수로 고정한다. 즉 밀도를 압력만의 함수로 본다. 유동이 등온이라는 뜻이 아니다. 밀도를 계산할 때 쓰는 온도만 얼려두는 것이다. 안쪽이 수렴하면 바깥 루프에서 갱신된 온도로 밀도를 다시 계산한다. 이 구조가 언더릴랙세이션을 대신한다.
논문의 결론은 둘을 대립시키지 않는다. 모든 시간항과 이송항에 Newton 선형화를 일관되게 적용하면 언더릴랙세이션을 어떤 형태로도 쓰지 않을 수 있고, 그러면 단일 루프가 이중 루프보다 빨라진다. 마하 3 전방계단에서 단일 루프 -Newton은 10,616초, 같은 조건 이중 루프는 12,117초였다. 원뿔 초음속 유동에서도 순서가 같았다.
Python으로 좁혀보는 수렴 경계#
여기서부터는 논문의 코드가 아니라, 그 주장을 가장 작게 줄인 장난감 모형이다. 셀 하나, 등온 이상기체, 면 하나의 질량유속만 남긴다.
로 무차원화하고 목표 질량유속을 로 두면 풀어야 할 비선형 방정식은 하나로 줄어든다.
여기에 두 선형화를 적용하면 서로 다른 반복 사상(map)이 나온다. 고정계수는
Newton 쪽은 정확히 에 대한 Newton–Raphson 반복과 일치한다. 대입해서 정리하면 그대로 떨어진다.
수축사상 조건 이 곧 다. 앞 절의 시소가 뒤집히는 지점과 같은 숫자다. 한 가지 더 있다. 은 2차식이라 근이 둘이다. 과 . 물리 근이 밀어내기 시작하면 반복은 발산하는 대신 다른 가지로 끌려가는 경우가 더 많다.
import math
def face_mass_flux(P, D):
"""비차원 면 질량유속 m/(rho0 u0). P = p/p0, D = Co/M."""
return P * (1.0 - D * (P - 1.0))
def iterate_lagged(P0, D, nmax=40, eta=1e-10):
"""고정계수: rho^(n) theta^(n+1) = mdot* — 밀도를 계수로 붙들어 둔다."""
P, hist = P0, []
for _ in range(nmax):
r = abs(face_mass_flux(P, D) - 1.0)
hist.append(r)
if r < eta:
return P, hist
P = 1.0 + (1.0 - 1.0 / P) / D
if not math.isfinite(P) or P <= 0.02 or P > 8.0:
return float('nan'), hist
return P, hist
def iterate_newton(P0, D, nmax=40, eta=1e-10):
"""Newton: rho^(n)theta^(n+1) + rho^(n+1)theta^(n) - rho^(n)theta^(n) = mdot*."""
P, hist = P0, []
for _ in range(nmax):
r = abs(face_mass_flux(P, D) - 1.0)
hist.append(r)
if r < eta:
return P, hist
dm = (1.0 + D) - 2.0 * D * P # d(rho theta)/dP
P = P - (face_mass_flux(P, D) - 1.0) / dm
return P, hist
def verdict(P, hist):
if math.isnan(P):
return "발산"
if abs(P - 1.0) < 1e-4:
return f"물리 근 ({len(hist)}회)"
return f"다른 가지 P={P:.3f} ({len(hist)}회)"
cases = [("acoustic wave", 0.003, 0.10),
("Sod shock tube", 0.900, 0.40),
("forward step", 3.000, 0.90),
("forward step*", 3.000, 0.30)]
print(f"{'case':<16}{'M':>7}{'Co':>6}{'M/Co':>7} {'고정계수':<22}{'Newton'}")
for name, M, Co in cases:
D = Co / M
Pl, hl = iterate_lagged(1.18, D)
Pn, hn = iterate_newton(1.18, D)
print(f"{name:<16}{M:>7.3f}{Co:>6.2f}{M / Co:>7.2f} "
f"{verdict(Pl, hl):<22}{verdict(Pn, hn)}")
print("\nSod shock tube — 반복별 잔차 ||r||")
_, hl = iterate_lagged(1.18, 0.40 / 0.90)
_, hn = iterate_newton(1.18, 0.40 / 0.90)
for n in range(5):
print(f" n={n} 고정계수 {hl[n]:.3e} Newton {hn[n]:.3e}")case M Co M/Co 고정계수 Newton
acoustic wave 0.003 0.10 0.03 물리 근 (9회) 물리 근 (5회)
Sod shock tube 0.900 0.40 2.25 다른 가지 P=2.250 (32회) 물리 근 (5회)
forward step 3.000 0.90 3.33 다른 가지 P=3.333 (23회) 물리 근 (5회)
forward step* 3.000 0.30 10.00 발산 물리 근 (4회)
Sod shock tube — 반복별 잔차 ||r||
n=0 고정계수 8.560e-02 Newton 8.560e-02
n=1 고정계수 1.383e-01 Newton 2.081e-02
n=2 고정계수 1.725e-01 Newton 5.570e-04
n=3 고정계수 1.565e-01 Newton 4.454e-07
n=4 고정계수 1.061e-01 Newton 2.855e-13Newton은 네 경우 모두 4~5회다. 잔차가 매 반복 제곱으로 줄어드는 2차 수렴이 그대로 보인다. 고정계수는 가 1을 넘는 순간 잔차가 세 번 연속 커진 뒤 다른 가지로 흘러간다. 아래에서 그 궤적을 직접 그려보자.
fixed-coefficient 상태에서 마하 슬라이더를 Courant 값 아래로 내리면 계단이 초록 점()으로 조여든다. 반대로 올리면 같은 계단이 초록 점을 밀어내고 빨간 점()으로 걸어간다. Newton으로 바꾸면 어느 조합에서도 오른쪽 잔차 그래프가 서너 번 만에 선 아래로 떨어진다.
장난감이라는 점은 분명히 해둔다. 실제 솔버에는 에너지 방정식, 다차원 이송, 압력 감쇠항의 시간 의존성이 더 얹힌다. 는 정확한 경계가 아니라 눈금이다. 다만 논문이 보고한 순서 — 음파 문제는 어느 선형화로도 돌고, 전방계단은 -Newton 없이는 안 돈다 — 와 이 눈금이 같은 방향을 가리킨다.
기억할 점 세 줄#
- 압력기반 연성 솔버에서 면 질량유속의 선형화는 압력-속도 결합과 압력-밀도 결합 중 무엇을 행렬에 남길지 정하는 일이다. 고정계수는 밀도 쪽을 지운다.
- 지운 항의 무게는 대략 로 잰다. 저마하에서는 무시해도 되고, 천음속·초음속에서 큰 시간스텝을 쓰면 지운 쪽이 지배적이 된다.
- 밀도를 압력의 함수로 음함수 처리해도 새 행렬 성분은 생기지 않는다. 값이 싸고, 일관되게 적용하면 언더릴랙세이션 자체를 없앨 수 있다.
도움이 됐다면 공유해주세요.