Skip to content

Instantly share code, notes, and snippets.

@jiweiqi
Last active February 23, 2021 16:34
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jiweiqi/21b8d149bd95b97d9ae948ab92e446df to your computer and use it in GitHub Desktop.
Save jiweiqi/21b8d149bd95b97d9ae948ab92e446df to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Package Dependence\n",
"\n",
"+ DifferentialEquations / DiffEqSensitivity for ODE solver\n",
"+ ForwardDiff for auto-differentiation"
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"using Arrhenius\n",
"using LinearAlgebra\n",
"using DifferentialEquations\n",
"using ForwardDiff\n",
"using DiffEqSensitivity\n",
"using Plots\n",
"using DelimitedFiles\n",
"using Profile"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Create a struct of solution\n",
"\n",
"Similar to Cantera, we create a struct of solution to store all of the kinetic and thermodynamic data.\n",
"\n",
"Those infomation are stored in the .yaml file. In addition, to preclude the need of re-invent wheels for interpreting .yaml files, we also rely on the package of ReacTorch to interpret the mechanism and save them into a .npy file.\n",
"\n",
"Here is a complete list of keys of the solution [source code](https://github.com/DENG-MIT/Arrhenius.jl/blob/a6e77fa501f8e1bfb0b4bd244b507f0bc10f1f8c/src/DataStructure.jl#L29)\n",
"\n",
"```Julia\n",
"struct Reaction\n",
" product_stoich_coeffs::Array{Float64, 2}\n",
" reactant_stoich_coeffs::Array{Float64, 2}\n",
" reactant_orders::Array{Float64, 2}\n",
" is_reversible::Array{Bool, 1}\n",
" Arrhenius_coeffs::Array{Float64, 2}\n",
" Arrhenius_A0::Array{Float64, 1}\n",
" Arrhenius_b0::Array{Float64, 1}\n",
" Arrhenius_Ea0::Array{Float64, 1}\n",
" Troe_A::Array{Float64, 1}\n",
" Troe_T1::Array{Float64, 1}\n",
" Troe_T2::Array{Float64, 1}\n",
" Troe_T3::Array{Float64, 1}\n",
" index_three_body::Array{Int64, 1}\n",
" index_falloff::Array{Int64, 1}\n",
" efficiencies_coeffs::Array{Float64, 2}\n",
" i_reactant::Array{Array{Int64, 1},1}\n",
" i_product::Array{Array{Int64, 1},1}\n",
" n_reactions::Int64\n",
" vk::Array{Float64, 2}\n",
" vk_sum::Array{Float64, 1}\n",
"end\n",
"\n",
"struct Thermo\n",
" nasa_low::Array{Float64, 2}\n",
" nasa_high::Array{Float64, 2}\n",
"end\n",
"\n",
"struct Solution\n",
" n_species::Int64\n",
" n_reactions::Int64\n",
" MW::Vector{Float64}\n",
" species_names::Vector{String}\n",
" thermo::Thermo\n",
" reaction::Reaction\n",
"end\n",
"```"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"Arrhenius.Solution(9, 24, [2.016, 31.998, 28.014, 1.008, 15.999, 17.007, 33.006, 34.014, 18.015], [\"H2\", \"O2\", \"N2\", \"H\", \"O\", \"OH\", \"HO2\", \"H2O2\", \"H2O\"], [\"N\", \"H\", \"O\", \"C\"], [0.0 0.0 … 0.0 0.0; 2.0 0.0 … 2.0 2.0; 0.0 2.0 … 2.0 1.0; 0.0 0.0 … 0.0 0.0], Arrhenius.Thermo([2.34433112 0.00798052075 … -917.935173 0.683010238; 3.78245636 -0.00299673416 … -1063.94356 3.65767573; … ; 4.27611269 -0.000542822417 … -17702.5821 3.43505074; 4.19864056 -0.0020364341 … -30293.7267 -0.849032208], [3.3372792 -4.94024731e-5 … -950.158922 -3.20502331; 3.28253784 0.00148308754 … -1088.45772 5.45323129; … ; 4.16500285 0.00490831694 … -17861.7877 2.91615662; 3.03399249 0.00217691804 … -30004.2971 4.9667701]), Arrhenius.Reaction([0.0 0.0 … 0.0 0.0; 0.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 0.0 0.0; 0.0 0.0 … 1.0 0.0], [0.0 1.0 … 0.0 0.0; 1.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.0 1.0; 0.0 0.0 … 0.0 0.0], [0.0 1.0 … 0.0 0.0; 1.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … 1.0 1.0; 0.0 0.0 … 0.0 0.0], Bool[1, 1, 1, 1, 1, 1, 1, 1, 1, 1 … 1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [3.52e13 -0.7 17069.79; 50.6 2.67 6290.63; … ; 7.59e10 0.0 7272.94; 9630.0 2.0 3991.4], Float64[], Float64[], Float64[], Float64[], Float64[], Float64[], Float64[], [5, 6, 7, 8, 9, 10, 17], Int64[], [1.0 1.0 … 1.0 1.0; 1.0 1.0 … 1.0 1.0; … ; 1.0 1.0 … 1.0 1.0; 1.0 1.0 … 1.0 1.0], [[2, 4], [1, 5], [1, 6], [5, 9], [4], [4, 6], [5], [4, 5], [5, 6], [2, 4] … [6, 7], [6, 7], [6], [7], [7], [4, 8], [4, 8], [6, 8], [6, 8], [5, 8]], [[5, 6], [4, 6], [4, 9], [6], [1], [9], [2], [6], [7], [7] … [2, 9], [2, 9], [8], [2, 8], [2, 8], [1, 7], [6, 9], [7, 9], [7, 9], [6, 7]], 24, [0.0 -1.0 … 0.0 0.0; -1.0 0.0 … 0.0 0.0; … ; 0.0 0.0 … -1.0 -1.0; 0.0 0.0 … 1.0 0.0], [0.0, 0.0, 0.0, 0.0, -1.0, -1.0, -1.0, -1.0, -1.0, -1.0 … 0.0, 0.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]))"
]
},
"execution_count": 2,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gas = CreateSolution(\"./chem.yaml\")"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"24"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"ns = gas.n_species\n",
"nr = gas.n_reactions"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"9-element Array{String,1}:\n",
" \"H2\"\n",
" \"O2\"\n",
" \"N2\"\n",
" \"H\"\n",
" \"O\"\n",
" \"OH\"\n",
" \"HO2\"\n",
" \"H2O2\"\n",
" \"H2O\""
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"gas.species_names"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Impliment governing equations\n",
"\n",
"The core functionality of Arrhenius.jl is interpreting chemical kinetic models, and compute the reaction source term. Most of combustion simulations involves of equations on top of reaction source term.\n",
"\n",
"This example simulate the pyrolysis under constant pressure conditions. While the pressure is fixed, we need equations to describe the changes of species concentrations and temperature. Species concentrations can be represented in three ways: mass fraction, mole fractions and mole concentrations. Most of combustion software impletes the governing equations using mass fraction or mass fractions divided by density.\n",
"\n",
"Therefore, we create arrays to host the initial values of the ODEs."
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"Y0 = zeros(ns)\n",
"Y0[species_index(gas, \"H2\")] = 0.055463\n",
"Y0[species_index(gas, \"O2\")] = 0.22008\n",
"Y0[species_index(gas, \"N2\")] = 0.724457 #to sum as unity\n",
"T0 = 1100.0 #K\n",
"P = one_atm * 10.0\n",
"u0 = vcat(Y0, T0);"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"One of the cool features of Julia language is that writing julia code is like write math equations. Once you know the governing equations, it is easy to implement the governing equations. In the governing equations, we have some magic functions to derive all relevent internal variables from the exposed variables of mass fraction Y and temperature T.\n",
"\n",
"Notebly\n",
"\n",
"* mean molecular weights `mean_MW = 1. / dot(Y, 1 ./ gas.MW)`\n",
"* density\n",
"* mass fraction to mole fraction Y2X\n",
"* mass fraction to mole concentration Y2C\n",
"* cp_mole\n",
"* h_mole (enthapy)\n",
"* S0 (entropy)\n",
"* wdot = dC/dt\n",
"* Ydot = dY/dt\n",
"* Tdot = dT/dt"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"dudt (generic function with 1 method)"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"function dudt(u)\n",
" T = u[end]\n",
" Y = @view(u[1:ns])\n",
" mean_MW = 1. / dot(Y, 1 ./ gas.MW)\n",
" ρ_mass = P / R / T * mean_MW\n",
" X = Y2X(gas, Y, mean_MW)\n",
" C = Y2C(gas, Y, ρ_mass)\n",
" cp_mole, cp_mass = get_cp(gas, T, X, mean_MW)\n",
" h_mole = get_H(gas, T, Y, X)\n",
" S0 = get_S(gas, T, P, X)\n",
" wdot = wdot_func(gas.reaction, T, C, S0, h_mole)\n",
" Ydot = wdot / ρ_mass .* gas.MW\n",
" Tdot = -dot(h_mole, wdot) / ρ_mass / cp_mass\n",
" du = vcat(Ydot, Tdot)\n",
"end"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
" 0.026856 seconds (18.37 k allocations: 1.047 MiB)\n"
]
},
{
"data": {
"text/plain": [
"10×10 Array{Float64,2}:\n",
" -0.00227393 -0.000934232 0.000137514 … 0.000213839 -5.21262e-6\n",
" -0.0360919 -0.0148282 0.00218263 0.00334244 -8.27348e-5\n",
" 0.0 0.0 0.0 0.0 0.0\n",
" 0.00113697 0.000467116 -6.87571e-5 -0.000106919 2.60631e-6\n",
" 2.09985e-12 2.28459e-12 -1.26987e-13 2.97389e-12 2.53222e-14\n",
" 0.0 0.0 0.0 … 2.74378e-5 0.0\n",
" 0.0372289 0.0152953 -0.00225138 -0.00344774 8.53411e-5\n",
" 0.0 0.0 0.0 0.0 0.0\n",
" 0.0 0.0 0.0 -2.9064e-5 0.0\n",
" -27.3692 -47.4374 16.5061 29.0894 -0.306451"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"@time du0 = ForwardDiff.jacobian(dudt, u0)"
]
},
{
"cell_type": "code",
"execution_count": 16,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"10×10 Array{Float64,2}:\n",
" -0.002274 -0.000934 0.000138 0.003822 -2.395e6 -1.19579e7 -297.284 0.000113 0.000214 -5.0e-6\n",
" -0.036092 -0.014828 0.002183 -5.02344e7 0.003822 -0.008937 4.67671 -2.2362 0.003342 -8.3e-5\n",
" 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0 0.0\n",
" 0.001137 0.000467 -6.9e-5 -1.58248e6 1.1975e6 5.97897e6 148.789 -5.7e-5 -0.000107 3.0e-6\n",
" 0.0 0.0 -0.0 2.13209e7 -1.90067e7 0.006266 1.89648 -0.0 0.0 0.0\n",
" 0.0 0.0 0.0 2.26642e7 2.02042e7 -1.00877e8 2.01596 48.9504 2.7e-5 0.0\n",
" 0.037229 0.015295 -0.002251 7.8318e6 -0.003942 0.009218 -4875.88 4.61515 -0.003448 8.5e-5\n",
" 0.0 0.0 0.0 0.0 0.0 0.0 5015.79 -51.3294 0.0 0.0\n",
" 0.0 0.0 0.0 0.0 0.0 1.06856e8 0.0 0.0 -2.9e-5 0.0\n",
" -27.3692 -47.4374 16.5061 -1.96846e10 -3.90305e9 1.89949e11 -5.51997e6 -1.64747e5 29.0894 -0.306451"
]
}
],
"source": [
"show(stdout, \"text/plain\", round.(du0, digits=6))"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Julia 1.5.2",
"language": "julia",
"name": "julia-1.5"
},
"language_info": {
"file_extension": ".jl",
"mimetype": "application/julia",
"name": "julia",
"version": "1.5.2"
}
},
"nbformat": 4,
"nbformat_minor": 4
}
@jiweiqi
Copy link
Author

jiweiqi commented Feb 23, 2021

mechanism interpreter, disable Troe

import cantera as ct
import torch
import numpy as np

import reactorch as rt

import json

mech_yaml = 'chem.yaml'

sol = rt.Solution(mech_yaml=mech_yaml, device=torch.device('cpu'),
                  vectorize=True,
                  is_clip=False, is_norm=False, is_wdot_vec=False)

gas = sol.gas

gas.TPY = 1200, ct.one_atm, np.ones(gas.n_species)/gas.n_species

molecular_weights = gas.molecular_weights.tolist()
reactant_stoich_coeffs = gas.reactant_stoich_coeffs()
product_stoich_coeffs = gas.product_stoich_coeffs()
Arrhenius_coeffs = sol.Arrhenius_coeffs
efficiencies_coeffs = sol.efficiencies_coeffs

np.savez(mech_yaml,
         molecular_weights=molecular_weights,
         reactant_stoich_coeffs=reactant_stoich_coeffs,
         product_stoich_coeffs=product_stoich_coeffs,
         reactant_orders=sol.reactant_orders,
         is_reversible=sol.is_reversible,
         Arrhenius_coeffs=Arrhenius_coeffs,
         efficiencies_coeffs=efficiencies_coeffs,
         # Arrhenius_A0=sol.Arrhenius_A0,
         # Arrhenius_b0=sol.Arrhenius_b0,
         # Arrhenius_Ea0=sol.Arrhenius_Ea0,
         # Troe_A=sol.Troe_A,
         # Troe_T1=sol.Troe_T1,
         # Troe_T2=sol.Troe_T2,
         # Troe_T3=sol.Troe_T3
         )

@jiweiqi
Copy link
Author

jiweiqi commented Feb 23, 2021

chem.yaml

generator: cti2yaml
cantera-version: 2.5.0a4
date: Tue, 23 Feb 2021 11:08:23 -0500
input-files: [chem.cti]

units: {length: cm, quantity: mol, activation-energy: cal/mol}

phases:
- name: gas
  thermo: ideal-gas
  elements: [N, H, O, C]
  species: [H2, O2, N2, H, O, OH, HO2, H2O2, H2O]
  kinetics: gas
  reactions: all
  state:
    T: 300.0
    P: 1.01325e+05

species:
- name: H2
  composition: {H: 2}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [2.34433112, 7.98052075e-03, -1.9478151e-05, 2.01572094e-08, -7.37611761e-12,
      -917.935173, 0.683010238]
    - [3.3372792, -4.94024731e-05, 4.99456778e-07, -1.79566394e-10, 2.00255376e-14,
      -950.158922, -3.20502331]
  note: '000000'
- name: O2
  composition: {O: 2}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [3.78245636, -2.99673416e-03, 9.84730201e-06, -9.68129509e-09, 3.24372837e-12,
      -1063.94356, 3.65767573]
    - [3.28253784, 1.48308754e-03, -7.57966669e-07, 2.09470555e-10, -2.16717794e-14,
      -1088.45772, 5.45323129]
  note: '000000'
- name: N2
  composition: {N: 2}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [3.298677, 1.4082404e-03, -3.963222e-06, 5.641515e-09, -2.444854e-12,
      -1020.8999, 3.950372]
    - [2.92664, 1.4879768e-03, -5.68476e-07, 1.0097038e-10, -6.753351e-15,
      -922.7977, 5.980528]
  note: '000000'
- name: H
  composition: {H: 1}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [2.5, 7.05332819e-13, -1.99591964e-15, 2.30081632e-18, -9.27732332e-22,
      2.54736599e+04, -0.446682853]
    - [2.50000001, -2.30842973e-11, 1.61561948e-14, -4.73515235e-18, 4.98197357e-22,
      2.54736599e+04, -0.446682914]
  note: '000000'
- name: O
  composition: {O: 1}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [3.1682671, -3.27931884e-03, 6.64306396e-06, -6.12806624e-09, 2.11265971e-12,
      2.91222592e+04, 2.05193346]
    - [2.56942078, -8.59741137e-05, 4.19484589e-08, -1.00177799e-11, 1.22833691e-15,
      2.92175791e+04, 4.78433864]
  note: '000000'
- name: OH
  composition: {H: 1, O: 1}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [4.12530561, -3.22544939e-03, 6.52764691e-06, -5.79853643e-09, 2.06237379e-12,
      3381.53812, -0.69043296]
    - [2.86472886, 1.05650448e-03, -2.59082758e-07, 3.05218674e-11, -1.33195876e-15,
      3718.85774, 5.70164073]
  note: '000000'
- name: HO2
  composition: {H: 1, O: 2}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [4.30179801, -4.74912051e-03, 2.11582891e-05, -2.42763894e-08, 9.29225124e-12,
      294.80804, 3.71666245]
    - [4.0172109, 2.23982013e-03, -6.3365815e-07, 1.1424637e-10, -1.07908535e-14,
      111.856713, 3.78510215]
  note: '000000'
- name: H2O2
  composition: {H: 2, O: 2}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [4.27611269, -5.42822417e-04, 1.67335701e-05, -2.15770813e-08, 8.62454363e-12,
      -1.77025821e+04, 3.43505074]
    - [4.16500285, 4.90831694e-03, -1.90139225e-06, 3.71185986e-10, -2.87908305e-14,
      -1.78617877e+04, 2.91615662]
  note: '000000'
- name: H2O
  composition: {H: 2, O: 1}
  thermo:
    model: NASA7
    temperature-ranges: [300.0, 1000.0, 5000.0]
    data:
    - [4.19864056, -2.0364341e-03, 6.52040211e-06, -5.48797062e-09, 1.77197817e-12,
      -3.02937267e+04, -0.849032208]
    - [3.03399249, 2.17691804e-03, -1.64072518e-07, -9.7041987e-11, 1.68200992e-14,
      -3.00042971e+04, 4.9667701]
  note: '000000'

reactions:
- equation: H + O2 <=> OH + O  # Reaction 1
  rate-constant: {A: 3.52e+16, b: -0.7, Ea: 1.706979e+04}
- equation: H2 + O <=> OH + H  # Reaction 2
  rate-constant: {A: 5.06e+04, b: 2.67, Ea: 6290.63}
- equation: H2 + OH <=> H2O + H  # Reaction 3
  rate-constant: {A: 1.17e+09, b: 1.3, Ea: 3635.28}
- equation: H2O + O <=> OH + OH  # Reaction 4
  rate-constant: {A: 7.0e+05, b: 2.33, Ea: 1.454828e+04}
- equation: H + H + M <=> H2 + M  # Reaction 5
  type: three-body
  rate-constant: {A: 1.3e+18, b: -1.0, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 12.0}
- equation: H + OH + M <=> H2O + M  # Reaction 6
  type: three-body
  rate-constant: {A: 4.0e+22, b: -2.0, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 12.0}
- equation: O + O + M <=> O2 + M  # Reaction 7
  type: three-body
  rate-constant: {A: 6.17e+15, b: -0.5, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 12.0}
- equation: H + O + M <=> OH + M  # Reaction 8
  type: three-body
  rate-constant: {A: 4.71e+18, b: -1.0, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 12.0}
- equation: O + OH + M <=> HO2 + M  # Reaction 9
  type: three-body
  rate-constant: {A: 8.0e+15, b: 0.0, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 12.0}
- equation: H + O2 + M <=> HO2 + M  # Reaction 10
  type: three-body
  rate-constant: {A: 4.65e+12, b: 0.44, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 16.0}
- equation: HO2 + H <=> OH + OH  # Reaction 11
  rate-constant: {A: 7.08e+13, b: 0.0, Ea: 294.93}
- equation: HO2 + H <=> H2 + O2  # Reaction 12
  rate-constant: {A: 1.66e+13, b: 0.0, Ea: 822.9}
- equation: HO2 + H <=> H2O + O  # Reaction 13
  rate-constant: {A: 3.1e+13, b: 0.0, Ea: 1720.84}
- equation: HO2 + O <=> OH + O2  # Reaction 14
  rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0}
- equation: HO2 + OH <=> H2O + O2  # Reaction 15
  rate-constant: {A: 7.0e+12, b: 0.0, Ea: -1094.65}
  duplicate: true
- equation: HO2 + OH <=> H2O + O2  # Reaction 16
  rate-constant: {A: 4.5e+14, b: 0.0, Ea: 1.092973e+04}
  duplicate: true
- equation: OH + OH + M <=> H2O2 + M  # Reaction 17
  type: three-body
  rate-constant: {A: 9.55e+13, b: -0.27, Ea: 0.0}
  efficiencies: {H2: 2.5, H2O: 6.0, H2O2: 6.0}
- equation: HO2 + HO2 <=> H2O2 + O2  # Reaction 18
  rate-constant: {A: 1.03e+14, b: 0.0, Ea: 1.104207e+04}
  duplicate: true
- equation: HO2 + HO2 <=> H2O2 + O2  # Reaction 19
  rate-constant: {A: 1.94e+11, b: 0.0, Ea: -1408.94}
  duplicate: true
- equation: H2O2 + H <=> HO2 + H2  # Reaction 20
  rate-constant: {A: 2.3e+13, b: 0.0, Ea: 7950.05}
- equation: H2O2 + H <=> H2O + OH  # Reaction 21
  rate-constant: {A: 1.0e+13, b: 0.0, Ea: 3585.09}
- equation: H2O2 + OH <=> H2O + HO2  # Reaction 22
  rate-constant: {A: 1.74e+12, b: 0.0, Ea: 1434.03}
  duplicate: true
- equation: H2O2 + OH <=> H2O + HO2  # Reaction 23
  rate-constant: {A: 7.59e+13, b: 0.0, Ea: 7272.94}
  duplicate: true
- equation: H2O2 + O <=> HO2 + OH  # Reaction 24
  rate-constant: {A: 9.63e+06, b: 2.0, Ea: 3991.4}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment