3차원 비압축성 채널 유동(channel flow) 을 직접 수치해석(DNS)하기 위한 솔버를 정리한 글이다. 큰 줄기는 다음 한 줄로 요약된다 — 지배방정식 무차원화 → Projection method → (Adams–Bashforth + Crank–Nicolson) 시간적분 → (Spectral + FDM) 공간 이산화 → 비균일·엇갈림(staggered) 격자 → TDMA → 압력 Poisson.
🌊
핵심 설계 — 벽에 평행한 \(x\)(주류)·\(z\)(스팬) 방향은 주기적이므로 스펙트럴(Fourier) 로 정확히 미분하고, 벽에 수직한 \(y\) 방향만 유한차분(FDM) + 비균일 격자로 다룬다. 비선형 항은 explicit(Adams–Bashforth), 점성 항은 implicit(Crank–Nicolson)으로 처리해 안정성과 정확도를 함께 잡는다.
채널 유동: 위·아래 벽 사이의 유동. \(x,z\) 는 주기적, \(y\) 는 벽으로 막혀 있다
1. 지배방정식과 무차원화
채널 유동(Channel flow)의 Navier–Stokes 운동량 방정식부터 시작한다. Momentum equation 은 벡터형과 성분형으로 다음과 같다.
\[ \rho\left(\frac{\partial \mathbf u}{\partial t} + \mathbf u\cdot(\nabla \mathbf u)\right) = \rho \mathbf g + \nabla p + \mu\nabla^2 \mathbf u \;\cdots\,① \]
우변 \(\text{RHS}=f_{(x,y,z)}\). Protocol 은 다음과 같다 — 1ˢᵗ TDMA 로 \(g_{(x,y,z)}\) → 2ⁿᵈ TDMA 로 \(h_{(x,y,z)}\) → 3ʳᵈ TDMA 로 \(\delta u_i{}_{(x,y,z)}\) 를 구한다. 즉 위의 순서대로 풀어 \(\delta u\) 를 구하면 되고, 이후 아래의 Poisson equation 을 풀어 다음 step 을 구한다.
Divergence 를 취하는 이유는, Navier–Stokes 를 풀 때 우리는 momentum eqn 을 풀지만 divergence-free condition(continuity equation) 으로 맞춰주지 않으면 안 되기 때문이다. 이에 따라 위 momentum eqn 에 Divergence 를 취해 풀어낸다. ⑦식에 대해 \(x,y,z\) 각 방향으로 Central difference method 등을 사용해 차분하고 풀면 그것이 곧 Finite difference method 가 된다(앞서 Cavity 에서 풀어보았으니 참조).
Spectral method 를 간단히 보자. Fourier transform 은 모든 물리량을 파동으로 이루어져 있다고 본다.
덕분에 \(x,z\) 방향에는 차분 오차나 factorization 이 필요 없다(FDM 으로 풀 경우엔 \(\big(1-\tfrac{\Delta t}{2Re}\partial_{x_1}^2\big)\big(1-\tfrac{\Delta t}{2Re}\partial_{x_2}^2\big)\big(1-\tfrac{\Delta t}{2Re}\partial_{x_3}^2\big)\) 로 factorization 한 뒤 방향마다 TDMA 를 풀어야 하고, factorization 에서 \(\tfrac{\Delta t^2}{4Re^2}\) 차수의 Error term 이 생긴다). 다만 비선형 항을 스펙트럴로 계산하면 aliasing 오차가 생기므로 곱(convolution)을 구할 때 zero-padding(2/3 law) 으로 제거한다. 반면 \(y\) 방향은 벽 때문에 주기적이지 않아 FDM 으로 차분한다.
5. 비균일 격자 (벽 근처 클러스터링)
벽 근처에서는 경계층의 급격한 변화를 잡기 위해 해상도를 높여야 한다. 그래서 \(y\) 방향은 Chebyshev 형 의 비균일 격자(벽 쪽으로 촘촘)를 쓴다.
비균일 격자: 벽(위·아래)으로 갈수록 격자가 촘촘해진다 (Chebyshev 분포)
간격이 일정하지 않으므로 미분도 Taylor expansion 으로 다시 유도해야 한다. 인접 간격을 \(dy_1\)(아래), \(dy_2\)(위)라 하고 점 \(y\) 주변을 전개하면
이렇게 어떤 grid 를 쓰든 points 사이의 관계를 Taylor expansion 으로 대수적으로 나타내는 작업을 마무리했다. 이 차분식이 곧 \(y\) 방향 FDM 의 계수가 된다.
6. 격자 배치 — Collocated vs Staggered
속도와 압력을 격자 위 어디에 둘지 가 또 하나의 핵심이다. 흔히 빨간 dashed-line 을 staggered grid, 파란 선을 collocated grid 라고 오해 하기 쉬운데, 우리가 쓰는 격자는 파란 선 하나다. 둘의 진짜 차이는 “속도 성분과 압력이 한 지점에 몰려 있느냐(Coupling) 아니면 따로 떨어져 있느냐(Decoupling)” 일 뿐이다.
속도·압력이 한 점 → 결합은 쉽지만 압력 checkerboard 디커플링 위험u 는 세로 면(→), v 는 가로 면(↑), p 는 셀 중심 → 디커플링 회피
3D 로 보면, 한 점에 세 속도 성분이 모이면 Coupling, 면마다 흩어지면 Decoupling 이다.
한 점에 세 속도가 모이면 Coupling, 면마다 흩어지면 Decoupling
이 솔버는 두 방식을 섞는다. 앞서 staggered grid 는 FDM 을 쓰기 때문에 \(u_1,u_3\) 가 decoupling 되어 있었는데, \(x,z\) 방향은 스펙트럴이라 exact 한 미분이 가능 하므로 \(u_1,u_3\) 를 압력 위치(cell center)에 직접 coupling 시킨다. 결과적으로 \(u_1,u_3\) 는 cell center 에 coupling 되고, FDM 으로 풀어야 하는 \(u_2(=v)\) 방향만 엇갈림(staggered) 으로 둔다 — 즉 “staggered grid with spectral” 구성이다. 벽에서는 no-slip 을 위해 ghost cell 을 두고(\(u_1=-u_0\) 등), 액추에이터(blower/suction)가 있을 때는 벽면 \(v\) 에 그 값을 준다.
7. 선형 시스템 — TDMA
스펙트럴 방향은 미분이 대수적으로 떨어지므로, 실제로 풀어야 하는 것은 \(y\) 방향 한 줄 뿐이다. 앞서 구한 중앙차분(3개의 점이 필요)을 grid 에 적용하면, FDM 의 인접 3점이 만드는 삼중대각(tridiagonal) 계를 TDMA(Thomas algorithm) 로 한 번에 푼다.
\[ a = -\frac{\Delta t}{2Re}\frac{2}{dy_j(dy_j+dy_{j-1})}, \quad b = 1 + \frac{\Delta t}{2Re}\alpha^2 + \frac{\Delta t}{2Re}\gamma^2 - \frac{\Delta t}{2Re}\Big(\frac{1}{dy_j}+\frac{1}{dy_{j-1}}\Big)\frac{2}{dy_j+dy_{j-1}}, \quad c = -\frac{\Delta t}{2Re}\frac{2}{dy_j(dy_j+dy_{j-1})} \]
[Figure 01 — staggered & collocated grid] \(y\) 축은 총 129 개 점(128 구간)으로 둔다. 변수 개수는 \(u,w\): 130 개, \(v\): 129 개다. collocated grid 기준 위·아래 2칸의 ghost cell 을 위해 다음 ghost cell interval 조건과 no-slip 경계조건, 그리고 staggered–collocated 위치 관계식을 둔다.
\(u,w\) 는 ghost cell 을 고려한 no-slip(\(u_{y'=0}=-u_{y'=-0}\) 등)을, \(v\) 는 액추에이터 유무(No actuator: 양 벽 \(v=0\) / With actuator: \(v_0=\) bottom act, \(v_{128}=\) top act)를 첫·마지막 행에 반영한다. \(u,w\) point 는 staggered grid 위에, \(v\) point 는 collocated grid 위에 있으므로 위치에 맞게 보간(interpolation)하여 적용한다.
이산 RHS \(f_{(x,y,z)}\) — Fourier · 차분 명시형
⑥·⑦에서 기호로만 두었던 우변 \(\text{RHS}=f_{(x,y,z)}\) 를 실제로 푸는 형태로 펼치면 다음과 같다. \(x,z\) 는 스펙트럴이라 \(\partial_{x_1}\!\to i\alpha\), \(\partial_{x_3}\!\to i\gamma\) 로 떨어지고, \(y\)(=\(x_2\)) 방향만 차분으로 남는다. 대류항은 AB(3·\(t\) − \(t{-}1\)), 점성항은 CN 으로 계산한다.
여기서 \(y\) 방향 2계 미분 계수 \(A,B,C\) 는 비균일 격자의 중심차분 계수(앞 5절 ⑪)와 같다.
\[ A = \frac{2}{dy_k(dy_{k+1}+dy_k)}, \qquad B = -\Big(\frac{1}{dy_{k+1}}+\frac{1}{dy_k}\Big)\frac{2}{dy_{k+1}+dy_k}, \qquad C = \frac{2}{dy_{k+1}(dy_{k+1}+dy_k)} \]
비선형 항을 스펙트럴 공간에서 곱하면 aliasing 이 생기므로, 곱(convolution) \( \widehat{(u_iu_j)} \) 를 구할 때 zero-padding(2/3 law) — 고파수 1/3 을 0 으로 채워 — aliasing 을 제거한다.
Staggered ↔ Collocated 보간 (2차 정확도 유지)
\(u,w\)(staggered)와 \(v\)(collocated)는 격자 위치가 어긋나 있으므로, 대류항의 \(y\)-미분 \(\partial_{x_2}\widehat{(u_2u_j)}\) 를 “우리가 원하는 point”에서 평가하려면 보간이 필요하다. 한 칸 앞·뒤 차분을 각각 구하면 둘 다 1차이지만,