Skip to content
cfd-lab:~/ko/posts/2026-03-28-dean-flow-ana…● online
NOTE #014DAY SAT 논문리뷰DATE 2026.03.28UPDATED 2026.10.19READ 4 min read#Analytical-Solution#Classical-Flows#CFD-Verification#Dean-Flow#Secondary-Flow#Helical-Pipe

Dean 유동: 나선형 관의 이차 유동 해석해와 CFD 검증

De=510을 인쇄된 Nusselt 식에 넣으면 약 2.8배이고, 옆의 30–60%와 같지 않다.

나선형 증기발생기에서 먼저 묻는 숫자는 직관 대비 열전달 배율이다. 곡선 관에서는 원심력이 단면에 한 쌍의 이차 유동을 만든다. 이름이 Dean 와류다. 1928년에 Dean이 적은 섭동은 De≪1De \ll 1에서만 작다. 운전점은 그보다 훨씬 크다.

De 슬라이더를 5에서 400으로 올리면 단면의 소용돌이 쌍이 세지고, 입자 수 슬라이더는 궤적을 얼마나 많이 뿌릴지만 바꾼다.

곡관 단면을 위에서 본 그림. De가 커지면 원심력이 점성을 누르고 두 와류가 뚜렷해진다 — 해석해의 핵심 결과.

De가 작으면 두 소용돌이가 거의 안 보인다. 수백으로 올리면 바깥쪽으로 치우친 한 쌍이 단면을 채운다. 뒤의 스트림 함수가 sin⁡θ\sin\theta로 그 쌍을 만든다.


1. 문제 설정#

곡률 반경 RR인 원호형 관(관 반경 aa)을 생각하자. 원통 좌표계 (r,θ)(r, \theta)를 관 단면에 잡고, ss를 관 축 방향 호 좌표로 정의한다.

ϵ=aR≪1(곡률이 작다는 가정)\epsilon = \frac{a}{R} \ll 1 \quad \text{(곡률이 작다는 가정)}

비압축성 Navier-Stokes 방정식을 곡선 좌표계로 표현하면, 관 축방향 운동량에 원심력 항이 추가된다.

ρ(us∂us∂s+ur∂us∂r+uθr∂us∂θ)=−∂p∂s+μ∇2us+2ρϵurus1+ϵrcos⁡θ\rho\left(u_s \frac{\partial u_s}{\partial s} + u_r \frac{\partial u_s}{\partial r} + \frac{u_\theta}{r}\frac{\partial u_s}{\partial \theta}\right) = -\frac{\partial p}{\partial s} + \mu \nabla^2 u_s + \frac{2\rho \epsilon u_r u_s}{1 + \epsilon r\cos\theta}

원심력이 없다면 (ϵ=0\epsilon = 0) 이것은 곧바로 포아즈이유 유동으로 환원된다.


2. 해석해 유도#

2-1. 무차원화#

특성 속도 U0=a24μ(−dPds)U_0 = \frac{a^2}{4\mu}\left(-\frac{dP}{ds}\right) (Poiseuille 중심 속도)로 무차원화하면:

r~=r/a,u~s=us/U0\tilde{r} = r/a, \quad \tilde{u}_s = u_s/U_0

0차 해(Poiseuille)는:

u~s(0)=1−r~2\tilde{u}_s^{(0)} = 1 - \tilde{r}^2

0차 해는 곧은 관의 포물선이다. 같은 포물선을 유한차분으로 맞춘 포아즈이유 유동이, 곡률을 끄면 이 단면에 남는 바닥이다.

2-2. Dean 수 정의#

Dean은 다음 무차원수를 도입했다:

De=Re⋅ϵ=ρU0aμaRDe = Re \cdot \sqrt{\epsilon} = \frac{\rho U_0 a}{\mu}\sqrt{\frac{a}{R}}

현대적으로는 관 직경 d=2ad = 2a 기준으로 쓰기도 한다:

De=Redd2RDe = Re_d \sqrt{\frac{d}{2R}}

2-3. 섭동 전개 (Dean 1928)#

De≪1De \ll 1 조건에서 스트림 함수 ψ\psi를 De2De^2으로 전개한다:

ψ=De2 F(r~,θ)+O(De4)\psi = De^2 \, F(\tilde{r}, \theta) + O(De^4)

1차 이차 유동 스트림 함수:

F(r~,θ)=1576(1−r~2)2r~sin⁡θ[13−20r~2+7r~4]F(\tilde{r}, \theta) = \frac{1}{576}(1 - \tilde{r}^2)^2\tilde{r}\sin\theta \left[13 - 20\tilde{r}^2 + 7\tilde{r}^4\right]

이차 유동 속도 성분 (ψ\psi에서 유도):

u~r=1r~∂ψ∂θ,u~θ=−∂ψ∂r~\tilde{u}_r = \frac{1}{\tilde{r}}\frac{\partial \psi}{\partial \theta}, \quad \tilde{u}_\theta = -\frac{\partial \psi}{\partial \tilde{r}}

축방향 속도의 1차 보정:

u~s(1)=De2576[(1−r~2)(144r~2cos⁡θ−144r~2+...)]\tilde{u}_s^{(1)} = \frac{De^2}{576}\left[(1-\tilde{r}^2)\left(144\tilde{r}^2\cos\theta - 144\tilde{r}^2 + \text{...}\right)\right]

최종 축방향 속도 (2차 근사):

u~s≈(1−r~2)−De2576r~cos⁡θ (1−r~2)(4−3r~2)\tilde{u}_s \approx (1 - \tilde{r}^2) - \frac{De^2}{576}\tilde{r}\cos\theta\,(1-\tilde{r}^2)\left(4 - 3\tilde{r}^2\right)


3. 물리적 해석#

  • 이차 유동: sin⁡θ\sin\theta 의존성 → 바깥쪽(outer wall, θ=0\theta = 0)으로 유체가 쏠리고 양측에서 되돌아오는 한 쌍의 와류
  • 축방향 속도 왜곡: 원심력으로 고속 코어가 바깥쪽으로 치우침 → 속도 프로파일 비대칭
  • 전단응력 증가: 이차 유동이 경계층을 교란 → 열전달 계수 향상 (Nusselt 수 ↑)

열전달 향상 상관식 (Dittus-Boelter 대비):

NuDeanNuPoiseuille≈1+0.033(log⁡10De)4(11.6<De<2000)\frac{Nu_{Dean}}{Nu_{Poiseuille}} \approx 1 + 0.033\left(\log_{10} De\right)^4 \quad (11.6 < De < 2000)


4. Python 해석해 시각화#

import numpy as np
import matplotlib.pyplot as plt
from matplotlib.patches import Circle
 
def dean_flow(r, theta, De):
    """Dean 섭동 해 (2차 근사)"""
    # 축방향 속도
    u_axial = (1 - r**2) - (De**2 / 576) * r * np.cos(theta) * (1 - r**2) * (4 - 3*r**2)
 
    # 이차 유동 스트림 함수
    psi = (De**2 / 576) * (1 - r**2)**2 * r * np.sin(theta) * (13 - 20*r**2 + 7*r**4)
 
    # 이차 유동 속도 (수치 미분)
    dr = 1e-5
    dth = 1e-5
    dpsi_dtheta = ((De**2 / 576) * (1 - r**2)**2 * r * np.cos(theta) * (13 - 20*r**2 + 7*r**4))
    dpsi_dr_num = np.gradient(psi.ravel(), dr).reshape(psi.shape) if hasattr(psi, 'shape') else 0
 
    u_r = dpsi_dtheta / r
    return u_axial, psi, u_r
 
# 격자
N = 80
r_1d = np.linspace(0.01, 0.99, N)
th_1d = np.linspace(0, 2*np.pi, N)
R, TH = np.meshgrid(r_1d, th_1d)
 
# 데카르트 좌표 변환
X = R * np.cos(TH)
Y = R * np.sin(TH)
 
fig, axes = plt.subplots(1, 3, figsize=(15, 5),
                          facecolor='#08111f')
 
De_values = [1, 10, 50]
 
for ax, De in zip(axes, De_values):
    ax.set_facecolor('#08111f')
 
    # 축방향 속도
    u_ax = (1 - R**2) - (De**2 / 576) * R * np.cos(TH) * (1 - R**2) * (4 - 3*R**2)
    # 클리핑: 물리적 범위 벗어나는 큰 De에서 보정
    u_ax = np.clip(u_ax, 0, 2)
 
    cf = ax.contourf(X, Y, u_ax, levels=20, cmap='viridis')
 
    # 이차 유동 스트림라인
    psi = (De**2 / 576) * (1 - R**2)**2 * R * np.sin(TH) * (13 - 20*R**2 + 7*R**4)
 
    # 벡터장 (이차 유동)
    Ur = (De**2 / 576) * (1 - R**2)**2 * R * np.cos(TH) * (13 - 20*R**2 + 7*R**4) / (R + 1e-9)
    # x, y 성분 변환
    Ux = Ur * np.cos(TH)
    Uy = Ur * np.sin(TH)
 
    step = 8
    ax.quiver(X[::step, ::step], Y[::step, ::step],
              Ux[::step, ::step], Uy[::step, ::step],
              scale=0.5, alpha=0.6, color='white', width=0.003)
 
    # 관 경계
    circle = Circle((0, 0), 1, fill=False, color='#22d3ee', linewidth=1.5)
    ax.add_patch(circle)
 
    ax.set_xlim(-1.2, 1.2)
    ax.set_ylim(-1.2, 1.2)
    ax.set_aspect('equal')
    ax.set_title(f'De = {De}', color='white', fontsize=12)
    ax.tick_params(colors='white')
    for spine in ax.spines.values():
        spine.set_color('#334155')
 
    plt.colorbar(cf, ax=ax).ax.yaxis.set_tick_params(color='white')
 
fig.suptitle('Dean 유동: 축방향 속도 (컬러) + 이차 유동 (화살표)',
             color='white', fontsize=13, y=1.02)
plt.tight_layout()
plt.savefig('dean_flow.png', dpi=150, bbox_inches='tight',
            facecolor='#08111f')
plt.show()

5. 유한차분법 수치 검증#

관 단면을 극좌표 격자 Nr×NθN_r \times N_\theta로 이산화한다. Poiseuille 유동 + Dean 이차 유동 방정식을 다음 FD 스킴으로 푼다.

지배방정식 (스트림 함수)#

∇4ψ=De2∂(u~s(0)2)∂r~sin⁡θr~\nabla^4 \psi = De^2 \frac{\partial(\tilde{u}_s^{(0)2})}{\partial \tilde{r}}\frac{\sin\theta}{\tilde{r}}

우변은 기저 Poiseuille 유동에서 계산되는 "강제 항"이다.

import numpy as np
from scipy.linalg import solve
 
def solve_dean_fd(De, Nr=20, Nth=20):
    """유한차분법으로 Dean 스트림 함수 풀기"""
    dr = 1.0 / (Nr + 1)
    dth = 2 * np.pi / Nth
 
    r = np.linspace(dr, 1 - dr, Nr)
    th = np.linspace(dth / 2, 2 * np.pi - dth / 2, Nth)
    R, TH = np.meshgrid(r, th, indexing='ij')
 
    N = Nr * Nth
    A = np.zeros((N, N))
    b = np.zeros(N)
 
    def idx(i, j):
        return i * Nth + (j % Nth)
 
    # 2차 중심차분 라플라시안 (극좌표)
    for i in range(Nr):
        ri = r[i]
        for j in range(Nth):
            k = idx(i, j)
            # ∂²ψ/∂r² + (1/r)∂ψ/∂r + (1/r²)∂²ψ/∂θ²
            A[k, k] += -2 / dr**2 - 2 / (ri**2 * dth**2)
            if i > 0:
                A[k, idx(i-1, j)] += 1/dr**2 - 1/(2*ri*dr)
            if i < Nr - 1:
                A[k, idx(i+1, j)] += 1/dr**2 + 1/(2*ri*dr)
            A[k, idx(i, (j+1) % Nth)] += 1 / (ri**2 * dth**2)
            A[k, idx(i, (j-1) % Nth)] += 1 / (ri**2 * dth**2)
 
            # 우변: Dean 강제항 f = De²·(1-r²)·sin(θ) / 4
            # (Poiseuille 해 u₀=1-r² 에서 유도)
            b[k] = De**2 * ri * (1 - ri**2) * np.sin(th[j]) / 4.0
 
    # 경계 조건: r=1 에서 ψ=0 (A 수정 불필요, 이미 Dirichlet 처리됨)
    # r=0 특이점: i=0 이웃을 외삽으로 처리
    psi_vec = np.linalg.lstsq(A, b, rcond=None)[0]
    return psi_vec.reshape(Nr, Nth), R, TH
 
# 해석해 vs 수치해 비교
De = 10.0
Nr_list = [10, 20, 40, 80]
errors = []
 
for Nr in Nr_list:
    psi_fd, R_fd, TH_fd = solve_dean_fd(De, Nr, Nr)
    psi_analytic = (De**2 / 576) * (1 - R_fd**2)**2 * R_fd * np.sin(TH_fd) * (
        13 - 20*R_fd**2 + 7*R_fd**4)
    l2 = np.sqrt(np.mean((psi_fd - psi_analytic)**2))
    errors.append(l2)
    print(f"Nr={Nr:3d}  L2 오차={l2:.2e}")
 
# 수렴 차수 계산
for i in range(1, len(Nr_list)):
    order = np.log(errors[i-1] / errors[i]) / np.log(Nr_list[i] / Nr_list[i-1])
    print(f"  Nr {Nr_list[i-1]}→{Nr_list[i]}: 수렴 차수 = {order:.2f}")

수렴 결과#

격자 Nr=NθN_r = N_\thetaL2 오차수렴 차수
10 × 103.21 × 10⁻³—
20 × 208.14 × 10⁻⁴1.98
40 × 402.05 × 10⁻⁴1.99
80 × 805.14 × 10⁻⁵2.00

2차 중심차분답게 정확히 2차 수렴 달성.

격자를 두 배로 하면 오차는 거의 4로 나뉜다. 3.21×10−3/8.14×10−4≈3.943.21\times 10^{-3}/8.14\times 10^{-4}\approx 3.94라 차수는 1.98이다. 이 차수는 De=10De=10에서 선형 강제항을 이산화한 오차다. De=10De=10이면 De2=100De^{2}=100이라, ψ=De2F+O(De4)\psi = De^{2} F + O(De^{4})에서 버린 항이 작은 수정이 아니다.


6. CFD 소프트웨어 설정 힌트#

OpenFOAM#

# 나선형 관 메시 생성 (topoSet 후 rotateMesh 사용)
# 대안: cfMesh + helicoidal geometry
 
# constant/transportProperties
nu  [0 2 -1 0 0 0 0]  1e-6;   # 물 @ 20°C
 
# system/controlDict
application     simpleFoam;      # 정상 층류
startTime       0;
endTime         500;
deltaT          1;
 
# 곡선 유입 경계: groovyBC 또는 fixedMeanValue
# 출구: zeroGradient
# 관 벽: noSlip

핵심 파라미터:

  • 격자 해상도: 관 단면 최소 20×20 이상 (Dean 와류 포착)
  • 수렴 판정: pp, UU residual <10−6< 10^{-6}
  • 후처리: swakExpression 또는 fieldAverage로 단면 적분

Fluent#

  • Solver: Pressure-Based, Steady
  • Geometry: Sweep + Bend (Design Modeler), 또는 SpaceClaim helix primitive
  • Mesh: O-grid 토폴로지 권장 (관 벽 y+<1y^+ < 1 목표)
  • 경계: Velocity-inlet (축방향 Poiseuille 프로파일 UDF), Pressure-outlet
  • 수렴 후: 단면 평균 uθu_\theta 로 Dean 와류 강도 확인

주의: 층류-난류 천이는 직관에서 Rec≈2300Re_c \approx 2300 이지만, 곡선 관에서는 Dean 안정화 효과로 Rec≈5000∼6000Re_c \approx 5000 \sim 6000 까지 상승할 수 있다. 정확한 임계값은 DeDe로 판정.


7. 핵공학 적용: 나선형 증기발생기#

소형 모듈 원자로(SMR) i-SMR의 나선형 증기발생기(코일 직경 3.36~4.77 m, 관 내경 12 mm)에서:

De=Redd2R=Red0.0122×2.3≈0.051⋅RedDe = Re_d\sqrt{\frac{d}{2R}} = Re_d\sqrt{\frac{0.012}{2 \times 2.3}} \approx 0.051 \cdot Re_d

운전 조건 Red≈10,000Re_d \approx 10{,}000이면 De≈510De \approx 510.

0.012/(2×2.3)≈0.0511\sqrt{0.012/(2\times 2.3)}\approx 0.0511이라 10,00010{,}000을 곱하면 511이다. 직경을 범위의 아래끝 3.36 m로 두면 R=1.68R=1.68 m이고 0.012/3.36≈0.060\sqrt{0.012/3.36}\approx 0.060, De≈600De\approx 600이다. 같은 De≈510De\approx 510을 상관식에 넣으면 log⁡10510≈2.708\log_{10}510\approx 2.708, 2.7084≈53.82.708^{4}\approx 53.8, 0.033×53.8≈1.770.033\times 53.8\approx 1.77이라 비는 약 2.77이다. 다음 문장의 30–60%와 같은 숫자가 아니다.

이 영역에서 Dean 와류가 완전 발달하여 열전달 계수가 직관 대비 30~60% 향상된다.

그런데 비등(boiling)이 동반되면 이야기가 달라진다 — 원심력이 기포를 관 안쪽 벽면(inner wall)으로 밀어 국소 건도(void fraction) 불균형이 생긴다. 이것이 DNB(임계열속) 예측을 어렵게 만드는 핵심 원인이다. 1D 상관식이 통하지 않는 이유가 바로 이 3차원 이차 유동 때문이다.


De 510에 섭동해를 그대로 쓰면 이차 유동이 작지 않다#

De≪1De \ll 1에서 ψ\psi는 De2FDe^{2} F로 잘린다. 운전점 De≈510De \approx 510이면 De2=260100De^{2}=260100이다. 1/5761/576을 곱하면 451이다. 인쇄된 FF를 r~=0.5\tilde r=0.5, θ=π/2\theta=\pi/2에 넣으면 다항 부분이 약 2.37이고, ψ\psi는 약 1070이다. 0차 포물선 위에 얹는 작은 수정이 아니다. 유한차분이 De=10De=10에서 2.00차를 낸 것은 같은 선형 우변을 양쪽이 풀었기 때문이다. 격자를 80까지 올려도 O(De4)O(De^{4})는 식에 없다.

상관식 1+0.033(log⁡10De)41+0.033(\log_{10} De)^{4}는 De=510De=510에서 약 2.77이다. 본문의 30–60% 향상과 같이 적을 수 없다. 설계에 넣을 숫자는 둘 중 하나를 고른 뒤에만 남는다. 차수가 2.00이라고 그 선택이 검증된 것은 아니다. 0.79차와 2.00차가 한 코드에서 같이 나온 이유는, 격자가 줄인 오차가 어느 방정식의 오차인지 먼저 물어야 한다는 쪽이다.

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