Whoosh bottle¶
David O. Lignell¶
- Fill a bottle with a premixure of fuel and air.
- Light the top.
- The flame propagates down the bottle, with a jet and a whoosh out the top.
- Compute the exit velocity and estimate the pressure rise.
- Vary the ratio of the exit diamter to the bottle diameter.
- Will it explode?
Code needs file premixed_flame_speed.py, and streams.py, and also etoh.xml
You also need to have Cantera installed
The code below assumes pure ethanol as the fuel.
In [9]:
from IPython.display import HTML
HTML('<iframe width="560" height="315" src="https://www.youtube.com/embed/tcrN5wMrS4w" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen></iframe>')
Out[9]:
In [2]:
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
import pint; u = pint.UnitRegistry()
import numpy as np
import streams
from premixed_flame_speed import premixed_flame_speed, suppress_stdout
In [3]:
def get_x_sat(Pa=85481, T=294):
Psat = 1E5*10**(5.24677-1598.673/(T-46.424)) # etoh vapor pressure: Pa, 292-366 K. https://webbook.nist.gov/cgi/cbook.cgi?ID=C64175&Mask=4&Type=ANTOINE&Plot=on
xF = Psat/Pa
xO2 = (1-xF)*0.21
xN2 = (1-xF)*0.79
return {"c2h4oh":xF, "o2":xO2, "n2":xN2}
#-------------------------------
def get_x_spray_ϕ(nSpray, Vb=0.0246, Pa=85481, T=294):
mEtOH = 0.11*nSpray/1000 # kg
nEtOH = mEtOH / 46.07 # kmol
nAir = Pa*Vb / 8314.46 / T # kmol
ntot = nEtOH + nAir
xF = nEtOH / ntot
xO2 = nAir * 0.21 / ntot
xN2 = nAir * 0.79 / ntot
#C2H6O + 3(O2 + 3.76N2) = 2CO2 + 3H2O + 3*3.76N2
ϕ = (nEtOH/nAir) / (1/(3*4.76))
return {"c2h4oh":xF, "o2":xO2, "n2":xN2}, ϕ
#-------------------------------
def get_x_vLiq(ϕ, Vb=0.0246, Pa=85481, T=294):
ρ_EtOH = 790 # kg/m3
nAir = Pa*Vb / 8314.46 / T # kmol
nEtOH = nAir / (3*4.76) * ϕ # kmol
mEtOH = nEtOH * 46.07 # kg
vEtOH = mEtOH/ρ_EtOH*100**3 # mm3
ntot = nEtOH + nAir
xF = nEtOH / ntot
xO2 = nAir * 0.21 / ntot
xN2 = nAir * 0.79 / ntot
return {"c2h4oh":xF, "o2":xO2, "n2":xN2}, vEtOH
In [5]:
Pa = 85481 # atmospheric pressure (Pa)
Tr = 300 # reactant temperature (K)
SL = 0.40 # laminar flame speed (m/s)
#------- 1 gallon bottle
#De = 1.0 /12/3.28084 # exit diameter (m)
#Db = 6.37 /12/3.28084 # bottle diameter (m)
#H = 12 /12/3.28084 # bottle height (m)
#------- 6.5 gallon carboy bottle
De = 1.25 /12/3.28084 # exit diameter (m)
Db = 11.14 /12/3.28084 # bottle diameter (m)
H = 22 /12/3.28084 # bottle height (m) (22, 17)
#-----------------------------
s = streams.streams("o2:1,n2:3.76","c2h5oh:1", Tr, Tr, Pa, "etoh.xml")
ξ = s.get_ξ(get_x_sat(Pa, Tr), "mole")
x, ϕ = get_x_spray_ϕ(20)
#ϕ = 0.8
#x, vLiq = get_x_vLiq(ϕ)
#ξ = s.get_ξ(x, "mole")
print("ϕ =", ϕ)
#print("vLiq =", vLiq, " cm3")
s.set_gas_mixing_state(ξ)
ρr = s.gas.density # reactant density (kg/m3)
with suppress_stdout(): # comment this line if you want to see the premix run output
SL, Tp, ρp = premixed_flame_speed("etoh.xml", Tr, Pa, s.gas.X);
#-----------------------------
Ae = np.pi/4*De**2 # exit cross sectional area (m2)
Ab = np.pi/4*Db**2 # bottle cross sectional area (m2)
mdot = ρr * Ab * SL # mass burning rate (kg/s)
vb = mdot / ρp / Ab # velocity in the bottle (m/s) (products)
ve = mdot / ρp / Ae # gas velocity at the exit
#-----------------------------
Pb = Pa + ρp*(ve**2 - vb**2)/2 # Bernoulli Equation bottle pressure (Pa)
#-----------------------------
print("exit gas temperature = {:4.0f} K ".format(Tp))
print("exit velocity = {:4.1f} m/s".format(ve))
print("product vel in bottle = {:4.3f} m/s".format(vb))
print("advancing flame speed = {:4.3f} m/s".format(SL))
print("bottle pressure (gage) = {:4.3f} psi".format((Pb-Pa)*14.695948/101325))
print("bottle P / atmospheric P = {:4.3f} ".format(Pb/Pa))
print("burn time = {:4.3f} s ".format(H/SL))
print("Pstatic water ρw*g*H = {:4.3f} psi".format(1000*9.81*H/101325*14.695948))
ϕ = 0.792700904077629 exit gas temperature = 1955 K exit velocity = 109.6 m/s product vel in bottle = 1.381 m/s advancing flame speed = 0.178 m/s bottle pressure (gage) = 0.117 psi bottle P / atmospheric P = 1.009 burn time = 3.145 s Pstatic water ρw*g*H = 0.795 psi
In [ ]: