In [ ]:
import os
from IPython.display import display
from rmgpy.species import Species
from collections import OrderedDict
import cantera as ct
import numpy as np
import pandas as pd
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
In [ ]:
def simulate(model, T, P, mol_frac, time):
model.TPX = T, P, mol_frac
reactor = ct.IdealGasReactor(model)
simulation = ct.ReactorNet([reactor])
simulation.advance(time)
conditions = pd.Series()
conditions['time'] = simulation.time
conditions['temperature0'] = T
conditions['temperature'] = model.T
conditions['pressure0'] = P
conditions['pressure'] = model.P
species = pd.Series()
for key, value in model.mole_fraction_dict().iteritems():
species[key] = value
return conditions, species
In [ ]:
# Convert chemkin to cantera
from cantera import ck2cti
directory = '/home/mjliu/Documents/models/faa_v2/pah/run4'
filename = 'chem_annotated'
chemkin_file = os.path.join(directory, filename + '.inp')
cantera_file = os.path.join(directory, filename + '.cti')
if os.path.exists(cantera_file):
raise Exception('File already exists')
ck2cti.Parser().convertMech(chemkin_file, outName=cantera_file)
In [ ]:
model = ct.Solution(cantera_file)
In [ ]:
conditions = [800, 1000, 1200, 1400, 1600, 1800, 2000]
In [ ]:
conditions_df = pd.DataFrame()
species_df = pd.DataFrame()
for T in conditions:
P = 2 * 101325
mol_frac = {
'A1(1)': 0.08,
'A1C(3)': .01,
'A2(2)': .01,
'C2H2(12)': 0.2,
'N2': 0.7,
}
conditions, species = simulate(model, T, P, mol_frac, 0.002)
conditions_df = conditions_df.append(conditions, ignore_index=True)
species_df = species_df.append(species, ignore_index=True)
print 'T = {0:4} Completed!'.format(T)
data = pd.concat([conditions_df, species_df], axis=1)
print 'Simulation Completed!'
In [ ]:
plt.style.use('seaborn-poster')
fig = plt.figure()
colormap = mpl.cm.tab20
i = 0
for label in species_df.columns:
x = data['temperature0']
y = data[label]
if any(y > 1e-4) and label not in ['N2', 'C2H2(12)']:
plt.plot(x, y, c=colormap(i), label=label)
i += 1
plt.yscale('log')
plt.xlabel('Temperature (K)')
plt.ylabel('Mole Fraction')
plt.legend(bbox_to_anchor=(1.02, 1), loc=2, borderaxespad=0.)
In [ ]:
# slightly modified version of rmgpy.chemkin.loadSpeciesDictionary
def loadSpeciesDictionary(path):
speciesDict = OrderedDict()
with open(path, 'r') as f:
adjlist = ''
for line in f:
if line.strip() == '' and adjlist.strip() != '':
# Finish this adjacency list
species = Species().fromAdjacencyList(adjlist)
label = species.label
speciesDict[label] = species
adjlist = ''
else:
if "InChI" in line:
line = line.split()[0] + '\n'
if '//' in line:
index = line.index('//')
line = line[0:index]
adjlist += line
else: #reach end of file
if adjlist.strip() != '':
species = Species().fromAdjacencyList(adjlist)
label = species.label
speciesDict[label] = species
return speciesDict
In [ ]:
# set path here
path = os.path.join(directory, 'species_dictionary.txt')
# load
species_dict = loadSpeciesDictionary(path)
In [ ]:
for label in species_df.columns:
y = data[label]
if any(y > 1e-4):
print label
display(species_dict[label])
In [ ]:
for label in species_df.columns:
y = data[label]
if all(y < 1e-8) and any(y > 1e-10):
display(species_dict[label])
In [ ]: