|
58 | 58 | from rmgpy.solver.mbSampled import MBSampledReactor |
59 | 59 | from rmgpy.solver.simple import SimpleReactor |
60 | 60 | from rmgpy.solver.surface import SurfaceReactor |
| 61 | +from rmgpy.solver.base import ReactionSystem |
61 | 62 | from rmgpy.solver.termination import ( |
62 | 63 | TerminationConversion, |
63 | 64 | TerminationRateRatio, |
@@ -656,7 +657,10 @@ def liquid_cat_reactor(temperature, |
656 | 657 | constantSpecies=[]): |
657 | 658 | for spec, conc in initialConcentrations.items(): |
658 | 659 | 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 |
660 | 664 | else: |
661 | 665 | if len(conc) != 2: |
662 | 666 | 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, |
712 | 716 |
|
713 | 717 | initialCondLiq = dict() |
714 | 718 | 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 |
718 | 722 | initialCondLiq["T"] = T |
719 | 723 | initialCondLiq["V"] = V |
720 | 724 | 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 |
723 | 727 | initialCondSurf["T"] = T |
724 | 728 | initialCondSurf["A"] = A |
725 | 729 | initialCondSurf["d"] = 0.0 |
@@ -768,7 +772,8 @@ def constant_T_V_liquid_reactor(temperature, |
768 | 772 |
|
769 | 773 | for spec, conc in initialConcentrations.items(): |
770 | 774 | if not isinstance(conc, list): |
771 | | - initialConcentrations[spec] = Quantity(conc) |
| 775 | + concentration = Quantity(conc) |
| 776 | + initialConcentrations[spec] = concentration.value_si |
772 | 777 | else: |
773 | 778 | raise InputError("Condition ranges not supported for this reaction type") |
774 | 779 | if len(conc) != 2: |
@@ -876,16 +881,16 @@ def constant_T_V_liquid_reactor(temperature, |
876 | 881 | ############################################### process inputs ############################################## |
877 | 882 |
|
878 | 883 | 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 |
881 | 886 | initial_conditions["T"] = T |
882 | 887 | initial_conditions["V"] = V |
883 | 888 |
|
884 | 889 | inlet_conditions = dict() |
885 | 890 | if inletConcentrations: |
886 | 891 | 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 |
889 | 894 | total_molar_flow_rate += inlet_conditions[key] |
890 | 895 | for key, item in inlet_conditions.items(): |
891 | 896 | inlet_conditions[key] = item/total_molar_flow_rate #molar fraction for each species |
@@ -942,7 +947,10 @@ def liquid_reactor(temperature, |
942 | 947 |
|
943 | 948 | for spec, conc in initialConcentrations.items(): |
944 | 949 | 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 |
946 | 954 | else: |
947 | 955 | if len(conc) != 2: |
948 | 956 | 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, |
983 | 991 | if sensitivityConcentrations is None or sensitivityTemperature is None: |
984 | 992 | sens_conditions = None |
985 | 993 | else: |
986 | | - sens_conditions = sensitivityConcentrations |
| 994 | + sens_conditions = deepcopy(sensitivityConcentrations) |
987 | 995 | sens_conditions['T'] = Quantity(sensitivityTemperature).value_si |
988 | 996 |
|
989 | 997 | system = LiquidReactor(T, initialConcentrations, nSims, termination, sensitive_species, sensitivityThreshold, |
@@ -1749,7 +1757,29 @@ def format_initial_mole_fractions(system): |
1749 | 1757 |
|
1750 | 1758 | # Reaction systems |
1751 | 1759 | 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): |
1753 | 1783 | f.write('liquidReactor(\n') |
1754 | 1784 | f.write(' temperature = ' + format_temperature(system) + '\n') |
1755 | 1785 | f.write(' initialConcentrations={\n') |
@@ -1778,8 +1808,25 @@ def format_initial_mole_fractions(system): |
1778 | 1808 | f.write(' },\n') |
1779 | 1809 |
|
1780 | 1810 | # 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 | + |
1781 | 1828 | conversions = '' |
1782 | | - for term in system.termination: |
| 1829 | + for term in terminations: |
1783 | 1830 | if isinstance(term, TerminationTime): |
1784 | 1831 | f.write(' terminationTime = ({0:g},"{1!s}"),\n'.format(term.time.value, term.time.units)) |
1785 | 1832 | elif isinstance(term, TerminationRateRatio): |
|
0 commit comments