※Canteraバージョン:3.0.0
Canteraでプラグフロー反応器を計算してみる。
プラグフロー反応器(PFR:Plug Flow Reactor)は、流体が管の中を流れる間に化学反応を起こす反応器である。計算モデルは、下図のように管を長手方向に有限個に分割したもので、一つの分割したセルごとに反応を計算する。
一つのセルは、上流の隣接セルから値を受け渡され、反応計算の結果を下流側の隣接セルに受け渡す。拡散を無視すると、一つのセルは上流からのみに影響を受けるため、上流側から順に計算することで系全体の結果を得ることができる。Canteraでは、一つのセルは反応器(IdealGasReactor)の上流(upstream)側と下流(downstream)側にオブジェクト(Reservoir)をつけて、入口出口としている。これを一単位として、上流側から順に計算する。
計算プログラム
ここでは、CH4、O2、Arの燃焼反応をプラグフローでモデル化する。
# 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_reactor = 200 # number of divided reactor
圧力p、入口温度Tin、入口の組成comp、入口流速vin、反応器全体の長さlength、反応器の断面積area、長手方向の分割数n_reactorを設定する。
# define object
gas = ct.Solution('gri30.yaml')
gas.TPX = Tin, p, comp
mdot = vin * area * gas.density
dx = length / n_reactor
気相オブジェクトgasを設定する。ここでは、GRI Mech3.0の反応メカニズムを使う。mdotは質量流量、dxは一つのセルの幅である。
r = ct.IdealGasReactor(gas)
r.volume = area * dx
upstream = ct.Reservoir(gas, name='upstream')
downstream = ct.Reservoir(gas, name='downstream')
m = ct.MassFlowController(upstream, r, mdot=mdot)
v = ct.PressureController(r, downstream, primary=m, K=1.0e-5)
sim = ct.ReactorNet([r])
反応器を設定する。rはIdealGasReactorで理想気体定容積の反応器とし、upstreamとdownstreamはReservoirで接続する。
upstreamには、流量を設定するためのMassFlowControllerを設定する。downstreamには、出口とするためのPressureControllerを設定する。Kの値は関係ない。
最後に解析用にReactorNetを定義する。
# solve
outfile = open('pfr.csv','w', newline='')
writer = csv.writer(outfile)
writer.writerow(['Distance (m)', 'u(m/s)', 'rtime(s)', 'T(K)', 'P(Pa)'] + gas.species_names)
t_res = 0.0
for n in range(n_reactor):
gas.TDY = r.thermo.TDY
upstream.syncState()
sim.reinitialize()
sim.advance_to_steady_state()
dist = n * dx
u = mdot / area / r.thermo.density # velocity
t_res += r.mass / mdot # residence time
writer.writerow([dist, u, t_res, r.T, r.thermo.P] + list(r.thermo.X))
outfile.close()
計算を実行する。結果ファイルをCSV出力するために、ファイルpfr.csvを定義している。結果ファイルには、距離、流速、滞留時間、温度、圧力、化学種のモル濃度が出力される。
for文は、上流側から順に計算するためのループである。まず、一つ前(上流側)の反応器の状態をupstreamにセットする。reinitializeで再初期化したあと、advance_to_steady_stateで定常状態になるまで計算する。
distは距離、uは流速、t_resは滞留時間を計算している。最後にCSVファイルに結果を出力する。
距離に対するモル分率の結果。0.003mm手前で燃焼反応が起こっている。
距離に対する、滞留時間と流速の結果。燃焼後流速が大きくなる。
滞留時間に対する温度の結果。