4 spaces per indentation level, no tabs, no trailing whitespace, and a single newline at end of each file.
82 lines
2.8 KiB
Python
82 lines
2.8 KiB
Python
""" A combustor. Two separate stream - one pure methane and the other
|
|
air, both at 300 K and 1 atm flow into an adiabatic combustor where
|
|
they mix. We are interested in the steady-state burning
|
|
solution. Since at 300 K no reaction will occur between methane and
|
|
air, we need to use an 'igniter' to initiate the chemistry. A simple
|
|
igniter is a pulsed flow of atomic hydrogen. After the igniter is
|
|
turned off, the system approaches the steady burning solution."""
|
|
|
|
from Cantera import *
|
|
from Cantera.Reactor import *
|
|
from Cantera.Func import *
|
|
|
|
# use reaction mechanism GRI-Mech 3.0
|
|
gas = GRI30()
|
|
|
|
# create a reservoir for the fuel inlet, and set to pure methane.
|
|
gas.set(T = 300.0, P = OneAtm, X = 'CH4:1.0')
|
|
fuel_in = Reservoir(gas)
|
|
fuel_mw = gas.meanMolarMass()
|
|
|
|
# use predefined function Air() for the air inlet
|
|
air = Air()
|
|
air_in = Reservoir(air)
|
|
air_mw = air.meanMolarMass()
|
|
|
|
# to ignite the fuel/air mixture, we'll introduce a pulse of radicals.
|
|
# The steady-state behavior is independent of how we do this, so we'll
|
|
# just use a stream of pure atomic hydrogen.
|
|
gas.set(T = 300.0, P = OneAtm, X = 'H:1.0')
|
|
igniter = Reservoir(gas)
|
|
|
|
|
|
# create the combustor, and fill it in initially with N2
|
|
gas.set(T = 300.0, P = OneAtm, X = 'N2:1.0')
|
|
combustor = Reactor(contents = gas, volume = 1.0)
|
|
|
|
# create a reservoir for the exhaust
|
|
exhaust = Reservoir(gas)
|
|
|
|
# lean combustion, phi = 0.5
|
|
equiv_ratio = 0.5
|
|
|
|
# compute fuel and air mass flow rates
|
|
factor = 0.1
|
|
air_mdot = factor*9.52*air_mw
|
|
fuel_mdot = factor*equiv_ratio*fuel_mw
|
|
|
|
# create and install the mass flow controllers. Controllers
|
|
# m1 and m2 provide constant mass flow rates, and m3 provides
|
|
# a short Gaussian pulse only to ignite the mixture
|
|
m1 = MassFlowController(upstream = fuel_in,
|
|
downstream = combustor, mdot = fuel_mdot)
|
|
|
|
# note that this connects two reactors with different reaction
|
|
# mechanisms and different numbers of species. Downstream and upstream
|
|
# species are matched by name.
|
|
m2 = MassFlowController(upstream = air_in,
|
|
downstream = combustor, mdot = air_mdot)
|
|
|
|
# The igniter will use a Guassiam 'functor' object to specify the
|
|
# time-dependent igniter mass flow rate.
|
|
igniter_mdot = Gaussian(t0 = 1.0, FWHM = 0.2, A = 0.1)
|
|
m3 = MassFlowController(upstream = igniter,
|
|
downstream = combustor, mdot = igniter_mdot)
|
|
|
|
# put a valve on the exhaust line to regulate the pressure
|
|
v = Valve(upstream = combustor, downstream = exhaust, Kv = 1.0)
|
|
|
|
# the simulation only contains one reactor
|
|
sim = ReactorNet([combustor])
|
|
|
|
# take single steps to 6 s, writing the results to a CSV file
|
|
# for later plotting.
|
|
tfinal = 6.0
|
|
tnow = 0.0
|
|
f = open('combustor.csv','w')
|
|
while tnow < tfinal:
|
|
tnow = sim.step(tfinal)
|
|
tres = combustor.mass()/v.massFlowRate()
|
|
writeCSV(f, [tnow, combustor.temperature(), tres]
|
|
+list(combustor.moleFractions()))
|
|
f.close()
|