Cantera:プラグフロー反応器のモデリング手法

※Canteraバージョン:3.0.0

Canteraでプラグフロー反応器をモデル化するにはいくつかの異なる手法がある。

ゼロ次元反応器の連結

一つ目は、ゼロ次元の反応器を連続して接続し、上流側から順に解いていく方法。これは、以下の記事で詳しく紹介している。

※Canteraバージョン:3.0.0 Canteraでプラグフロー反応器を計算してみる。 プラグフロー反応器(PFR:Plu...

ラグランジェ的手法

二つ目は、Canteraのサイトでラグランジェ的な手法(Lagrangian Particle Simulation)として紹介されている方法。

https://cantera.org/examples/python/reactors/pfr.py.html

IdealGasConstPressureReactorを使って時間発展を計算している。一つ目の例と同じ問題で解くとすると、以下のようになる。

import cantera as ct
import csv

# Simulation parameters
p = ct.one_atm  # pressure [Pa]
Tin = 1500.0  # inlet temperature [K]
comp = 'CH4:1, O2:1, AR:0.5' 
vin = 0.005 # inlet velocity [m/s]
length = 5e-6 # reactor length [m]
area = 1e-4 # cross section area [m2]
n_step = 1000 # number of divided reactor

# define object
gas = ct.Solution('gri30.yaml')
gas.TPX = Tin, p, comp
mdot = vin * area * gas.density

r = ct.IdealGasConstPressureReactor(gas)
sim = ct.ReactorNet([r])

t_total = length / vin
dt = t_total / n_step

# solve
outfile = open('pfr.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(['distance', 'velocity', 'rtime', 'T', 'P'] + gas.species_names)

rtime = 0.0
dist = 0.0
for n in range(n_step):
    rtime += dt
    sim.advance(rtime)
    u = mdot / area / r.thermo.density # velocity
    dist += dt * u
    writer.writerow([dist, u, rtime, r.T, r.thermo.P] + list(r.thermo.X))
    if dist >= length:
        break

outfile.close()

FlowReactorを使う

三つ目は、FlowReactor反応器オブジェクトを使う方法。

https://cantera.org/science/reactors/pfr.html

次のようなコードで計算できる。

import cantera as ct
import csv

# Simulation parameters
p = ct.one_atm  # pressure [Pa]
Tin = 1500.0  # inlet temperature [K]
comp = 'CH4:1, O2:1, AR:0.5' 
vin = 0.005 # inlet velocity [m/s]
length = 5e-6 # reactor length [m]
area = 1e-4 # cross section area [m2]

# define object
gas = ct.Solution('gri30.yaml')
gas.TPX = Tin, p, comp
mdot = vin * area * gas.density

r = ct.FlowReactor(gas)
r.mass_flow_rate = mdot / area

sim = ct.ReactorNet([r])

# solve
outfile = open('pfr_2.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(['distance', 'velocity', 'rtime', 'T', 'P'] + gas.species_names)

while sim.distance < length:
    dist = sim.distance
    rtime = sim.step()
    writer.writerow([dist, r.speed, rtime, r.T, r.thermo.P] + list(r.thermo.X))
    print(rtime, dist)

outfile.close()

FlowRactor反応器を定義して、内部で時間発展の計算を行う。

結果の比較

それぞれの手法で計算結果を比較してみる。まず、濃度の分布を示す。

PFR濃度1

ゼロ次元反応器

PFR濃度2

ラグランジェ手法

PFR温度3

FlowReactor

次に温度分布を示す。

PFR温度1ゼロ次元反応器PFR温度2

ラグランジェ手法

PFR温度3

FlowReactor

どの手法でも、ほぼ同じ結果となっている。

ラグランジェ手法やFlowReactorはコードを簡潔に書ける。また、ゼロ次元反応器の連結手法は、対向流熱交換器などで他のプラグフロー反応器と熱連成を行ったり自由度のあるモデリングができる。場合により使い分けるとよいだろう。

スポンサーリンク
科学技術計算のご相談は「キャットテックラボ」へ

科学技術計算やCAEに関するご相談、計算用プログラムの開発などお困りのことは「株式会社キャットテックラボ」へお問い合わせください。

お問い合わせはこちら

フォローする

スポンサーリンク