You are on page 1of 12

CANTERA: Uma Ferramenta para Cálculo

Cinético e Termodinâmico

Rodolfo Rodrigues
A Ferramenta
● Combina um núcleo em C++ com interface em
PYTHON e MATLAB
… além do próprio C++ e FORTRAN
● Formado por classes de objetos
Recursos
● Múltiplas fases
● Interface entre fases
● Gerenciador de reações
● Rede de reatores (transiente ou estacionária)
● Escoamento unidimensional
Onde encontrar?
● Página atual (≥ 1.8.0)
● http://code.google.com/p/cantera
● Página antiga (≤ 1.7.1)
● http://sourceforge.net/projects/cantera
● Grupo de usuários
● http://groups.google.com/group/cantera-users
Instalação
● Linux (Ubuntu)
● http://aandreasen.wordpress.com/2010/01/28/installing-
cantera-1-8-on-ubuntu-9-10-32-bit/
● Windows
● http://web.mit.edu/2.62/www/cantera/install.html
Aplicação
● Problema de combustão
CH4 + 2(O2 + 3,76N2) → CO2 + 2H2O
● Temperatura adiabática de chama
– Na condição estequiométrica
Combustão de CH4
from Cantera import *

gas = GRI30()

gas.set(T = 300, P = OneAtm, X = 'CH4:1, O2:2, N2:7.52')


gas.equilibrate('HP')

print gas.temperature() # T = 2223 K


Aplicação
● Problema de pirólise/gaseificação
● Caso de Baratieri et al. (2008)
● Considera biomassa como: CHONS + água +
cinzas
● São 60 compostos em fase gasosa e 1 composto
em fase sólida
Baratieri et al. (2008)
from Cantera import *
from numpy import *
from matplotlib.pyplot import *

## initial data
# biomass(fuel)
# ultimate analysis(%wt)
massfrac = array([0.452, 0.054, 0.39, 0.001, 0]) # C,H,O,N,S
moisture = array([0.094]) # H2O
ash = 0.009*array([0.5, 0.5]) # CaO,SiO2

# massfrac + moisture + ash = 1


xmass = concatenate((massfrac,moisture,ash))/sum(concatenate((massfrac,moisture,ash)))
Mw = array([12.011, 1.00794, 15.9994, 14.00674, 32.066, 18.01528, 56.0774, 44.0849]) # kg/kmol
xmol = xmass/Mw/sum(xmass/Mw)

## load components
gas = importPhase('baratieri2008.cti')
solid = importPhase('graphite.cti')
nsp = gas.nSpecies() + solid.nSpecies() # number of components
Baratieri et al. (2008)
# preallocate variable
x0 = zeros(nsp)
# attribute values
x0[gas.speciesIndex('H')] = xmol[1]
x0[gas.speciesIndex('O')] = xmol[2]
x0[gas.speciesIndex('N')] = xmol[3]
x0[gas.speciesIndex('S')] = xmol[4]
x0[gas.speciesIndex('H2O')] = xmol[5]
x0[gas.speciesIndex('CaO')] = xmol[6]
x0[gas.speciesIndex('SiO2')] = xmol[7]

## set states
gas.set(T = 300, P = OneAtm, X = x0)
solid.set(T = 300, P = OneAtm)
biomass = Mixture([(gas,1-xmol[0]),(solid,xmol[0])])

## calculations
# preallocate variables
np = 50 # number of points
Ti = zeros(np)
xi = zeros((np,nsp))
Baratieri et al. (2008)
# set conditions
T1 = 300 #298.15 # 25 degC
T2 = 1500 #1473.15 # 1200 degC
Pi = 100000 # 1 bar

for i in range(np):
Ti[i] = T1 + (T2-T1)/np*i
biomass.set(T = Ti[i], P = Pi)
biomass.equilibrate('TP', maxsteps = 20000)
xi[i,:] = biomass.speciesMoles()

## figure
figure()
plot(Ti-273.15, 100*xi)
axis([400, 1200, 0, 60])

show()
Baratieri et al. (2008)
## make plot
# find important indices
species = ['CH4','CO','CO2','H2','H2O']
ns = size(species) # number of species
iP = range(ns) # preallocate variable
for i in range(ns):
iP[i] = biomass.speciesIndex(species[i])
# preallocate variables
xfs = zeros((np,ns)) # normalized x
xf = zeros((np,ns)) # important x
for i in range(ns):
xf[:,i] = xi[:,iP[i]] # identify x for important species
sxf = sum(xf,axis=1) # sum
# normalize xeq according to important species
for i in range(np):
xfs[i,:] = xf[i,:]/sxf[i]

## figure
figure()
plot(Ti-273.15, 100*xfs)
axis([400, 1200, 0, 60])
legend(species,'lower right', shadow=False)
xlabel('Temperature [degC]')
ylabel('Molar fraction [%]')
title('Pine sawdust pyrolysis test, 1 bar')

You might also like