皆さん、一度は経験したことがあるでしょう。蛇口を勢いよく閉めた瞬間、配管から「ドン!」という衝撃音が響く。あれ、ただの音だと思っていませんか?
実はあの衝撃、条件によっては数MPaもの圧力波になっているんです。
家庭の細い塩ビ管なら問題にならなくても、工場や発電所の大口径配管で同じことが起きると…配管の破断、継手の破損、ポンプの逆転。過去には実際に死者を出した事故も報告されています。
今回はこの「水撃(ウォーターハンマー)」現象を、数式から実装、そして実務での対策まで一気に解説します。最後にはブラウザで動くシミュレーターで実際にパラメータをいじって遊べるようになっています。
ざっくり本質:水撃は「水の慣性」と「管壁の弾性」のせい
水撃の本質を一言で言うと:
「止まりたい水」と「止めさせたい弁」のせめぎ合いで生まれる圧力の波
イメージしてください。高速道路を時速100kmで走る大型トラックが、突然壁に衝突したらどうなる? 衝撃波が発生し、車体はグシャッと潰れる。水撃も同じです。配管内を高速で流れていた水が、弁の急閉鎖で「壁」にぶつかる。水は非圧縮性に近いので、運動エネルギーが一瞬で圧力エネルギーに変換される。
ただし、完全な非圧縮性ではないので、実際には「圧力波」として配管内を音速に近い速度で伝わっていきます。この波の速さが、後で出てくる「圧力波速度 ( a )」です。
数式で理解する:Joukowskyの式と圧力波速度
核心その1:最大水撃圧を決めるJoukowskyの式
水撃の最大圧力上昇 (\Delta P) は、たったこれだけの式で表せます:
\Delta P = \rho \cdot a \cdot \Delta V
- (\rho):流体の密度 [kg/m³]
- (a):管内の圧力波速度 [m/s]
- (\Delta V):流速の変化量 [m/s](急閉鎖なら初期流速そのもの)
つまり、流速が速いほど、圧力波速度が速いほど、水撃圧は大きくなる。直感的ですね。
核心その2:圧力波速度 (a) の正体
ここが重要です。水中の音速は約1480m/sですが、管内の圧力波速度は管の材質によって大きく変わります。
a = \sqrt{\frac{K/\rho}{1 + \frac{K \cdot D}{E \cdot e}}}
- (K):流体の体積弾性係数 [Pa](水なら約2.2GPa)
- (E):管材のヤング率 [Pa]
- (D):管内径 [m]
- (e):管厚 [m]
ポイントは分母の (\frac{K \cdot D}{E \cdot e}) です。
もし管が完全に剛体((E \to \infty))なら、この項はゼロになり (a = \sqrt{K/\rho}) で水中音速そのもの。しかし現実の管は弾性を持つため、圧力波が来ると管壁が膨らんで波の伝播を遅くする。つまり、柔らかい管ほど水撃圧は小さくなる。
核心その3:臨界閉鎖時間と緩閉鎖の条件
弁をどれだけ速く閉めるかで、水撃圧が変わる:
T_r = \frac{2L}{a}
- (L):管路長 [m]
- (T_r):圧力波が管路を往復する時間 [s](臨界閉鎖時間)
弁閉鎖時間 (t_c) が (T_r) より短い(急閉鎖)→ 最大水撃圧 (\Delta P = \rho a \Delta V) がそのまま発生
(t_c) が (T_r) より長い(緩閉鎖)→ 圧力波が反射して戻ってくる間に弁がまだ開いているので、水撃圧が低減:
\Delta P_{slow} \approx \Delta P_{Joukowsky} \cdot \frac{T_r}{t_c} \quad (t_c > T_r)
コードで実装する:JavaScriptで水撃計算機を作る
ここがこの記事の核です。上記の数式をそのままJavaScriptで実装します。ブラウザの開発者ツール(F12)でそのまま実行できます。
/**
* 水撃(ウォーターハンマー)解析計算機
* Joukowsky式に基づく最大水撃圧・圧力波速度の計算
*/
class WaterHammerCalculator {
constructor() {
// 流体物性(20°Cの水)
this.fluids = {
water: { rho: 998, K: 2.2e9, name: '水(20°C)' },
oil: { rho: 880, K: 1.5e9, name: '石油(鉱油)' },
mercury: { rho: 13546, K: 25.3e9, name: '水銀' }
};
// 管材のヤング率 [Pa]
this.pipeMaterials = {
steel: { E: 210e9, name: '鋼管' },
castIron: { E: 110e9, name: '鋳鉄管' },
concrete: { E: 30e9, name: 'コンクリート管' },
HDPE: { E: 1e9, name: 'HDPE管' },
rubber: { E: 0.05e9, name: 'ゴム管' }
};
}
/**
* 圧力波速度 a [m/s] を計算
* @param {string} fluidType - 流体種類
* @param {string} pipeType - 管材種類
* @param {number} D - 管内径 [m]
* @param {number} e - 管厚 [m]
* @returns {number} 圧力波速度 [m/s]
*/
calcWaveSpeed(fluidType, pipeType, D, e) {
const fluid = this.fluids[fluidType];
const pipe = this.pipeMaterials[pipeType];
if (!fluid || !pipe) throw new Error('Invalid fluid or pipe type');
if (e <= 0) throw new Error('Pipe thickness must be positive');
const K = fluid.K;
const rho = fluid.rho;
const E = pipe.E;
// a = sqrt( (K/rho) / (1 + K*D/(E*e)) )
const numerator = K / rho;
const denominator = 1 + (K * D) / (E * e);
const a = Math.sqrt(numerator / denominator);
return a;
}
/**
* 最大水撃圧 ΔP [Pa] を計算(急閉鎖時)
* @param {number} rho - 流体密度 [kg/m³]
* @param {number} a - 圧力波速度 [m/s]
* @param {number} deltaV - 流速変化量 [m/s]
* @returns {number} 水撃圧 [Pa]
*/
calcJoukowskyPressure(rho, a, deltaV) {
return rho * a * deltaV;
}
/**
* 臨界閉鎖時間 Tr [s] を計算
* @param {number} L - 管路長 [m]
* @param {number} a - 圧力波速度 [m/s]
* @returns {number} 臨界閉鎖時間 [s]
*/
calcCriticalClosureTime(L, a) {
return (2 * L) / a;
}
/**
* 緩閉鎖時の水撃圧 [Pa] を計算
* @param {number} deltaPJoukowsky - 急閉鎖時の水撃圧 [Pa]
* @param {number} Tr - 臨界閉鎖時間 [s]
* @param {number} tc - 実際の閉鎖時間 [s]
* @returns {number} 緩閉鎖時の水撃圧 [Pa]
*/
calcSlowClosurePressure(deltaPJoukowsky, Tr, tc) {
if (tc <= Tr) return deltaPJoukowsky; // 急閉鎖
return deltaPJoukowsky * (Tr / tc);
}
/**
* フル解析(1発で全部計算)
*/
analyze(params) {
const { fluidType, pipeType, D, e, L, V0, tc } = params;
// 圧力波速度
const a = this.calcWaveSpeed(fluidType, pipeType, D, e);
const fluid = this.fluids[fluidType];
// 急閉鎖時の最大水撃圧
const deltaPJoukowsky = this.calcJoukowskyPressure(fluid.rho, a, V0);
// 臨界閉鎖時間
const Tr = this.calcCriticalClosureTime(L, a);
// 実際の水撃圧(閉鎖時間考慮)
const deltaPActual = this.calcSlowClosurePressure(deltaPJoukowsky, Tr, tc);
return {
waveSpeed: a,
criticalClosureTime: Tr,
pressureJoukowsky: deltaPJoukowsky,
pressureActual: deltaPActual,
isSlowClosure: tc > Tr,
pressureActualMPa: deltaPActual / 1e6,
pressureJoukowskyMPa: deltaPJoukowsky / 1e6
};
}
}
// ===== 使用例 =====
const calc = new WaterHammerCalculator();
// 鋼管・水・内径0.3m・管厚5mm・管路長200m・流速2m/s・閉鎖時間0.5s
const result = calc.analyze({
fluidType: 'water',
pipeType: 'steel',
D: 0.3, // 内径 0.3m
e: 0.005, // 管厚 5mm
L: 200, // 管路長 200m
V0: 2.0, // 初期流速 2m/s
tc: 0.5 // 弁閉鎖時間 0.5s
});
console.log('=== 水撃解析結果 ===');
console.log(`流体: ${calc.fluids.water.name}`);
console.log(`管材: ${calc.pipeMaterials.steel.name}`);
console.log(`圧力波速度: ${result.waveSpeed.toFixed(1)} m/s`);
console.log(`臨界閉鎖時間: ${result.criticalClosureTime.toFixed(3)} s`);
console.log(`急閉鎖時水撃圧: ${result.pressureJoukowskyMPa.toFixed(2)} MPa`);
console.log(`実際の水撃圧: ${result.pressureActualMPa.toFixed(2)} MPa`);
console.log(`閉鎖判定: ${result.isSlowClosure ? '緩閉鎖' : '急閉鎖'}`);
数値例で確かめる:鋼管200m、流速2m/s、閉鎖時間0.5s
実際に上のコードを実行してみましょう。
条件:
- 流体:水(20°C、(\rho = 998) kg/m³、(K = 2.2) GPa)
- 管材:鋼管((E = 210) GPa)
- 内径 (D = 0.3) m、管厚 (e = 5) mm = 0.005 m
- 管路長 (L = 200) m
- 初期流速 (V_0 = 2.0) m/s
- 弁閉鎖時間 (t_c = 0.5) s
Step 1:圧力波速度 (a) を計算
a = \sqrt{\frac{2.2 \times 10^9 / 998}{1 + \frac{2.2 \times 10^9 \times 0.3}{210 \times 10^9 \times 0.005}}}
まず分母の補正項:
\frac{K D}{E e} = \frac{2.2 \times 10^9 \times 0.3}{210 \times 10^9 \times 0.005} = \frac{6.6 \times 10^8}{1.05 \times 10^9} \approx 0.629
a = \sqrt{\frac{2.204 \times 10^6}{1 + 0.629}} = \sqrt{\frac{2.204 \times 10^6}{1.629}} = \sqrt{1.353 \times 10^6} \approx 1163 \text{ m/s}
鋼管内の圧力波速度は約1163 m/s。水中音速1480 m/sより遅いのは、管壁の弾性変形が波の伝播を遅らせているからです。
Step 2:急閉鎖時の最大水撃圧
\Delta P_{Joukowsky} = 998 \times 1163 \times 2.0 \approx 2.32 \times 10^6 \text{ Pa} = 2.32 \text{ MPa}
Step 3:臨界閉鎖時間
T_r = \frac{2 \times 200}{1163} \approx 0.344 \text{ s}
Step 4:実際の水撃圧(緩閉鎖判定)
(t_c = 0.5) s > (T_r = 0.344) s → 緩閉鎖!
\Delta P_{actual} = 2.32 \times \frac{0.344}{0.5} \approx 1.60 \text{ MPa}
結果:
- 急閉鎖なら2.32 MPaの衝撃が発生するところを、閉鎖時間を0.5sにすることで1.60 MPaに低減できた。
- ただし、1.6 MPa(約16気圧)でも十分大きな圧力。配管の設計圧力が2 MPaならギリギリセーフだが、余裕はない。
シミュレーターで遊ぶ:3つの実験
実際にブラウザで動くシミュレーターで試してみましょう。
実験1:管材を変えてみる(鋼管→HDPE管)
- 管路長200m、流速2m/s、内径0.3m、管厚5mm、閉鎖時間0.5s
- 鋼管 → 水撃圧:約1.60 MPa
- HDPE管(E=1GPa)→ 圧力波速度が約250 m/sに低下 → 水撃圧:約0.35 MPa
なぜ? HDPEは柔らかいので、圧力波が来ると管壁が膨らんでエネルギーを吸収する。つまり、管材選びだけで水撃圧を1/5にできる。ただし、HDPE管は耐圧が低いので高圧系には使えないというトレードオフ。
実験2:閉鎖時間を変えてみる(0.1s→1.0s→3.0s)
- 鋼管、管路長200m、流速2m/s
- 0.1s(急閉鎖):2.32 MPa → 配管破損リスク大
- 0.5s(緩閉鎖):1.60 MPa → まだ大きい
- 1.0s:0.80 MPa → 実用的な範囲
- 3.0s:0.27 MPa → かなり安全
実務の目安:臨界閉鎖時間 (T_r) の2〜3倍以上の閉鎖時間を確保すると安全。この例では (T_r = 0.344s) なので、1.0〜1.5s以上が推奨。
実験3:流体を変えてみる(水→石油→水銀)
- 鋼管、流速2m/s、閉鎖時間0.5s
- 水(ρ=998):1.60 MPa
- 石油(ρ=880):1.41 MPa(密度が低い分、水撃圧も低い)
- 水銀(ρ=13546):21.7 MPa(!)
水銀は密度が水の13.6倍なので、同じ流速でも水撃圧が13.6倍になる。化学プラントで高密度流体を扱う場合は特に注意が必要。
現場でハマるポイント:適用限界と落とし穴
1. Joukowsky式は「単純な1次元解析」に過ぎない
このシミュレーターはJoukowsky式を使って最大水撃圧の概算を瞬時に出します。しかし実際の配管設計では、以下の要素を考慮した**MOC(特性曲線法)**による過渡解析が必要です:
- 分岐管・エルボ・バルブの局部損失
- ポンプの慣性と逆流防止弁の動特性
- キャビテーション(気泡の発生と崩壊)
- 管網全体の相互作用
特に**カラム分離(column separation)**は危険。負圧で水が気化し、その後空洞が崩壊するときに二次水撃が発生。Joukowsky式では予測できない。
2. 圧力波速度の計算は「管の拘束条件」で変わる
上記の式は「管の一端が自由に膨張できる」場合のもの。実際には:
- 管が地中に埋設されている → 周囲の土が膨張を拘束 → 圧力波速度が上がる
- 管が継手で固定されている → 軸方向の伸びが拘束 → 圧力波速度が上がる
正確な設計では、管の支持条件に応じた補正が必要。
3. 「緩閉鎖=安全」ではない
緩閉鎖にすれば水撃圧は下がるが、閉鎖時間が長すぎると逆に問題が起きることも:
- ポンプの逆流・逆転
- バルブシートの摩耗
- プロセス制御上の問題(応答遅れ)
特にポンプ停止時は、逆流防止弁が閉じるタイミングとポンプの減速特性のマッチングが重要。フライホイールでポンプの慣性を大きくして減速を緩やかにするなどの対策が必要。
まとめ:水撃対策の3原則
- 流速を下げる:Joukowsky式 (\Delta P = \rho a \Delta V) の (\Delta V) を小さくする。設計流速は2〜3 m/s以下が目安。
- 圧力波速度を下げる:管材を柔らかくする(HDPE管など)、またはエアチャンバーで圧力波を吸収。
- 閉鎖時間を長くする:臨界閉鎖時間 (T_r = 2L/a) の2〜3倍以上を確保。
そして何より、概算にはJoukowsky式、詳細設計にはMOC解析という使い分けが鉄則です。
今回使ったシミュレーターは、Joukowsky式による瞬時の概算に最適。パラメータを変えながら「どの程度の水撃圧になるか」の感覚を掴むのに役立ちます。
▶ 水撃(ウォーターハンマー)解析シミュレーター — ブラウザで即動作、登録不要
NovaSolverでは700以上の工学シミュレーターを無料公開中 👉 一覧はこちら
「水撃なんて、蛇口の音でしょ?」— その考えが、現場で事故を起こす。
配管設計に携わるエンジニアはもちろん、流体機械を扱うすべての人に、この「見えない衝撃」の怖さと対策を知ってほしい。今回の記事がそのきっかけになれば幸いです。