Skip to content
cfd-lab:~/ja/posts/2026-04-28-rankine-vorte…● online

この記事は著者が韓国語で書いた原文の翻訳です。 原文(한국어)を読む

NOTE #025DAY TUE 유체역학DATE 2026.04.28UPDATED 2026.10.19READ 5 min read#Vortex#Vorticity#Fluid-Dynamics#Flow-Phenomena#Helmholtz

渦の二つの顔 — 自由渦・強制渦、そしてヘルムホルツ

葉が排水口へ同じ面を向けたままなら、その領域は公転だけです。自転の2ωは黄色いコアにあります。

風呂の栓を抜くと水がぐるぐる回ります。その光景を「水が回転している」と呼びます。流体力学者は、同じ領域の大部分について「ここでは回転は起きていない(irrotational)」と答えます。矛盾に見えるこの言い方の中に、渦(vortex)の姿があります。同じ絵に自由渦(free vortex、1/r1/r 速度)と強制渦(forced vortex、ωr\omega r 速度)が同居します。渦度(vorticity、流体粒子の自転角速度の二倍)が測るのは、その差です。ヘルムホルツの定理は、その渦がなぜ簡単に消えないのかまで押し進めます。

風呂の渦は本当に「回転」なのか

「回転」という一語に二つの層が重なります。一つは 公転 です。ある点のまわりを円で動きます。もう一つは 自転 です。粒子自身が回ります。

風呂の渦で水の粒子は公転します。排水口から離れた領域の自転は、ほとんどありません。水面の小さな葉は円をたどりますが、体は回りません。いつも同じ面が排水口を向きます。

流体力学で「回転」とは自転のことです。自由渦は中心の特異点を除く全域で「回転なし」です。

コア半径 RR を小さくすると黄色い自転領域が狭まり、Umax⁡U_{\max} を上げるとコア渦度 2Umax⁡/R2U_{\max}/R が大きくなります。

Yellow tracers sit inside the forced-vortex core and rotate as a solid body (ω = 2U/R). Blue tracers outside follow u_θ = ΓR/r — circular streamlines but zero local spin. The Rankine combined vortex is the simplest model for a bath-tub drain or tornado.

黄色い粒子は場で自転します。青い粒子は排水口側の面を保ったまま公転し、右上の曲線は r≤Rr \le R で直線、その外では 1/r1/r です。

強制渦と自由渦:同じ絵、違う魂

回転する容器の水を長く混ぜると、液体全体が剛体のように回ります。これを 強制渦 と呼びます。粒子は公転と同時に自転します。

uθ(r)=ω ru_\theta(r) = \omega \, r

ここで uθu_\theta は接線速度、ω\omega は剛体回転の角速度、rr は中心からの距離です。速度が距離に比例します。

粘性を無視した理想流体で自然に生じる渦は 自由渦(ポテンシャル渦)です。

uθ(r)=Γ2πru_\theta(r) = \frac{\Gamma}{2\pi r}

Γ\Gamma は 循環(circulation)です。閉じた経路に沿った速度の線積分です。速度は 1/r1/r で減り、中心では発散します。この特異点を実流体では粘性が和らげます。

強制渦自由渦
速度ωr\omega rΓ/2πr\Gamma / 2\pi r
自転ありなし
エネルギー供給連続的最初の一度だけ
身近な例かき混ぜたカップ風呂・竜巻

同じ円形の流れでも自転の有無が逆です。この差を一つの量で測るのが渦度です。

渦度が測るもの

渦度 ω\boldsymbol{\omega} は速度場の回転(curl)です。

ω=∇×u\boldsymbol{\omega} = \nabla \times \mathbf{u}

二次元では zz 成分だけが残り

ωz=∂v∂x−∂u∂y\omega_z = \frac{\partial v}{\partial x} - \frac{\partial u}{\partial y}

となります。u,vu, v はそれぞれ x,yx, y 方向の速度成分です。この値は 流体粒子の自転角速度の二倍 に等しいです。

強制渦に代入すると ωz=2ω\omega_z = 2\omega で一定です。領域全体が自転しています。自由渦に代入すると、中心以外では ωz=0\omega_z = 0 です。同じ丸い流線でも、自転は正反対です。

ランキン組合せ渦 — 竜巻の青写真

現実の渦は片方だけには従いません。中心付近では粘性が強く剛体のように回り、遠方では粘性が落ちて自由渦の法則に従います。両者をつないだ模型が ランキン組合せ渦 です。

uθ(r)={Umax⁡R r,r≤RUmax⁡ Rr,r>Ru_\theta(r) = \begin{cases} \dfrac{U_{\max}}{R}\, r, & r \le R \\[6pt] \dfrac{U_{\max}\, R}{r}, & r > R \end{cases}

RR はコア半径、Umax⁡U_{\max} はコア境界での最大接線速度です。二式は r=Rr = R で滑らかにつながります。竜巻の風速、翼端渦、排水口の吸い込み渦は、この形に近いです。コア内は回転領域、コア外は非回転領域です。

コードの初期値を式へそのまま入れます。Umax⁡=1U_{\max} = 1、R=0.5R = 0.5 です。境界 r=Rr = R では内側も外側も uθ=1u_\theta = 1 です。r=0.25r = 0.25 なら内側は Umax⁡r/R=0.5U_{\max} r / R = 0.5 です。r=1r = 1 なら外側は Umax⁡R/r=0.5U_{\max} R / r = 0.5 です。中心から同じ距離でも、速度の数字だけが同じで、傾きは逆です。

外側ループの循環は、半径を大きくしても変わりません。r>Rr > R では uθ=Umax⁡R/ru_\theta = U_{\max} R / r なので、Γ=2πruθ=2πRUmax⁡\Gamma = 2\pi r u_\theta = 2\pi R U_{\max} です。数字を入れると 2π×0.5×1=π2\pi \times 0.5 \times 1 = \pi です。コア渦度は ωz=2Umax⁡/R=4\omega_z = 2 U_{\max}/R = 4 です。コア面積 πR2=π/4\pi R^2 = \pi/4 にこの渦度を掛けると 4×π/4=π4 \times \pi/4 = \pi です。面積積分と周回積分が同じ循環で閉じます。この Γ\Gamma が揚力に変わる道は 回転する球 に続きます。

ヘルムホルツの定理 — 渦の不滅

粘性を無視すれば、粒子に働く力は圧力だけです。圧力は粒子中心を向くので、トルクを生みません。したがって 自転していない粒子は永遠に自転を始めず、自転している粒子は永遠に止まりません。これがヘルムホルツの渦定理を一行にしたものです。

より精密なのは ケルビンの定理 です。閉じた物質曲線に沿った循環 Γ\Gamma は、時間が経っても変わりません。

DΓDt=0\frac{D\Gamma}{Dt} = 0

D/DtD/Dt は物質微分です。流体粒子に追随します。渦管は切れず、分かれず、引き伸ばすほど速く回ります。フィギュアスケートで腕を縮めるのと同じです。実流体には粘性があるので渦はやがて拡散しますが、水や空気では数日生き残ります。航空機の通った跡に凝結渦が長く見えるのはこのためです。

速度ポテンシャルが開く扉

非回転領域(ω=0\boldsymbol{\omega} = 0)では、ベクトル恒等式が一行を渡します。

∇×u=0⟹u=∇ϕ\nabla \times \mathbf{u} = 0 \quad \Longrightarrow \quad \mathbf{u} = \nabla \phi

スカラー関数 ϕ\phi を 速度ポテンシャル と呼びます。さらに非圧縮 ∇⋅u=0\nabla \cdot \mathbf{u} = 0 なら

∇2ϕ=0\nabla^2 \phi = 0

ラプラス方程式です。非粘性・非回転・非圧縮の流れは、一つのスカラーに帰着します。19世紀の流体力学が翼やソース・シンクを解析的に扱えた理由がここです。自由渦自身は ϕ=(Γ/2π) θ\phi = (\Gamma / 2\pi)\, \theta です。角度 θ\theta に比例するポテンシャルです。

コードで見る二つの渦

ランキン渦の速度と離散渦度を描けば、違いが一目でわかります。

import numpy as np
 
def rankine_speed(r, R_core, U_max):
    """ランキン組合せ渦の接線速度"""
    speed = np.where(r <= R_core,
                     U_max * r / R_core,
                     U_max * R_core / np.maximum(r, 1e-9))
    return speed
 
def vorticity_field(u, v, dx, dy):
    """2次元の離散curl: omega_z = dv/dx - du/dy"""
    dvdx = (v[1:-1, 2:] - v[1:-1, :-2]) / (2 * dx)
    dudy = (u[2:, 1:-1] - u[:-2, 1:-1]) / (2 * dy)
    return dvdx - dudy
 
# 200x200 格子でサンプリング
N, L = 200, 2.0
x = np.linspace(-L, L, N)
y = np.linspace(-L, L, N)
X, Y = np.meshgrid(x, y)
R = np.hypot(X, Y)
THETA = np.arctan2(Y, X)
 
U_max, R_core = 1.0, 0.5
u_theta = rankine_speed(R, R_core, U_max)
u =  -u_theta * np.sin(THETA)
v =   u_theta * np.cos(THETA)
 
dx = dy = x[1] - x[0]
omega = vorticity_field(u, v, dx, dy)
 
# コア内とコア外の平均渦度
mask_in  = R[1:-1, 1:-1] <  R_core
mask_out = R[1:-1, 1:-1] >  1.5 * R_core
print(f"コア内 平均 omega_z ~ {omega[mask_in].mean():.3f}")   # ~ 2 * U_max / R_core
print(f"コア外 平均 omega_z ~ {omega[mask_out].mean():.3f}")  # ~ 0

コア内では ωz≈2Umax⁡/R\omega_z \approx 2 U_{\max}/R でほぼ一定、コア外ではゼロに近いです。同じ丸い流れの中に、自転を分ける境界が半径 RR に描かれます。

格子も同じ数字です。N=200N = 200、L=2L = 2 なので領域は −2-2 から 22 まで、間隔は 4/1994/199 です。コア半径 0.50.5 は中心から約二十五セルです。外側マスクは 1.5R=0.751.5 R = 0.75 から開きます。RR と 0.750.75 の間は平均から外します。中心差分のステンシルが境界をまたぐと、ωz\omega_z が 44 でも 00 でもない値になるためです。注釈の期待値は、コア内 44、外側 00 です。

コア半径をどこに残すか

コアを小さく切りすぎると 2Umax⁡/R2U_{\max}/R が格子を超えます。Umax⁡=1U_{\max} = 1、R=0.5R = 0.5 では渦度は 44 です。RR を半分にすると同じ式は 88 を返します。境界をまたぐ中心差分は、平均を 44 でも 88 でもない値で汚します。外側マスクを 1.5R1.5R から開く理由です。

コアを領域の端まで押し出すと、1/r1/r の尾が消えます。循環 Γ=2πRUmax⁡\Gamma = 2\pi R U_{\max} は残っても、葉が同じ面を保つ非回転区間がなくなります。その尾でベルヌーイ定数が流線を横切って一定かどうかは、全圧が落ちた計算 が別に扱います。

役に立ったらシェアしてください。