Darcy-Weisbach式で直管圧力損失を計算するとき、必要になるのがDarcy摩擦係数です。
層流なら、
と直接求められます。
一方、乱流では摩擦係数はレイノルズ数だけでなく、管内面の粗さにも影響されます。
代表的な関係式がColebrook-White式です。
ここで、
- :Darcy摩擦係数
- :レイノルズ数
- :絶対粗さ
- :管内径
- :相対粗さ
です。
NISTの配管試験でも、直管の摩擦係数評価にColebrook相関が使われています。
この式の難しいところは、求めたいが式の左辺と右辺の両方に存在することです。
そのため、一般には反復計算で求めます。
なぜ乱流では粗さが必要なのか
層流では、流体の粘性による影響が支配的です。
一方、乱流では管壁近傍の流れと表面粗さが摩擦損失へ影響します。
そのため乱流のDarcy摩擦係数は、
と考えます。
つまり必要なのは、
レイノルズ数
+
相対粗さ
↓
Darcy摩擦係数
です。
Colebrook-White式は、この関係を数式として表したものです。
絶対粗さと相対粗さ
管内面の粗さをとします。
単位は長さです。
たとえば、
のように表します。
ただしColebrook-White式では、そのままの粗さではなく、
という相対粗さを使います。
相対粗さには単位がありません。
たとえば、
- 管内径:
- 絶対粗さ:
なら、
です。
このように、絶対粗さが同じでも管径が変われば相対粗さは変化します。
単位はそろえる
相対粗さでは、分子と分母の単位をそろえる必要があります。
たとえば、
をそのまま割ってはいけません。
どちらかへ統一します。
として、
とするか、
として、
とします。
どちらでも、
になります。
相対粗さは無次元ですが、計算前には単位統一が必要です。
Colebrook-White式は陰関数
式をもう一度示します。
この式では、が左右両方にあります。
つまり、
という形に単純には整理できません。
そのため、
初期値を仮定
↓
右辺を計算
↓
新しい摩擦係数を得る
↓
再計算
↓
収束するまで繰り返す
という方法を使います。
INLのColebrook-White実装資料でも、この相関は陰的な式として反復的に解かれています。
反復用の形に変形する
Colebrook-White式を反復計算しやすい形にすると、
となります。
つまり、
- を仮定
- 右辺へ代入
- を計算
- 差が十分小さくなるまで繰り返す
という処理です。
計算例
次の条件を考えます。
- レイノルズ数:
- 管内径:
- 絶対粗さ:
まず相対粗さを求めます。
です。
初期値として、
を仮定します。
Colebrook-White式へ代入すると、新しい値が得られます。
この計算を繰り返すと、最終的に、
へ収束します。
この値が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
を使っています。
つまり、
となったら計算終了です。
ここで使うは管粗さのとは別物です。
プログラムでは混乱を避けるため、
tolerance
など別名にします。
最大反復回数も必要
反復処理では、何らかの理由で収束しない場合に無限ループへ入らないよう、
max_iterations
を設けます。
たとえば100回を上限として、
for _ in range(max_iterations):
とします。
収束しなければ、
raise RuntimeError(...)
として異常を明示します。
工学計算では、数値が出たように見せて処理を続けるより、収束失敗を検出する方が安全です。
層流にColebrook-White式を使わない
Colebrook-White式は乱流域の摩擦係数を扱うための関係です。
層流では、
を使います。
したがって計算プログラムでは、先にレイノルズ数から流動状態を判定します。
概念的には、
Re
↓
層流
→ 64 / Re
乱流
→ Colebrook-White
遷移域
→ 警告・別扱い
という構造です。
境界付近は流れの状態が不安定になり得るため、単純な二値判定より遷移領域を明示した方が扱いやすくなります。
Darcy摩擦係数であることを明示する
Colebrook-White式で求めるのは、ここではDarcy摩擦係数です。
摩擦係数にはFanning摩擦係数もあります。
両者には、
という関係があります。
Darcy-Weisbach式、
へ使うなら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式へ使います。
つまり計算パイプラインは、
流量
↓
流速
↓
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線図、プログラムで大量計算する場合は数式による解法、という使い分けができます。
重要なのは、どちらも、
と、
から摩擦係数を決めるという同じ構造を持っていることです。
まとめ
乱流配管のDarcy摩擦係数は、Colebrook-White式、
から求められます。
重要な入力は、
- レイノルズ数
- 絶対粗さ
- 管内径
- 相対粗さ
です。
式は陰関数なので、
初期値
↓
反復
↓
収束判定
↓
Darcy摩擦係数
として解きます。
さらに、
流量
↓
流速
↓
Re
↓
相対粗さ
↓
摩擦係数
↓
圧力損失
までつなげると、配管計算を一つの再利用可能な計算チェーンへできます。
Colebrook-White式単体を覚えるより、どの入力から何を求め、その結果が次のどの式へ渡るかまで構造として理解することが重要です。
参考情報
- NIST Technical Note 2294 — 直管摩擦係数とColebrook相関の比較
- Idaho National Laboratory TMAP8 — Colebrook-White Darcy friction factor implementation
- National Renewable Energy Laboratory — 乱流摩擦係数とColebrook近似の利用例

