Colebrook-White式で乱流のDarcy摩擦係数を求める|相対粗さとPython反復計算

「Colebrook-White式で乱流のDarcy摩擦係数を求める|相対粗さとPython反復計算」の内容を表す技術イラスト

Darcy-Weisbach式で直管圧力損失を計算するとき、必要になるのがDarcy摩擦係数です。

層流なら、fD=64Ref_D=\frac{64}{Re}

と直接求められます。

一方、乱流では摩擦係数はレイノルズ数だけでなく、管内面の粗さにも影響されます。

代表的な関係式がColebrook-White式です。1fD=−2log⁡10(ε/D3.7+2.51RefD)\frac{1}{\sqrt{f_D}} = -2\log_{10} \left( \frac{\varepsilon/D}{3.7} + \frac{2.51}{Re\sqrt{f_D}} \right)

ここで、

  • fDf_D:Darcy摩擦係数
  • ReRe:レイノルズ数
  • ε\varepsilon:絶対粗さ
  • DD:管内径
  • ε/D\varepsilon/D:相対粗さ

です。

NISTの配管試験でも、直管の摩擦係数評価にColebrook相関が使われています。

この式の難しいところは、求めたいfDf_Dが式の左辺と右辺の両方に存在することです。

そのため、一般には反復計算で求めます。

目次

なぜ乱流では粗さが必要なのか

層流では、流体の粘性による影響が支配的です。

一方、乱流では管壁近傍の流れと表面粗さが摩擦損失へ影響します。

そのため乱流のDarcy摩擦係数は、fD=f(Re,ε/D)f_D=f(Re,\varepsilon/D)

と考えます。

つまり必要なのは、

レイノルズ数
+
相対粗さ
↓
Darcy摩擦係数

です。

Colebrook-White式は、この関係を数式として表したものです。

絶対粗さと相対粗さ

管内面の粗さをε\varepsilonとします。

単位は長さです。

たとえば、ε=0.045 mm\varepsilon=0.045\ \mathrm{mm}

のように表します。

ただしColebrook-White式では、そのままの粗さではなく、εD\frac{\varepsilon}{D}

という相対粗さを使います。

相対粗さには単位がありません。

たとえば、

  • 管内径:D=20 mmD=20\ \mathrm{mm}
  • 絶対粗さ:ε=0.045 mm\varepsilon=0.045\ \mathrm{mm}

なら、εD=0.04520\frac{\varepsilon}{D} = \frac{0.045}{20}εD=0.00225\frac{\varepsilon}{D} = 0.00225

です。

このように、絶対粗さが同じでも管径が変われば相対粗さは変化します。

単位はそろえる

相対粗さでは、分子と分母の単位をそろえる必要があります。

たとえば、ε=0.045 mm\varepsilon=0.045\ \mathrm{mm}D=0.020 mD=0.020\ \mathrm{m}

をそのまま割ってはいけません。

どちらかへ統一します。D=20 mmD=20\ \mathrm{mm}

として、0.04520\frac{0.045}{20}

とするか、ε=0.000045 m\varepsilon=0.000045\ \mathrm{m}

として、0.0000450.020\frac{0.000045}{0.020}

とします。

どちらでも、0.002250.00225

になります。

相対粗さは無次元ですが、計算前には単位統一が必要です。

Colebrook-White式は陰関数

式をもう一度示します。1fD=−2log⁡10(ε/D3.7+2.51RefD)\frac{1}{\sqrt{f_D}} = -2\log_{10} \left( \frac{\varepsilon/D}{3.7} + \frac{2.51}{Re\sqrt{f_D}} \right)

この式では、fDf_Dが左右両方にあります。

つまり、fD=何かf_D= \text{何か}

という形に単純には整理できません。

そのため、

初期値を仮定
↓
右辺を計算
↓
新しい摩擦係数を得る
↓
再計算
↓
収束するまで繰り返す

という方法を使います。

INLのColebrook-White実装資料でも、この相関は陰的な式として反復的に解かれています。

反復用の形に変形する

Colebrook-White式を反復計算しやすい形にすると、fn+1=1[−2log⁡10(ε/D3.7+2.51Refn)]2f_{n+1} = \frac{1}{ \left[ -2\log_{10} \left( \frac{\varepsilon/D}{3.7} + \frac{2.51}{Re\sqrt{f_n}} \right) \right]^2 }

となります。

つまり、

  1. fnf_nを仮定
  2. 右辺へ代入
  3. fn+1f_{n+1}を計算
  4. 差が十分小さくなるまで繰り返す

という処理です。

計算例

次の条件を考えます。

  • レイノルズ数:Re=100000Re=100000
  • 管内径:D=20 mmD=20\ \mathrm{mm}
  • 絶対粗さ:ε=0.045 mm\varepsilon=0.045\ \mathrm{mm}

まず相対粗さを求めます。εD=0.04520=0.00225\frac{\varepsilon}{D} = \frac{0.045}{20} = 0.00225

です。

初期値として、f0=0.020f_0=0.020

を仮定します。

Colebrook-White式へ代入すると、新しい値が得られます。

この計算を繰り返すと、最終的に、fD≈0.02574f_D\approx0.02574

へ収束します。

この値がDarcy摩擦係数です。

Pythonで反復計算する

基本的な実装は次のようにできます。

import math


def colebrook_white(
    reynolds: float,
    relative_roughness: float,
    initial_friction_factor: float = 0.02,
    tolerance: float = 1e-10,
    max_iterations: int = 100,
) -> float:
    if reynolds <= 0:
        raise ValueError("Reは0より大きい必要があります")

    if relative_roughness < 0:
        raise ValueError("相対粗さは0以上である必要があります")

    if initial_friction_factor <= 0:
        raise ValueError("初期摩擦係数は0より大きい必要があります")

    f = initial_friction_factor

    for _ in range(max_iterations):
        new_f = 1.0 / (
            -2.0
            * math.log10(
                relative_roughness / 3.7
                + 2.51 / (reynolds * math.sqrt(f))
            )
        ) ** 2

        if abs(new_f - f) < tolerance:
            return new_f

        f = new_f

    raise RuntimeError("Colebrook-White式が収束しませんでした")

計算例は、

re = 100_000
roughness_mm = 0.045
diameter_mm = 20.0

relative_roughness = roughness_mm / diameter_mm

f = colebrook_white(
    reynolds=re,
    relative_roughness=relative_roughness,
)

print(f)

およそ、

0.02574

となります。

収束判定を入れる

反復計算では、単に回数だけ繰り返すのではなく、収束条件を設定します。

今回の例では、

abs(new_f - f) < tolerance

を使っています。

つまり、∣fn+1−fn∣<εtol|f_{n+1}-f_n|<\varepsilon_{\mathrm{tol}}

となったら計算終了です。

ここで使うεtol\varepsilon_{\mathrm{tol}}は管粗さのε\varepsilonとは別物です。

プログラムでは混乱を避けるため、

tolerance

など別名にします。

最大反復回数も必要

反復処理では、何らかの理由で収束しない場合に無限ループへ入らないよう、

max_iterations

を設けます。

たとえば100回を上限として、

for _ in range(max_iterations):

とします。

収束しなければ、

raise RuntimeError(...)

として異常を明示します。

工学計算では、数値が出たように見せて処理を続けるより、収束失敗を検出する方が安全です。

層流にColebrook-White式を使わない

Colebrook-White式は乱流域の摩擦係数を扱うための関係です。

層流では、fD=64Ref_D=\frac{64}{Re}

を使います。

したがって計算プログラムでは、先にレイノルズ数から流動状態を判定します。

概念的には、

Re
↓
層流
→ 64 / Re

乱流
→ Colebrook-White

遷移域
→ 警告・別扱い

という構造です。

境界付近は流れの状態が不安定になり得るため、単純な二値判定より遷移領域を明示した方が扱いやすくなります。

Darcy摩擦係数であることを明示する

Colebrook-White式で求めるのは、ここではDarcy摩擦係数です。

摩擦係数にはFanning摩擦係数もあります。

両者には、fD=4fFf_D=4f_F

という関係があります。

Darcy-Weisbach式、Δp=fDLDρv22\Delta p = f_D \frac{L}{D} \frac{\rho v^2}{2}

へ使うならDarcy摩擦係数です。

計算コードでは、

darcy_friction_factor

のように名前へ定義を含めると混同しにくくなります。

粗さデータは固定値だと決めつけない

絶対粗さは、材料名だけで一意に決まる理想的な物性値ではありません。

実際には、

  • 製造状態
  • 表面仕上げ
  • 使用年数
  • 腐食
  • スケール
  • 汚れ
  • 内面処理

などによって変化します。

NISTの試験でも、Colebrook相関との比較では管内面粗さを仮定して評価しています。

したがって実務では、

材質名
↓
粗さを自動確定

と単純化しすぎない方が安全です。

データベース化するなら、粗さには出典と条件を持たせます。

{
  "absolute_roughness": {
    "value": 0.045,
    "unit": "mm",
    "source": "manufacturer_or_reference",
    "condition": "specified_surface_condition"
  }
}

のような構造が考えられます。

圧力損失計算へ接続する

Colebrook-White式で得られた摩擦係数は、Darcy-Weisbach式へ使います。Δp=fDLDρv22\Delta p = f_D \frac{L}{D} \frac{\rho v^2}{2}

つまり計算パイプラインは、

流量
↓
流速
↓
Re
↓
相対粗さ
↓
Colebrook-White
↓
Darcy摩擦係数
↓
Darcy-Weisbach
↓
直管圧力損失

となります。

ここまでつなげると、配管径や流量を変更したときに圧力損失を自動再計算できます。

関数を分けておく

再利用性を高めるなら、1つの巨大な関数にしない方が扱いやすくなります。

たとえば、

def relative_roughness(
    roughness_mm: float,
    diameter_mm: float,
) -> float:
    if roughness_mm < 0:
        raise ValueError("粗さは0以上である必要があります")

    if diameter_mm <= 0:
        raise ValueError("内径は0より大きい必要があります")

    return roughness_mm / diameter_mm

と、

def colebrook_white(...):
    ...

を分けます。

さらに、

def darcy_friction_factor(...):
    ...

で層流・乱流を切り替えます。

def darcy_friction_factor(
    reynolds: float,
    relative_roughness: float,
) -> float:
    if reynolds < 2300:
        return 64.0 / reynolds

    if reynolds < 4000:
        raise ValueError("遷移領域です")

    return colebrook_white(
        reynolds,
        relative_roughness,
    )

こうしておけば、

流動状態判定

と、

乱流摩擦係数計算

を分離できます。

入力と計算モデルをデータ化する

将来WebツールやAPIへ展開するなら、入力値だけでなくモデル名も保持できます。

{
  "reynolds_number": 100000,
  "inside_diameter": {
    "value": 20,
    "unit": "mm"
  },
  "absolute_roughness": {
    "value": 0.045,
    "unit": "mm"
  },
  "friction_factor": {
    "definition": "darcy",
    "model": "colebrook_white"
  }
}

こうすると、

  • どの式を使ったか
  • DarcyかFanningか
  • どの粗さを使ったか

を後から追跡できます。

工学計算では、結果だけを保存するより計算根拠を一緒に保存することが重要です。

明示式を使う方法もある

Colebrook-White式は反復が必要なため、計算負荷を減らす目的で複数の明示近似式が提案されています。

NRELの資料でも、乱流域の摩擦係数についてColebrook式の明示近似を使用する例があります。

ただし、近似式ごとに適用範囲と誤差特性があります。

そのため、

反復Colebrook

を基準実装として持ち、

高速近似

を別モデルとして追加する構造が検証しやすいでしょう。

Moody線図との関係

Moody線図は、レイノルズ数と相対粗さから摩擦係数を読み取るためのグラフです。

Colebrook-White式が数値計算側の表現だとすると、Moody線図は同じ関係を視覚的に確認するための代表的な方法です。

人間が概算・確認する場合はMoody線図、プログラムで大量計算する場合は数式による解法、という使い分けができます。

重要なのは、どちらも、ReRe

と、ε/D\varepsilon/D

から摩擦係数を決めるという同じ構造を持っていることです。

まとめ

乱流配管のDarcy摩擦係数は、Colebrook-White式、1fD=−2log⁡10(ε/D3.7+2.51RefD)\frac{1}{\sqrt{f_D}} = -2\log_{10} \left( \frac{\varepsilon/D}{3.7} + \frac{2.51}{Re\sqrt{f_D}} \right)

から求められます。

重要な入力は、

  • レイノルズ数ReRe
  • 絶対粗さε\varepsilon
  • 管内径DD
  • 相対粗さε/D\varepsilon/D

です。

式は陰関数なので、

初期値
↓
反復
↓
収束判定
↓
Darcy摩擦係数

として解きます。

さらに、

流量
↓
流速
↓
Re
↓
相対粗さ
↓
摩擦係数
↓
圧力損失

までつなげると、配管計算を一つの再利用可能な計算チェーンへできます。

Colebrook-White式単体を覚えるより、どの入力から何を求め、その結果が次のどの式へ渡るかまで構造として理解することが重要です。

参考情報

  • NIST Technical Note 2294 — 直管摩擦係数とColebrook相関の比較
  • Idaho National Laboratory TMAP8 — Colebrook-White Darcy friction factor implementation
  • National Renewable Energy Laboratory — 乱流摩擦係数とColebrook近似の利用例

参考になったらシェアしてください
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

機械設計・油圧・CAD・Python・AIなど、ものづくりに関わる技術を扱っています。工学知識を整理・構造化し、設計や自動化に再利用できる形へ変えていくことを目指しています。

目次