Skip to content

Commit 3c66ace

Browse files
committed
implement writing of input files with liquidSurfaceReactor
1 parent f61c8ec commit 3c66ace

File tree

1 file changed

+62
-15
lines changed

1 file changed

+62
-15
lines changed

rmgpy/rmg/input.py

Lines changed: 62 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@
5858
from rmgpy.solver.mbSampled import MBSampledReactor
5959
from rmgpy.solver.simple import SimpleReactor
6060
from rmgpy.solver.surface import SurfaceReactor
61+
from rmgpy.solver.base import ReactionSystem
6162
from rmgpy.solver.termination import (
6263
TerminationConversion,
6364
TerminationRateRatio,
@@ -656,7 +657,10 @@ def liquid_cat_reactor(temperature,
656657
constantSpecies=[]):
657658
for spec, conc in initialConcentrations.items():
658659
if not isinstance(conc, list):
659-
initialConcentrations[spec] = Quantity(conc)
660+
concentration = Quantity(conc)
661+
# check the dimensions are ok
662+
# convert to mol/m^3 (or something numerically nice? or must it be SI)
663+
initialConcentrations[spec] = concentration.value_si
660664
else:
661665
if len(conc) != 2:
662666
raise InputError("Concentration values must either be in the form of (number,units) or a list with 2 "
@@ -712,14 +716,14 @@ def liquid_cat_reactor(temperature,
712716

713717
initialCondLiq = dict()
714718
V = 1.0
715-
A = V * Quantity(surfaceVolumeRatio).value_si
716-
for key, conc in initialConcentrations.items():
717-
initialCondLiq[key] = conc.value_si * V
719+
A = V*Quantity(surfaceVolumeRatio).value_si
720+
for key,item in initialConcentrations.items():
721+
initialCondLiq[key] = item*V
718722
initialCondLiq["T"] = T
719723
initialCondLiq["V"] = V
720724
initialCondSurf = dict()
721-
for key, surf_cov in initialSurfaceCoverages.items():
722-
initialCondSurf[key] = surf_cov * rmg.surface_site_density.value_si * A
725+
for key,item in initialSurfaceCoverages.items():
726+
initialCondSurf[key] = item*rmg.surface_site_density.value_si*A
723727
initialCondSurf["T"] = T
724728
initialCondSurf["A"] = A
725729
initialCondSurf["d"] = 0.0
@@ -768,7 +772,8 @@ def constant_T_V_liquid_reactor(temperature,
768772

769773
for spec, conc in initialConcentrations.items():
770774
if not isinstance(conc, list):
771-
initialConcentrations[spec] = Quantity(conc)
775+
concentration = Quantity(conc)
776+
initialConcentrations[spec] = concentration.value_si
772777
else:
773778
raise InputError("Condition ranges not supported for this reaction type")
774779
if len(conc) != 2:
@@ -876,16 +881,16 @@ def constant_T_V_liquid_reactor(temperature,
876881
############################################### process inputs ##############################################
877882

878883
initial_conditions = dict()
879-
for key, conc in initialConcentrations.items():
880-
initial_conditions[key] = conc.value_si * V
884+
for key, item in initialConcentrations.items():
885+
initial_conditions[key] = item*V
881886
initial_conditions["T"] = T
882887
initial_conditions["V"] = V
883888

884889
inlet_conditions = dict()
885890
if inletConcentrations:
886891
total_molar_flow_rate = 0
887-
for key, inlet_conc in inletConcentrations.items():
888-
inlet_conditions[key] = inlet_conc.value_si * inlet_volumetric_flow_rate
892+
for key, item in inletConcentrations.items():
893+
inlet_conditions[key] = item*inlet_volumetric_flow_rate
889894
total_molar_flow_rate += inlet_conditions[key]
890895
for key, item in inlet_conditions.items():
891896
inlet_conditions[key] = item/total_molar_flow_rate #molar fraction for each species
@@ -942,7 +947,10 @@ def liquid_reactor(temperature,
942947

943948
for spec, conc in initialConcentrations.items():
944949
if not isinstance(conc, list):
945-
initialConcentrations[spec] = Quantity(conc)
950+
concentration = Quantity(conc)
951+
# check the dimensions are ok
952+
# convert to mol/m^3 (or something numerically nice? or must it be SI)
953+
initialConcentrations[spec] = concentration.value_si
946954
else:
947955
if len(conc) != 2:
948956
raise InputError("Concentration values must either be in the form of (number,units) or a list with 2 "
@@ -983,7 +991,7 @@ def liquid_reactor(temperature,
983991
if sensitivityConcentrations is None or sensitivityTemperature is None:
984992
sens_conditions = None
985993
else:
986-
sens_conditions = sensitivityConcentrations
994+
sens_conditions = deepcopy(sensitivityConcentrations)
987995
sens_conditions['T'] = Quantity(sensitivityTemperature).value_si
988996

989997
system = LiquidReactor(T, initialConcentrations, nSims, termination, sensitive_species, sensitivityThreshold,
@@ -1749,7 +1757,29 @@ def format_initial_mole_fractions(system):
17491757

17501758
# Reaction systems
17511759
for system in rmg.reaction_systems:
1752-
if rmg.solvent:
1760+
if isinstance(system, ConstantTLiquidSurfaceReactor):
1761+
f.write('liquidSurfaceReactor(\n')
1762+
f.write(' temperature = ' + format_temperature(system) + '\n')
1763+
f.write(' initialConcentrations={\n')
1764+
for spcs, conc in system.initial_conditions['liquid'].items():
1765+
if spcs in ['T', 'V']:
1766+
continue
1767+
f.write(' "{0!s}": ({1:g},"{2!s}"),\n'.format(spcs, conc, 'mol/m^3'))
1768+
f.write(' initialSurfaceCoverages={\n')
1769+
for spcs, conc_mols in system.initial_conditions['surface'].items():
1770+
if spcs in ['T', 'A', 'd']:
1771+
continue
1772+
# surf conc here is in mols, need to convert back into unitless coverage fraction
1773+
coverage = conc_mols / (rmg.surface_site_density.value_si * system.initial_conditions['surface']['A'])
1774+
f.write(' "{0!s}": ({1:g}),\n'.format(spcs, coverage))
1775+
f.write(' },\n')
1776+
1777+
# write the list of constant species
1778+
f.write(f' constantSpecies = {system.const_spc_names},\n')
1779+
1780+
# write the surface Volume ratio, where ratio = A/V and A was originally constructed by assuming V=1 m^3
1781+
f.write(' surfaceVolumeRatio = ({0:g}, "{1!s}"),\n'.format(system.initial_conditions['surface']['A'], 'm^-1'))
1782+
elif isinstance(system, LiquidReactor):
17531783
f.write('liquidReactor(\n')
17541784
f.write(' temperature = ' + format_temperature(system) + '\n')
17551785
f.write(' initialConcentrations={\n')
@@ -1778,8 +1808,25 @@ def format_initial_mole_fractions(system):
17781808
f.write(' },\n')
17791809

17801810
# Termination criteria
1811+
if isinstance(system, ReactionSystem):
1812+
terminations = system.termination
1813+
elif isinstance(system, Reactor): # RMS reactor terminations need to be converted back
1814+
terminations = []
1815+
for term in system.terminations:
1816+
if hasattr(term, 'time'):
1817+
terminations.append(TerminationTime(time=(term.time, 's')))
1818+
elif hasattr(term, 'ratio'):
1819+
terminations.append(TerminationRateRatio(ratio=term.ratio))
1820+
elif isinstance(term, tuple):
1821+
species, conversion = term
1822+
terminations.append(TerminationConversion(spec=species, conv=conversion))
1823+
else:
1824+
raise NotImplementedError('Termination criterion of type {0} is not currently supported for RMS reactors. Please convert this criterion to a time-based criterion or remove it from the input file.'.format(type(term)))
1825+
else:
1826+
raise NotImplementedError('Termination criteria for reaction system of type {0} not supported'.format(type(system)))
1827+
17811828
conversions = ''
1782-
for term in system.termination:
1829+
for term in terminations:
17831830
if isinstance(term, TerminationTime):
17841831
f.write(' terminationTime = ({0:g},"{1!s}"),\n'.format(term.time.value, term.time.units))
17851832
elif isinstance(term, TerminationRateRatio):

0 commit comments

Comments
 (0)