🧪

【化学でPython】Cantera:燃焼反応や化学平衡の状態を計算する

に公開

はじめに

この「化学でPython」シリーズでは、化学の分野で有用な Python ライブラリを紹介しています。

今回紹介するのは、Cantera です。

Cantera とは?

化学反応速度論、熱力学、および輸送特性の計算を行うためのオープンソースライブラリです。

燃焼、電気化学、プラズマなどの分野で広く利用されており、複雑な化学反応メカニズムを扱うシミュレーションに強みがあります。

  • 公式サイト: Link
  • GitHub: Link (⭐️700+)

インストール

pip で簡単にインストールできます。Google Colab でもそのまま動作します。

terminal
pip install cantera

基本的な使い方

まずは、最も基本的な使い方として、メタン燃焼の反応メカニズム(GRI-Mech 3.0)を読み込み、ガスの状態を設定してみましょう。

Canteraでは、物質の状態(温度、圧力、組成)をオブジェクトとして管理します。

import cantera as ct

# メタン燃焼の標準的なメカニズムファイル(gri30.yaml)を読み込む
# Canteraにはいくつかの標準メカニズムが同梱されています
gas = ct.Solution('gri30.yaml')

# ガスの状態を設定
# T: 温度 (Kelvin), P: 圧力 (Pascal), X: モル分率
gas.TPX = 300.0, ct.one_atm, 'CH4:1.0, O2:2.0, N2:7.52'

# 現在の状態を表示
print(f"Temperature: {gas.T:.2f} K")
print(f"Pressure:    {gas.P:.2f} Pa")
print(f"Density:     {gas.density:.4f} kg/m3")

# 特定の化学種の情報を取得
ch4_index = gas.species_index('CH4')
print(f"CH4 Mole Fraction: {gas.X[ch4_index]:.4f}")
実行結果
Temperature: 300.00 K
Pressure:    101325.00 Pa
Density:     1.1225 kg/m3
CH4 Mole Fraction: 0.0951

実践例: メタンの断熱火炎温度の計算

実践的な例として、「メタン-空気混合気の断熱火炎温度を計算する」 タスクをやってみます。

これは燃焼工学の基礎であり、燃料が燃焼した際に到達しうる理論上の最高温度を求めるものです。

1. 定圧断熱平衡計算

断熱条件下で定圧燃焼させた場合の平衡状態(断熱火炎温度)を計算します。

equilibrate メソッドを使うだけで、ギブス自由エネルギー最小化による平衡計算が行われます。

import cantera as ct
import matplotlib.pyplot as plt
import numpy as np

# ガスオブジェクトの作成
gas = ct.Solution('gri30.yaml')

# 初期状態の設定(メタンと空気の化学量論混合気)
# CH4 + 2(O2 + 3.76N2) -> CO2 + 2H2O + 7.52N2
gas.TPX = 300.0, ct.one_atm, 'CH4:1, O2:2, N2:7.52'

# 初期エンタルピーを表示
h_initial = gas.enthalpy_mass
print(f"Initial Enthalpy: {h_initial:.2f} J/kg")

# 定圧断熱平衡計算 (HP: Enthalpy-Pressure constant)
gas.equilibrate('HP')

# 計算結果(断熱火炎温度)
T_adiabatic = gas.T
print(f"Adiabatic Flame Temperature: {T_adiabatic:.2f} K")

# 平衡組成の一部を表示 (主要生成物と微量成分)
print("\nEquilibrium Composition (Mole Fraction):")
for species in ['CO2', 'H2O', 'N2', 'CO', 'NO']:
    print(f"{species:>4}: {gas[species].X[0]:.6f}")
実行結果
Initial Enthalpy: -254587.05 J/kg
Adiabatic Flame Temperature: 2225.52 K

Equilibrium Composition (Mole Fraction):
 CO2: 0.085364
 H2O: 0.183467
  N2: 0.708584
  CO: 0.008988
  NO: 0.001888

2. 当量比と断熱火炎温度の関係

次に、燃料と空気の比率(当量比 \phi)を変化させたときに、断熱火炎温度がどう変化するかをプロットしてみます。

化学量論組成(\phi=1)付近で温度が最大になる様子を確認します。

# 当量比の範囲を設定 (0.5 ~ 2.0)
phi_values = np.linspace(0.5, 2.0, 50)
T_adiabatic_list = []
CO_mole_fraction = []

for phi in phi_values:
    # 組成の設定: CH4 + (2/phi)(O2 + 3.76N2)
    # 酸素のモル数を基準に設定します
    n_O2 = 2.0 / phi
    n_N2 = 3.76 * n_O2
    X_string = f'CH4:1.0, O2:{n_O2}, N2:{n_N2}'
    
    # 状態のリセットと平衡計算
    gas.TPX = 300.0, ct.one_atm, X_string
    gas.equilibrate('HP')
    
    # 結果の保存
    T_adiabatic_list.append(gas.T)
    CO_mole_fraction.append(gas['CO'].X[0])

# プロット
fig, ax1 = plt.subplots(figsize=(8, 5))

color = 'tab:red'
ax1.set_xlabel('Equivalence Ratio ($\phi$)')
ax1.set_ylabel('Adiabatic Flame Temperature (K)', color=color)
ax1.plot(phi_values, T_adiabatic_list, color=color, label='Temperature')
ax1.tick_params(axis='y', labelcolor=color)
ax1.grid(True, alpha=0.3)

# CO濃度のプロット(右軸)
ax2 = ax1.twinx()
color = 'tab:blue'
ax2.set_ylabel('CO Mole Fraction', color=color)
ax2.plot(phi_values, CO_mole_fraction, color=color, linestyle='--', label='CO')
ax2.tick_params(axis='y', labelcolor=color)

plt.title('Adiabatic Flame Temperature & CO Formation vs Equivalence Ratio')
plt.show()


実行結果

この結果から、以下のことがわかります。

  1. 最高温度: 当量比 \phi \approx 1.0(化学量論組成)よりわずかにリッチ側で最高温度を示します。
  2. COの生成: \phi > 1.0(燃料過多)になると、酸素不足により不完全燃焼が起こり、一酸化炭素(CO)の濃度が急激に上昇します。

このように、Canteraを使うと燃焼や化学プロセスの熱力学的な挙動を簡単にシミュレーションできます。

まとめ

今回は Cantera を紹介しました。

  • Point 1: 複雑な化学反応メカニズムを扱える、燃焼・熱力学計算のデファクトスタンダード。
  • Point 2: equilibrate メソッドで簡単に化学平衡計算ができ、断熱火炎温度などを求められます。
  • Point 3: 手軽に利用でき、Matplotlibなどと組み合わせて結果をすぐに可視化できます。

燃焼研究だけでなく、新しい燃料の設計や、化学プロセスのエネルギー解析など、幅広い分野で役立つライブラリです。

ぜひ試してみてください。

参考リンク

Discussion