Skip to content

Commit

Permalink
Update diamond.cti and diamond_cvd.py
Browse files Browse the repository at this point in the history
Replace data/inputs/diamond.cti with test_problems version that has
more information. This results in a change in the default pressure and
mole fractions of the gas phase, which in turn changes the result of
one of the regression tests. This is fixed by setting the composition
and pressure of the gas phase in the test to their original values. The
default state from the CTI file matches from the paper.

Include plotting in the diamond_cvd.py and use open properly.
  • Loading branch information
agarwalrounak authored and bryanwweber committed Aug 5, 2019
1 parent bfa5a66 commit 17a27be
Show file tree
Hide file tree
Showing 4 changed files with 103 additions and 176 deletions.
107 changes: 59 additions & 48 deletions data/inputs/diamond.cti
Original file line number Diff line number Diff line change
@@ -1,96 +1,107 @@
# simplified version of Harris and Goodwin diamond (100) growth
# mechanism, J. Phys. Chem., 1993.

# Trough mechanism from 'S. J. Harris and D. G. Goodwin, 'Growth on
# the reconstructed diamond (100) surface, 'J. Phys. Chem. vol. 97,
# 23-28 (1993). reactions a - t are taken directly from Table II,
# with thermochemistry from Table IV. Reaction u is added here.


units(length = 'cm', quantity = 'mol', act_energy = 'kcal/mol')

#------------- the gas -------------------------------------

ideal_gas(name = 'gas',
elements = 'H C',
species = 'gri30: H H2 CH3 CH4',
initial_state = state(temperature = 1200.0,
pressure = 1.0e3,
mole_fractions = 'H:0.002, H2:1, CH4:0.01, CH3:0.0002'))
initial_state = state(
temperature = 1200.0,
pressure = 20.0 * OneAtm / 760.0,
mole_fractions = 'H:0.002, H2:0.988, CH3:0.0002, CH4:0.01',
)
)

#------------- bulk diamond -------------------------------------

stoichiometric_solid(name = 'diamond',
elements = 'C',
density = (3.52, 'g/cm3'),
species = 'C(d)')
elements = 'C',
density = (3.52, 'g/cm3'),
species = 'C(d)')

species(name = 'C(d)',
atoms = 'C:1') # no thermo needed (reaction is irreversible)

#------------- the diamond surface -------------------------------------

ideal_interface(name = 'diamond_100',
elements = 'H C',
species = 'c6HH c6H* c6*H c6** c6HM c6HM* c6*M c6B ',
reactions = 'all',
phases = 'gas diamond',
site_density = (3.0e-9, 'mol/cm2'),
site_density = (3.0E-9, 'mol/cm2'),
initial_state = state(temperature = 1200.0,
coverages = 'c6H*:0.1, c6HH:0.9'))

species(name = 'C(d)',
atoms = 'C:1',
thermo = const_cp() )

# an empty surface site
species(name = 'c6H*',
atoms = 'H:1',
thermo = const_cp(h0 = (51.7, 'kcal/mol'), s0 = (19.5, 'cal/mol/K') ) )
thermo = const_cp(h0 = (51.7, 'kcal/mol'),
s0 = (19.5, 'cal/mol/K')))

species(name = 'c6*H',
atoms = 'H:1',
thermo = const_cp(h0 = (46.1, 'kcal/mol'), s0 = (19.9, 'cal/mol/K') ) )
thermo = const_cp(h0 = (46.1, 'kcal/mol'),
s0 = (19.9, 'cal/mol/K')))

# a hydrogen-terminated site
species(name = 'c6HH',
atoms = 'H:2',
thermo = const_cp(t0 = 1200.0, h0 = (11.4, 'kcal/mol'),
s0 = (21.0, 'cal/mol/K'))
)
thermo = const_cp(h0 = (11.4, 'kcal/mol'),
s0 = (21.0, 'cal/mol/K')))

species(name = 'c6HM',
atoms = 'C:1 H:4',
thermo = const_cp(h0 = (26.9, 'kcal/mol'),
s0 = (40.3, 'cal/mol/K') )
)
s0 = (40.3, 'cal/mol/K')))

species(name = 'c6HM*',
atoms = 'C:1 H:3',
thermo = const_cp(h0 = (65.8, 'kcal/mol'),
s0 = (40.1, 'cal/mol/K') )
)
s0 = (40.1, 'cal/mol/K')))

species(name = 'c6*M',
atoms = 'C:1 H:3',
thermo = const_cp(h0 = (53.3, 'kcal/mol'),
s0 = (38.9, 'cal/mol/K') )
)
s0 = (38.9, 'cal/mol/K')))

species(name = 'c6**',
atoms = 'C:0',
thermo = const_cp(h0 = (90.0, 'kcal/mol'),
s0 = (18.4, 'cal/mol/K') )
)
s0 = (18.4, 'cal/mol/K')))

species(name = 'c6B',
atoms = 'H:2 C:1',
thermo = const_cp(h0 = (40.9, 'kcal/mol'),
s0 = (26.9, 'cal/mol/K') ) )

surface_reaction('c6HH + H <=> c6H* + H2', [1.3e14, 0.0, 7.3]) # a
surface_reaction('c6H* + H <=> c6HH', [1.0e13, 0.0, 0.0]) # b
surface_reaction('c6H* + CH3 <=> c6HM', [5.0e12, 0.0, 0.0]) # c
surface_reaction('c6HM + H <=> c6*M + H2', [1.3e14, 0.0, 7.3]) # d
surface_reaction('c6*M + H <=> c6HM', [1.0e13, 0.0, 0.0]) # e
surface_reaction('c6HM + H <=> c6HM* + H2', [2.8e7, 2.0, 7.7]) # f
surface_reaction('c6HM* + H <=> c6HM', [1.0e13, 0.0, 0.0]) # g
surface_reaction('c6HM* <=> c6*M', [1.0e8, 0.0, 0.0]) # h
surface_reaction('c6HM* + H <=> c6H* + CH3', [3.0e13, 0.0, 0.0]) # i
surface_reaction('c6HM* + H <=> c6B + H2', [1.3e14, 0.0, 7.3]) # k
surface_reaction('c6*M + H <=> c6B + H2', [2.8e7, 2.0, 7.7]) # l
surface_reaction('c6HH + H <=> c6*H + H2', [1.3e14, 0.0, 7.3]) # m
surface_reaction('c6*H + H <=> c6HH', [1.0e13, 0.0, 0.0]) # n
surface_reaction('c6H* + H <=> c6** + H2', [1.3e14, 0.0, 7.3]) # o
surface_reaction('c6** + H <=> c6H*', [1.0e13, 0.0, 0.0]) # p
surface_reaction('c6*H + H <=> c6** + H2', [4.5e6, 2.0, 5.0]) # q
surface_reaction('c6** + H <=> c6*H', [1.0e13, 0.0, 0.0]) # r
surface_reaction('c6** + CH3 <=> c6*M', [5.0e12, 0.0, 0.0]) # s
surface_reaction('c6H* <=> c6*H', [1.0e8, 0.0, 0.0]) # t
surface_reaction('c6B => c6HH + C(d)', [1.0e9, 0.0, 0.0])
s0 = (26.9, 'cal/mol/K')))

surface_reaction('c6HH + H <=> c6H* + H2', [1.3E14, 0.0, 7.3]) # a
surface_reaction('c6H* + H <=> c6HH', [1.0E13, 0.0, 0.0]) # b
surface_reaction('c6H* + CH3 <=> c6HM', [5.0E12, 0.0, 0.0]) # c
surface_reaction('c6HM + H <=> c6*M + H2', [1.3E14, 0.0, 7.3]) # d
surface_reaction('c6*M + H <=> c6HM', [1.0E13, 0.0, 0.0]) # e
surface_reaction('c6HM + H <=> c6HM* + H2', [2.8E7, 2.0, 7.7]) # f
surface_reaction('c6HM* + H <=> c6HM', [1.0E13, 0.0, 0.0]) # g
surface_reaction('c6HM* <=> c6*M', [1.0E8, 0.0, 0.0]) # h
surface_reaction('c6HM* + H <=> c6H* + CH3', [3.0E13, 0.0, 0.0]) # i
surface_reaction('c6HM* + H <=> c6B + H2', [1.3E14, 0.0, 7.3]) # k
surface_reaction('c6*M + H <=> c6B + H2', [2.8E7, 2.0, 7.7]) # l
surface_reaction('c6HH + H <=> c6*H + H2', [1.3E14, 0.0, 7.3]) # m
surface_reaction('c6*H + H <=> c6HH', [1.0E13, 0.0, 0.0]) # m
surface_reaction('c6H* + H <=> c6** + H2', [1.3E14, 0.0, 7.3]) # o
surface_reaction('c6** + H <=> c6H*', [1.0E13, 0.0, 0.0]) # p
surface_reaction('c6*H + H <=> c6** + H2', [4.5E6, 2.0, 5.0]) # q
surface_reaction('c6** + H <=> c6*H', [1.0E13, 0.0, 0.0]) # r
surface_reaction('c6** + CH3 <=> c6*M', [5.0E12, 0.0, 0.0]) # s
surface_reaction('c6H* <=> c6*H', [1.0E8, 0.0, 0.0]) # t

# reaction to add new carbon atom to bulk and regenerate a new site
#
surface_reaction('c6B => c6HH + C(d)', [1.0E9, 0.0, 0.0]) # u
64 changes: 43 additions & 21 deletions interfaces/cython/cantera/examples/surface_chemistry/diamond_cvd.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@

import csv
import cantera as ct
import pandas as pd

print('\n****** CVD Diamond Example ******\n')

Expand All @@ -21,7 +22,6 @@
# import the model for the diamond (100) surface
d = ct.Interface('diamond.cti', 'diamond_100', [g, dbulk])

ns = d.n_species
mw = dbulk.molecular_weights[0]

t = 1200.0
Expand All @@ -32,23 +32,45 @@
ih = g.species_index('H')

xh0 = x[ih]
f = open('diamond.csv', 'w')
writer = csv.writer(f)
writer.writerow(['H mole Fraction', 'Growth Rate (microns/hour)'] +
d.species_names)

iC = d.kinetics_species_index(dbulk.species_index('C(d)'), 1)

for n in range(20):
x[ih] /= 1.4
g.TPX = t, p, x
d.advance_coverages(10.0) # integrate the coverages to steady state
carbon_dot = d.net_production_rates[iC]
mdot = mw * carbon_dot
rate = mdot / dbulk.density
writer.writerow([x[ih], rate * 1.0e6 * 3600.0] + list(d.coverages))

f.close()

print('H concentration, growth rate, and surface coverages '
'written to file diamond.csv')

with open('diamond.csv', 'w', newline='') as f:
writer = csv.writer(f)
writer.writerow(['H mole Fraction', 'Growth Rate (microns/hour)'] +
d.species_names)

iC = d.kinetics_species_index(dbulk.species_index('C(d)'), 1)

for n in range(20):
x[ih] /= 1.4
g.TPX = t, p, x
d.advance_coverages(10.0) # integrate the coverages to steady state
carbon_dot = d.net_production_rates[iC]
mdot = mw * carbon_dot
rate = mdot / dbulk.density
writer.writerow([x[ih], rate * 1.0e6 * 3600.0] + list(d.coverages))

print('H concentration, growth rate, and surface coverages '
'written to file diamond.csv')

try:
import matplotlib.pyplot as plt
data = pd.read_csv('diamond.csv')

plt.figure()
plt.plot(data['H mole Fraction'], data['Growth Rate (microns/hour)'])
plt.xlabel('H Mole Fraction')
plt.ylabel('Growth Rate (microns/hr)')
plt.show()

plt.figure()
for name in data:
if name.startswith('H mole') or name.startswith('Growth'):
continue
plt.plot(data['H mole Fraction'], data[name], label=name)

plt.legend()
plt.xlabel('H Mole Fraction')
plt.ylabel('Coverage')
plt.show()
except ImportError:
print("Install matplotlib to plot the outputs")
1 change: 1 addition & 0 deletions interfaces/cython/cantera/test/test_reactor.py
Original file line number Diff line number Diff line change
Expand Up @@ -983,6 +983,7 @@ def make_reactors(self):
self.solid = ct.Solution('diamond.xml', 'diamond')
self.interface = ct.Interface('diamond.xml', 'diamond_100',
(self.gas, self.solid))
self.gas.TPX = None, 1.0e3, 'H:0.002, H2:1, CH4:0.01, CH3:0.0002'
self.r1 = ct.IdealGasReactor(self.gas)
self.r1.volume = 0.01
self.net.add_reactor(self.r1)
Expand Down
107 changes: 0 additions & 107 deletions test_problems/diamondSurf/diamond.cti

This file was deleted.

0 comments on commit 17a27be

Please sign in to comment.