Кинетика пиролиза биомассы с помощью Cantera

Я пытаюсь использовать Cantera с кинетической схемой для пиролиза биомассы, чтобы посмотреть изменения концентрации с течением времени в реакторе периодического действия. Обзор кинетики Ди Блази показан ниже, а ссылка на статью приведена в строке документации кода Python, показанной далее. Концентрации видов в массовом порядке, такие как kg/m^3,

первичные реакции вторичные реакции

  • дерево = биомасса, которая обычно сосна
  • газ = сосредоточенные частицы, которые содержат легкие неконденсирующиеся газы
  • смола = кусковые виды конденсирующихся паров пиролиза
  • символ = полностью пиролизованная древесина, в основном углерод

Предполагая начальную концентрацию древесины 1.0Я могу решить систему уравнений скорости реакции с помощью Python и построить график преобразования, как показано ниже.

import numpy as np
import matplotlib.pyplot as plt
import scipy.integrate as sp

def dcdt_blasi(c, t):
    """
    Return system of equations based on kinetic scheme from Blasi 1993 for
    biomass pyrolysis.

    Parameters
    ----------
    c : array of floats
        Concentrations where c[0] = wood, c[1] = gas, c[2] = tar, c[3] = char.
        Units are in kg/m^3.
    t : array of floats
        Time vector to calculate concentrations [s]

    Returns
    -------
    dcdt : array like
        Reaction rates where dcdt[0] = wood, dcdt[1] = gas, dcdt[2] = tar,
        dcdt[3] = char.

    References
    ----------
    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.
    """

    c_wood = c[0]
    c_tar = c[2]
    R = 0.008314    # universal gas constant [kJ/mol*K]
    T = 773         # temperature [K]

    # wood -> gas
    # units for reaction rates are A [1/s], E [kJ/mol], and K [1/s]
    A1 = 1.4345e4
    E1 = 88.6
    K1 = A1 * np.exp(-E1 / (R * T))

    # wood -> tar
    A2 = 4.125e6
    E2 = 112.7
    K2 = A2 * np.exp(-E2 / (R * T))

    # wood -> char
    A3 = 7.3766e5
    E3 = 106.5
    K3 = A3 * np.exp(-E3 / (R * T))

    # tar -> gas
    A4 = 4.28e6
    E4 = 108
    K4 = A4 * np.exp(-E4 / (R * T))

    # tar -> char
    A5 = 1.0e6
    E5 = 108
    K5 = A5 * np.exp(-E5 / (R * T))

    # reaction rates
    r_wood = -(K1 + K2 + K3) * c_wood
    r_gas = K1 * c_wood + K4 * c_tar
    r_tar = K2 * c_wood - (K4 + K5) * c_tar
    r_char = K3 * c_wood + K5 * c_tar

    # return system of equations representing reaction rates
    dcdt = [r_wood, r_gas, r_tar, r_char]
    return dcdt


t0 = np.linspace(0, 25, num=1000)           # time vector to evaluate reaction rates [s]
c0 = [1, 0, 0, 0]                           # initial concentrations
conc = sp.odeint(dcdt_blasi, c0, t0)        # concentrations at each time step

plt.close('all')

plt.figure()
plt.plot(t0, conc[:, 0], label='wood')
plt.plot(t0, conc[:, 1], label='gas')
plt.plot(t0, conc[:, 2], label='tar')
plt.plot(t0, conc[:, 3], label='char')
plt.legend(loc='best')
plt.xlabel('Time [s]')
plt.ylabel('Concentration [kg/m$^3$]')
plt.show()

концентрации

К сожалению, моя попытка использовать кинетическую схему с Cantera дает ошибки о несовместимых типах фаз. мой cti Файл содержит следующее:

stoichiometric_solid(name = "wood", species = "wood", density = (700, "kg/m3"))
ideal_gas(name = "gas", species = "gas")
ideal_gas(name = "tar", species = "tar")
stoichiometric_solid(name = "char", species = "char", density = (110, "kg/m3"))

species(name="wood")
species(name = "gas")
species(name = "tar")
species(name = "char")

reaction("wood => gas", [1.4345e4, 0, 88.6])
reaction("wood => tar", [4.125e6, 0, 112.7])
reaction("wood => char", [7.3766e5, 0, 106.5])
reaction("tar => gas", [4.28e6, 0, 108])
reaction("tar => char", [1.0e6, 0, 108])

и пример Python, который использует выше cti файл:

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
    sim.advance(time)
    states.append(r.thermo.state, t=time)

plt.figure()
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]')
plt.show()

Сообщение об ошибке от Cantera:

Traceback (most recent call last):
  File "blasi_cantera.py", 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
cantera._cantera.CanteraError:
***********************************************************************
CanteraError thrown by IdealGasReactor::setThermoMgr:
Incompatible phase type provided
***********************************************************************

Как я могу определить виды комков, такие как древесина, газ, гудрон и гольц, с помощью Cantera? Можно ли вообще использовать такую ​​кинетическую схему в Cantera? Обычно я создаю свои собственные модели пиролиза с использованием Python, но я бы хотел использовать возможности реактора в Cantera. Это также позволило бы мне сравнить результаты между Cantera и моими личными моделями Python.

Примечание - я посмотрел примеры на веб-сайте документации Cantera, но все для четко определенных видов газовой фазы, где вы знаете элементный состав и коэффициенты НАСА.

0 ответов

Другие вопросы по тегам