Use biomass pyrolysis kinetics in Cantera reactor

I'm trying to use Cantera with a kinetic scheme for biomass pyrolysis to look at concentration changes over time in a batch reactor. An overview of the kinetics is shown below along with a reference to the paper. Notice that species concentrations are on a mass basis such as kg/m^3.



  • wood = biomass which is typically pine
  • gas = lumped species which contains light non-condensable gases
  • tar = lumped species of condensable pyrolysis vapors
  • char = fully pyrolyzed wood, basically carbon

Reference: Colomba Di Blasi. Analysis of Convection and Secondary Reaction Effects Within Porous Solid Fuels Undergoing Pyrolysis. Combustion Science and Technology, vol. 90, pp. 315-340, 1993.

Assuming an initial wood concentation of 1.0, I can solve the system of reaction rate equations with Python and plot the conversion with time as shown below.


Unfortunately, my attempt to use the kinetic scheme with Cantera is giving errors about incompatible phase types. My blasi.cti file contains the following:

#  Phases data

    name = "wood",
    species = "wood",
    density = (700, "kg/m3")

    name = "gas",
    species = "gas"

    name = "tar",
    species = "tar"

    name = "char",
    species = "char",
    density = (110, "kg/m3")

#  Species data


    name = "gas"

    name = "tar"

    name = "char"

#  Reaction data

# Reaction 1
reaction("wood => gas", [1.4345e4, 0, 88.6])

# Reaction 2
reaction("wood => tar", [4.125e6, 0, 112.7])

# Reaction 3
reaction("wood => char", [7.3766e5, 0, 106.5])

# Reaction 4
reaction("tar => gas", [4.28e6, 0, 108])

# Reaction 5
reaction("tar => char", [1.0e6, 0, 108])

and the Python file that uses the above cti file is:

import cantera as ct
import matplotlib.pyplot as plt

tk = 773.15     # temperature [K]
p = 101325.0    # pressure [Pa]

gas = ct.Solution('blasi.cti')
gas.TP = tk, p
r = ct.IdealGasConstPressureReactor(gas)

sim = ct.ReactorNet([r])
time = 0.0
states = ct.SolutionArray(gas, extra=['t'])

for n in range(50):
    time += 1.0
    states.append(r.thermo.state, t=time)

plt.plot(states.t, states.X[:, gas.species_index('wood')])
plt.plot(states.t, states.X[:, gas.species_index('gas')])
plt.plot(states.t, states.X[:, gas.species_index('tar')])
plt.plot(states.t, states.X[:, gas.species_index('char')])
plt.xlabel('Time [s]')
plt.ylabel('Concentration [kg/m^3]')

The error message from Cantera is:

Traceback (most recent call last):
  File "", line 9, in <module>
    r = ct.IdealGasConstPressureReactor(gas)
  File "interfaces/cython/cantera/reactor.pyx", line 191, in cantera._cantera.Reactor.__init__
  File "interfaces/cython/cantera/reactor.pyx", line 28, in cantera._cantera.ReactorBase.__init__
  File "interfaces/cython/cantera/reactor.pyx", line 199, in cantera._cantera.Reactor.insert
  File "interfaces/cython/cantera/reactor.pyx", line 50, in cantera._cantera.ReactorBase.insert
CanteraError thrown by IdealGasReactor::setThermoMgr:
Incompatible phase type provided

How do I define lumped species such as wood, gas, tar, and char with Cantera? Is it even possible to use such a kinetic scheme in Cantera? I typically create my own pyrolysis models using Python but I would like to use the reactor features in Cantera. This would also allow me to compare results between Cantera and my personal Python models.

Note - I looked at the examples on the Cantera documentation website but everything is for well defined gas phase species where you know the elemental composition and NASA coefficients.