From e89f48339f1dd0b67245ab22241ea3a0c0bcb18c Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 11 May 2026 16:52:53 -0400 Subject: [PATCH 01/55] Fix to_cantera() to use equation string, avoiding Cantera third-body misidentification MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Cantera's Python API, when constructing ct.Reaction from reactants/products dicts, silently re-interprets any species with net-zero stoichiometry (equal count on both sides — a spectator or surface catalyst) as a third-body collider. This mutates input_data: the equation string has the spectator's stoichiometry doubled and a spurious 'efficiencies' entry is added. The corrupted YAML cannot be round-tripped. This affects all rate types (ArrheniusRate, InterfaceArrheniusRate, StickingArrheniusRate, PlogRate, ChebyshevRate) and is reproducible on Cantera 3.1.0 and 3.2.0. A bug report has been filed with the Cantera project. Fix: replace the reactants/products dict form of ct.Reaction with the equation-string form for all non-third-body reaction types. Passing an equation string avoids the misidentification entirely. ThirdBody, Troe, and Lindemann reactions are left using the dict form because they require the third_body= keyword parameter, and their species do not appear on both sides so the bug does not affect them. A nested helper _ct_equation() is added inside to_cantera() to build the equation string from the already-computed ct_reactants / ct_products dicts. Also adds a regression test (test_reaction_to_dicts_surface_spectator_species) that verifies no 'efficiencies' key and no doubled stoichiometry appear for a SurfaceArrhenius reaction where the same surface species appears on both sides. Co-Authored-By: Claude Sonnet 4.6 --- rmgpy/reaction.py | 43 +++++++++++++++++++++------------ test/rmgpy/yaml_cantera1Test.py | 40 ++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 16 deletions(-) diff --git a/rmgpy/reaction.py b/rmgpy/reaction.py index 63e1d278f1..229545f3c9 100644 --- a/rmgpy/reaction.py +++ b/rmgpy/reaction.py @@ -322,29 +322,48 @@ def to_cantera(self, species_list=None, use_chemkin_identifier=False): if not self.kinetics: raise Exception('Cantera reaction cannot be created because there was no kinetics.') + # Build an equation string from the stoichiometry dicts. + # Passing equation= to ct.Reaction avoids a Cantera API bug where any + # species present in both reactants and products dicts is misidentified + # as a third-body collider, corrupting input_data with spurious + # 'efficiencies' and doubled stoichiometry in the equation string. + # Third-body reaction types (ThirdBody/Troe/Lindemann) are exempt: they + # require the third_body= keyword and their species do not appear on + # both sides, so the bug does not affect them. + def _ct_equation(reactants, products, reversible): + def fmt(d): + return " + ".join( + f"{stoich} {name}" if stoich > 1 else name + for name, stoich in d.items() + ) + arrow = " <=> " if reversible else " => " + return fmt(reactants) + arrow + fmt(products) + + ct_equation = _ct_equation(ct_reactants, ct_products, self.reversible) + # Create the Cantera reaction object, # with the correct type of kinetics object # but don't actually set its kinetics (we do that at the end) if isinstance(self.kinetics, Arrhenius): # Create an Elementary Reaction if isinstance(self.kinetics, SurfaceArrhenius): # SurfaceArrhenius inherits from Arrhenius - ct_reaction = ct.Reaction(reactants=ct_reactants, products=ct_products, rate=ct.InterfaceArrheniusRate()) + ct_reaction = ct.Reaction(equation=ct_equation, rate=ct.InterfaceArrheniusRate()) else: - ct_reaction = ct.Reaction(reactants=ct_reactants, products=ct_products, rate=ct.ArrheniusRate()) + ct_reaction = ct.Reaction(equation=ct_equation, rate=ct.ArrheniusRate()) elif isinstance(self.kinetics, MultiArrhenius): # Return a list of elementary reactions which are duplicates - ct_reaction = [ct.Reaction(reactants=ct_reactants, products=ct_products, rate=ct.ArrheniusRate()) + ct_reaction = [ct.Reaction(equation=ct_equation, rate=ct.ArrheniusRate()) for arr in self.kinetics.arrhenius] elif isinstance(self.kinetics, PDepArrhenius): - ct_reaction = ct.Reaction(reactants=ct_reactants, products=ct_products, rate=ct.PlogRate()) + ct_reaction = ct.Reaction(equation=ct_equation, rate=ct.PlogRate()) elif isinstance(self.kinetics, MultiPDepArrhenius): - ct_reaction = [ct.Reaction(reactants=ct_reactants, products=ct_products, rate=ct.PlogRate()) + ct_reaction = [ct.Reaction(equation=ct_equation, rate=ct.PlogRate()) for arr in self.kinetics.arrhenius] elif isinstance(self.kinetics, Chebyshev): - ct_reaction = ct.Reaction(reactants=ct_reactants, products=ct_products, rate=ct.ChebyshevRate()) + ct_reaction = ct.Reaction(equation=ct_equation, rate=ct.ChebyshevRate()) elif isinstance(self.kinetics, ThirdBody): if ct_collider: @@ -393,18 +412,10 @@ def to_cantera(self, species_list=None, use_chemkin_identifier=False): ) elif isinstance(self.kinetics, SurfaceArrhenius): - ct_reaction = ct.Reaction( - reactants=ct_reactants, - products=ct_products, - rate=ct.InterfaceArrheniusRate() - ) + ct_reaction = ct.Reaction(equation=ct_equation, rate=ct.InterfaceArrheniusRate()) elif isinstance(self.kinetics, StickingCoefficient): - ct_reaction = ct.Reaction( - reactants=ct_reactants, - products=ct_products, - rate=ct.StickingArrheniusRate() - ) + ct_reaction = ct.Reaction(equation=ct_equation, rate=ct.StickingArrheniusRate()) else: raise NotImplementedError(f"Unable to set cantera kinetics for {self.kinetics}") diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 06ea5397e9..6d6cb4ec60 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -294,6 +294,46 @@ def test_reaction_to_dicts_coverage_dependence(self): # 5 kJ/mol = 5000 J/mol → ×1000 → 5 000 000 J/kmol assert np.isclose(cov["E"], 5e6) + def test_reaction_to_dicts_surface_spectator_species(self): + """SurfaceArrhenius with a spectator species on both sides must not produce efficiencies. + + Cantera's Python API misidentifies a species with equal stoichiometry on + both sides (a net spectator / surface catalyst) as a third-body collider, + causing input_data to include a spurious 'efficiencies' entry and doubled + stoichiometry in the equation string. reaction_to_dicts must detect and + fix this. + """ + # Build a second surface species to act as spectator (adsorbed oxygen) + ox = _make_surface_species( + "O_X", + "1 O u0 p2 c0 {2,D}\n2 X u0 p0 c0 {1,D}", + index=6, + ) + # H_X(5) + O_X(6) <=> X(4) + O_X(6) — O_X is spectator on both sides + kin = SurfaceArrhenius( + A=(4.18e20, "m^2/(mol*s)"), n=0.0, Ea=(148.7, "kJ/mol"), T0=(1, "K") + ) + rxn = Reaction( + reactants=[self.hx, ox], + products=[self.x, ox], + kinetics=kin, + ) + species_list = self.all_surface + [ox] + entries = reaction_to_dicts(rxn, species_list) + d = entries[0] + assert "efficiencies" not in d, ( + "Spurious 'efficiencies' must not appear for a SurfaceArrhenius reaction " + "even when a species appears on both sides." + ) + eq = d["equation"] + # O_X(6) should appear exactly once on each side, not doubled + assert eq.count("O_X(6)") == 2, ( + f"Spectator O_X should appear once per side in: {eq}" + ) + assert "2 O_X" not in eq, ( + f"Spectator stoichiometry should not be doubled in: {eq}" + ) + class TestCanteraWriter1: """Tests for the CanteraWriter1 class.""" From 883416d30439f414f7c81f22b93fa4647b8b69ff Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Mon, 11 May 2026 18:16:23 -0400 Subject: [PATCH 02/55] [yaml_cantera2] Use full elements list, like in antera1 method defines base elements from existing list, but also includes custom elements and surface site as done in cantera1 method --- rmgpy/yaml_cantera2.py | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index b5fd10500f..0c87d15cdb 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -201,6 +201,25 @@ def save_cantera_model(model_container, path, site_density=None, verbose=False): # sort_keys=False ensures 'units' comes first, then 'phases', etc. yaml.dump(yaml_data, f, Dumper=Dumper, sort_keys=False, default_flow_style=None) +def get_elements_lists(): + """ + Returns custom element definitions and the full elements list for phases. + """ + from rmgpy.molecule.element import get_element + elements_list = ['H', 'C', 'O', 'N', 'Ne', 'Ar', 'He', 'Si', 'S', + 'F', 'Cl', 'Br', 'I', 'E'] + isotopes = (('H', 2), ('H', 3), ('C', 13), ('O', 18)) + custom_elements = [] + for symbol, isotope in isotopes: + element = get_element(symbol, isotope=isotope) + chemkin_name = element.chemkin_name + mass = 1000 * element.mass + custom_elements.append({'symbol': chemkin_name, 'atomic-weight': mass}) + elements_list.append(chemkin_name) + # Surface sites + elements_list.append('X') + custom_elements.append({'symbol': 'X', 'atomic-weight': 195.083}) + return custom_elements, elements_list def generate_cantera_data(species_list, reaction_list, @@ -253,8 +272,10 @@ def generate_cantera_data(species_list, gas_reactions.append(rxn) # --- 3. Phase Definitions --- - base_elements = ['H', 'C', 'O', 'N', 'Ne', 'Ar', 'He', 'Si', 'S', 'F', 'Cl', 'Br', 'I', 'E'] - elements_set = set(base_elements) + custom_elements, all_elements = get_elements_lists() + + data['elements'] = custom_elements + elements_set = set(all_elements) if search_for_additional_elements: for spc in sorted_species: From 800611729f4e4fdb37e6a29724d216e4d933972f Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Mon, 11 May 2026 20:44:47 -0400 Subject: [PATCH 03/55] counts surface sites and assigns the corresponding field --- rmgpy/yaml_cantera2.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 0c87d15cdb..06eec271dc 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -408,6 +408,10 @@ def species_to_dict(species, species_list, verbose=False): }, } + if species.contains_surface_site(): + num_sites = sum(1 for atom in mol.atoms if atom.symbol == 'X') + species_entry['sites'] = num_sites + # Transport (if available) - Only relevant for gas phase usually if species.transport_data and not species.contains_surface_site(): td = species.transport_data From d5ba4c39b6a2b4385ccee3ce86c088dafbb0c2e4 Mon Sep 17 00:00:00 2001 From: Richard West Date: Tue, 12 May 2026 13:46:26 -0400 Subject: [PATCH 04/55] use mol.number_of_surface_sites() instead of inline X-atom count Replaces the ad-hoc sum over atoms with the existing Molecule API method, and only emits the 'sites' field when a species occupies more than one site (monodentate adsorbates with sites=1 don't need the field). Co-Authored-By: Claude Sonnet 4.6 --- rmgpy/yaml_cantera2.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 06eec271dc..cac4d32da9 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -408,8 +408,8 @@ def species_to_dict(species, species_list, verbose=False): }, } - if species.contains_surface_site(): - num_sites = sum(1 for atom in mol.atoms if atom.symbol == 'X') + num_sites = mol.number_of_surface_sites() + if num_sites > 1: species_entry['sites'] = num_sites # Transport (if available) - Only relevant for gas phase usually From 13bf857c9a5f8740f468f70f7b82766ff283d704 Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Mon, 11 May 2026 20:46:05 -0400 Subject: [PATCH 05/55] adds transport note to each species, not just in annotated yaml to match ck2yaml --- rmgpy/yaml_cantera1.py | 13 ++++++------- rmgpy/yaml_cantera2.py | 2 +- 2 files changed, 7 insertions(+), 8 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index db2928b0c9..3c29a95e00 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -394,13 +394,12 @@ def species_to_dict(species, all_species=None, verbose=False): cantera_species = species.to_cantera(use_chemkin_identifier=True, all_species=all_species) species_data = cantera_species.input_data - if verbose: - try: - transport_comment = species.transport_data.comment - if transport_comment: - species_data["transport"]["note"] = transport_comment - except AttributeError: - pass + try: + transport_comment = species.transport_data.comment + if transport_comment: + species_data["transport"]["note"] = transport_comment + except AttributeError: + pass if "size" in species_data: sites = species_data["size"] diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index cac4d32da9..49820010ef 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -428,7 +428,7 @@ def species_to_dict(species, species_list, verbose=False): transport_dict['polarizability'] = td.polarizability.value_si * 1e30 # Angstrom^3 if getattr(td, 'rotrelaxcollnum', None) and td.rotrelaxcollnum != 0.0: transport_dict['rotational-relaxation'] = td.rotrelaxcollnum - if verbose and td.comment: + if td.comment: transport_dict['note'] = td.comment.strip() species_entry['transport'] = transport_dict From a29fee9e88b664f691166c298879c4a4f342ac17 Mon Sep 17 00:00:00 2001 From: Richard West Date: Tue, 12 May 2026 13:54:59 -0400 Subject: [PATCH 06/55] Restore verbose gate on transport notes; strip them from ck2yaml non-annotated file The way things are set up currently, transport notes belong in annotated output only. The previous commit removed the verbose guards, to match the ck2yaml version. Yes, we want them consistent, but for now make it so the non-annotated yaml files have no comments/notes, in any version. Instead: restore if-verbose gating in both yaml_cantera1 and yaml_cantera2, and strip transport notes from cantera_from_ck/chem.yaml after ck2yaml generates it when verbose_comments is False, so all three non-annotated files are consistent. To remove them from the ck2yaml-generated file, we can use a regex to remove 'note:' lines and their indented continuations . Avoieds yaml.safe_load + yaml.dump (which reformats the whole file) Co-Authored-By: Claude Sonnet 4.6 --- rmgpy/rmg/main.py | 10 ++++++++++ rmgpy/yaml_cantera1.py | 13 +++++++------ rmgpy/yaml_cantera2.py | 2 +- 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index de65508cd1..a9539d5da5 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -1346,6 +1346,16 @@ def execute(self, initialize=True, **kwargs): if os.path.exists(annotated): self.generate_cantera_files_from_chemkin(annotated) + # Strip transport notes from the non-annotated ck2yaml file to match the non-verbose RMG writers + ck_chem_yaml = os.path.join(self.output_directory, "cantera_from_ck", "chem.yaml") + if os.path.exists(ck_chem_yaml): + with open(ck_chem_yaml) as f: + ck_text = f.read() + # Remove 'note:' lines and their indented continuations (multi-line values are more-indented) + ck_text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', ck_text, flags=re.MULTILINE) + with open(ck_chem_yaml, "w") as f: + f.write(ck_text) + # Compare translated Cantera files against directly generated Cantera files if translated_cantera_file and self.cantera1_writer_config and self.cantera1_writer_config.enabled: compare_yaml_files_and_report(translated_cantera_file, diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 3c29a95e00..db2928b0c9 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -394,12 +394,13 @@ def species_to_dict(species, all_species=None, verbose=False): cantera_species = species.to_cantera(use_chemkin_identifier=True, all_species=all_species) species_data = cantera_species.input_data - try: - transport_comment = species.transport_data.comment - if transport_comment: - species_data["transport"]["note"] = transport_comment - except AttributeError: - pass + if verbose: + try: + transport_comment = species.transport_data.comment + if transport_comment: + species_data["transport"]["note"] = transport_comment + except AttributeError: + pass if "size" in species_data: sites = species_data["size"] diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 49820010ef..cac4d32da9 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -428,7 +428,7 @@ def species_to_dict(species, species_list, verbose=False): transport_dict['polarizability'] = td.polarizability.value_si * 1e30 # Angstrom^3 if getattr(td, 'rotrelaxcollnum', None) and td.rotrelaxcollnum != 0.0: transport_dict['rotational-relaxation'] = td.rotrelaxcollnum - if td.comment: + if verbose and td.comment: transport_dict['note'] = td.comment.strip() species_entry['transport'] = transport_dict From 2286e18167ce121515c62887a620c9300475724f Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Mon, 11 May 2026 20:47:31 -0400 Subject: [PATCH 07/55] separates gas reactions and surface reactions to match ck2yaml --- rmgpy/yaml_cantera2.py | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index cac4d32da9..55729ff2f2 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -296,9 +296,10 @@ def generate_cantera_data(species_list, 'elements': sorted(list(elements_set)), 'species': [get_label(spc, species_list) for spc in gas_species], 'kinetics': 'gas', - 'reactions': 'declared-species', } + if surface_species: + gas_phase_def['reactions'] = ['gas-reactions'] if is_plasma: gas_phase_def['transport'] = 'ionized-gas' # Plasma specific defaults @@ -327,8 +328,8 @@ def generate_cantera_data(species_list, 'elements': sorted(list(elements_set)), 'species': [get_label(sp, species_list) for sp in surface_species], 'kinetics': 'surface', - 'reactions': 'declared-species', - 'site-density': site_density or default_site_density + 'reactions': ['surface-reactions'], + 'site-density': site_density or default_site_density, } if has_coverage_dependence: surface_phase_def['reference-state-coverage'] = 0.11 @@ -341,16 +342,25 @@ def generate_cantera_data(species_list, species_data.append(species_to_dict(sp, species_list, verbose=verbose)) data['species'] = species_data - reaction_data = list() + # Build separate reaction lists for each phase if there are two phases + gas_reaction_data = list() for rxn in gas_reactions: entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) if entries: - reaction_data.extend(entries) - for rxn in surface_reactions: - entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) - if entries: - reaction_data.extend(entries) - data['reactions'] = reaction_data + gas_reaction_data.extend(entries) + + if surface_species: + data['gas-reactions'] = gas_reaction_data + else: + data['reactions'] = gas_reaction_data + + if surface_reactions: + surface_reaction_data = list() + for rxn in surface_reactions: + entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) + if entries: + surface_reaction_data.extend(entries) + data['surface-reactions'] = surface_reaction_data return data From e56e9d62d37999078d57b0ff3bad74ab4b0ddbc3 Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Mon, 11 May 2026 20:36:24 -0400 Subject: [PATCH 08/55] adds 'state' to gas and surface phases to match ck2yaml --- rmgpy/yaml_cantera1.py | 1 + rmgpy/yaml_cantera2.py | 2 ++ 2 files changed, 3 insertions(+) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index db2928b0c9..6d542643f5 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -265,6 +265,7 @@ def get_phases_with_surface(spcs, surface_site_density, has_coverage_dependence= kinetics: surface reactions: [site0-reactions] site-density: {surface_site_density * 1e-4 } + state: {{T: 300.0, P: 1 atm}} """ # surface_site_density * 1e-4 #in units of mol/cm^2 diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 55729ff2f2..031d387011 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -311,6 +311,7 @@ def generate_cantera_data(species_list, else: gas_phase_def['transport'] = 'mixture-averaged' + gas_phase_def['state'] = {'T': 300.0, 'P': '1 atm'} phases.append(gas_phase_def) if surface_species: @@ -330,6 +331,7 @@ def generate_cantera_data(species_list, 'kinetics': 'surface', 'reactions': ['surface-reactions'], 'site-density': site_density or default_site_density, + 'state': {'T': 300.0, 'P': '1 atm'}, } if has_coverage_dependence: surface_phase_def['reference-state-coverage'] = 0.11 From 92f1a73045d6e9db3dfc0a38d3145354efcf6fb5 Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Mon, 11 May 2026 20:54:57 -0400 Subject: [PATCH 09/55] tests for entries and fields that are expected from ck2yaml and compares cantera2 writer to ck2yaml as is done for cantera1 --- test/rmgpy/yaml_cantera1Test.py | 97 +++++++++++ test/rmgpy/yaml_cantera2Test.py | 290 +++++++++++++++++++++++++++++++- 2 files changed, 386 insertions(+), 1 deletion(-) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 6d6cb4ec60..0835f3e448 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -52,6 +52,11 @@ CanteraWriter1, species_to_dict, reaction_to_dicts, + get_elements_block, + get_phases_gas_only, + get_phases_with_surface, + get_mech_dict_nonsurface, + get_mech_dict_surface, ) @@ -334,6 +339,98 @@ def test_reaction_to_dicts_surface_spectator_species(self): f"Spectator stoichiometry should not be doubled in: {eq}" ) + def test_get_elements_block_isotopes_and_surface_site(self): + """get_elements_block returns isotope definitions and X with correct weights.""" + elements_block, elements_line = get_elements_block() + + # elements_line should list X + assert 'X' in elements_line + + # elements_block should contain isotope symbols and X + assert 'D' in elements_block # H-2 + assert 'T' in elements_block # H-3 + assert 'X' in elements_block + assert '195.083' in elements_block # X atomic weight + + def test_get_phases_gas_only_has_state(self): + """Gas-only phases block includes state with T and P.""" + phases_block = get_phases_gas_only([self.h2, self.h]) + assert 'state:' in phases_block + assert 'T: 300.0' in phases_block + assert 'P: 1 atm' in phases_block + + def test_get_phases_gas_only_has_elements(self): + """Gas-only phases block includes elements line.""" + phases_block = get_phases_gas_only([self.h2]) + assert 'elements:' in phases_block + + def test_get_mech_dict_nonsurface_reactions_key(self): + """Gas-only mech dict uses 'reactions' key.""" + rxn = Reaction( + reactants=[self.h2], products=[self.h, self.h], + kinetics=Arrhenius(A=(1e13, "s^-1"), n=0, Ea=(400, "kJ/mol"), T0=(1, "K")) + ) + result = get_mech_dict_nonsurface([self.h2, self.h], [rxn]) + assert 'species' in result + assert 'reactions' in result + assert len(result['reactions']) == 1 + + def test_get_mech_dict_surface_has_gas_and_surface_reactions(self): + """Surface mech dict separates gas-reactions and site0-reactions.""" + kin = SurfaceArrhenius( + A=(1e13, "m^2/(mol*s)"), n=0, Ea=(50, "kJ/mol"), T0=(1, "K") + ) + rxn = Reaction(reactants=[self.h2, self.x], products=[self.hx, self.hx], kinetics=kin) + result = get_mech_dict_surface( + [self.h2, self.x, self.hx], [rxn] + ) + assert 'species' in result + assert 'gas-reactions' in result + assert 'site0-reactions' in result + assert len(result['site0-reactions']) == 1 + + def test_get_phases_with_surface_has_state(self): + """Surface phases block includes state for both gas and surface phases.""" + phases_block = get_phases_with_surface( + [self.h2, self.x, self.hx], + surface_site_density=2.5e-9, # mol/cm^2-equivalent SI + ) + # Should have two phase definitions each with state + assert phases_block.count('state:') == 2 + assert 'T: 300.0' in phases_block + assert 'P: 1 atm' in phases_block + + def test_species_to_dict_surface_sites_count(self): + """species_to_dict reports correct 'sites' count for multi-site surface species.""" + # Bidentate glyoxal adsorbed via C and O (2 X atoms) + glyoxal_xx = _make_surface_species( + "glyoxalXX", + "1 O u0 p2 c0 {3,S} {8,S}\n" + "2 O u0 p2 c0 {4,D}\n" + "3 C u0 p0 c0 {1,S} {4,S} {5,S} {7,S}\n" + "4 C u0 p0 c0 {2,D} {3,S} {6,S}\n" + "5 H u0 p0 c0 {3,S}\n" + "6 H u0 p0 c0 {4,S}\n" + "7 X u0 p0 c0 {3,S}\n" + "8 X u0 p0 c0 {1,S}", + index=215, + ) + d2 = species_to_dict(glyoxal_xx) + assert 'sites' in d2 + assert d2['sites'] == 2 + + def test_species_to_dict_gas_no_sites_field(self): + """Gas species must not have a 'sites' field.""" + d = species_to_dict(self.h2) + assert 'sites' not in d + + def test_species_to_dict_transport_note_without_verbose(self): + """Transport 'note' is written even when verbose=False.""" + self.h2.transport_data.comment = "from GRI-Mech" + d = species_to_dict(self.h2, verbose=False) + assert 'note' in d['transport'] + assert d['transport']['note'] == "from GRI-Mech" + class TestCanteraWriter1: """Tests for the CanteraWriter1 class.""" diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index f4d588a486..ff7ef2e023 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -29,10 +29,12 @@ import cantera as ct +import copy import os import shutil import numpy as np import pytest +import yaml from rmgpy.species import Species from rmgpy.reaction import Reaction @@ -53,7 +55,8 @@ save_cantera_files, species_to_dict, reaction_to_dict_list, - generate_cantera_data + generate_cantera_data, + get_elements_lists, ) @@ -541,3 +544,288 @@ def test_reaction_to_dict_thirdbody_unit(self): assert "rate-constant" in d assert "efficiencies" in d assert np.isclose(d["efficiencies"]["Ar(3)"], 0.7) + + def test_get_elements_block_isotopes_and_surface_site(self): + """get_elements_lists returns isotope definitions and X with correct weights.""" + custom_elements, elements_list = get_elements_lists() + + assert 'X' in elements_list + x_entry = next((e for e in custom_elements if e['symbol'] == 'X'), None) + assert x_entry is not None + assert np.isclose(x_entry['atomic-weight'], 195.083) + + symbols = [e['symbol'] for e in custom_elements] + assert 'D' in symbols # H-2 + assert 'T' in symbols # H-3 + for entry in custom_elements: + assert entry['atomic-weight'] > 0 + + def test_generate_cantera_data_elements_block(self): + """generate_cantera_data includes top-level 'elements' key with custom definitions.""" + h2 = self._create_dummy_species("H2", "[H][H]", index=1) + data = generate_cantera_data([h2], []) + + assert 'elements' in data + custom_elements = data['elements'] + assert isinstance(custom_elements, list) + assert len(custom_elements) > 0 + symbols = [e['symbol'] for e in custom_elements] + assert 'X' in symbols + + def test_generate_cantera_data_gas_phase_state(self): + """Gas phase definition includes a 'state' block with T and P.""" + h2 = self._create_dummy_species("H2", "[H][H]", index=1) + data = generate_cantera_data([h2], []) + + gas_phase = data['phases'][0] + assert 'state' in gas_phase + assert np.isclose(gas_phase['state']['T'], 300.0) + assert gas_phase['state']['P'] == '1 atm' + + def test_generate_cantera_data_gas_reactions_key(self): + """Gas-only model uses top-level 'reactions' key (matching ck2yaml).""" + h2 = self._create_dummy_species("H2", "[H][H]", index=1) + h = self._create_dummy_species("H", "[H]", index=2) + rxn = Reaction( + reactants=[h2], products=[h, h], + kinetics=Arrhenius(A=(1e13, "s^-1"), n=0, Ea=(400, "kJ/mol"), T0=(1, "K")) + ) + data = generate_cantera_data([h2, h], [rxn]) + + gas_phase = data['phases'][0] + assert 'reactions' not in gas_phase, "Gas-only phase should not reference reactions" + assert 'reactions' in data + assert len(data['reactions']) == 1 + assert 'gas-reactions' not in data + + def test_generate_cantera_data_surface_phase_state_and_reactions_key(self): + """Surface phase has 'state' and references 'surface-reactions'; data has that key.""" + h2 = self._create_dummy_species("H2", "[H][H]", index=1) + x = self._create_surface_species("X", "1 X u0 p0", index=2) + hx = self._create_surface_species( + "H_X", "1 H u0 p0 {2,S}\n2 X u0 p0 {1,S}", index=3 + ) + kin = SurfaceArrhenius( + A=(1e13, "m^2/(mol*s)"), n=0, Ea=(50, "kJ/mol"), T0=(1, "K") + ) + rxn = Reaction(reactants=[h2, x], products=[hx, hx], kinetics=kin) + data = generate_cantera_data([h2, x, hx], [rxn]) + + surface_phase = next(p for p in data['phases'] if p['name'] == 'surface') + assert 'state' in surface_phase + assert np.isclose(surface_phase['state']['T'], 300.0) + assert surface_phase['reactions'] == ['surface-reactions'] + assert 'surface-reactions' in data + assert len(data['surface-reactions']) == 1 + + def test_species_to_dict_surface_sites_count(self): + """species_to_dict reports correct 'sites' count for surface species.""" + # Single-site species + hx = self._create_surface_species( + "H_X", "1 H u0 p0 {2,S}\n2 X u0 p0 {1,S}", index=11 + ) + d = species_to_dict(hx, [hx]) + assert 'sites' in d + assert d['sites'] == 1 + + # Bidentate glyoxal adsorbed via C and O (2 X atoms) + glyoxal_xx = self._create_surface_species( + "glyoxalXX", + "1 O u0 p2 c0 {3,S} {8,S}\n" + "2 O u0 p2 c0 {4,D}\n" + "3 C u0 p0 c0 {1,S} {4,S} {5,S} {7,S}\n" + "4 C u0 p0 c0 {2,D} {3,S} {6,S}\n" + "5 H u0 p0 c0 {3,S}\n" + "6 H u0 p0 c0 {4,S}\n" + "7 X u0 p0 c0 {3,S}\n" + "8 X u0 p0 c0 {1,S}", + index=215, + ) + d2 = species_to_dict(glyoxal_xx, [glyoxal_xx]) + assert 'sites' in d2 + assert d2['sites'] == 2 + + def test_species_to_dict_gas_no_sites_field(self): + """Gas species must not have a 'sites' field.""" + h2 = self._create_dummy_species("H2", "[H][H]", index=1) + d = species_to_dict(h2, [h2]) + assert 'sites' not in d + + def test_species_to_dict_transport_note_without_verbose(self): + """Transport 'note' is written even when verbose=False.""" + sp = self._create_dummy_species("H2", "[H][H]", index=1) + sp.transport_data.comment = "from GRI-Mech" + d = species_to_dict(sp, [sp], verbose=False) + assert 'note' in d['transport'] + assert d['transport']['note'] == "from GRI-Mech" + + +class CanteraYamlFileComparer: + """ + For comparing two Cantera YAML files. + This class provides methods to compare species and reactions between the two files. + + Args: + yaml_path_1: Path to the first YAML file, converted from Chemkin by ck2yaml. + yaml_path_2: Path to the second YAML file, written directly by RMG. + """ + yaml_path_1 = None + yaml_path_2 = None + + @pytest.fixture(autouse=True, scope="class") # loaded once per Class + def load_yaml_files(self, request): + """Load the two YAML files to be compared.""" + with open(request.cls.yaml_path_1, 'r') as file: + request.cls.yaml1 = yaml.safe_load(file) + with open(request.cls.yaml_path_2, 'r') as file: + request.cls.yaml2 = yaml.safe_load(file) + + @pytest.fixture(autouse=True) # runs before each test method + def copy_yaml_dicts(self): + """Make deep copies so tests can modify without affecting other tests.""" + self.yaml1 = copy.deepcopy(self.__class__.yaml1) + self.yaml2 = copy.deepcopy(self.__class__.yaml2) + + def testGeneratorsAsExpected(self): + "Check the two yaml files were generated by the expected tools (ck2yaml vs RMG)." + assert self.yaml1['generator'] == 'ck2yaml', "First YAML file should be generated by ck2yaml." + assert 'RMG' in self.yaml2['generator'], "Second YAML file should be generated by RMG." + + def testKeysMatch(self): + """Test that the top-level keys in both YAML files match, except those expected not to.""" + # Remove keys unique to each generator + self.yaml1.pop('input-files', None) + self.yaml1.pop('cantera-version', None) + self.yaml1.pop('date', None) + self.yaml2.pop('cantera-version', None) + self.yaml2.pop('description', None) + for model in [self.yaml1, self.yaml2]: + for phase in model['phases']: + for reactions_block in phase.get('reactions', []): + assert reactions_block in model, f"Expected reactions block '{reactions_block}' not found in YAML file." + model.pop(reactions_block, None) + assert self.yaml1.keys() == self.yaml2.keys(), "YAML files have different top-level keys." + + def testPhasesMatch(self): + """Test that the phase definitions in both YAML files match.""" + assert len(self.yaml1['phases']) == len(self.yaml2['phases']), "YAML files have different numbers of phases" + + for phase1, phase2 in zip(self.yaml1['phases'], self.yaml2['phases']): + assert phase1['name'] == phase2['name'], f"Phase names do not match: {phase1['name']} vs {phase2['name']}." + assert phase1['thermo'] == phase2['thermo'], f"Thermo definitions for phase {phase1['name']} do not match." + assert phase1.get('transport', '') == phase2.get('transport', ''), f"Transport definitions for phase {phase1['name']} do not match." + assert phase1.get('adjacent-phases', []) == phase2.get('adjacent-phases', []), f"Adjacent phases for phase {phase1['name']} do not match." + assert phase1.get('species', []) == phase2.get('species', []), f"Species lists for phase {phase1['name']} do not match." + assert phase1.get('reactions', []) == phase2.get('reactions', []), f"Reactions blocks for phase {phase1['name']} do not match." + # the ck2yaml has all elements in Titlecase, while RMG lets some isotopes be CI and OI (not Ci and Oi). + assert sorted(phase1.get('elements', [])) == sorted(e.title() for e in phase2.get('elements', [])), f"Element lists for phase {phase1['name']} do not match." + assert phase1.get('state', {}) == phase2.get('state', {}), f"State definitions for phase {phase1['name']} do not match." + + def testElementsMatch(self): + """Test that the element definitions in both YAML files match.""" + ck2yaml_elements = sorted(self.yaml1['elements'], key=lambda e: e['symbol']) + # Put symbol into Titlecase to match ck2yaml's formatting + rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2['elements']] + rmg_elements = sorted(rmg_elements, key=lambda e: e['symbol']) + # Compare symbols exactly, and atomic weights approximately + assert [e['symbol'] for e in ck2yaml_elements] == [e['symbol'] for e in rmg_elements], \ + "YAML files have different element symbols." + assert [e['atomic-weight'] for e in ck2yaml_elements] == pytest.approx( + [e['atomic-weight'] for e in rmg_elements], abs=1e-3 + ), "YAML files have different element atomic weights." + + def testSpeciesMatch(self): + """Test that species definitions match between the two YAML files.""" + species1 = {s['name']: s for s in self.yaml1['species']} + species2 = {s['name']: s for s in self.yaml2['species']} + assert species1.keys() == species2.keys(), "Species names do not match." + + for name in species1: + s1 = species1[name] + s2 = species2[name] + + # Composition: ck2yaml uses int values, RMG uses float + assert {k: int(v) for k, v in s2['composition'].items()} == s1['composition'], \ + f"Composition mismatch for {name}." + + # Thermo model + assert s1['thermo']['model'] == s2['thermo']['model'], \ + f"Thermo model mismatch for {name}." + + # Temperature ranges and polynomial data + t_ranges1 = s1['thermo'].get('temperature-ranges', []) + t_ranges2 = s2['thermo'].get('temperature-ranges', []) + data1 = s1['thermo'].get('data', []) + data2 = s2['thermo'].get('data', []) + + if len(t_ranges1) == 2 and len(t_ranges2) == 3: + # ck2yaml collapsed to single polynomial; RMG has two identical ones + assert t_ranges1[0] == pytest.approx(t_ranges2[0], rel=1e-4), \ + f"Temperature range lower bound mismatch for {name}." + assert t_ranges1[1] == pytest.approx(t_ranges2[2], rel=1e-4), \ + f"Temperature range upper bound mismatch for {name}." + assert len(data1) == 1 and len(data2) == 2, \ + f"Expected 1 vs 2 polynomials for collapsed species {name}." + assert data1[0] == pytest.approx(data2[0], rel=1e-4), \ + f"Thermo polynomial mismatch for {name} (low range)." + assert data1[0] == pytest.approx(data2[1], rel=1e-4), \ + f"Thermo polynomial mismatch for {name} (high range should match low)." + else: + assert t_ranges1 == pytest.approx(t_ranges2, rel=1e-4), \ + f"Temperature ranges mismatch for {name}." + assert len(data1) == len(data2), \ + f"Number of thermo polynomial ranges differs for {name}." + for i, (poly1, poly2) in enumerate(zip(data1, data2)): + assert poly1 == pytest.approx(poly2, rel=1e-4), \ + f"Thermo polynomial {i} mismatch for {name}." + + # Transport data + assert ('transport' in s1) == ('transport' in s2), f"Transport data presence mismatch for {name}." + if 'transport' in s1 and 'transport' in s2: + t1 = s1['transport'] + t2 = s2['transport'] + assert t1['model'] == t2['model'], f"Transport model mismatch for {name}." + assert t1['geometry'] == t2['geometry'], f"Transport geometry mismatch for {name}." + assert t1.get('well-depth', 0) == pytest.approx( + t2.get('well-depth', 0), rel=1e-3 + ), f"Transport well-depth mismatch for {name}." + assert t1.get('diameter', 0) == pytest.approx( + t2.get('diameter', 0), rel=1e-3 + ), f"Transport diameter mismatch for {name}." + assert t1.get('polarizability', 0) == pytest.approx( + t2.get('polarizability', 0), rel=1e-3 + ), f"Transport polarizability mismatch for {name}." + assert t1.get('dipole', 0) == pytest.approx( + t2.get('dipole', 0), rel=1e-3 + ), f"Transport dipole mismatch for {name}." + assert t1.get('rotational-relaxation', 0) == pytest.approx( + t2.get('rotational-relaxation', 0), rel=1e-3 + ), f"Transport rotational-relaxation mismatch for {name}." + assert t1.get('note', '') == t2.get('note', ''), \ + f"Transport note mismatch for {name}." + + +class TestRecentlyGeneratedCanteraYaml2GasOnly(CanteraYamlFileComparer): + """Tests for comparing recently generated Cantera YAML files from cantera2, gas-only mechanism. + + These are generated on the fly in the mainTest.py functional test and stored in the testing data directory. + """ + test_data_folder = 'test/rmgpy/test_data/yaml_writer_data/' + + @pytest.fixture(autouse=True, scope="class") + def find_recent_files(self, request): + """Find the YAML files generated by mainTest.""" + cantera_dir = os.path.join(self.test_data_folder, 'cantera2') + chemkin_dir = os.path.join(self.test_data_folder, 'ck2yaml') + + if not os.path.exists(cantera_dir) or not os.path.exists(chemkin_dir): + pytest.skip("YAML test data directories not found. Run mainTest first.") + + cantera_file = os.path.join(cantera_dir, 'from_main_test.yaml') + chemkin_file = os.path.join(chemkin_dir, 'from_main_test.yaml') + + if not os.path.exists(cantera_file) or not os.path.exists(chemkin_file): + pytest.skip("from_main_test.yaml files not found. Run mainTest first.") + + request.cls.yaml_path_1 = chemkin_file + request.cls.yaml_path_2 = cantera_file \ No newline at end of file From dc27b97286d55a73bc960ba54d96ae13768e851b Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 13 May 2026 09:12:37 -0400 Subject: [PATCH 10/55] fix tests to match actual verbose-gated transport note and sites>1 behaviour Two tests were written against the original (ungated) transport note behaviour and against sites=1 being emitted for monodentate species: - Rename and invert the transport note tests: note must be absent when verbose=False and present when verbose=True. - Single-site surface species should have no 'sites' key (Cantera defaults to 1); only bidentate+ species emit the field. Co-Authored-By: Claude Sonnet 4.6 --- test/rmgpy/yaml_cantera1Test.py | 9 +++++---- test/rmgpy/yaml_cantera2Test.py | 16 ++++++++-------- 2 files changed, 13 insertions(+), 12 deletions(-) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 0835f3e448..d1dece6c73 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -424,12 +424,13 @@ def test_species_to_dict_gas_no_sites_field(self): d = species_to_dict(self.h2) assert 'sites' not in d - def test_species_to_dict_transport_note_without_verbose(self): - """Transport 'note' is written even when verbose=False.""" + def test_species_to_dict_transport_note_gated_by_verbose(self): + """Transport 'note' is only written when verbose=True.""" self.h2.transport_data.comment = "from GRI-Mech" d = species_to_dict(self.h2, verbose=False) - assert 'note' in d['transport'] - assert d['transport']['note'] == "from GRI-Mech" + assert 'note' not in d.get('transport', {}) + d_verbose = species_to_dict(self.h2, verbose=True) + assert d_verbose['transport']['note'] == "from GRI-Mech" class TestCanteraWriter1: diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index ff7ef2e023..bed7f33f2f 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -619,14 +619,13 @@ def test_generate_cantera_data_surface_phase_state_and_reactions_key(self): assert len(data['surface-reactions']) == 1 def test_species_to_dict_surface_sites_count(self): - """species_to_dict reports correct 'sites' count for surface species.""" - # Single-site species + """species_to_dict reports 'sites' only for multi-site (bidentate+) surface species.""" + # Single-site species: 'sites' key is omitted (Cantera defaults to 1) hx = self._create_surface_species( "H_X", "1 H u0 p0 {2,S}\n2 X u0 p0 {1,S}", index=11 ) d = species_to_dict(hx, [hx]) - assert 'sites' in d - assert d['sites'] == 1 + assert 'sites' not in d # Bidentate glyoxal adsorbed via C and O (2 X atoms) glyoxal_xx = self._create_surface_species( @@ -651,13 +650,14 @@ def test_species_to_dict_gas_no_sites_field(self): d = species_to_dict(h2, [h2]) assert 'sites' not in d - def test_species_to_dict_transport_note_without_verbose(self): - """Transport 'note' is written even when verbose=False.""" + def test_species_to_dict_transport_note_gated_by_verbose(self): + """Transport 'note' is only written when verbose=True.""" sp = self._create_dummy_species("H2", "[H][H]", index=1) sp.transport_data.comment = "from GRI-Mech" d = species_to_dict(sp, [sp], verbose=False) - assert 'note' in d['transport'] - assert d['transport']['note'] == "from GRI-Mech" + assert 'note' not in d['transport'] + d_verbose = species_to_dict(sp, [sp], verbose=True) + assert d_verbose['transport']['note'] == "from GRI-Mech" class CanteraYamlFileComparer: From 59933b99d4c0ff99891c537dbc1eaffcbdcb04a2 Mon Sep 17 00:00:00 2001 From: Danielle Lucey Date: Tue, 12 May 2026 01:02:21 -0400 Subject: [PATCH 11/55] yaml_fix generated recent files for comparison mainTest --- .../cantera1/from_main_test.yaml | 363 +++++++++--------- .../cantera2/from_main_test.yaml | 344 +++++++++-------- .../ck2yaml/from_main_test.yaml | 310 +++++++-------- 3 files changed, 509 insertions(+), 508 deletions(-) diff --git a/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml b/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml index 58ec229ab9..a77715a598 100644 --- a/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml +++ b/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml @@ -1,5 +1,5 @@ -generator: "RMG-Py CanteraWriter1 at /Users/rwest/Code/RMG-Py/rmgpy/yaml_cantera1.py (git commit: 1568184)" -date: Sun, 03 May 2026 22:13:40 +generator: "RMG-Py CanteraWriter1 at /Users/daniellelucey/RMG-Py/rmgpy/yaml_cantera1.py (git commit: 063b6b0)" +date: Mon, 11 May 2026 23:59:04 units: {length: m, time: s, quantity: kmol, activation-energy: J/kmol} @@ -31,12 +31,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 954.5110936886715, 5000.0] + temperature-ranges: [100.0, 954.5165316630638, 5000.0] data: - - [3.780345805837327, -0.0032427616688195738, 5.5238540835961135e-05, -6.385877469439608e-08, - 2.28639998353842e-11, -11620.34135275107, 5.210297172176226] - - [4.589795312018622, 0.014150836627966965, -4.7596579825052244e-06, 8.603029496983977e-10, - -6.217238823881424e-14, -12721.75068161533, -3.6171891868496764] + - [3.7803274333291164, -0.003242536810039668, 5.523771743952032e-05, -6.385765657832756e-08, + 2.286350154835937e-11, -11620.34056878642, 5.2103625138745535] + - [4.589857356655155, 0.01415072957994417, -4.759595608783751e-06, 8.602881051327119e-10, + -6.21711500823632e-14, -12721.776270468992, -3.617537540469888] note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH)' transport: {model: gas, geometry: nonlinear, diameter: 4.3020000000000005, well-depth: 252.30104810022812, rotational-relaxation: 1.5, note: GRI-Mech} @@ -45,12 +45,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 3381.427070109808, 5000.0] + temperature-ranges: [100.0, 3937.4317070531474, 5000.0] data: - - [2.4999999999985287, 9.628563723021598e-15, -1.4423129357510334e-17, 7.111203555044388e-21, - -1.081468248287365e-24, 29230.244128550923, 5.12616427269486] - - [2.499999993394482, 7.0272581087493795e-12, -2.7749960501602356e-15, 4.81886544110849e-19, - -3.1045794407491553e-23, 29230.244133471373, 5.126164313272914] + - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, + 3.793163699805646e-24, 29230.24412855015, 5.126164272659162] + - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, + 1.0844882370603103e-21, 29230.243847087564, 5.126162159943312] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: atom, diameter: 2.7500000000000004, well-depth: 80.00026940977129, note: GRI-Mech} @@ -59,12 +59,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1959.0734570532368, 5000.0] + temperature-ranges: [100.0, 1959.0704060489752, 5000.0] data: - - [3.4353640322436836, 0.000212711088867548, -2.786267109928371e-07, 3.4026847506425956e-10, - -7.76035238245164e-14, -1031.3598354840772, -3.9084169952050014] - - [2.7881746899044373, 0.0005876294327569003, 1.5901580485407815e-07, -5.527498406457646e-11, - 4.343188667565404e-15, -596.1494960879099, 0.11268014479418695] + - [3.4353639487680128, 0.0002127118156028557, -2.7862835897145624e-07, 3.402697677898988e-10, + -7.760384389606823e-14, -1031.3598307378923, -3.9084166738022317] + - [2.788183431931728, 0.0005876180754751174, 1.5902112168376917e-07, -5.527605114100645e-11, + 4.343266442811977e-15, -596.1546540947348, 0.11262832427188434] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, diameter: 2.9200000000000004, well-depth: 38.00012796964137, polarizability: 0.7900000000000005, rotational-relaxation: 280.0, note: GRI-Mech} @@ -73,12 +73,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 3381.427070109808, 5000.0] + temperature-ranges: [100.0, 3937.4317070531474, 5000.0] data: - - [2.4999999999985287, 9.628563723021598e-15, -1.4423129357510334e-17, 7.111203555044388e-21, - -1.081468248287365e-24, 25474.21776872916, -0.4449728963280224] - - [2.499999993394482, 7.0272581087493795e-12, -2.7749960501602356e-15, 4.81886544110849e-19, - -3.1045794407491553e-23, 25474.217773649605, -0.444972855749969] + - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, + 3.793163699805646e-24, 25474.217768728387, -0.4449728963637201] + - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, + 1.0844882370603103e-21, 25474.2174872658, -0.4449750090795722] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: atom, diameter: 2.0500000000000003, well-depth: 145.00018762466215, note: GRI-Mech} @@ -87,12 +87,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1145.7520269685585, 5000.0] + temperature-ranges: [100.0, 1145.7521011170168, 5000.0] data: - - [3.514568030889614, 2.927749474273922e-05, -5.321637895868379e-07, 1.0194907787997865e-09, - -3.859453686345065e-13, 3414.2541976175758, 2.104348876239043] - - [3.0719398919454433, 0.0006040155603844118, -1.3978216817494781e-08, -2.1344627096837766e-11, - 2.480657980220244e-15, 3579.386728674486, 4.577999618270958] + - [3.514568038834053, 2.9277405618225407e-05, -5.32163500292442e-07, 1.0194904372190674e-09, + -3.859452377917145e-13, 3414.25419726746, 2.104348847447872] + - [3.071939833652634, 0.0006040156545295, -1.3978269107817313e-08, -2.1344615084426844e-11, + 2.4806570047627186e-15, 3579.3867548969656, 4.577999949781534] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, diameter: 2.7500000000000004, well-depth: 80.00026940977129, note: GRI-Mech} @@ -101,12 +101,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 932.147807123929, 5000.0] + temperature-ranges: [100.0, 932.1587116923824, 5000.0] data: - - [4.04594657447324, -0.0017346688146588037, 1.0376730032838863e-05, -1.022036035881876e-08, - 3.3491349668804084e-12, -986.754316874425, 4.6358069149070324] - - [3.2102333691731144, 0.0036794289568842686, -1.2770210213031316e-06, 2.180465263628796e-10, - -1.463389951108199e-14, -910.3663758168628, 8.182947949802738] + - [4.045943172132462, -0.001734626698454687, 1.0376573386756708e-05, -1.0220143747577855e-08, + 3.3490365122259157e-12, -986.754171996653, 4.635818986467584] + - [3.210243785202328, 0.0036794108355443496, -1.2770104000866958e-06, 2.1804398774112111e-10, + -1.4633687091481033e-14, -910.3706242716864, 8.182889562642405] note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH) + radical(HOOJ)' transport: {model: gas, geometry: nonlinear, diameter: 3.4580000000000015, well-depth: 107.40032560095216, rotational-relaxation: 1.0, note: GRI-Mech} @@ -115,12 +115,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1074.5487910223908, 5000.0] + temperature-ranges: [100.0, 1074.5559874666221, 5000.0] data: - - [3.5373230506433604, -0.001215723673673554, 5.316226913876108e-06, -4.894494564171178e-09, - 1.4584747893316288e-12, -1038.5885150253216, 4.683679586164618] - - [3.1538173541160557, 0.0016780494172578125, -7.69977463345062e-07, 1.5127621307497415e-10, - -1.0878302972154481e-14, -1040.815775508589, 6.1675778705421145] + - [3.5373217113695397, -0.0012157081866178787, 5.3161744753665525e-06, -4.894429543084893e-09, + 1.4584485293487145e-12, -1038.5884568564704, 4.6836844075736] + - [3.1538247849326697, 0.001678037130877558, -7.699705205295331e-07, 1.5127459750571054e-10, + -1.0878170489110307e-14, -1040.8190172537113, 6.167535803814269] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, diameter: 3.4580000000000015, well-depth: 107.40032560095216, polarizability: 1.6000000000000008, rotational-relaxation: 3.8, note: GRI-Mech} @@ -129,12 +129,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 908.8636980899306, 5000.0] + temperature-ranges: [100.0, 908.8554823511466, 5000.0] data: - - [3.731366284109007, 0.003350606013094521, 9.350720493428984e-06, -1.521051004866441e-08, - 6.416107043520503e-12, -17721.171163869974, 5.459079107803863] - - [5.415764982526016, 0.002610120173918772, -4.3991489926460024e-07, 4.911425476518949e-11, - -3.352347640995115e-15, -18302.943400742348, -4.022358081202631] + - [3.73137614050705, 0.003350482514942175, 9.351187533876275e-06, -1.5211168513411492e-08, + 6.416412701320585e-12, -17721.171582843155, 5.459044225733844] + - [5.415737793495593, 0.0026101678952029977, -4.399430439107962e-07, 4.912101201717723e-11, + -3.3529149506348695e-15, -18302.932441143923, -4.022205933495868] note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH)' transport: {model: gas, geometry: nonlinear, diameter: 3.4580000000000015, well-depth: 107.40032560095216, rotational-relaxation: 3.8, note: GRI-Mech} @@ -143,12 +143,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 926.4996998286691, 5000.0] + temperature-ranges: [100.0, 926.5000868614704, 5000.0] data: - - [4.114883798366483, -0.00036105622302789266, -6.34738424724746e-06, 1.0588830857995857e-08, - -4.570592635290404e-12, 75083.85536332303, 1.6126948258692664] - - [2.3397315833288777, 0.0017585822652602947, -8.029170644997589e-07, 1.4045749082137327e-10, - -8.474970838349845e-15, 75650.75149764838, 11.32545135377962] + - [4.114884169085687, -0.0003610608257374108, -6.347367058134333e-06, 1.0588806976351849e-08, + -4.570581724984619e-12, 75083.85534754528, 1.612693511378359] + - [2.3397304757095996, 0.0017585841964054565, -8.029181981027698e-07, 1.4045776206801416e-10, + -8.474993553681503e-15, 75650.7519481187, 11.325457559946967] note: 'Thermo library: primaryThermoLibrary + radical(Cs_P)' transport: {model: gas, geometry: linear, diameter: 2.7500000000000004, well-depth: 80.00026940977129, note: GRI-Mech} @@ -157,12 +157,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1571.6325038092866, 5000.0] + temperature-ranges: [100.0, 1571.635577343377, 5000.0] data: - - [3.568380183872591, -0.0008521275749708765, 2.4891831341165422e-06, -1.5633152724367305e-09, - 3.135967411946522e-13, -14284.254949016655, 3.579121029658425] - - [2.913058334465055, 0.0016465903493515035, -6.886211322091902e-07, 1.2103870467221813e-10, - -7.840283442517857e-15, -14180.880154113569, 6.710506180052189] + - [3.5683800484025916, -0.0008521262670226395, 2.4891796966658126e-06, -1.5633120860143723e-09, + 3.135957994412226e-13, -14284.2549422392, 3.579121538053434] + - [2.9130626306424436, 0.0016465842199386833, -6.886180363700936e-07, 1.2103804382683996e-10, + -7.840232784477964e-15, -14180.882416118407, 6.710481156838912] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, diameter: 3.6500000000000004, well-depth: 98.10027624123336, polarizability: 1.9500000000000008, rotational-relaxation: 1.8, note: GRI-Mech} @@ -171,12 +171,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1104.6163817756849, 5000.0] + temperature-ranges: [100.0, 1104.6267239631795, 5000.0] data: - - [4.011923841489133, -0.00015497839451543438, 3.2629774085156933e-06, -2.4042174893371504e-09, - 5.694965417963233e-13, 45867.680221696675, 0.5332006293939462] - - [3.1498337193348007, 0.0029667428526204092, -9.760559992782986e-07, 1.5411531705304938e-10, - -9.503384326736568e-15, 46058.139092219215, 4.7780774856041885] + - [4.0119238173266885, -0.00015497815596776285, 3.262976760818217e-06, -2.4042168549424923e-09, + 5.694963373961063e-13, 45867.680222863884, 0.5332007195283763] + - [3.149833606344721, 0.0029667430594348385, -9.760561249263692e-07, 1.5411534787212476e-10, + -9.503386955575038e-15, 46058.13913461232, 4.778078110804035] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, diameter: 3.8, well-depth: 144.00072548202698, note: GRI-Mech} @@ -185,12 +185,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1565.714132371199, 5000.0] + temperature-ranges: [100.0, 1565.7120792018852, 5000.0] data: - - [4.35602339043274, -0.0034709024404038355, 1.2566500153664981e-05, -9.99496787565554e-09, - 2.278910275533282e-12, 3995.7703823171323, 2.7511152173315896] - - [4.618552189478943, 0.005044727567949883, -4.392490375225836e-06, 9.733000206186813e-10, - -7.074497320360272e-14, 2787.5657280626556, -2.2289265396150277] + - [4.356024400619503, -0.003470912211025233, 1.2566525897003503e-05, -9.994991807684093e-09, + 2.278917370374692e-12, 3995.7703318779218, 2.751111427914028] + - [4.618520755148811, 0.005044772485178862, -4.392513089795063e-06, 9.733048740473051e-10, + -7.074534554082162e-14, 2787.582246997859, -2.2287435033652683] note: 'Thermo group additivity estimation: group(Cds-OdHH) + radical(HCdsJO)' transport: {model: gas, geometry: nonlinear, diameter: 3.590000000000001, well-depth: 498.001556803607, note: GRI-Mech} @@ -199,12 +199,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1442.3511750737548, 5000.0] + temperature-ranges: [100.0, 1442.3580101782086, 5000.0] data: - - [4.102644262821686, -0.0014406893453596408, 5.450704522808327e-06, -3.580035535341835e-09, - 7.561975727674366e-13, 50400.578468202875, -0.411767744752251] - - [2.626461951839261, 0.003947647061872542, -1.499250600733676e-06, 2.545411695073568e-10, - -1.6295740679010454e-14, 50691.75925170181, 6.783860566624157] + - [4.102643682622427, -0.0014406835121726618, 5.450688287473449e-06, -3.5800194681993524e-09, + 7.561924806653407e-13, 50400.57849602855, -0.4117655884033766] + - [2.6264740273422635, 0.003947629223585963, -1.4992413415313327e-06, 2.545391499915196e-10, + -1.629558318782858e-14, 50691.75316398369, 6.783790698934837] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, diameter: 3.8, well-depth: 144.00072548202698, note: GRI-Mech} @@ -213,12 +213,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1337.620819587787, 5000.0] + temperature-ranges: [100.0, 1337.627303178629, 5000.0] data: - - [3.915468545997816, 0.0018415334744105523, 3.487446141728892e-06, -3.3275059960317733e-09, - 8.499669695415019e-13, 16285.63932910768, 0.3517380395131654] - - [3.5414438177641827, 0.0047678891393774115, -1.8214953036507109e-06, 3.2887903936663636e-10, - -2.2254753367320316e-14, 16223.964546647976, 1.6604283078795798] + - [3.915467627996589, 0.001841543038966437, 3.4874181471700314e-06, -3.327476648677652e-09, + 8.499570768410386e-13, 16285.639371722482, 0.3517414228537716] + - [3.5414572225301972, 0.004767868738173273, -1.8214844677356902e-06, 3.2887663334895645e-10, + -2.2254563074621602e-14, 16223.958038756007, 1.660351193289797] note: 'Thermo library: primaryThermoLibrary + radical(CH3)' transport: {model: gas, geometry: nonlinear, diameter: 3.8, well-depth: 144.00072548202698, note: GRI-Mech} @@ -227,12 +227,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1402.2812011786486, 5000.0] + temperature-ranges: [100.0, 1402.2848955097152, 5000.0] data: - - [4.322896688132622, -0.00506327946440804, 2.151558020865406e-05, -1.7652165578523147e-08, - 4.318158267459416e-12, -14278.956505443542, 2.3924226447408348] - - [3.179936326492375, 0.00955601269235614, -6.273028454801088e-06, 1.3355481910102911e-09, - -9.684126206021399e-14, -15075.21914563935, 4.31085170341811] + - [4.322893745207224, -0.005063249479937248, 2.1515495168109833e-05, -1.76520795881397e-08, + 4.3181303801961645e-12, -14278.956366088585, 2.3924335479025562] + - [3.1799898971516543, 0.00955593266295388, -6.272986551368634e-06, 1.3355389892308e-09, + -9.68405406001952e-14, -15075.245773494298, 4.310542416920189] note: 'Thermo group additivity estimation: group(Cds-OdHH)' transport: {model: gas, geometry: nonlinear, diameter: 3.590000000000001, well-depth: 498.001556803607, rotational-relaxation: 2.0, note: GRI-Mech} @@ -241,12 +241,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1084.123827322365, 5000.0] + temperature-ranges: [100.0, 1084.1178897101286, 5000.0] data: - - [4.205413249592893, -0.005355550700516357, 2.5112249357340948e-05, -2.137618922935306e-08, - 5.97520127499108e-12, -10161.943218560951, -0.9212721095036059] - - [0.9082771923874331, 0.011454066909071433, -4.571727616998398e-06, 8.29189195152023e-10, - -5.6631286728402924e-14, -9719.979461834091, 13.993029451960226] + - [4.205416684633066, -0.005355590254627177, 2.511238250111796e-05, -2.137635320163276e-08, + 5.9752670131915595e-12, -10161.943368029231, -0.9212844871470729] + - [0.9082573996547298, 0.011454099528933412, -4.571746006222714e-06, 8.291934667300837e-10, + -5.66316365457203e-14, -9719.970790335326, 13.993141571614126] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, diameter: 3.746000000000001, well-depth: 141.400440100105, polarizability: 2.600000000000002, rotational-relaxation: 13.0, note: GRI-Mech} @@ -255,12 +255,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 988.8860879833867, 5000.0] + temperature-ranges: [100.0, 988.874846895476, 5000.0] data: - - [3.2786139579157667, 0.0027414907869317043, 7.160850310649065e-06, -1.080287685514878e-08, - 4.14288279908879e-12, -48470.31456638012, 5.979355663789081] - - [4.546085505272925, 0.0029191505308481846, -1.1548474402701926e-06, 2.276560890459939e-10, - -1.7091195474740168e-14, -48980.355193356234, -1.432689313852118] + - [3.278622967759262, 0.002741382373989827, 7.161238132337091e-06, -1.0803389384388666e-08, + 4.1431045806313505e-12, -48470.314952383545, 5.979323504737395] + - [4.546050274062975, 0.002919210558291122, -1.1548821046550818e-06, 2.276642852647346e-10, + -1.7091875765043676e-14, -48980.34041889094, -1.4324910236617816] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + missing(O2d-Cdd) + group(Cdd-OdOd)' transport: {model: gas, geometry: linear, diameter: 3.763, well-depth: 244.00106224424113, @@ -270,12 +270,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 895.0128423768832, 5000.0] + temperature-ranges: [100.0, 895.0163946403012, 5000.0] data: - - [3.711747875498063, 0.0019310495477475086, 2.1234224669361647e-05, -3.031581261488382e-08, - 1.2487821239782904e-11, -4007.4595420199803, 7.291993676284961] - - [6.0562988011935595, 0.0030217384679415552, 1.720948400698776e-08, -6.962736851576313e-11, - 5.182164230170264e-15, -4890.505525515445, -6.3476542841121555] + - [3.711740249971209, 0.0019311457977334778, 2.123385699735588e-05, -3.031528812969471e-08, + 1.2487574647076677e-11, -4007.4592181376324, 7.292020622080347] + - [6.056318547324978, 0.0030217036257262145, 1.723010962975875e-08, -6.963233382451129e-11, + 5.182581927964743e-15, -4890.513428418116, -6.34776466810346] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + radical(CsJOH)' transport: {model: gas, geometry: nonlinear, diameter: 3.6900000000000013, well-depth: 417.00182525120056, @@ -285,12 +285,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 916.8834490980655, 5000.0] + temperature-ranges: [100.0, 916.8968434206298, 5000.0] data: - - [4.0013575561328585, -0.004156835987149363, 3.263543261448762e-05, -3.71118105654598e-08, - 1.3570917933379284e-11, -6.152570493302685, 6.813714035946757] - - [4.016223845036489, 0.006268132072155586, -1.5806804808679084e-06, 2.44606571076615e-10, - -1.7033720648694282e-14, -449.8054684774207, 4.338796349824254] + - [4.0013327502495155, -0.004156526476422401, 3.263426883212575e-05, -3.7110180766619686e-08, + 1.3570166892492088e-11, -6.151515491093088, 6.8138019013791435] + - [4.016294811471149, 0.006268007893365234, -1.5806074006739916e-06, 2.445890523709642e-10, + -1.70322515470223e-14, -449.83419135504226, 4.338398992219582] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + radical(H3COJ)' transport: {model: gas, geometry: nonlinear, diameter: 3.6900000000000013, well-depth: 417.00182525120056, @@ -300,12 +300,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 952.1389908637451, 5000.0] + temperature-ranges: [100.0, 952.1389545704913, 5000.0] data: - - [3.8949618831293553, -0.0007713534032064971, 2.6475516242260254e-05, -2.9179363149306652e-08, - 1.0083470134889905e-11, -26335.85476940014, 6.364759206338717] - - [3.138078300120791, 0.010354206425018032, -3.569573213259954e-06, 6.2228670380635e-10, - -4.2780556797788775e-14, -26551.895613135097, 8.087777938366735] + - [3.8949619311009682, -0.0007713539892289695, 2.6475518384892784e-05, -2.917936605714971e-08, + 1.0083471431111355e-11, -26335.854771452, 6.364759035632583] + - [3.138078144441756, 0.010354206693580961, -3.5695733697248403e-06, 6.222867410402885e-10, + -4.278055990314069e-14, -26551.895548904657, 8.087778812494083] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH)' transport: {model: gas, geometry: nonlinear, diameter: 3.626000000000001, well-depth: 481.802091582003, rotational-relaxation: 1.0, note: GRI-Mech} @@ -314,12 +314,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1076.5739030931832, 5000.0] + temperature-ranges: [100.0, 1076.5707431623787, 5000.0] data: - - [3.038528423280286, 0.011544944603038693, -2.1326485954432746e-05, 1.819338534674556e-08, - -5.41594365314797e-12, 66398.01413786084, 5.966763865161724] - - [4.008476679662765, 0.002068132533447794, 6.051403922076703e-08, -1.1771143178546624e-10, - 1.292843103778667e-14, 66529.51239223393, 2.796431735903967] + - [3.038526076764681, 0.011544971712654409, -2.1326577630156857e-05, 1.8193498854298534e-08, + -5.415989423373292e-12, 66398.01423981925, 5.966772314365718] + - [4.0084898009954175, 0.0020681108532139827, 6.052628413041129e-08, -1.1771428006220733e-10, + 1.2928664540905204e-14, 66529.5066627588, 2.796357444487442] note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH) + radical(Acetyl)' transport: {model: gas, geometry: linear, diameter: 4.1000000000000005, well-depth: 209.00064369691785, rotational-relaxation: 2.5, note: GRI-Mech} @@ -328,12 +328,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 888.6182543600265, 5000.0] + temperature-ranges: [100.0, 888.6312703495089, 5000.0] data: - - [3.0357585217151586, 0.007712248787838784, 2.535472846104679e-06, -1.0814091419221027e-08, - 5.50793884017531e-12, 25852.6438513772, 4.544573545031331] - - [5.7620170200918155, 0.002371637509595834, -1.4961216335698123e-07, -2.1908364280616377e-11, - 2.21719408295192e-15, 25094.4612801627, -9.825927939150352] + - [3.035741541159452, 0.007712463869898586, 2.5346473132966697e-06, -1.0812907257939146e-08, + 5.507378740942841e-12, 25852.644572333335, 4.544633504234925] + - [5.762059744831072, 0.002371561933486471, -1.495673463818596e-07, -2.1919166811126934e-11, + 2.218103671549502e-15, 25094.44423800569, -9.826166661316744] note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH)' transport: {model: gas, geometry: linear, diameter: 4.1000000000000005, well-depth: 209.00064369691785, rotational-relaxation: 2.5, note: GRI-Mech} @@ -342,12 +342,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 936.0672810203184, 5000.0] + temperature-ranges: [100.0, 936.0638710543434, 5000.0] data: - - [3.4564721955019664, 0.01057287065008409, -7.35997930717575e-06, 7.974865857027052e-10, - 8.644788930195111e-13, 22595.688064401904, 7.094966296818602] - - [5.9981069864241885, 0.003144794134936119, -9.578007435439627e-07, 1.5562106735769888e-10, - -1.0430827416714007e-14, 21969.463783317686, -5.802371777239033] + - [3.4564741766825713, 0.010572846175575629, -7.359888529672018e-06, 7.973614621605504e-10, + 8.64535565921129e-13, 22595.687980009596, 7.094959264554976] + - [5.998100816612723, 0.0031448048531052264, -9.578070191018402e-07, 1.5562256617433557e-10, + -1.0430952759847218e-14, 21969.466304795515, -5.802337182407708] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) + missing(Cdd-CdO2d) + radical(Cds_P)' transport: {model: gas, geometry: nonlinear, diameter: 2.5000000000000013, well-depth: 150.00110650441783, @@ -357,12 +357,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 931.9858880076591, 5000.0] + temperature-ranges: [100.0, 931.9620386849122, 5000.0] data: - - [3.9066414443391624, -0.00406161805089794, 3.867505561886614e-05, -4.629356294110721e-08, - 1.7288184850765833e-11, 34797.18098324665, 6.098116827390869] - - [5.448161345038558, 0.004983220634586766, -1.088008027091821e-06, 1.7978956968030537e-10, - -1.4505633804539655e-14, 33829.69476393835, -4.879180043982607] + - [3.9067052224888306, -0.004062407608381454, 3.867799265691756e-05, -4.629762490027485e-08, + 1.729003139946922e-11, 34797.178267497635, 6.097890545879522] + - [5.447966243943666, 0.004983560085949153, -1.0882069947704135e-06, 1.798371274522559e-10, + -1.4509613313229812e-14, 33829.77433382413, -4.878086417352228] note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH) + radical(Cds_P)' transport: {model: gas, geometry: nonlinear, diameter: 4.1000000000000005, well-depth: 209.00064369691785, @@ -372,12 +372,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 956.6589663809253, 5000.0] + temperature-ranges: [100.0, 956.6689491705725, 5000.0] data: - - [3.5274937117983933, 0.007083323568383587, 9.178495162982448e-06, -1.6427295974845557e-08, - 6.7119937845095964e-12, -7123.942950136391, 5.743686833486504] - - [5.764843860393455, 0.005965775843435247, -1.984972026524795e-06, 3.527701091332367e-10, - -2.5164077388183256e-14, -7928.956600867915, -6.9211732597275475] + - [3.5274804055011524, 0.007083486242205215, 9.177900378006544e-06, -1.6426489708137257e-08, + 6.711635150789706e-12, -7123.942382209249, 5.743734168371629] + - [5.764889204717002, 0.005965697671832553, -1.9849265041966017e-06, 3.5275927958549083e-10, + -2.5163174396771523e-14, -7928.975322079587, -6.92142788806353] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) + missing(Cdd-CdO2d)' transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, @@ -387,12 +387,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 940.4415341496032, 5000.0] + temperature-ranges: [100.0, 940.418247087086, 5000.0] data: - - [3.979761078299263, -0.007575804379415596, 5.5298083380567165e-05, -6.362321213029474e-08, - 2.3177190400951143e-11, 5077.460147499724, 4.0461684201547214] - - [5.202940933280232, 0.007824516477330179, -2.1268877513906106e-06, 3.7970335544514704e-10, - -2.946814128701208e-14, 3936.3029880366635, -6.623812180250903] + - [3.9798415026745158, -0.007576795695064226, 5.5301749021260425e-05, -6.36282467356439e-08, + 2.3179461952714415e-11, 5077.456720344708, 4.0458828180531095] + - [5.202685599067635, 0.00782495932129625, -2.127146740857326e-06, 3.797651593095124e-10, + -2.9473306602423246e-14, 3936.4075648915114, -6.622380040353341] note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH)' transport: {model: gas, geometry: nonlinear, diameter: 3.9710000000000005, well-depth: 280.80075319274636, rotational-relaxation: 1.5, note: GRI-Mech} @@ -401,12 +401,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 900.3133686413051, 5000.0] + temperature-ranges: [100.0, 900.3134894489242, 5000.0] data: - - [3.8218366887126693, -0.0034336137652750723, 5.092576559329648e-05, -6.202121616415652e-08, - 2.3707360339402987e-11, 13066.01287427912, 7.616431110400184] - - [5.156207199872521, 0.009431228225167086, -1.8194614628685796e-06, 2.2119612633683184e-10, - -1.4348159485107404e-14, 12064.083237107747, -2.9109776507588903] + - [3.821836273781996, -0.0034336085398177577, 5.0925745698192944e-05, -6.202118789954702e-08, + 2.3707347111588728e-11, 13066.012891898954, 7.61643257724655] + - [5.156208306185573, 0.009431226276708927, -1.8194603109290526e-06, 2.2119584928108884e-10, + -1.434813619419196e-14, 12064.082793230154, -2.910983837429268] note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH) + radical(CCJ)' transport: {model: gas, geometry: nonlinear, diameter: 4.3020000000000005, well-depth: 252.30104810022812, @@ -416,12 +416,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1130.2428926130467, 5000.0] + temperature-ranges: [100.0, 1130.229527376887, 5000.0] data: - - [4.057636187975462, -0.0007879398698184641, 2.908788069492715e-06, -1.475204287660629e-09, - 2.128490170160392e-13, -30281.5866521907, -0.31136534685788253] - - [2.8432480470655004, 0.002751089366900853, -7.8103367121036e-07, 1.0724414332729549e-10, - -5.793963421285384e-15, -29958.611693452458, 5.910433578723651] + - [4.0576350324382435, -0.0007879268259766038, 2.908745359555667e-06, -1.4751533432712154e-09, + 2.128292857644156e-13, -30281.58660142529, -0.31136116480217385] + - [2.8432560092133228, 0.0027510764450291783, -7.81026468417208e-07, 1.072424842465603e-10, + -5.79382842272479e-15, -29958.615252484073, 5.910388340788128] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, diameter: 2.6050000000000004, well-depth: 572.4019516813576, dipole: 1.8439999999999999, rotational-relaxation: 4.0, note: GRI-Mech} @@ -430,12 +430,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 3381.427070109808, 5000.0] + temperature-ranges: [100.0, 3937.4317070531474, 5000.0] data: - - [2.4999999999985287, 9.628563723021598e-15, -1.4423129357510334e-17, 7.111203555044388e-21, - -1.081468248287365e-24, 85474.52470343288, 3.659784206708707] - - [2.499999993394482, 7.0272581087493795e-12, -2.7749960501602356e-15, 4.81886544110849e-19, - -3.1045794407491553e-23, 85474.52470835333, 3.6597842472867588] + - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, + 3.793163699805646e-24, 85474.52470343211, 3.6597842066730095] + - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, + 1.0844882370603103e-21, 85474.52442196952, 3.659782093957159] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: atom, diameter: 3.2980000000000005, well-depth: 71.40020436655509, note: GRI-Mech} @@ -444,12 +444,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 1009.8671367328868, 5000.0] + temperature-ranges: [100.0, 1009.8708057502912, 5000.0] data: - - [3.3040912347897615, 0.012502446003621081, -3.795055354192445e-06, -4.4633009808641336e-09, - 2.663225471130415e-12, 8782.035416515859, 7.197168970728035] - - [6.7124551454507815, 0.005148330500649028, -2.0007834627740915e-06, 3.788190799793496e-10, - -2.7409124748516927e-14, 7780.23551660169, -10.831376654084673] + - [3.304087973229727, 0.01250248485622879, -3.7951924250664015e-06, -4.463122728730499e-09, + 2.6631496728579284e-12, 8782.035556651996, 7.197180637326219] + - [6.712469069000979, 0.005148306955083985, -2.0007699389212864e-06, 3.78815894942322e-10, + -2.740886117401159e-14, 7780.2296193740285, -10.831455133638801] note: 'Thermo group additivity estimation: group(O2s-CtH) + group(Ct-CtOs) + group(Ct-CtH)' transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, rotational-relaxation: 2.0, note: GRI-Mech} @@ -458,12 +458,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 914.2195653125194, 5000.0] + temperature-ranges: [100.0, 914.2116020861831, 5000.0] data: - - [3.347148890024995, 0.0012878732026556307, 5.399642419215212e-05, -7.841121904676618e-08, - 3.240708687065647e-11, -2992.8440212693995, 8.9731019330448] - - [11.726154554803275, -0.001473691800042265, 2.907484426602473e-06, -5.970162857550277e-10, - 3.7029752558219025e-14, -5941.538943574109, -38.44712632255116] + - [3.347196840427565, 0.0012872740814258146, 5.399868121989472e-05, -7.841438689681067e-08, + 3.240855021277469e-11, -2992.8460602521013, 8.972932135895645] + - [11.726019036050477, -0.0014734544263003628, 2.9073446308875385e-06, -5.969827568656105e-10, + 3.702693978288885e-14, -5941.484167993394, -38.44636767007471] note: 'Thermo group additivity estimation: group(O2s-(Cds-Cd)H) + group(Cds-CdsOsH) + group(Cds-CdsHH) + radical(C=COJ)' transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, @@ -473,12 +473,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 984.2016120728738, 5000.0] + temperature-ranges: [100.0, 984.197680603768, 5000.0] data: - - [3.7007802531138334, 0.0003879420044348043, 3.8692486968828104e-05, -4.5244175226526585e-08, - 1.588568911984255e-11, -21380.907966251474, 9.13565622207468] - - [4.588928731919886, 0.01288931344454544, -4.914985254816196e-06, 9.265000639719394e-10, - -6.710044287886815e-14, -22336.02926281222, 0.9008805816430335] + - [3.7007899203288224, 0.00038782542085882675, 3.8692905312513264e-05, -4.524473009262779e-08, + 1.5885930165726808e-11, -21380.908380185487, 9.13562173300882] + - [4.588891681956185, 0.012889376676989747, -4.915021813955812e-06, 9.26508715798075e-10, + -6.710116145936973e-14, -22336.013760155674, 0.9010890403489865] note: 'Thermo group additivity estimation: group(Cs-(Cds-O2d)HHH) + group(Cds-OdCsH)' transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, rotational-relaxation: 2.0, note: GRI-Mech} @@ -487,12 +487,12 @@ species: thermo: model: NASA7 reference-pressure: 10000.0 - temperature-ranges: [100.0, 986.5741824852131, 5000.0] + temperature-ranges: [100.0, 986.5783141978117, 5000.0] data: - - [3.052565931612535, 0.01250994052655728, 3.793862567309607e-05, -5.120220837447088e-08, - 1.8706492840834734e-11, -14454.176775999556, 10.067246001067637] - - [5.91316392026703, 0.021876253744009963, -8.176607701325125e-06, 1.4985452522965277e-09, - -1.0599135379428694e-13, -16038.878659602295, -8.865558390351929] + - [3.052552781024803, 0.0125100989428809, 3.7938058095217115e-05, -5.120145693587291e-08, + 1.8706167044773312e-11, -14454.176212770122, 10.067292928454926] + - [5.9132148512337706, 0.021876166894657482, -8.176557517977191e-06, 1.4985333815155727e-09, + -1.0599036819008721e-13, -16038.899994267074, -8.865844996334646] note: 'Thermo group additivity estimation: group(Cs-CsCsHH) + group(Cs-CsHHH) + group(Cs-CsHHH)' transport: {model: gas, geometry: nonlinear, diameter: 4.982000000000001, well-depth: 266.8010668626943, @@ -634,26 +634,26 @@ reactions: - equation: CH2O(15) + O2(7) <=> HCO(12) + HO2(6) rate-constant: {A: 100000000000.00002, b: 0.0, Ea: 167360000.00000003} note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + 2 O2(7) + O2(7) <=> HO2(6) + O2(7) + O2(7) +- equation: H(4) + O2(7) + O2(7) <=> HO2(6) + O2(7) rate-constant: {A: 20800000000000.004, b: -1.24, Ea: 0.0} efficiencies: {O2(7): 1.0} note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + H2O(28) + O2(7) + H2O(28) <=> H2O(28) + HO2(6) + H2O(28) +- equation: H(4) + O2(7) + H2O(28) <=> HO2(6) + H2O(28) rate-constant: {A: 11260000000000.002, b: -0.76, Ea: 0.0} efficiencies: {H2O(28): 1.0} note: 'Library reaction: GRI-Mech3.0' - equation: H(4) + O2(7) <=> O(2) + OH(5) rate-constant: {A: 26500000000000.004, b: -0.6707, Ea: 71299544.00000001} note: 'Library reaction: GRI-Mech3.0' -- equation: 2 H(4) + H2(3) + H2(3) <=> 2 H2(3) + H2(3) +- equation: 2 H(4) + H2(3) <=> H2(3) + H2(3) rate-constant: {A: 90000000000.00002, b: -0.6, Ea: 0.0} efficiencies: {H2(3): 1.0} note: 'Library reaction: GRI-Mech3.0' -- equation: 2 H(4) + H2O(28) + H2O(28) <=> H2(3) + H2O(28) + H2O(28) +- equation: 2 H(4) + H2O(28) <=> H2(3) + H2O(28) rate-constant: {A: 60000000000000.01, b: -1.25, Ea: 0.0} efficiencies: {H2O(28): 1.0} note: 'Library reaction: GRI-Mech3.0' -- equation: CO2(17) + 2 H(4) + CO2(17) <=> CO2(17) + H2(3) + CO2(17) +- equation: 2 H(4) + CO2(17) <=> H2(3) + CO2(17) rate-constant: {A: 550000000000000.1, b: -2.0, Ea: 0.0} efficiencies: {CO2(17): 1.0} note: 'Library reaction: GRI-Mech3.0' @@ -696,9 +696,8 @@ reactions: - equation: CH2OH(18) + H(4) <=> CH2(S)(13) + H2O(28) rate-constant: {A: 32800000000.000004, b: -0.09, Ea: 2552240.0000000005} note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + H(4) + H(4) <=> CH2OH(18) + H(4) + H(4) +- equation: CH3O(19) + H(4) <=> CH2OH(18) + H(4) rate-constant: {A: 41500.00000000001, b: 1.63, Ea: 8050016.000000002} - efficiencies: {H(4): 1.0} note: 'Library reaction: GRI-Mech3.0' - equation: CH3O(19) + H(4) <=> CH2O(15) + H2(3) rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} @@ -736,9 +735,8 @@ reactions: - equation: CH2CO(25) + H(4) <=> CH3(14) + CO(10) rate-constant: {A: 11300000000.000002, b: 0.0, Ea: 14342752.000000002} note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HCCOH(30) + H(4) <=> CH2CO(25) + H(4) + H(4) +- equation: H(4) + HCCOH(30) <=> CH2CO(25) + H(4) rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 0.0} - efficiencies: {H(4): 1.0} note: 'Library reaction: GRI-Mech3.0' - equation: H2(3) + OH(5) <=> H(4) + H2O(28) rate-constant: {A: 216000.00000000003, b: 1.51, Ea: 14351120.000000002} @@ -920,9 +918,8 @@ reactions: - equation: CH2(S)(13) + H2(3) <=> CH3(14) + H(4) rate-constant: {A: 70000000000.00002, b: 0.0, Ea: 0.0} note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + H2O(28) + H2O(28) <=> CH2(11) + H2O(28) + H2O(28) +- equation: CH2(S)(13) + H2O(28) <=> CH2(11) + H2O(28) rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - efficiencies: {H2O(28): 1.0} note: 'Library reaction: GRI-Mech3.0' - equation: CH2(S)(13) + CH3(14) <=> C2H4(26) + H(4) rate-constant: {A: 12000000000.000002, b: 0.0, Ea: -2384880.0} @@ -930,13 +927,11 @@ reactions: - equation: CH2(S)(13) + CH4(16) <=> 2 CH3(14) rate-constant: {A: 16000000000.000002, b: 0.0, Ea: -2384880.0} note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CO(10) + CO(10) <=> CH2(11) + CO(10) + CO(10) +- equation: CH2(S)(13) + CO(10) <=> CH2(11) + CO(10) rate-constant: {A: 9000000000.000002, b: 0.0, Ea: 0.0} - efficiencies: {CO(10): 1.0} note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CO2(17) + CO2(17) <=> CH2(11) + CO2(17) + CO2(17) +- equation: CH2(S)(13) + CO2(17) <=> CH2(11) + CO2(17) rate-constant: {A: 7000000000.000001, b: 0.0, Ea: 0.0} - efficiencies: {CO2(17): 1.0} note: 'Library reaction: GRI-Mech3.0' - equation: CH2(S)(13) + CO2(17) <=> CH2O(15) + CO(10) rate-constant: {A: 14000000000.000002, b: 0.0, Ea: 0.0} @@ -974,7 +969,7 @@ reactions: - equation: CH3(14) + ethane(1) <=> C2H5(27) + CH4(16) rate-constant: {A: 6140.000000000002, b: 1.74, Ea: 43722800.0} note: 'Library reaction: GRI-Mech3.0' -- equation: H2O(28) + HCO(12) + H2O(28) <=> CO(10) + H(4) + H2O(28) + H2O(28) +- equation: HCO(12) + H2O(28) <=> CO(10) + H(4) + H2O(28) rate-constant: {A: 1500000000000000.2, b: -1.0, Ea: 71128000.0} efficiencies: {H2O(28): 1.0} note: 'Library reaction: GRI-Mech3.0' @@ -1056,7 +1051,7 @@ reactions: - equation: CH3CHO(32) + HO2(6) => CH3(14) + CO(10) + H2O2(8) rate-constant: {A: 3010000000.0000005, b: 0.0, Ea: 49885832.0} note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + CH3CHO(32) + CH3(14) => CH3(14) + CH4(16) + CO(10) + CH3(14) +- equation: CH3CHO(32) + CH3(14) => CH4(16) + CO(10) + CH3(14) rate-constant: {A: 2720.0000000000005, b: 1.77, Ea: 24769280.000000004} efficiencies: {CH3(14): 1.0} note: 'Library reaction: GRI-Mech3.0' diff --git a/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml b/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml index 346df39d34..38930866a9 100644 --- a/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml +++ b/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml @@ -1,30 +1,36 @@ description: RMG-Py Generated Mechanism -generator: 'RMG-Py CanteraWriter2 at /Users/rwest/Code/RMG-Py/rmgpy/yaml_cantera2.py - (git commit: 36d0039)' +generator: 'RMG-Py CanteraWriter2 at /Users/daniellelucey/RMG-Py/rmgpy/yaml_cantera2.py + (git commit: 063b6b0)' cantera-version: '3.1' units: {length: m, time: s, quantity: mol, activation-energy: J/mol} +elements: +- {symbol: D, atomic-weight: 2.014101715758443} +- {symbol: T, atomic-weight: 3.0160490423440933} +- {symbol: CI, atomic-weight: 13.003353960812092} +- {symbol: OI, atomic-weight: 17.999159172177315} +- {symbol: X, atomic-weight: 195.083} phases: - name: gas thermo: ideal-gas - elements: [Ar, Br, C, Cl, E, F, H, He, I, N, Ne, O, S, Si] + elements: [Ar, Br, C, CI, Cl, D, F, H, He, I, N, Ne, O, OI, S, Si, T, X] species: [N2, Ar, He, Ne, ethane(1), O(2), H2(3), H(4), OH(5), HO2(6), O2(7), H2O2(8), CH(9), CO(10), CH2(11), HCO(12), CH2(S)(13), CH3(14), CH2O(15), CH4(16), CO2(17), CH2OH(18), CH3O(19), CH3OH(20), C2H(21), C2H2(22), HCCO(23), C2H3(24), CH2CO(25), C2H4(26), C2H5(27), H2O(28), C(29), HCCOH(30), CH2CHO(31), CH3CHO(32), C3H8(33)] kinetics: gas - reactions: declared-species transport: mixture-averaged + state: {T: 300.0, P: 1 atm} species: - name: ethane(1) composition: {H: 6, C: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 954.5110936886715, 5000.0] + temperature-ranges: [100.0, 954.5165316630638, 5000.0] data: - - [3.780345805837327, -0.0032427616688195738, 5.5238540835961135e-05, -6.385877469439608e-08, - 2.28639998353842e-11, -11620.34135275107, 5.210297172176226] - - [4.589795312018622, 0.014150836627966965, -4.7596579825052244e-06, 8.603029496983977e-10, - -6.217238823881424e-14, -12721.75068161533, -3.6171891868496764] + - [3.7803274333291164, -0.003242536810039668, 5.523771743952032e-05, -6.385765657832756e-08, + 2.286350154835937e-11, -11620.34056878642, 5.2103625138745535] + - [4.589857356655155, 0.01415072957994417, -4.759595608783751e-06, 8.602881051327119e-10, + -6.21711500823632e-14, -12721.776270468992, -3.617537540469888] note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH)' transport: {model: gas, geometry: nonlinear, well-depth: 252.30104810022812, diameter: 4.3020000000000005, rotational-relaxation: 1.5, note: GRI-Mech} @@ -32,12 +38,12 @@ species: composition: {O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 3381.427070109808, 5000.0] + temperature-ranges: [100.0, 3937.4317070531474, 5000.0] data: - - [2.4999999999985287, 9.628563723021598e-15, -1.4423129357510334e-17, 7.111203555044388e-21, - -1.081468248287365e-24, 29230.244128550923, 5.12616427269486] - - [2.499999993394482, 7.0272581087493795e-12, -2.7749960501602356e-15, 4.81886544110849e-19, - -3.1045794407491553e-23, 29230.244133471373, 5.126164313272914] + - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, + 3.793163699805646e-24, 29230.24412855015, 5.126164272659162] + - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, + 1.0844882370603103e-21, 29230.243847087564, 5.126162159943312] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: atom, well-depth: 80.00026940977129, diameter: 2.7500000000000004, note: GRI-Mech} @@ -45,12 +51,12 @@ species: composition: {H: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 1959.0734570532368, 5000.0] + temperature-ranges: [100.0, 1959.0704060489752, 5000.0] data: - - [3.4353640322436836, 0.000212711088867548, -2.786267109928371e-07, 3.4026847506425956e-10, - -7.76035238245164e-14, -1031.3598354840772, -3.9084169952050014] - - [2.7881746899044373, 0.0005876294327569003, 1.5901580485407815e-07, -5.527498406457646e-11, - 4.343188667565404e-15, -596.1494960879099, 0.11268014479418695] + - [3.4353639487680128, 0.0002127118156028557, -2.7862835897145624e-07, 3.402697677898988e-10, + -7.760384389606823e-14, -1031.3598307378923, -3.9084166738022317] + - [2.788183431931728, 0.0005876180754751174, 1.5902112168376917e-07, -5.527605114100645e-11, + 4.343266442811977e-15, -596.1546540947348, 0.11262832427188434] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, well-depth: 38.00012796964137, diameter: 2.92, polarizability: 0.7900000000000004, rotational-relaxation: 280.0, note: GRI-Mech} @@ -58,12 +64,12 @@ species: composition: {H: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 3381.427070109808, 5000.0] + temperature-ranges: [100.0, 3937.4317070531474, 5000.0] data: - - [2.4999999999985287, 9.628563723021598e-15, -1.4423129357510334e-17, 7.111203555044388e-21, - -1.081468248287365e-24, 25474.21776872916, -0.4449728963280224] - - [2.499999993394482, 7.0272581087493795e-12, -2.7749960501602356e-15, 4.81886544110849e-19, - -3.1045794407491553e-23, 25474.217773649605, -0.444972855749969] + - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, + 3.793163699805646e-24, 25474.217768728387, -0.4449728963637201] + - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, + 1.0844882370603103e-21, 25474.2174872658, -0.4449750090795722] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: atom, well-depth: 145.00018762466215, diameter: 2.0500000000000003, note: GRI-Mech} @@ -71,12 +77,12 @@ species: composition: {H: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1145.7520269685585, 5000.0] + temperature-ranges: [100.0, 1145.7521011170168, 5000.0] data: - - [3.514568030889614, 2.927749474273922e-05, -5.321637895868379e-07, 1.0194907787997865e-09, - -3.859453686345065e-13, 3414.2541976175758, 2.104348876239043] - - [3.0719398919454433, 0.0006040155603844118, -1.3978216817494781e-08, -2.1344627096837766e-11, - 2.480657980220244e-15, 3579.386728674486, 4.577999618270958] + - [3.514568038834053, 2.9277405618225407e-05, -5.32163500292442e-07, 1.0194904372190674e-09, + -3.859452377917145e-13, 3414.25419726746, 2.104348847447872] + - [3.071939833652634, 0.0006040156545295, -1.3978269107817313e-08, -2.1344615084426844e-11, + 2.4806570047627186e-15, 3579.3867548969656, 4.577999949781534] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, well-depth: 80.00026940977129, diameter: 2.7500000000000004, note: GRI-Mech} @@ -84,12 +90,12 @@ species: composition: {H: 1, O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 932.147807123929, 5000.0] + temperature-ranges: [100.0, 932.1587116923824, 5000.0] data: - - [4.04594657447324, -0.0017346688146588037, 1.0376730032838863e-05, -1.022036035881876e-08, - 3.3491349668804084e-12, -986.754316874425, 4.6358069149070324] - - [3.2102333691731144, 0.0036794289568842686, -1.2770210213031316e-06, 2.180465263628796e-10, - -1.463389951108199e-14, -910.3663758168628, 8.182947949802738] + - [4.045943172132462, -0.001734626698454687, 1.0376573386756708e-05, -1.0220143747577855e-08, + 3.3490365122259157e-12, -986.754171996653, 4.635818986467584] + - [3.210243785202328, 0.0036794108355443496, -1.2770104000866958e-06, 2.1804398774112111e-10, + -1.4633687091481033e-14, -910.3706242716864, 8.182889562642405] note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH) + radical(HOOJ)' transport: {model: gas, geometry: nonlinear, well-depth: 107.40032560095216, diameter: 3.458000000000001, rotational-relaxation: 1.0, note: GRI-Mech} @@ -97,12 +103,12 @@ species: composition: {O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 1074.5487910223908, 5000.0] + temperature-ranges: [100.0, 1074.5559874666221, 5000.0] data: - - [3.5373230506433604, -0.001215723673673554, 5.316226913876108e-06, -4.894494564171178e-09, - 1.4584747893316288e-12, -1038.5885150253216, 4.683679586164618] - - [3.1538173541160557, 0.0016780494172578125, -7.69977463345062e-07, 1.5127621307497415e-10, - -1.0878302972154481e-14, -1040.815775508589, 6.1675778705421145] + - [3.5373217113695397, -0.0012157081866178787, 5.3161744753665525e-06, -4.894429543084893e-09, + 1.4584485293487145e-12, -1038.5884568564704, 4.6836844075736] + - [3.1538247849326697, 0.001678037130877558, -7.699705205295331e-07, 1.5127459750571054e-10, + -1.0878170489110307e-14, -1040.8190172537113, 6.167535803814269] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, well-depth: 107.40032560095216, diameter: 3.458000000000001, polarizability: 1.6000000000000008, rotational-relaxation: 3.8, note: GRI-Mech} @@ -110,12 +116,12 @@ species: composition: {H: 2, O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 908.8636980899306, 5000.0] + temperature-ranges: [100.0, 908.8554823511466, 5000.0] data: - - [3.731366284109007, 0.003350606013094521, 9.350720493428984e-06, -1.521051004866441e-08, - 6.416107043520503e-12, -17721.171163869974, 5.459079107803863] - - [5.415764982526016, 0.002610120173918772, -4.3991489926460024e-07, 4.911425476518949e-11, - -3.352347640995115e-15, -18302.943400742348, -4.022358081202631] + - [3.73137614050705, 0.003350482514942175, 9.351187533876275e-06, -1.5211168513411492e-08, + 6.416412701320585e-12, -17721.171582843155, 5.459044225733844] + - [5.415737793495593, 0.0026101678952029977, -4.399430439107962e-07, 4.912101201717723e-11, + -3.3529149506348695e-15, -18302.932441143923, -4.022205933495868] note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH)' transport: {model: gas, geometry: nonlinear, well-depth: 107.40032560095216, diameter: 3.458000000000001, rotational-relaxation: 3.8, note: GRI-Mech} @@ -123,12 +129,12 @@ species: composition: {H: 1, C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 926.4996998286691, 5000.0] + temperature-ranges: [100.0, 926.5000868614704, 5000.0] data: - - [4.114883798366483, -0.00036105622302789266, -6.34738424724746e-06, 1.0588830857995857e-08, - -4.570592635290404e-12, 75083.85536332303, 1.6126948258692664] - - [2.3397315833288777, 0.0017585822652602947, -8.029170644997589e-07, 1.4045749082137327e-10, - -8.474970838349845e-15, 75650.75149764838, 11.32545135377962] + - [4.114884169085687, -0.0003610608257374108, -6.347367058134333e-06, 1.0588806976351849e-08, + -4.570581724984619e-12, 75083.85534754528, 1.612693511378359] + - [2.3397304757095996, 0.0017585841964054565, -8.029181981027698e-07, 1.4045776206801416e-10, + -8.474993553681503e-15, 75650.7519481187, 11.325457559946967] note: 'Thermo library: primaryThermoLibrary + radical(Cs_P)' transport: {model: gas, geometry: linear, well-depth: 80.00026940977129, diameter: 2.7500000000000004, note: GRI-Mech} @@ -136,12 +142,12 @@ species: composition: {C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1571.6325038092866, 5000.0] + temperature-ranges: [100.0, 1571.635577343377, 5000.0] data: - - [3.568380183872591, -0.0008521275749708765, 2.4891831341165422e-06, -1.5633152724367305e-09, - 3.135967411946522e-13, -14284.254949016655, 3.579121029658425] - - [2.913058334465055, 0.0016465903493515035, -6.886211322091902e-07, 1.2103870467221813e-10, - -7.840283442517857e-15, -14180.880154113569, 6.710506180052189] + - [3.5683800484025916, -0.0008521262670226395, 2.4891796966658126e-06, -1.5633120860143723e-09, + 3.135957994412226e-13, -14284.2549422392, 3.579121538053434] + - [2.9130626306424436, 0.0016465842199386833, -6.886180363700936e-07, 1.2103804382683996e-10, + -7.840232784477964e-15, -14180.882416118407, 6.710481156838912] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: linear, well-depth: 98.10027624123336, diameter: 3.6500000000000004, polarizability: 1.9500000000000008, rotational-relaxation: 1.8, note: GRI-Mech} @@ -149,12 +155,12 @@ species: composition: {H: 2, C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1104.6163817756849, 5000.0] + temperature-ranges: [100.0, 1104.6267239631795, 5000.0] data: - - [4.011923841489133, -0.00015497839451543438, 3.2629774085156933e-06, -2.4042174893371504e-09, - 5.694965417963233e-13, 45867.680221696675, 0.5332006293939462] - - [3.1498337193348007, 0.0029667428526204092, -9.760559992782986e-07, 1.5411531705304938e-10, - -9.503384326736568e-15, 46058.139092219215, 4.7780774856041885] + - [4.0119238173266885, -0.00015497815596776285, 3.262976760818217e-06, -2.4042168549424923e-09, + 5.694963373961063e-13, 45867.680222863884, 0.5332007195283763] + - [3.149833606344721, 0.0029667430594348385, -9.760561249263692e-07, 1.5411534787212476e-10, + -9.503386955575038e-15, 46058.13913461232, 4.778078110804035] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, well-depth: 144.00072548202698, diameter: 3.8, note: GRI-Mech} @@ -162,12 +168,12 @@ species: composition: {H: 1, C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1565.714132371199, 5000.0] + temperature-ranges: [100.0, 1565.7120792018852, 5000.0] data: - - [4.35602339043274, -0.0034709024404038355, 1.2566500153664981e-05, -9.99496787565554e-09, - 2.278910275533282e-12, 3995.7703823171323, 2.7511152173315896] - - [4.618552189478943, 0.005044727567949883, -4.392490375225836e-06, 9.733000206186813e-10, - -7.074497320360272e-14, 2787.5657280626556, -2.2289265396150277] + - [4.356024400619503, -0.003470912211025233, 1.2566525897003503e-05, -9.994991807684093e-09, + 2.278917370374692e-12, 3995.7703318779218, 2.751111427914028] + - [4.618520755148811, 0.005044772485178862, -4.392513089795063e-06, 9.733048740473051e-10, + -7.074534554082162e-14, 2787.582246997859, -2.2287435033652683] note: 'Thermo group additivity estimation: group(Cds-OdHH) + radical(HCdsJO)' transport: {model: gas, geometry: nonlinear, well-depth: 498.001556803607, diameter: 3.5900000000000007, note: GRI-Mech} @@ -175,12 +181,12 @@ species: composition: {H: 2, C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1442.3511750737548, 5000.0] + temperature-ranges: [100.0, 1442.3580101782086, 5000.0] data: - - [4.102644262821686, -0.0014406893453596408, 5.450704522808327e-06, -3.580035535341835e-09, - 7.561975727674366e-13, 50400.578468202875, -0.411767744752251] - - [2.626461951839261, 0.003947647061872542, -1.499250600733676e-06, 2.545411695073568e-10, - -1.6295740679010454e-14, 50691.75925170181, 6.783860566624157] + - [4.102643682622427, -0.0014406835121726618, 5.450688287473449e-06, -3.5800194681993524e-09, + 7.561924806653407e-13, 50400.57849602855, -0.4117655884033766] + - [2.6264740273422635, 0.003947629223585963, -1.4992413415313327e-06, 2.545391499915196e-10, + -1.629558318782858e-14, 50691.75316398369, 6.783790698934837] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, well-depth: 144.00072548202698, diameter: 3.8, note: GRI-Mech} @@ -188,12 +194,12 @@ species: composition: {H: 3, C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1337.620819587787, 5000.0] + temperature-ranges: [100.0, 1337.627303178629, 5000.0] data: - - [3.915468545997816, 0.0018415334744105523, 3.487446141728892e-06, -3.3275059960317733e-09, - 8.499669695415019e-13, 16285.63932910768, 0.3517380395131654] - - [3.5414438177641827, 0.0047678891393774115, -1.8214953036507109e-06, 3.2887903936663636e-10, - -2.2254753367320316e-14, 16223.964546647976, 1.6604283078795798] + - [3.915467627996589, 0.001841543038966437, 3.4874181471700314e-06, -3.327476648677652e-09, + 8.499570768410386e-13, 16285.639371722482, 0.3517414228537716] + - [3.5414572225301972, 0.004767868738173273, -1.8214844677356902e-06, 3.2887663334895645e-10, + -2.2254563074621602e-14, 16223.958038756007, 1.660351193289797] note: 'Thermo library: primaryThermoLibrary + radical(CH3)' transport: {model: gas, geometry: nonlinear, well-depth: 144.00072548202698, diameter: 3.8, note: GRI-Mech} @@ -201,12 +207,12 @@ species: composition: {H: 2, C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1402.2812011786486, 5000.0] + temperature-ranges: [100.0, 1402.2848955097152, 5000.0] data: - - [4.322896688132622, -0.00506327946440804, 2.151558020865406e-05, -1.7652165578523147e-08, - 4.318158267459416e-12, -14278.956505443542, 2.3924226447408348] - - [3.179936326492375, 0.00955601269235614, -6.273028454801088e-06, 1.3355481910102911e-09, - -9.684126206021399e-14, -15075.21914563935, 4.31085170341811] + - [4.322893745207224, -0.005063249479937248, 2.1515495168109833e-05, -1.76520795881397e-08, + 4.3181303801961645e-12, -14278.956366088585, 2.3924335479025562] + - [3.1799898971516543, 0.00955593266295388, -6.272986551368634e-06, 1.3355389892308e-09, + -9.68405406001952e-14, -15075.245773494298, 4.310542416920189] note: 'Thermo group additivity estimation: group(Cds-OdHH)' transport: {model: gas, geometry: nonlinear, well-depth: 498.001556803607, diameter: 3.5900000000000007, rotational-relaxation: 2.0, note: GRI-Mech} @@ -214,12 +220,12 @@ species: composition: {H: 4, C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1084.123827322365, 5000.0] + temperature-ranges: [100.0, 1084.1178897101286, 5000.0] data: - - [4.205413249592893, -0.005355550700516357, 2.5112249357340948e-05, -2.137618922935306e-08, - 5.97520127499108e-12, -10161.943218560951, -0.9212721095036059] - - [0.9082771923874331, 0.011454066909071433, -4.571727616998398e-06, 8.29189195152023e-10, - -5.6631286728402924e-14, -9719.979461834091, 13.993029451960226] + - [4.205416684633066, -0.005355590254627177, 2.511238250111796e-05, -2.137635320163276e-08, + 5.9752670131915595e-12, -10161.943368029231, -0.9212844871470729] + - [0.9082573996547298, 0.011454099528933412, -4.571746006222714e-06, 8.291934667300837e-10, + -5.66316365457203e-14, -9719.970790335326, 13.993141571614126] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, well-depth: 141.400440100105, diameter: 3.746000000000001, polarizability: 2.6000000000000014, rotational-relaxation: 13.0, note: GRI-Mech} @@ -227,12 +233,12 @@ species: composition: {C: 1, O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 988.8860879833867, 5000.0] + temperature-ranges: [100.0, 988.874846895476, 5000.0] data: - - [3.2786139579157667, 0.0027414907869317043, 7.160850310649065e-06, -1.080287685514878e-08, - 4.14288279908879e-12, -48470.31456638012, 5.979355663789081] - - [4.546085505272925, 0.0029191505308481846, -1.1548474402701926e-06, 2.276560890459939e-10, - -1.7091195474740168e-14, -48980.355193356234, -1.432689313852118] + - [3.278622967759262, 0.002741382373989827, 7.161238132337091e-06, -1.0803389384388666e-08, + 4.1431045806313505e-12, -48470.314952383545, 5.979323504737395] + - [4.546050274062975, 0.002919210558291122, -1.1548821046550818e-06, 2.276642852647346e-10, + -1.7091875765043676e-14, -48980.34041889094, -1.4324910236617816] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + missing(O2d-Cdd) + group(Cdd-OdOd)' transport: {model: gas, geometry: linear, well-depth: 244.00106224424113, diameter: 3.763, @@ -241,12 +247,12 @@ species: composition: {H: 3, C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 895.0128423768832, 5000.0] + temperature-ranges: [100.0, 895.0163946403012, 5000.0] data: - - [3.711747875498063, 0.0019310495477475086, 2.1234224669361647e-05, -3.031581261488382e-08, - 1.2487821239782904e-11, -4007.4595420199803, 7.291993676284961] - - [6.0562988011935595, 0.0030217384679415552, 1.720948400698776e-08, -6.962736851576313e-11, - 5.182164230170264e-15, -4890.505525515445, -6.3476542841121555] + - [3.711740249971209, 0.0019311457977334778, 2.123385699735588e-05, -3.031528812969471e-08, + 1.2487574647076677e-11, -4007.4592181376324, 7.292020622080347] + - [6.056318547324978, 0.0030217036257262145, 1.723010962975875e-08, -6.963233382451129e-11, + 5.182581927964743e-15, -4890.513428418116, -6.34776466810346] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + radical(CsJOH)' transport: {model: gas, geometry: nonlinear, well-depth: 417.00182525120056, diameter: 3.690000000000001, @@ -255,12 +261,12 @@ species: composition: {H: 3, C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 916.8834490980655, 5000.0] + temperature-ranges: [100.0, 916.8968434206298, 5000.0] data: - - [4.0013575561328585, -0.004156835987149363, 3.263543261448762e-05, -3.71118105654598e-08, - 1.3570917933379284e-11, -6.152570493302685, 6.813714035946757] - - [4.016223845036489, 0.006268132072155586, -1.5806804808679084e-06, 2.44606571076615e-10, - -1.7033720648694282e-14, -449.8054684774207, 4.338796349824254] + - [4.0013327502495155, -0.004156526476422401, 3.263426883212575e-05, -3.7110180766619686e-08, + 1.3570166892492088e-11, -6.151515491093088, 6.8138019013791435] + - [4.016294811471149, 0.006268007893365234, -1.5806074006739916e-06, 2.445890523709642e-10, + -1.70322515470223e-14, -449.83419135504226, 4.338398992219582] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + radical(H3COJ)' transport: {model: gas, geometry: nonlinear, well-depth: 417.00182525120056, diameter: 3.690000000000001, @@ -269,12 +275,12 @@ species: composition: {H: 4, C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 952.1389908637451, 5000.0] + temperature-ranges: [100.0, 952.1389545704913, 5000.0] data: - - [3.8949618831293553, -0.0007713534032064971, 2.6475516242260254e-05, -2.9179363149306652e-08, - 1.0083470134889905e-11, -26335.85476940014, 6.364759206338717] - - [3.138078300120791, 0.010354206425018032, -3.569573213259954e-06, 6.2228670380635e-10, - -4.2780556797788775e-14, -26551.895613135097, 8.087777938366735] + - [3.8949619311009682, -0.0007713539892289695, 2.6475518384892784e-05, -2.917936605714971e-08, + 1.0083471431111355e-11, -26335.854771452, 6.364759035632583] + - [3.138078144441756, 0.010354206693580961, -3.5695733697248403e-06, 6.222867410402885e-10, + -4.278055990314069e-14, -26551.895548904657, 8.087778812494083] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH)' transport: {model: gas, geometry: nonlinear, well-depth: 481.802091582003, diameter: 3.626000000000001, rotational-relaxation: 1.0, note: GRI-Mech} @@ -282,12 +288,12 @@ species: composition: {H: 1, C: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 1076.5739030931832, 5000.0] + temperature-ranges: [100.0, 1076.5707431623787, 5000.0] data: - - [3.038528423280286, 0.011544944603038693, -2.1326485954432746e-05, 1.819338534674556e-08, - -5.41594365314797e-12, 66398.01413786084, 5.966763865161724] - - [4.008476679662765, 0.002068132533447794, 6.051403922076703e-08, -1.1771143178546624e-10, - 1.292843103778667e-14, 66529.51239223393, 2.796431735903967] + - [3.038526076764681, 0.011544971712654409, -2.1326577630156857e-05, 1.8193498854298534e-08, + -5.415989423373292e-12, 66398.01423981925, 5.966772314365718] + - [4.0084898009954175, 0.0020681108532139827, 6.052628413041129e-08, -1.1771428006220733e-10, + 1.2928664540905204e-14, 66529.5066627588, 2.796357444487442] note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH) + radical(Acetyl)' transport: {model: gas, geometry: linear, well-depth: 209.00064369691785, diameter: 4.1000000000000005, rotational-relaxation: 2.5, note: GRI-Mech} @@ -295,12 +301,12 @@ species: composition: {H: 2, C: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 888.6182543600265, 5000.0] + temperature-ranges: [100.0, 888.6312703495089, 5000.0] data: - - [3.0357585217151586, 0.007712248787838784, 2.535472846104679e-06, -1.0814091419221027e-08, - 5.50793884017531e-12, 25852.6438513772, 4.544573545031331] - - [5.7620170200918155, 0.002371637509595834, -1.4961216335698123e-07, -2.1908364280616377e-11, - 2.21719408295192e-15, 25094.4612801627, -9.825927939150352] + - [3.035741541159452, 0.007712463869898586, 2.5346473132966697e-06, -1.0812907257939146e-08, + 5.507378740942841e-12, 25852.644572333335, 4.544633504234925] + - [5.762059744831072, 0.002371561933486471, -1.495673463818596e-07, -2.1919166811126934e-11, + 2.218103671549502e-15, 25094.44423800569, -9.826166661316744] note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH)' transport: {model: gas, geometry: linear, well-depth: 209.00064369691785, diameter: 4.1000000000000005, rotational-relaxation: 2.5, note: GRI-Mech} @@ -308,12 +314,12 @@ species: composition: {H: 1, C: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 936.0672810203184, 5000.0] + temperature-ranges: [100.0, 936.0638710543434, 5000.0] data: - - [3.4564721955019664, 0.01057287065008409, -7.35997930717575e-06, 7.974865857027052e-10, - 8.644788930195111e-13, 22595.688064401904, 7.094966296818602] - - [5.9981069864241885, 0.003144794134936119, -9.578007435439627e-07, 1.5562106735769888e-10, - -1.0430827416714007e-14, 21969.463783317686, -5.802371777239033] + - [3.4564741766825713, 0.010572846175575629, -7.359888529672018e-06, 7.973614621605504e-10, + 8.64535565921129e-13, 22595.687980009596, 7.094959264554976] + - [5.998100816612723, 0.0031448048531052264, -9.578070191018402e-07, 1.5562256617433557e-10, + -1.0430952759847218e-14, 21969.466304795515, -5.802337182407708] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) + missing(Cdd-CdO2d) + radical(Cds_P)' transport: {model: gas, geometry: nonlinear, well-depth: 150.00110650441783, diameter: 2.500000000000001, @@ -322,12 +328,12 @@ species: composition: {H: 3, C: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 931.9858880076591, 5000.0] + temperature-ranges: [100.0, 931.9620386849122, 5000.0] data: - - [3.9066414443391624, -0.00406161805089794, 3.867505561886614e-05, -4.629356294110721e-08, - 1.7288184850765833e-11, 34797.18098324665, 6.098116827390869] - - [5.448161345038558, 0.004983220634586766, -1.088008027091821e-06, 1.7978956968030537e-10, - -1.4505633804539655e-14, 33829.69476393835, -4.879180043982607] + - [3.9067052224888306, -0.004062407608381454, 3.867799265691756e-05, -4.629762490027485e-08, + 1.729003139946922e-11, 34797.178267497635, 6.097890545879522] + - [5.447966243943666, 0.004983560085949153, -1.0882069947704135e-06, 1.798371274522559e-10, + -1.4509613313229812e-14, 33829.77433382413, -4.878086417352228] note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH) + radical(Cds_P)' transport: {model: gas, geometry: nonlinear, well-depth: 209.00064369691785, diameter: 4.1000000000000005, @@ -336,12 +342,12 @@ species: composition: {H: 2, C: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 956.6589663809253, 5000.0] + temperature-ranges: [100.0, 956.6689491705725, 5000.0] data: - - [3.5274937117983933, 0.007083323568383587, 9.178495162982448e-06, -1.6427295974845557e-08, - 6.7119937845095964e-12, -7123.942950136391, 5.743686833486504] - - [5.764843860393455, 0.005965775843435247, -1.984972026524795e-06, 3.527701091332367e-10, - -2.5164077388183256e-14, -7928.956600867915, -6.9211732597275475] + - [3.5274804055011524, 0.007083486242205215, 9.177900378006544e-06, -1.6426489708137257e-08, + 6.711635150789706e-12, -7123.942382209249, 5.743734168371629] + - [5.764889204717002, 0.005965697671832553, -1.9849265041966017e-06, 3.5275927958549083e-10, + -2.5163174396771523e-14, -7928.975322079587, -6.92142788806353] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) + missing(Cdd-CdO2d)' transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, @@ -350,12 +356,12 @@ species: composition: {H: 4, C: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 940.4415341496032, 5000.0] + temperature-ranges: [100.0, 940.418247087086, 5000.0] data: - - [3.979761078299263, -0.007575804379415596, 5.5298083380567165e-05, -6.362321213029474e-08, - 2.3177190400951143e-11, 5077.460147499724, 4.0461684201547214] - - [5.202940933280232, 0.007824516477330179, -2.1268877513906106e-06, 3.7970335544514704e-10, - -2.946814128701208e-14, 3936.3029880366635, -6.623812180250903] + - [3.9798415026745158, -0.007576795695064226, 5.5301749021260425e-05, -6.36282467356439e-08, + 2.3179461952714415e-11, 5077.456720344708, 4.0458828180531095] + - [5.202685599067635, 0.00782495932129625, -2.127146740857326e-06, 3.797651593095124e-10, + -2.9473306602423246e-14, 3936.4075648915114, -6.622380040353341] note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH)' transport: {model: gas, geometry: nonlinear, well-depth: 280.80075319274636, diameter: 3.9710000000000005, rotational-relaxation: 1.5, note: GRI-Mech} @@ -363,12 +369,12 @@ species: composition: {H: 5, C: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 900.3133686413051, 5000.0] + temperature-ranges: [100.0, 900.3134894489242, 5000.0] data: - - [3.8218366887126693, -0.0034336137652750723, 5.092576559329648e-05, -6.202121616415652e-08, - 2.3707360339402987e-11, 13066.01287427912, 7.616431110400184] - - [5.156207199872521, 0.009431228225167086, -1.8194614628685796e-06, 2.2119612633683184e-10, - -1.4348159485107404e-14, 12064.083237107747, -2.9109776507588903] + - [3.821836273781996, -0.0034336085398177577, 5.0925745698192944e-05, -6.202118789954702e-08, + 2.3707347111588728e-11, 13066.012891898954, 7.61643257724655] + - [5.156208306185573, 0.009431226276708927, -1.8194603109290526e-06, 2.2119584928108884e-10, + -1.434813619419196e-14, 12064.082793230154, -2.910983837429268] note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH) + radical(CCJ)' transport: {model: gas, geometry: nonlinear, well-depth: 252.30104810022812, diameter: 4.3020000000000005, @@ -377,12 +383,12 @@ species: composition: {H: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1130.2428926130467, 5000.0] + temperature-ranges: [100.0, 1130.229527376887, 5000.0] data: - - [4.057636187975462, -0.0007879398698184641, 2.908788069492715e-06, -1.475204287660629e-09, - 2.128490170160392e-13, -30281.5866521907, -0.31136534685788253] - - [2.8432480470655004, 0.002751089366900853, -7.8103367121036e-07, 1.0724414332729549e-10, - -5.793963421285384e-15, -29958.611693452458, 5.910433578723651] + - [4.0576350324382435, -0.0007879268259766038, 2.908745359555667e-06, -1.4751533432712154e-09, + 2.128292857644156e-13, -30281.58660142529, -0.31136116480217385] + - [2.8432560092133228, 0.0027510764450291783, -7.81026468417208e-07, 1.072424842465603e-10, + -5.79382842272479e-15, -29958.615252484073, 5.910388340788128] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: nonlinear, well-depth: 572.4019516813576, diameter: 2.6050000000000004, dipole: 1.8440000000000003, rotational-relaxation: 4.0, note: GRI-Mech} @@ -390,12 +396,12 @@ species: composition: {C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 3381.427070109808, 5000.0] + temperature-ranges: [100.0, 3937.4317070531474, 5000.0] data: - - [2.4999999999985287, 9.628563723021598e-15, -1.4423129357510334e-17, 7.111203555044388e-21, - -1.081468248287365e-24, 85474.52470343288, 3.659784206708707] - - [2.499999993394482, 7.0272581087493795e-12, -2.7749960501602356e-15, 4.81886544110849e-19, - -3.1045794407491553e-23, 85474.52470835333, 3.6597842472867588] + - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, + 3.793163699805646e-24, 85474.52470343211, 3.6597842066730095] + - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, + 1.0844882370603103e-21, 85474.52442196952, 3.659782093957159] note: 'Thermo library: primaryThermoLibrary' transport: {model: gas, geometry: atom, well-depth: 71.40020436655509, diameter: 3.2980000000000005, note: GRI-Mech} @@ -403,12 +409,12 @@ species: composition: {H: 2, C: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1009.8671367328868, 5000.0] + temperature-ranges: [100.0, 1009.8708057502912, 5000.0] data: - - [3.3040912347897615, 0.012502446003621081, -3.795055354192445e-06, -4.4633009808641336e-09, - 2.663225471130415e-12, 8782.035416515859, 7.197168970728035] - - [6.7124551454507815, 0.005148330500649028, -2.0007834627740915e-06, 3.788190799793496e-10, - -2.7409124748516927e-14, 7780.23551660169, -10.831376654084673] + - [3.304087973229727, 0.01250248485622879, -3.7951924250664015e-06, -4.463122728730499e-09, + 2.6631496728579284e-12, 8782.035556651996, 7.197180637326219] + - [6.712469069000979, 0.005148306955083985, -2.0007699389212864e-06, 3.78815894942322e-10, + -2.740886117401159e-14, 7780.2296193740285, -10.831455133638801] note: 'Thermo group additivity estimation: group(O2s-CtH) + group(Ct-CtOs) + group(Ct-CtH)' transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, rotational-relaxation: 2.0, note: GRI-Mech} @@ -416,12 +422,12 @@ species: composition: {H: 3, C: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 914.2195653125194, 5000.0] + temperature-ranges: [100.0, 914.2116020861831, 5000.0] data: - - [3.347148890024995, 0.0012878732026556307, 5.399642419215212e-05, -7.841121904676618e-08, - 3.240708687065647e-11, -2992.8440212693995, 8.9731019330448] - - [11.726154554803275, -0.001473691800042265, 2.907484426602473e-06, -5.970162857550277e-10, - 3.7029752558219025e-14, -5941.538943574109, -38.44712632255116] + - [3.347196840427565, 0.0012872740814258146, 5.399868121989472e-05, -7.841438689681067e-08, + 3.240855021277469e-11, -2992.8460602521013, 8.972932135895645] + - [11.726019036050477, -0.0014734544263003628, 2.9073446308875385e-06, -5.969827568656105e-10, + 3.702693978288885e-14, -5941.484167993394, -38.44636767007471] note: 'Thermo group additivity estimation: group(O2s-(Cds-Cd)H) + group(Cds-CdsOsH) + group(Cds-CdsHH) + radical(C=COJ)' transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, @@ -430,12 +436,12 @@ species: composition: {H: 4, C: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 984.2016120728738, 5000.0] + temperature-ranges: [100.0, 984.197680603768, 5000.0] data: - - [3.7007802531138334, 0.0003879420044348043, 3.8692486968828104e-05, -4.5244175226526585e-08, - 1.588568911984255e-11, -21380.907966251474, 9.13565622207468] - - [4.588928731919886, 0.01288931344454544, -4.914985254816196e-06, 9.265000639719394e-10, - -6.710044287886815e-14, -22336.02926281222, 0.9008805816430335] + - [3.7007899203288224, 0.00038782542085882675, 3.8692905312513264e-05, -4.524473009262779e-08, + 1.5885930165726808e-11, -21380.908380185487, 9.13562173300882] + - [4.588891681956185, 0.012889376676989747, -4.915021813955812e-06, 9.26508715798075e-10, + -6.710116145936973e-14, -22336.013760155674, 0.9010890403489865] note: 'Thermo group additivity estimation: group(Cs-(Cds-O2d)HHH) + group(Cds-OdCsH)' transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, rotational-relaxation: 2.0, note: GRI-Mech} @@ -443,12 +449,12 @@ species: composition: {H: 8, C: 3} thermo: model: NASA7 - temperature-ranges: [100.0, 986.5741824852131, 5000.0] + temperature-ranges: [100.0, 986.5783141978117, 5000.0] data: - - [3.052565931612535, 0.01250994052655728, 3.793862567309607e-05, -5.120220837447088e-08, - 1.8706492840834734e-11, -14454.176775999556, 10.067246001067637] - - [5.91316392026703, 0.021876253744009963, -8.176607701325125e-06, 1.4985452522965277e-09, - -1.0599135379428694e-13, -16038.878659602295, -8.865558390351929] + - [3.052552781024803, 0.0125100989428809, 3.7938058095217115e-05, -5.120145693587291e-08, + 1.8706167044773312e-11, -14454.176212770122, 10.067292928454926] + - [5.9132148512337706, 0.021876166894657482, -8.176557517977191e-06, 1.4985333815155727e-09, + -1.0599036819008721e-13, -16038.899994267074, -8.865844996334646] note: 'Thermo group additivity estimation: group(Cs-CsCsHH) + group(Cs-CsHHH) + group(Cs-CsHHH)' transport: {model: gas, geometry: nonlinear, well-depth: 266.8010668626943, diameter: 4.982000000000001, diff --git a/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml b/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml index 7edfc6dba0..cc02d4340e 100644 --- a/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml +++ b/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml @@ -1,7 +1,7 @@ generator: ck2yaml input-files: [chem_annotated.inp, tran.dat] cantera-version: 3.1.0 -date: Sun, 03 May 2026 13:46:02 -0400 +date: Mon, 11 May 2026 23:59:04 -0400 units: {length: cm, time: s, quantity: mol, activation-energy: kcal/mol} @@ -105,12 +105,12 @@ species: composition: {C: 2, H: 6} thermo: model: NASA7 - temperature-ranges: [100.0, 954.51, 5000.0] + temperature-ranges: [100.0, 954.52, 5000.0] data: - - [3.78034581, -3.24276167e-03, 5.52385408e-05, -6.38587747e-08, - 2.28639998e-11, -1.16203414e+04, 5.21029717] - - [4.58979531, 0.0141508366, -4.75965798e-06, 8.6030295e-10, - -6.21723882e-14, -1.27217507e+04, -3.61718919] + - [3.78032743, -3.24253681e-03, 5.52377174e-05, -6.38576566e-08, + 2.28635015e-11, -1.16203406e+04, 5.21036251] + - [4.58985736, 0.0141507296, -4.75959561e-06, 8.60288105e-10, + -6.21711501e-14, -1.27217763e+04, -3.61753754] note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH)' transport: model: gas @@ -124,12 +124,12 @@ species: composition: {O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 3381.43, 5000.0] + temperature-ranges: [100.0, 3937.43, 5000.0] data: - - [2.5, 9.62856372e-15, -1.44231294e-17, 7.11120356e-21, - -1.08146825e-24, 2.92302441e+04, 5.12616427] - - [2.49999999, 7.02725811e-12, -2.77499605e-15, 4.81886544e-19, - -3.10457944e-23, 2.92302441e+04, 5.12616431] + - [2.5, -4.35596516e-14, 6.01870293e-17, -2.72230154e-20, + 3.7931637e-24, 2.92302441e+04, 5.12616427] + - [2.50000034, -3.23453715e-10, 1.15706352e-13, -1.83278703e-17, + 1.08448824e-21, 2.92302438e+04, 5.12616216] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -144,10 +144,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1959.07, 5000.0] data: - - [3.43536403, 2.12711089e-04, -2.78626711e-07, 3.40268475e-10, - -7.76035238e-14, -1031.35984, -3.908417] - - [2.78817469, 5.87629433e-04, 1.59015805e-07, -5.52749841e-11, - 4.34318867e-15, -596.149496, 0.112680145] + - [3.43536395, 2.12711816e-04, -2.78628359e-07, 3.40269768e-10, + -7.76038439e-14, -1031.35983, -3.90841667] + - [2.78818343, 5.87618075e-04, 1.59021122e-07, -5.52760511e-11, + 4.34326644e-15, -596.154654, 0.112628324] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -162,12 +162,12 @@ species: composition: {H: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 3381.43, 5000.0] + temperature-ranges: [100.0, 3937.43, 5000.0] data: - - [2.5, 9.62856372e-15, -1.44231294e-17, 7.11120356e-21, - -1.08146825e-24, 2.54742178e+04, -0.444972896] - - [2.49999999, 7.02725811e-12, -2.77499605e-15, 4.81886544e-19, - -3.10457944e-23, 2.54742178e+04, -0.444972856] + - [2.5, -4.35596516e-14, 6.01870293e-17, -2.72230154e-20, + 3.7931637e-24, 2.54742178e+04, -0.444972896] + - [2.50000034, -3.23453715e-10, 1.15706352e-13, -1.83278703e-17, + 1.08448824e-21, 2.54742175e+04, -0.444975009] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -182,10 +182,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1145.75, 5000.0] data: - - [3.51456803, 2.92774947e-05, -5.3216379e-07, 1.01949078e-09, - -3.85945369e-13, 3414.2542, 2.10434888] - - [3.07193989, 6.0401556e-04, -1.39782168e-08, -2.13446271e-11, - 2.48065798e-15, 3579.38673, 4.57799962] + - [3.51456804, 2.92774056e-05, -5.321635e-07, 1.01949044e-09, + -3.85945238e-13, 3414.2542, 2.10434885] + - [3.07193983, 6.04015655e-04, -1.39782691e-08, -2.13446151e-11, + 2.480657e-15, 3579.38675, 4.57799995] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -198,12 +198,12 @@ species: composition: {H: 1, O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 932.15, 5000.0] + temperature-ranges: [100.0, 932.16, 5000.0] data: - - [4.04594657, -1.73466881e-03, 1.037673e-05, -1.02203604e-08, - 3.34913497e-12, -986.754317, 4.63580691] - - [3.21023337, 3.67942896e-03, -1.27702102e-06, 2.18046526e-10, - -1.46338995e-14, -910.366376, 8.18294795] + - [4.04594317, -1.7346267e-03, 1.03765734e-05, -1.02201437e-08, + 3.34903651e-12, -986.754172, 4.63581899] + - [3.21024379, 3.67941084e-03, -1.2770104e-06, 2.18043988e-10, + -1.46336871e-14, -910.370624, 8.18288956] note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH) + radical(HOOJ)' transport: @@ -218,12 +218,12 @@ species: composition: {O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 1074.55, 5000.0] + temperature-ranges: [100.0, 1074.56, 5000.0] data: - - [3.53732305, -1.21572367e-03, 5.31622691e-06, -4.89449456e-09, - 1.45847479e-12, -1038.58852, 4.68367959] - - [3.15381735, 1.67804942e-03, -7.69977463e-07, 1.51276213e-10, - -1.0878303e-14, -1040.81578, 6.16757787] + - [3.53732171, -1.21570819e-03, 5.31617448e-06, -4.89442954e-09, + 1.45844853e-12, -1038.58846, 4.68368441] + - [3.15382478, 1.67803713e-03, -7.69970521e-07, 1.51274598e-10, + -1.08781705e-14, -1040.81902, 6.1675358] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -240,10 +240,10 @@ species: model: NASA7 temperature-ranges: [100.0, 908.86, 5000.0] data: - - [3.73136628, 3.35060601e-03, 9.35072049e-06, -1.521051e-08, - 6.41610704e-12, -1.77211712e+04, 5.45907911] - - [5.41576498, 2.61012017e-03, -4.39914899e-07, 4.91142548e-11, - -3.35234764e-15, -1.83029434e+04, -4.02235808] + - [3.73137614, 3.35048251e-03, 9.35118753e-06, -1.52111685e-08, + 6.4164127e-12, -1.77211716e+04, 5.45904423] + - [5.41573779, 2.6101679e-03, -4.39943044e-07, 4.9121012e-11, + -3.35291495e-15, -1.83029324e+04, -4.02220593] note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH)' transport: model: gas @@ -259,10 +259,10 @@ species: model: NASA7 temperature-ranges: [100.0, 926.5, 5000.0] data: - - [4.1148838, -3.61056223e-04, -6.34738425e-06, 1.05888309e-08, - -4.57059264e-12, 7.50838554e+04, 1.61269483] - - [2.33973158, 1.75858227e-03, -8.02917064e-07, 1.40457491e-10, - -8.47497084e-15, 7.56507515e+04, 11.3254514] + - [4.11488417, -3.61060826e-04, -6.34736706e-06, 1.0588807e-08, + -4.57058172e-12, 7.50838553e+04, 1.61269351] + - [2.33973048, 1.7585842e-03, -8.02918198e-07, 1.40457762e-10, + -8.47499355e-15, 7.56507519e+04, 11.3254576] note: 'Thermo library: primaryThermoLibrary + radical(Cs_P)' transport: model: gas @@ -275,12 +275,12 @@ species: composition: {C: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1571.63, 5000.0] + temperature-ranges: [100.0, 1571.64, 5000.0] data: - - [3.56838018, -8.52127575e-04, 2.48918313e-06, -1.56331527e-09, - 3.13596741e-13, -1.42842549e+04, 3.57912103] - - [2.91305833, 1.64659035e-03, -6.88621132e-07, 1.21038705e-10, - -7.84028344e-15, -1.41808802e+04, 6.71050618] + - [3.56838005, -8.52126267e-04, 2.4891797e-06, -1.56331209e-09, + 3.13595799e-13, -1.42842549e+04, 3.57912154] + - [2.91306263, 1.64658422e-03, -6.88618036e-07, 1.21038044e-10, + -7.84023278e-15, -1.41808824e+04, 6.71048116] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -295,12 +295,12 @@ species: composition: {C: 1, H: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 1104.62, 5000.0] + temperature-ranges: [100.0, 1104.63, 5000.0] data: - - [4.01192384, -1.54978395e-04, 3.26297741e-06, -2.40421749e-09, - 5.69496542e-13, 4.58676802e+04, 0.533200629] - - [3.14983372, 2.96674285e-03, -9.76055999e-07, 1.54115317e-10, - -9.50338433e-15, 4.60581391e+04, 4.77807749] + - [4.01192382, -1.54978156e-04, 3.26297676e-06, -2.40421685e-09, + 5.69496337e-13, 4.58676802e+04, 0.53320072] + - [3.14983361, 2.96674306e-03, -9.76056125e-07, 1.54115348e-10, + -9.50338696e-15, 4.60581391e+04, 4.77807811] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -315,10 +315,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1565.71, 5000.0] data: - - [4.35602339, -3.47090244e-03, 1.25665002e-05, -9.99496788e-09, - 2.27891028e-12, 3995.77038, 2.75111522] - - [4.61855219, 5.04472757e-03, -4.39249038e-06, 9.73300021e-10, - -7.07449732e-14, 2787.56573, -2.22892654] + - [4.3560244, -3.47091221e-03, 1.25665259e-05, -9.99499181e-09, + 2.27891737e-12, 3995.77033, 2.75111143] + - [4.61852076, 5.04477249e-03, -4.39251309e-06, 9.73304874e-10, + -7.07453455e-14, 2787.58225, -2.2287435] note: 'Thermo group additivity estimation: group(Cds-OdHH) + radical(HCdsJO)' transport: model: gas @@ -331,12 +331,12 @@ species: composition: {C: 1, H: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 1442.35, 5000.0] + temperature-ranges: [100.0, 1442.36, 5000.0] data: - - [4.10264426, -1.44068935e-03, 5.45070452e-06, -3.58003554e-09, - 7.56197573e-13, 5.04005785e+04, -0.411767745] - - [2.62646195, 3.94764706e-03, -1.4992506e-06, 2.5454117e-10, - -1.62957407e-14, 5.06917593e+04, 6.78386057] + - [4.10264368, -1.44068351e-03, 5.45068829e-06, -3.58001947e-09, + 7.56192481e-13, 5.04005785e+04, -0.411765588] + - [2.62647403, 3.94762922e-03, -1.49924134e-06, 2.5453915e-10, + -1.62955832e-14, 5.06917532e+04, 6.7837907] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -349,12 +349,12 @@ species: composition: {C: 1, H: 3} thermo: model: NASA7 - temperature-ranges: [100.0, 1337.62, 5000.0] + temperature-ranges: [100.0, 1337.63, 5000.0] data: - - [3.91546855, 1.84153347e-03, 3.48744614e-06, -3.327506e-09, - 8.4996697e-13, 1.62856393e+04, 0.35173804] - - [3.54144382, 4.76788914e-03, -1.8214953e-06, 3.28879039e-10, - -2.22547534e-14, 1.62239645e+04, 1.66042831] + - [3.91546763, 1.84154304e-03, 3.48741815e-06, -3.32747665e-09, + 8.49957077e-13, 1.62856394e+04, 0.351741423] + - [3.54145722, 4.76786874e-03, -1.82148447e-06, 3.28876633e-10, + -2.22545631e-14, 1.6223958e+04, 1.66035119] note: 'Thermo library: primaryThermoLibrary + radical(CH3)' transport: model: gas @@ -369,10 +369,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1402.28, 5000.0] data: - - [4.32289669, -5.06327946e-03, 2.15155802e-05, -1.76521656e-08, - 4.31815827e-12, -1.42789565e+04, 2.39242264] - - [3.17993633, 9.55601269e-03, -6.27302845e-06, 1.33554819e-09, - -9.68412621e-14, -1.50752191e+04, 4.3108517] + - [4.32289375, -5.06324948e-03, 2.15154952e-05, -1.76520796e-08, + 4.31813038e-12, -1.42789564e+04, 2.39243355] + - [3.1799899, 9.55593266e-03, -6.27298655e-06, 1.33553899e-09, + -9.68405406e-14, -1.50752458e+04, 4.31054242] note: 'Thermo group additivity estimation: group(Cds-OdHH)' transport: model: gas @@ -388,10 +388,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1084.12, 5000.0] data: - - [4.20541325, -5.3555507e-03, 2.51122494e-05, -2.13761892e-08, - 5.97520127e-12, -1.01619432e+04, -0.92127211] - - [0.908277192, 0.0114540669, -4.57172762e-06, 8.29189195e-10, - -5.66312867e-14, -9719.97946, 13.9930295] + - [4.20541668, -5.35559025e-03, 2.51123825e-05, -2.13763532e-08, + 5.97526701e-12, -1.01619434e+04, -0.921284487] + - [0.9082574, 0.0114540995, -4.57174601e-06, 8.29193467e-10, + -5.66316365e-14, -9719.97079, 13.9931416] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -406,12 +406,12 @@ species: composition: {C: 1, O: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 988.89, 5000.0] + temperature-ranges: [100.0, 988.87, 5000.0] data: - - [3.27861396, 2.74149079e-03, 7.16085031e-06, -1.08028769e-08, - 4.1428828e-12, -4.84703146e+04, 5.97935566] - - [4.54608551, 2.91915053e-03, -1.15484744e-06, 2.27656089e-10, - -1.70911955e-14, -4.89803552e+04, -1.43268931] + - [3.27862297, 2.74138237e-03, 7.16123813e-06, -1.08033894e-08, + 4.14310458e-12, -4.8470315e+04, 5.9793235] + - [4.54605027, 2.91921056e-03, -1.1548821e-06, 2.27664285e-10, + -1.70918758e-14, -4.89803404e+04, -1.43249102] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + missing(O2d-Cdd) + group(Cdd-OdOd)' transport: @@ -427,12 +427,12 @@ species: composition: {C: 1, H: 3, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 895.01, 5000.0] + temperature-ranges: [100.0, 895.02, 5000.0] data: - - [3.71174788, 1.93104955e-03, 2.12342247e-05, -3.03158126e-08, - 1.24878212e-11, -4007.45954, 7.29199368] - - [6.0562988, 3.02173847e-03, 1.7209484e-08, -6.96273685e-11, - 5.18216423e-15, -4890.50553, -6.34765428] + - [3.71174025, 1.9311458e-03, 2.1233857e-05, -3.03152881e-08, + 1.24875746e-11, -4007.45922, 7.29202062] + - [6.05631855, 3.02170363e-03, 1.72301096e-08, -6.96323338e-11, + 5.18258193e-15, -4890.51343, -6.34776467] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + radical(CsJOH)' transport: @@ -448,12 +448,12 @@ species: composition: {C: 1, H: 3, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 916.88, 5000.0] + temperature-ranges: [100.0, 916.9, 5000.0] data: - - [4.00135756, -4.15683599e-03, 3.26354326e-05, -3.71118106e-08, - 1.35709179e-11, -6.15257049, 6.81371404] - - [4.01622385, 6.26813207e-03, -1.58068048e-06, 2.44606571e-10, - -1.70337206e-14, -449.805468, 4.33879635] + - [4.00133275, -4.15652648e-03, 3.26342688e-05, -3.71101808e-08, + 1.35701669e-11, -6.15151549, 6.8138019] + - [4.01629481, 6.26800789e-03, -1.5806074e-06, 2.44589052e-10, + -1.70322515e-14, -449.834191, 4.33839899] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + radical(H3COJ)' transport: @@ -471,10 +471,10 @@ species: model: NASA7 temperature-ranges: [100.0, 952.14, 5000.0] data: - - [3.89496188, -7.71353403e-04, 2.64755162e-05, -2.91793631e-08, - 1.00834701e-11, -2.63358548e+04, 6.36475921] - - [3.1380783, 0.0103542064, -3.56957321e-06, 6.22286704e-10, - -4.27805568e-14, -2.65518956e+04, 8.08777794] + - [3.89496193, -7.71353989e-04, 2.64755184e-05, -2.91793661e-08, + 1.00834714e-11, -2.63358548e+04, 6.36475904] + - [3.13807814, 0.0103542067, -3.56957337e-06, 6.22286741e-10, + -4.27805599e-14, -2.65518955e+04, 8.08777881] note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH)' transport: model: gas @@ -490,10 +490,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1076.57, 5000.0] data: - - [3.03852842, 0.0115449446, -2.1326486e-05, 1.81933853e-08, - -5.41594365e-12, 6.63980141e+04, 5.96676387] - - [4.00847668, 2.06813253e-03, 6.05140392e-08, -1.17711432e-10, - 1.2928431e-14, 6.65295124e+04, 2.79643174] + - [3.03852608, 0.0115449717, -2.13265776e-05, 1.81934989e-08, + -5.41598942e-12, 6.63980142e+04, 5.96677231] + - [4.0084898, 2.06811085e-03, 6.05262841e-08, -1.1771428e-10, + 1.29286645e-14, 6.65295067e+04, 2.79635744] note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH) + radical(Acetyl)' transport: @@ -508,12 +508,12 @@ species: composition: {C: 2, H: 2} thermo: model: NASA7 - temperature-ranges: [100.0, 888.62, 5000.0] + temperature-ranges: [100.0, 888.63, 5000.0] data: - - [3.03575852, 7.71224879e-03, 2.53547285e-06, -1.08140914e-08, - 5.50793884e-12, 2.58526439e+04, 4.54457355] - - [5.76201702, 2.37163751e-03, -1.49612163e-07, -2.19083643e-11, - 2.21719408e-15, 2.50944613e+04, -9.82592794] + - [3.03574154, 7.71246387e-03, 2.53464731e-06, -1.08129073e-08, + 5.50737874e-12, 2.58526446e+04, 4.5446335] + - [5.76205974, 2.37156193e-03, -1.49567346e-07, -2.19191668e-11, + 2.21810367e-15, 2.50944442e+04, -9.82616666] note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH)' transport: model: gas @@ -527,12 +527,12 @@ species: composition: {C: 2, H: 1, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 936.07, 5000.0] + temperature-ranges: [100.0, 936.06, 5000.0] data: - - [3.4564722, 0.0105728707, -7.35997931e-06, 7.97486586e-10, - 8.64478893e-13, 2.25956881e+04, 7.0949663] - - [5.99810699, 3.14479413e-03, -9.57800744e-07, 1.55621067e-10, - -1.04308274e-14, 2.19694638e+04, -5.80237178] + - [3.45647418, 0.0105728462, -7.35988853e-06, 7.97361462e-10, + 8.64535566e-13, 2.2595688e+04, 7.09495926] + - [5.99810082, 3.14480485e-03, -9.57807019e-07, 1.55622566e-10, + -1.04309528e-14, 2.19694663e+04, -5.80233718] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) + missing(Cdd-CdO2d) + radical(Cds_P)' transport: @@ -547,12 +547,12 @@ species: composition: {C: 2, H: 3} thermo: model: NASA7 - temperature-ranges: [100.0, 931.99, 5000.0] + temperature-ranges: [100.0, 931.96, 5000.0] data: - - [3.90664144, -4.06161805e-03, 3.86750556e-05, -4.62935629e-08, - 1.72881849e-11, 3.4797181e+04, 6.09811683] - - [5.44816135, 4.98322063e-03, -1.08800803e-06, 1.7978957e-10, - -1.45056338e-14, 3.38296948e+04, -4.87918004] + - [3.90670522, -4.06240761e-03, 3.86779927e-05, -4.62976249e-08, + 1.72900314e-11, 3.47971783e+04, 6.09789055] + - [5.44796624, 4.98356009e-03, -1.08820699e-06, 1.79837127e-10, + -1.45096133e-14, 3.38297743e+04, -4.87808642] note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH) + radical(Cds_P)' transport: @@ -567,12 +567,12 @@ species: composition: {C: 2, H: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 956.66, 5000.0] + temperature-ranges: [100.0, 956.67, 5000.0] data: - - [3.52749371, 7.08332357e-03, 9.17849516e-06, -1.6427296e-08, - 6.71199378e-12, -7123.94295, 5.74368683] - - [5.76484386, 5.96577584e-03, -1.98497203e-06, 3.52770109e-10, - -2.51640774e-14, -7928.9566, -6.92117326] + - [3.52748041, 7.08348624e-03, 9.17790038e-06, -1.64264897e-08, + 6.71163515e-12, -7123.94238, 5.74373417] + - [5.7648892, 5.96569767e-03, -1.9849265e-06, 3.5275928e-10, + -2.51631744e-14, -7928.97532, -6.92142789] note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) + missing(Cdd-CdO2d)' transport: @@ -587,12 +587,12 @@ species: composition: {C: 2, H: 4} thermo: model: NASA7 - temperature-ranges: [100.0, 940.44, 5000.0] + temperature-ranges: [100.0, 940.42, 5000.0] data: - - [3.97976108, -7.57580438e-03, 5.52980834e-05, -6.36232121e-08, - 2.31771904e-11, 5077.46015, 4.04616842] - - [5.20294093, 7.82451648e-03, -2.12688775e-06, 3.79703355e-10, - -2.94681413e-14, 3936.30299, -6.62381218] + - [3.9798415, -7.5767957e-03, 5.5301749e-05, -6.36282467e-08, + 2.3179462e-11, 5077.45672, 4.04588282] + - [5.2026856, 7.82495932e-03, -2.12714674e-06, 3.79765159e-10, + -2.94733066e-14, 3936.40756, -6.62238004] note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH)' transport: model: gas @@ -608,10 +608,10 @@ species: model: NASA7 temperature-ranges: [100.0, 900.31, 5000.0] data: - - [3.82183669, -3.43361377e-03, 5.09257656e-05, -6.20212162e-08, - 2.37073603e-11, 1.30660129e+04, 7.61643111] - - [5.1562072, 9.43122823e-03, -1.81946146e-06, 2.21196126e-10, - -1.43481595e-14, 1.20640832e+04, -2.91097765] + - [3.82183627, -3.43360854e-03, 5.09257457e-05, -6.20211879e-08, + 2.37073471e-11, 1.30660129e+04, 7.61643258] + - [5.15620831, 9.43122628e-03, -1.81946031e-06, 2.21195849e-10, + -1.43481362e-14, 1.20640828e+04, -2.91098384] note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH) + radical(CCJ)' transport: @@ -626,12 +626,12 @@ species: composition: {H: 2, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 1130.24, 5000.0] + temperature-ranges: [100.0, 1130.23, 5000.0] data: - - [4.05763619, -7.8793987e-04, 2.90878807e-06, -1.47520429e-09, - 2.12849017e-13, -3.02815867e+04, -0.311365347] - - [2.84324805, 2.75108937e-03, -7.81033671e-07, 1.07244143e-10, - -5.79396342e-15, -2.99586117e+04, 5.91043358] + - [4.05763503, -7.87926826e-04, 2.90874536e-06, -1.47515334e-09, + 2.12829286e-13, -3.02815866e+04, -0.311361165] + - [2.84325601, 2.75107645e-03, -7.81026468e-07, 1.07242484e-10, + -5.79382842e-15, -2.99586153e+04, 5.91038834] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -646,12 +646,12 @@ species: composition: {C: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 3381.43, 5000.0] + temperature-ranges: [100.0, 3937.43, 5000.0] data: - - [2.5, 9.62856372e-15, -1.44231294e-17, 7.11120356e-21, - -1.08146825e-24, 8.54745247e+04, 3.65978421] - - [2.49999999, 7.02725811e-12, -2.77499605e-15, 4.81886544e-19, - -3.10457944e-23, 8.54745247e+04, 3.65978425] + - [2.5, -4.35596516e-14, 6.01870293e-17, -2.72230154e-20, + 3.7931637e-24, 8.54745247e+04, 3.65978421] + - [2.50000034, -3.23453715e-10, 1.15706352e-13, -1.83278703e-17, + 1.08448824e-21, 8.54745244e+04, 3.65978209] note: 'Thermo library: primaryThermoLibrary' transport: model: gas @@ -666,10 +666,10 @@ species: model: NASA7 temperature-ranges: [100.0, 1009.87, 5000.0] data: - - [3.30409123, 0.012502446, -3.79505535e-06, -4.46330098e-09, - 2.66322547e-12, 8782.03542, 7.19716897] - - [6.71245515, 5.1483305e-03, -2.00078346e-06, 3.7881908e-10, - -2.74091247e-14, 7780.23552, -10.8313767] + - [3.30408797, 0.0125024849, -3.79519243e-06, -4.46312273e-09, + 2.66314967e-12, 8782.03556, 7.19718064] + - [6.71246907, 5.14830696e-03, -2.00076994e-06, 3.78815895e-10, + -2.74088612e-14, 7780.22962, -10.8314551] note: 'Thermo group additivity estimation: group(O2s-CtH) + group(Ct-CtOs) + group(Ct-CtH)' transport: @@ -684,12 +684,12 @@ species: composition: {C: 2, H: 3, O: 1} thermo: model: NASA7 - temperature-ranges: [100.0, 914.22, 5000.0] + temperature-ranges: [100.0, 914.21, 5000.0] data: - - [3.34714889, 1.2878732e-03, 5.39964242e-05, -7.8411219e-08, - 3.24070869e-11, -2992.84402, 8.97310193] - - [11.7261546, -1.4736918e-03, 2.90748443e-06, -5.97016286e-10, - 3.70297526e-14, -5941.53894, -38.4471263] + - [3.34719684, 1.28727408e-03, 5.39986812e-05, -7.84143869e-08, + 3.24085502e-11, -2992.84606, 8.97293214] + - [11.726019, -1.47345443e-03, 2.90734463e-06, -5.96982757e-10, + 3.70269398e-14, -5941.48417, -38.4463677] note: 'Thermo group additivity estimation: group(O2s-(Cds-Cd)H) + group(Cds-CdsOsH) + group(Cds-CdsHH) + radical(C=COJ)' transport: @@ -706,10 +706,10 @@ species: model: NASA7 temperature-ranges: [100.0, 984.2, 5000.0] data: - - [3.70078025, 3.87942004e-04, 3.8692487e-05, -4.52441752e-08, - 1.58856891e-11, -2.1380908e+04, 9.13565622] - - [4.58892873, 0.0128893134, -4.91498525e-06, 9.26500064e-10, - -6.71004429e-14, -2.23360293e+04, 0.900880582] + - [3.70078992, 3.87825421e-04, 3.86929053e-05, -4.52447301e-08, + 1.58859302e-11, -2.13809084e+04, 9.13562173] + - [4.58889168, 0.0128893767, -4.91502181e-06, 9.26508716e-10, + -6.71011615e-14, -2.23360138e+04, 0.90108904] note: 'Thermo group additivity estimation: group(Cs-(Cds-O2d)HHH) + group(Cds-OdCsH)' transport: @@ -724,12 +724,12 @@ species: composition: {C: 3, H: 8} thermo: model: NASA7 - temperature-ranges: [100.0, 986.57, 5000.0] + temperature-ranges: [100.0, 986.58, 5000.0] data: - - [3.05256593, 0.0125099405, 3.79386257e-05, -5.12022084e-08, - 1.87064928e-11, -1.44541768e+04, 10.067246] - - [5.91316392, 0.0218762537, -8.1766077e-06, 1.49854525e-09, - -1.05991354e-13, -1.60388787e+04, -8.86555839] + - [3.05255278, 0.0125100989, 3.79380581e-05, -5.12014569e-08, + 1.8706167e-11, -1.44541762e+04, 10.0672929] + - [5.91321485, 0.0218761669, -8.17655752e-06, 1.49853338e-09, + -1.05990368e-13, -1.60389e+04, -8.865845] note: 'Thermo group additivity estimation: group(Cs-CsCsHH) + group(Cs-CsHHH) + group(Cs-CsHHH)' transport: @@ -1777,7 +1777,7 @@ reactions: - equation: O(2) + O(2) + M <=> O2(7) + M # Reaction 173 type: three-body rate-constant: {A: 1.2e+17, b: -1.0, Ea: 0.0} - efficiencies: {CO2(17): 3.6, ethane(1): 3.0, CH4(16): 2.0, H2O(28): + efficiencies: {CO2(17): 3.6, CH4(16): 2.0, ethane(1): 3.0, H2O(28): 15.4, H2(3): 2.4, Ar: 0.83} note: | Reaction index: Chemkin #173; RMG #170 From 8ca54e720f17890ef3582776a3675d25f40f4509 Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 13 May 2026 09:18:06 -0400 Subject: [PATCH 12/55] remove committed golden YAML files; gitignore from_main_test.yaml These files are generated on the fly by running the mainTest functional test. Committing them bakes in machine-specific paths and database-version-dependent thermo coefficients that drift over time. The comparison test already skips gracefully when the files are absent, so CI is unaffected. Co-Authored-By: Claude Sonnet 4.6 --- .../test_data/yaml_writer_data/.gitignore | 1 + .../cantera1/from_main_test.yaml | 1324 ---------- .../cantera2/from_main_test.yaml | 1255 ---------- .../ck2yaml/from_main_test.yaml | 2151 ----------------- 4 files changed, 1 insertion(+), 4730 deletions(-) create mode 100644 test/rmgpy/test_data/yaml_writer_data/.gitignore delete mode 100644 test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml delete mode 100644 test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml delete mode 100644 test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml diff --git a/test/rmgpy/test_data/yaml_writer_data/.gitignore b/test/rmgpy/test_data/yaml_writer_data/.gitignore new file mode 100644 index 0000000000..7acff224a2 --- /dev/null +++ b/test/rmgpy/test_data/yaml_writer_data/.gitignore @@ -0,0 +1 @@ +from_main_test.yaml diff --git a/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml b/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml deleted file mode 100644 index a77715a598..0000000000 --- a/test/rmgpy/test_data/yaml_writer_data/cantera1/from_main_test.yaml +++ /dev/null @@ -1,1324 +0,0 @@ -generator: "RMG-Py CanteraWriter1 at /Users/daniellelucey/RMG-Py/rmgpy/yaml_cantera1.py (git commit: 063b6b0)" -date: Mon, 11 May 2026 23:59:04 - -units: {length: m, time: s, quantity: kmol, activation-energy: J/kmol} - - -phases: -- name: gas - thermo: ideal-gas - elements: [H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, CI, OI, X] - species: [N2, Ar, He, Ne, ethane(1), O(2), H2(3), H(4), OH(5), HO2(6), O2(7), H2O2(8), CH(9), CO(10), CH2(11), HCO(12), CH2(S)(13), CH3(14), CH2O(15), CH4(16), CO2(17), CH2OH(18), CH3O(19), CH3OH(20), C2H(21), C2H2(22), HCCO(23), C2H3(24), CH2CO(25), C2H4(26), C2H5(27), H2O(28), C(29), HCCOH(30), CH2CHO(31), CH3CHO(32), C3H8(33)] - kinetics: gas - transport: mixture-averaged - state: {T: 300.0, P: 1 atm} - -elements: -- symbol: D - atomic-weight: 2.014102 -- symbol: T - atomic-weight: 3.016049 -- symbol: CI - atomic-weight: 13.003354 -- symbol: OI - atomic-weight: 17.999159 -- symbol: X - atomic-weight: 195.083 - -species: -- name: ethane(1) - composition: {C: 2.0, H: 6.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 954.5165316630638, 5000.0] - data: - - [3.7803274333291164, -0.003242536810039668, 5.523771743952032e-05, -6.385765657832756e-08, - 2.286350154835937e-11, -11620.34056878642, 5.2103625138745535] - - [4.589857356655155, 0.01415072957994417, -4.759595608783751e-06, 8.602881051327119e-10, - -6.21711500823632e-14, -12721.776270468992, -3.617537540469888] - note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH)' - transport: {model: gas, geometry: nonlinear, diameter: 4.3020000000000005, well-depth: 252.30104810022812, - rotational-relaxation: 1.5, note: GRI-Mech} -- name: O(2) - composition: {O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 3937.4317070531474, 5000.0] - data: - - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, - 3.793163699805646e-24, 29230.24412855015, 5.126164272659162] - - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, - 1.0844882370603103e-21, 29230.243847087564, 5.126162159943312] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, diameter: 2.7500000000000004, well-depth: 80.00026940977129, - note: GRI-Mech} -- name: H2(3) - composition: {H: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1959.0704060489752, 5000.0] - data: - - [3.4353639487680128, 0.0002127118156028557, -2.7862835897145624e-07, 3.402697677898988e-10, - -7.760384389606823e-14, -1031.3598307378923, -3.9084166738022317] - - [2.788183431931728, 0.0005876180754751174, 1.5902112168376917e-07, -5.527605114100645e-11, - 4.343266442811977e-15, -596.1546540947348, 0.11262832427188434] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, diameter: 2.9200000000000004, well-depth: 38.00012796964137, - polarizability: 0.7900000000000005, rotational-relaxation: 280.0, note: GRI-Mech} -- name: H(4) - composition: {H: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 3937.4317070531474, 5000.0] - data: - - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, - 3.793163699805646e-24, 25474.217768728387, -0.4449728963637201] - - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, - 1.0844882370603103e-21, 25474.2174872658, -0.4449750090795722] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, diameter: 2.0500000000000003, well-depth: 145.00018762466215, - note: GRI-Mech} -- name: OH(5) - composition: {H: 1.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1145.7521011170168, 5000.0] - data: - - [3.514568038834053, 2.9277405618225407e-05, -5.32163500292442e-07, 1.0194904372190674e-09, - -3.859452377917145e-13, 3414.25419726746, 2.104348847447872] - - [3.071939833652634, 0.0006040156545295, -1.3978269107817313e-08, -2.1344615084426844e-11, - 2.4806570047627186e-15, 3579.3867548969656, 4.577999949781534] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, diameter: 2.7500000000000004, well-depth: 80.00026940977129, - note: GRI-Mech} -- name: HO2(6) - composition: {H: 1.0, O: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 932.1587116923824, 5000.0] - data: - - [4.045943172132462, -0.001734626698454687, 1.0376573386756708e-05, -1.0220143747577855e-08, - 3.3490365122259157e-12, -986.754171996653, 4.635818986467584] - - [3.210243785202328, 0.0036794108355443496, -1.2770104000866958e-06, 2.1804398774112111e-10, - -1.4633687091481033e-14, -910.3706242716864, 8.182889562642405] - note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH) + radical(HOOJ)' - transport: {model: gas, geometry: nonlinear, diameter: 3.4580000000000015, well-depth: 107.40032560095216, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: O2(7) - composition: {O: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1074.5559874666221, 5000.0] - data: - - [3.5373217113695397, -0.0012157081866178787, 5.3161744753665525e-06, -4.894429543084893e-09, - 1.4584485293487145e-12, -1038.5884568564704, 4.6836844075736] - - [3.1538247849326697, 0.001678037130877558, -7.699705205295331e-07, 1.5127459750571054e-10, - -1.0878170489110307e-14, -1040.8190172537113, 6.167535803814269] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, diameter: 3.4580000000000015, well-depth: 107.40032560095216, - polarizability: 1.6000000000000008, rotational-relaxation: 3.8, note: GRI-Mech} -- name: H2O2(8) - composition: {H: 2.0, O: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 908.8554823511466, 5000.0] - data: - - [3.73137614050705, 0.003350482514942175, 9.351187533876275e-06, -1.5211168513411492e-08, - 6.416412701320585e-12, -17721.171582843155, 5.459044225733844] - - [5.415737793495593, 0.0026101678952029977, -4.399430439107962e-07, 4.912101201717723e-11, - -3.3529149506348695e-15, -18302.932441143923, -4.022205933495868] - note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.4580000000000015, well-depth: 107.40032560095216, - rotational-relaxation: 3.8, note: GRI-Mech} -- name: CH(9) - composition: {C: 1.0, H: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 926.5000868614704, 5000.0] - data: - - [4.114884169085687, -0.0003610608257374108, -6.347367058134333e-06, 1.0588806976351849e-08, - -4.570581724984619e-12, 75083.85534754528, 1.612693511378359] - - [2.3397304757095996, 0.0017585841964054565, -8.029181981027698e-07, 1.4045776206801416e-10, - -8.474993553681503e-15, 75650.7519481187, 11.325457559946967] - note: 'Thermo library: primaryThermoLibrary + radical(Cs_P)' - transport: {model: gas, geometry: linear, diameter: 2.7500000000000004, well-depth: 80.00026940977129, - note: GRI-Mech} -- name: CO(10) - composition: {C: 1.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1571.635577343377, 5000.0] - data: - - [3.5683800484025916, -0.0008521262670226395, 2.4891796966658126e-06, -1.5633120860143723e-09, - 3.135957994412226e-13, -14284.2549422392, 3.579121538053434] - - [2.9130626306424436, 0.0016465842199386833, -6.886180363700936e-07, 1.2103804382683996e-10, - -7.840232784477964e-15, -14180.882416118407, 6.710481156838912] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, diameter: 3.6500000000000004, well-depth: 98.10027624123336, - polarizability: 1.9500000000000008, rotational-relaxation: 1.8, note: GRI-Mech} -- name: CH2(11) - composition: {C: 1.0, H: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1104.6267239631795, 5000.0] - data: - - [4.0119238173266885, -0.00015497815596776285, 3.262976760818217e-06, -2.4042168549424923e-09, - 5.694963373961063e-13, 45867.680222863884, 0.5332007195283763] - - [3.149833606344721, 0.0029667430594348385, -9.760561249263692e-07, 1.5411534787212476e-10, - -9.503386955575038e-15, 46058.13913461232, 4.778078110804035] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, diameter: 3.8, well-depth: 144.00072548202698, - note: GRI-Mech} -- name: HCO(12) - composition: {C: 1.0, H: 1.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1565.7120792018852, 5000.0] - data: - - [4.356024400619503, -0.003470912211025233, 1.2566525897003503e-05, -9.994991807684093e-09, - 2.278917370374692e-12, 3995.7703318779218, 2.751111427914028] - - [4.618520755148811, 0.005044772485178862, -4.392513089795063e-06, 9.733048740473051e-10, - -7.074534554082162e-14, 2787.582246997859, -2.2287435033652683] - note: 'Thermo group additivity estimation: group(Cds-OdHH) + radical(HCdsJO)' - transport: {model: gas, geometry: nonlinear, diameter: 3.590000000000001, well-depth: 498.001556803607, - note: GRI-Mech} -- name: CH2(S)(13) - composition: {C: 1.0, H: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1442.3580101782086, 5000.0] - data: - - [4.102643682622427, -0.0014406835121726618, 5.450688287473449e-06, -3.5800194681993524e-09, - 7.561924806653407e-13, 50400.57849602855, -0.4117655884033766] - - [2.6264740273422635, 0.003947629223585963, -1.4992413415313327e-06, 2.545391499915196e-10, - -1.629558318782858e-14, 50691.75316398369, 6.783790698934837] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, diameter: 3.8, well-depth: 144.00072548202698, - note: GRI-Mech} -- name: CH3(14) - composition: {C: 1.0, H: 3.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1337.627303178629, 5000.0] - data: - - [3.915467627996589, 0.001841543038966437, 3.4874181471700314e-06, -3.327476648677652e-09, - 8.499570768410386e-13, 16285.639371722482, 0.3517414228537716] - - [3.5414572225301972, 0.004767868738173273, -1.8214844677356902e-06, 3.2887663334895645e-10, - -2.2254563074621602e-14, 16223.958038756007, 1.660351193289797] - note: 'Thermo library: primaryThermoLibrary + radical(CH3)' - transport: {model: gas, geometry: nonlinear, diameter: 3.8, well-depth: 144.00072548202698, - note: GRI-Mech} -- name: CH2O(15) - composition: {C: 1.0, H: 2.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1402.2848955097152, 5000.0] - data: - - [4.322893745207224, -0.005063249479937248, 2.1515495168109833e-05, -1.76520795881397e-08, - 4.3181303801961645e-12, -14278.956366088585, 2.3924335479025562] - - [3.1799898971516543, 0.00955593266295388, -6.272986551368634e-06, 1.3355389892308e-09, - -9.68405406001952e-14, -15075.245773494298, 4.310542416920189] - note: 'Thermo group additivity estimation: group(Cds-OdHH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.590000000000001, well-depth: 498.001556803607, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH4(16) - composition: {C: 1.0, H: 4.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1084.1178897101286, 5000.0] - data: - - [4.205416684633066, -0.005355590254627177, 2.511238250111796e-05, -2.137635320163276e-08, - 5.9752670131915595e-12, -10161.943368029231, -0.9212844871470729] - - [0.9082573996547298, 0.011454099528933412, -4.571746006222714e-06, 8.291934667300837e-10, - -5.66316365457203e-14, -9719.970790335326, 13.993141571614126] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, diameter: 3.746000000000001, well-depth: 141.400440100105, - polarizability: 2.600000000000002, rotational-relaxation: 13.0, note: GRI-Mech} -- name: CO2(17) - composition: {C: 1.0, O: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 988.874846895476, 5000.0] - data: - - [3.278622967759262, 0.002741382373989827, 7.161238132337091e-06, -1.0803389384388666e-08, - 4.1431045806313505e-12, -48470.314952383545, 5.979323504737395] - - [4.546050274062975, 0.002919210558291122, -1.1548821046550818e-06, 2.276642852647346e-10, - -1.7091875765043676e-14, -48980.34041889094, -1.4324910236617816] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + missing(O2d-Cdd) - + group(Cdd-OdOd)' - transport: {model: gas, geometry: linear, diameter: 3.763, well-depth: 244.00106224424113, - polarizability: 2.650000000000001, rotational-relaxation: 2.1, note: GRI-Mech} -- name: CH2OH(18) - composition: {C: 1.0, H: 3.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 895.0163946403012, 5000.0] - data: - - [3.711740249971209, 0.0019311457977334778, 2.123385699735588e-05, -3.031528812969471e-08, - 1.2487574647076677e-11, -4007.4592181376324, 7.292020622080347] - - [6.056318547324978, 0.0030217036257262145, 1.723010962975875e-08, -6.963233382451129e-11, - 5.182581927964743e-15, -4890.513428418116, -6.34776466810346] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + - radical(CsJOH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.6900000000000013, well-depth: 417.00182525120056, - dipole: 1.7000000000000002, rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH3O(19) - composition: {C: 1.0, H: 3.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 916.8968434206298, 5000.0] - data: - - [4.0013327502495155, -0.004156526476422401, 3.263426883212575e-05, -3.7110180766619686e-08, - 1.3570166892492088e-11, -6.151515491093088, 6.8138019013791435] - - [4.016294811471149, 0.006268007893365234, -1.5806074006739916e-06, 2.445890523709642e-10, - -1.70322515470223e-14, -449.83419135504226, 4.338398992219582] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + - radical(H3COJ)' - transport: {model: gas, geometry: nonlinear, diameter: 3.6900000000000013, well-depth: 417.00182525120056, - dipole: 1.7000000000000002, rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH3OH(20) - composition: {C: 1.0, H: 4.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 952.1389545704913, 5000.0] - data: - - [3.8949619311009682, -0.0007713539892289695, 2.6475518384892784e-05, -2.917936605714971e-08, - 1.0083471431111355e-11, -26335.854771452, 6.364759035632583] - - [3.138078144441756, 0.010354206693580961, -3.5695733697248403e-06, 6.222867410402885e-10, - -4.278055990314069e-14, -26551.895548904657, 8.087778812494083] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.626000000000001, well-depth: 481.802091582003, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: C2H(21) - composition: {C: 2.0, H: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1076.5707431623787, 5000.0] - data: - - [3.038526076764681, 0.011544971712654409, -2.1326577630156857e-05, 1.8193498854298534e-08, - -5.415989423373292e-12, 66398.01423981925, 5.966772314365718] - - [4.0084898009954175, 0.0020681108532139827, 6.052628413041129e-08, -1.1771428006220733e-10, - 1.2928664540905204e-14, 66529.5066627588, 2.796357444487442] - note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH) + radical(Acetyl)' - transport: {model: gas, geometry: linear, diameter: 4.1000000000000005, well-depth: 209.00064369691785, - rotational-relaxation: 2.5, note: GRI-Mech} -- name: C2H2(22) - composition: {C: 2.0, H: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 888.6312703495089, 5000.0] - data: - - [3.035741541159452, 0.007712463869898586, 2.5346473132966697e-06, -1.0812907257939146e-08, - 5.507378740942841e-12, 25852.644572333335, 4.544633504234925] - - [5.762059744831072, 0.002371561933486471, -1.495673463818596e-07, -2.1919166811126934e-11, - 2.218103671549502e-15, 25094.44423800569, -9.826166661316744] - note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH)' - transport: {model: gas, geometry: linear, diameter: 4.1000000000000005, well-depth: 209.00064369691785, - rotational-relaxation: 2.5, note: GRI-Mech} -- name: HCCO(23) - composition: {C: 2.0, H: 1.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 936.0638710543434, 5000.0] - data: - - [3.4564741766825713, 0.010572846175575629, -7.359888529672018e-06, 7.973614621605504e-10, - 8.64535565921129e-13, 22595.687980009596, 7.094959264554976] - - [5.998100816612723, 0.0031448048531052264, -9.578070191018402e-07, 1.5562256617433557e-10, - -1.0430952759847218e-14, 21969.466304795515, -5.802337182407708] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) - + missing(Cdd-CdO2d) + radical(Cds_P)' - transport: {model: gas, geometry: nonlinear, diameter: 2.5000000000000013, well-depth: 150.00110650441783, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: C2H3(24) - composition: {C: 2.0, H: 3.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 931.9620386849122, 5000.0] - data: - - [3.9067052224888306, -0.004062407608381454, 3.867799265691756e-05, -4.629762490027485e-08, - 1.729003139946922e-11, 34797.178267497635, 6.097890545879522] - - [5.447966243943666, 0.004983560085949153, -1.0882069947704135e-06, 1.798371274522559e-10, - -1.4509613313229812e-14, 33829.77433382413, -4.878086417352228] - note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH) - + radical(Cds_P)' - transport: {model: gas, geometry: nonlinear, diameter: 4.1000000000000005, well-depth: 209.00064369691785, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: CH2CO(25) - composition: {C: 2.0, H: 2.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 956.6689491705725, 5000.0] - data: - - [3.5274804055011524, 0.007083486242205215, 9.177900378006544e-06, -1.6426489708137257e-08, - 6.711635150789706e-12, -7123.942382209249, 5.743734168371629] - - [5.764889204717002, 0.005965697671832553, -1.9849265041966017e-06, 3.5275927958549083e-10, - -2.5163174396771523e-14, -7928.975322079587, -6.92142788806353] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) - + missing(Cdd-CdO2d)' - transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: C2H4(26) - composition: {C: 2.0, H: 4.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 940.418247087086, 5000.0] - data: - - [3.9798415026745158, -0.007576795695064226, 5.5301749021260425e-05, -6.36282467356439e-08, - 2.3179461952714415e-11, 5077.456720344708, 4.0458828180531095] - - [5.202685599067635, 0.00782495932129625, -2.127146740857326e-06, 3.797651593095124e-10, - -2.9473306602423246e-14, 3936.4075648915114, -6.622380040353341] - note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.9710000000000005, well-depth: 280.80075319274636, - rotational-relaxation: 1.5, note: GRI-Mech} -- name: C2H5(27) - composition: {C: 2.0, H: 5.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 900.3134894489242, 5000.0] - data: - - [3.821836273781996, -0.0034336085398177577, 5.0925745698192944e-05, -6.202118789954702e-08, - 2.3707347111588728e-11, 13066.012891898954, 7.61643257724655] - - [5.156208306185573, 0.009431226276708927, -1.8194603109290526e-06, 2.2119584928108884e-10, - -1.434813619419196e-14, 12064.082793230154, -2.910983837429268] - note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH) + - radical(CCJ)' - transport: {model: gas, geometry: nonlinear, diameter: 4.3020000000000005, well-depth: 252.30104810022812, - rotational-relaxation: 1.5, note: GRI-Mech} -- name: H2O(28) - composition: {H: 2.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1130.229527376887, 5000.0] - data: - - [4.0576350324382435, -0.0007879268259766038, 2.908745359555667e-06, -1.4751533432712154e-09, - 2.128292857644156e-13, -30281.58660142529, -0.31136116480217385] - - [2.8432560092133228, 0.0027510764450291783, -7.81026468417208e-07, 1.072424842465603e-10, - -5.79382842272479e-15, -29958.615252484073, 5.910388340788128] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, diameter: 2.6050000000000004, well-depth: 572.4019516813576, - dipole: 1.8439999999999999, rotational-relaxation: 4.0, note: GRI-Mech} -- name: C(29) - composition: {C: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 3937.4317070531474, 5000.0] - data: - - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, - 3.793163699805646e-24, 85474.52470343211, 3.6597842066730095] - - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, - 1.0844882370603103e-21, 85474.52442196952, 3.659782093957159] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, diameter: 3.2980000000000005, well-depth: 71.40020436655509, - note: GRI-Mech} -- name: HCCOH(30) - composition: {C: 2.0, H: 2.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 1009.8708057502912, 5000.0] - data: - - [3.304087973229727, 0.01250248485622879, -3.7951924250664015e-06, -4.463122728730499e-09, - 2.6631496728579284e-12, 8782.035556651996, 7.197180637326219] - - [6.712469069000979, 0.005148306955083985, -2.0007699389212864e-06, 3.78815894942322e-10, - -2.740886117401159e-14, 7780.2296193740285, -10.831455133638801] - note: 'Thermo group additivity estimation: group(O2s-CtH) + group(Ct-CtOs) + group(Ct-CtH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH2CHO(31) - composition: {C: 2.0, H: 3.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 914.2116020861831, 5000.0] - data: - - [3.347196840427565, 0.0012872740814258146, 5.399868121989472e-05, -7.841438689681067e-08, - 3.240855021277469e-11, -2992.8460602521013, 8.972932135895645] - - [11.726019036050477, -0.0014734544263003628, 2.9073446308875385e-06, -5.969827568656105e-10, - 3.702693978288885e-14, -5941.484167993394, -38.44636767007471] - note: 'Thermo group additivity estimation: group(O2s-(Cds-Cd)H) + group(Cds-CdsOsH) - + group(Cds-CdsHH) + radical(C=COJ)' - transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH3CHO(32) - composition: {C: 2.0, H: 4.0, O: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 984.197680603768, 5000.0] - data: - - [3.7007899203288224, 0.00038782542085882675, 3.8692905312513264e-05, -4.524473009262779e-08, - 1.5885930165726808e-11, -21380.908380185487, 9.13562173300882] - - [4.588891681956185, 0.012889376676989747, -4.915021813955812e-06, 9.26508715798075e-10, - -6.710116145936973e-14, -22336.013760155674, 0.9010890403489865] - note: 'Thermo group additivity estimation: group(Cs-(Cds-O2d)HHH) + group(Cds-OdCsH)' - transport: {model: gas, geometry: nonlinear, diameter: 3.9700000000000006, well-depth: 436.0012277388149, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: C3H8(33) - composition: {C: 3.0, H: 8.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [100.0, 986.5783141978117, 5000.0] - data: - - [3.052552781024803, 0.0125100989428809, 3.7938058095217115e-05, -5.120145693587291e-08, - 1.8706167044773312e-11, -14454.176212770122, 10.067292928454926] - - [5.9132148512337706, 0.021876166894657482, -8.176557517977191e-06, 1.4985333815155727e-09, - -1.0599036819008721e-13, -16038.899994267074, -8.865844996334646] - note: 'Thermo group additivity estimation: group(Cs-CsCsHH) + group(Cs-CsHHH) - + group(Cs-CsHHH)' - transport: {model: gas, geometry: nonlinear, diameter: 4.982000000000001, well-depth: 266.8010668626943, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: N2 - composition: {N: 2.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [3.53101, -0.000123661, -5.02999e-07, 2.43531e-09, -1.40881e-12, -1046.98, 2.96747] - - [2.95258, 0.0013969, -4.92632e-07, 7.8601e-11, -4.60755e-15, -923.949, 5.87189] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, diameter: 3.6210000000000013, well-depth: 97.53030619382686, - polarizability: 1.7600000000000011, rotational-relaxation: 4.0, note: GRI-Mech} -- name: Ar - composition: {Ar: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 4.37967] - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 4.37967] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, diameter: 3.3300000000000005, well-depth: 136.50054988458677, - note: GRI-Mech} -- name: He - composition: {He: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 0.928724] - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 0.928724] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, diameter: 2.5760000000000005, well-depth: 10.2, - note: NOx2018} -- name: Ne - composition: {Ne: 1.0} - thermo: - model: NASA7 - reference-pressure: 10000.0 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 3.35532] - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 3.35532] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, diameter: 3.7580000000000005, well-depth: 148.6, - note: Epsilon & sigma estimated with fixed Lennard Jones Parameters. This is the - fallback method! Try improving transport databases!} -reactions: -- equation: H2(3) + O(2) <=> H(4) + OH(5) - rate-constant: {A: 38.7, b: 2.7, Ea: 26191840.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: HO2(6) + O(2) <=> O2(7) + OH(5) - rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H2O2(8) + O(2) <=> HO2(6) + OH(5) - rate-constant: {A: 9630.0, b: 2.0, Ea: 16736000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + O(2) <=> CO(10) + H(4) - rate-constant: {A: 57000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + O(2) <=> H(4) + HCO(12) - rate-constant: {A: 80000000000.00002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + O(2) <=> CO(10) + H2(3) - rate-constant: {A: 15000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + O(2) <=> H(4) + HCO(12) - rate-constant: {A: 15000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + O(2) <=> CH2O(15) + H(4) - rate-constant: {A: 50600000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH4(16) + O(2) <=> CH3(14) + OH(5) - rate-constant: {A: 1020000.0000000001, b: 1.5, Ea: 35982400.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCO(12) + O(2) <=> CO(10) + OH(5) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCO(12) + O(2) <=> CO2(17) + H(4) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + O(2) <=> HCO(12) + OH(5) - rate-constant: {A: 39000000000.00001, b: 0.0, Ea: 14811360.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + O(2) <=> CH2O(15) + OH(5) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + O(2) <=> CH2O(15) + OH(5) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3OH(20) + O(2) <=> CH2OH(18) + OH(5) - rate-constant: {A: 388.00000000000006, b: 2.5, Ea: 12970400.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3OH(20) + O(2) <=> CH3O(19) + OH(5) - rate-constant: {A: 130.00000000000003, b: 2.5, Ea: 20920000.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H(21) + O(2) <=> CH(9) + CO(10) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + O(2) <=> H(4) + HCCO(23) - rate-constant: {A: 13500.000000000002, b: 2.0, Ea: 7949600.000000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + O(2) <=> C2H(21) + OH(5) - rate-constant: {A: 4.600000000000001e+16, b: -1.41, Ea: 121126800.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + O(2) <=> CH2(11) + CO(10) - rate-constant: {A: 6940.000000000001, b: 2.0, Ea: 7949600.000000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + O(2) <=> CH2CO(25) + H(4) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) + O(2) <=> CH3(14) + HCO(12) - rate-constant: {A: 12500.000000000002, b: 1.83, Ea: 920480.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H5(27) + O(2) <=> CH2O(15) + CH3(14) - rate-constant: {A: 22400000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: O(2) + ethane(1) <=> C2H5(27) + OH(5) - rate-constant: {A: 89800.00000000001, b: 1.92, Ea: 23806960.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCCO(23) + O(2) <=> 2 CO(10) + H(4) - rate-constant: {A: 100000000000.00002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CO(25) + O(2) <=> HCCO(23) + OH(5) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 33472000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CO(25) + O(2) <=> CH2(11) + CO2(17) - rate-constant: {A: 1750000000.0000002, b: 0.0, Ea: 5648400.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CO(10) + O2(7) <=> CO2(17) + O(2) - rate-constant: {A: 2500000000.0000005, b: 0.0, Ea: 199995200.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + O2(7) <=> HCO(12) + HO2(6) - rate-constant: {A: 100000000000.00002, b: 0.0, Ea: 167360000.00000003} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + O2(7) + O2(7) <=> HO2(6) + O2(7) - rate-constant: {A: 20800000000000.004, b: -1.24, Ea: 0.0} - efficiencies: {O2(7): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + O2(7) + H2O(28) <=> HO2(6) + H2O(28) - rate-constant: {A: 11260000000000.002, b: -0.76, Ea: 0.0} - efficiencies: {H2O(28): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + O2(7) <=> O(2) + OH(5) - rate-constant: {A: 26500000000000.004, b: -0.6707, Ea: 71299544.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 H(4) + H2(3) <=> H2(3) + H2(3) - rate-constant: {A: 90000000000.00002, b: -0.6, Ea: 0.0} - efficiencies: {H2(3): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 H(4) + H2O(28) <=> H2(3) + H2O(28) - rate-constant: {A: 60000000000000.01, b: -1.25, Ea: 0.0} - efficiencies: {H2O(28): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 H(4) + CO2(17) <=> H2(3) + CO2(17) - rate-constant: {A: 550000000000000.1, b: -2.0, Ea: 0.0} - efficiencies: {CO2(17): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> H2O(28) + O(2) - rate-constant: {A: 3970000000.0000005, b: 0.0, Ea: 2807464.0000000005} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> H2(3) + O2(7) - rate-constant: {A: 44800000000.00001, b: 0.0, Ea: 4468512.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> 2 OH(5) - rate-constant: {A: 84000000000.00002, b: 0.0, Ea: 2656840.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + H2O2(8) <=> H2(3) + HO2(6) - rate-constant: {A: 12100.000000000002, b: 2.0, Ea: 21756800.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + H2O2(8) <=> H2O(28) + OH(5) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 15062400.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + H(4) <=> C(29) + H2(3) - rate-constant: {A: 165000000000.00003, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + H(4) <=> CH(9) + H2(3) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH4(16) + H(4) <=> CH3(14) + H2(3) - rate-constant: {A: 660000.0000000001, b: 1.62, Ea: 45354560.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HCO(12) <=> CO(10) + H2(3) - rate-constant: {A: 73400000000.00002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + H(4) <=> H2(3) + HCO(12) - rate-constant: {A: 57400.000000000015, b: 1.9, Ea: 11472528.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + H(4) <=> CH2O(15) + H2(3) - rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + H(4) <=> CH3(14) + OH(5) - rate-constant: {A: 165000000.00000003, b: 0.65, Ea: -1188256.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + H(4) <=> CH2(S)(13) + H2O(28) - rate-constant: {A: 32800000000.000004, b: -0.09, Ea: 2552240.0000000005} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + H(4) <=> CH2OH(18) + H(4) - rate-constant: {A: 41500.00000000001, b: 1.63, Ea: 8050016.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + H(4) <=> CH2O(15) + H2(3) - rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + H(4) <=> CH3(14) + OH(5) - rate-constant: {A: 1500000000.0000002, b: 0.5, Ea: -460240.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + H(4) <=> CH2(S)(13) + H2O(28) - rate-constant: {A: 262000000000.00003, b: -0.23, Ea: 4476880.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3OH(20) + H(4) <=> CH2OH(18) + H2(3) - rate-constant: {A: 17000.000000000004, b: 2.1, Ea: 20376080.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3OH(20) + H(4) <=> CH3O(19) + H2(3) - rate-constant: {A: 4200.000000000001, b: 2.1, Ea: 20376080.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + H(4) <=> C2H2(22) + H2(3) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) + H(4) <=> C2H3(24) + H2(3) - rate-constant: {A: 1325.0000000000002, b: 2.53, Ea: 51212160.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H5(27) + H(4) <=> C2H4(26) + H2(3) - rate-constant: {A: 2000000000.0000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + ethane(1) <=> C2H5(27) + H2(3) - rate-constant: {A: 115000.00000000001, b: 1.9, Ea: 31505520.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HCCO(23) <=> CH2(S)(13) + CO(10) - rate-constant: {A: 100000000000.00002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CO(25) + H(4) <=> H2(3) + HCCO(23) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 33472000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CO(25) + H(4) <=> CH3(14) + CO(10) - rate-constant: {A: 11300000000.000002, b: 0.0, Ea: 14342752.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HCCOH(30) <=> CH2CO(25) + H(4) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: H2(3) + OH(5) <=> H(4) + H2O(28) - rate-constant: {A: 216000.00000000003, b: 1.51, Ea: 14351120.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 OH(5) <=> H2O(28) + O(2) - rate-constant: {A: 35.7, b: 2.4, Ea: -8828240.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: HO2(6) + OH(5) <=> H2O(28) + O2(7) - rate-constant: {A: 14500000000.000002, b: 0.0, Ea: -2092000.0} - duplicate: true - note: 'Library reaction: GRI-Mech3.0' -- equation: HO2(6) + OH(5) <=> H2O(28) + O2(7) - rate-constant: {A: 5000000000000.001, b: 0.0, Ea: 72508720.00000001} - duplicate: true - note: 'Library reaction: GRI-Mech3.0' -- equation: H2O2(8) + OH(5) <=> H2O(28) + HO2(6) - rate-constant: {A: 2000000000.0000002, b: 0.0, Ea: 1786568.0} - duplicate: true - note: 'Library reaction: GRI-Mech3.0' -- equation: H2O2(8) + OH(5) <=> H2O(28) + HO2(6) - rate-constant: {A: 1700000000000000.2, b: 0.0, Ea: 123051440.00000001} - duplicate: true - note: 'Library reaction: GRI-Mech3.0' -- equation: C(29) + OH(5) <=> CO(10) + H(4) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + OH(5) <=> H(4) + HCO(12) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + OH(5) <=> CH2O(15) + H(4) - rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + OH(5) <=> CH(9) + H2O(28) - rate-constant: {A: 11300.000000000002, b: 2.0, Ea: 12552000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + OH(5) <=> CH2O(15) + H(4) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + OH(5) <=> CH2(11) + H2O(28) - rate-constant: {A: 56000.00000000001, b: 1.6, Ea: 22677280.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + OH(5) <=> CH2(S)(13) + H2O(28) - rate-constant: {A: 644000000000000.1, b: -1.34, Ea: 5928728.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH4(16) + OH(5) <=> CH3(14) + H2O(28) - rate-constant: {A: 100000.00000000001, b: 1.6, Ea: 13054080.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CO(10) + OH(5) <=> CO2(17) + H(4) - rate-constant: {A: 47600.00000000001, b: 1.228, Ea: 292880.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCO(12) + OH(5) <=> CO(10) + H2O(28) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + OH(5) <=> H2O(28) + HCO(12) - rate-constant: {A: 3430000.0000000005, b: 1.18, Ea: -1870248.0000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + OH(5) <=> CH2O(15) + H2O(28) - rate-constant: {A: 5000000000.000001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + OH(5) <=> CH2O(15) + H2O(28) - rate-constant: {A: 5000000000.000001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3OH(20) + OH(5) <=> CH2OH(18) + H2O(28) - rate-constant: {A: 1440.0000000000002, b: 2.0, Ea: -3514560.0000000005} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3OH(20) + OH(5) <=> CH3O(19) + H2O(28) - rate-constant: {A: 6300.000000000001, b: 2.0, Ea: 6276000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H(21) + OH(5) <=> H(4) + HCCO(23) - rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + OH(5) <=> CH2CO(25) + H(4) - rate-constant: {A: 2.1800000000000005e-07, b: 4.5, Ea: -4184000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + OH(5) <=> H(4) + HCCOH(30) - rate-constant: {A: 504.0000000000001, b: 2.3, Ea: 56484000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + OH(5) <=> C2H(21) + H2O(28) - rate-constant: {A: 33700.0, b: 2.0, Ea: 58576000.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + OH(5) <=> CH3(14) + CO(10) - rate-constant: {A: 4.830000000000001e-07, b: 4.0, Ea: -8368000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + OH(5) <=> C2H2(22) + H2O(28) - rate-constant: {A: 5000000000.000001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) + OH(5) <=> C2H3(24) + H2O(28) - rate-constant: {A: 3600.0000000000005, b: 2.0, Ea: 10460000.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: OH(5) + ethane(1) <=> C2H5(27) + H2O(28) - rate-constant: {A: 3540.0000000000005, b: 2.12, Ea: 3640080.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CO(25) + OH(5) <=> H2O(28) + HCCO(23) - rate-constant: {A: 7500000000.000001, b: 0.0, Ea: 8368000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 HO2(6) <=> H2O2(8) + O2(7) - rate-constant: {A: 130000000.00000001, b: 0.0, Ea: -6819920.000000001} - duplicate: true - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 HO2(6) <=> H2O2(8) + O2(7) - rate-constant: {A: 420000000000.00006, b: 0.0, Ea: 50208000.0} - duplicate: true - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + HO2(6) <=> CH2O(15) + OH(5) - rate-constant: {A: 20000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + HO2(6) <=> CH4(16) + O2(7) - rate-constant: {A: 1000000000.0000001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + HO2(6) <=> CH3O(19) + OH(5) - rate-constant: {A: 37800000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CO(10) + HO2(6) <=> CO2(17) + OH(5) - rate-constant: {A: 150000000000.00003, b: 0.0, Ea: 98742400.00000003} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + HO2(6) <=> H2O2(8) + HCO(12) - rate-constant: {A: 5600.000000000001, b: 2.0, Ea: 50208000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C(29) + O2(7) <=> CO(10) + O(2) - rate-constant: {A: 58000000000.00001, b: 0.0, Ea: 2409984.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C(29) + CH2(11) <=> C2H(21) + H(4) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C(29) + CH3(14) <=> C2H2(22) + H(4) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + O2(7) <=> HCO(12) + O(2) - rate-constant: {A: 67100000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + H2(3) <=> CH2(11) + H(4) - rate-constant: {A: 108000000000.00002, b: 0.0, Ea: 13012240.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + H2O(28) <=> CH2O(15) + H(4) - rate-constant: {A: 5710000000.000001, b: 0.0, Ea: -3158920.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + CH2(11) <=> C2H2(22) + H(4) - rate-constant: {A: 40000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + CH3(14) <=> C2H3(24) + H(4) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + CH4(16) <=> C2H4(26) + H(4) - rate-constant: {A: 60000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + CO2(17) <=> CO(10) + HCO(12) - rate-constant: {A: 190000000000.00003, b: 0.0, Ea: 66073728.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + CH2O(15) <=> CH2CO(25) + H(4) - rate-constant: {A: 94600000000.00002, b: 0.0, Ea: -2154760.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + HCCO(23) <=> C2H2(22) + CO(10) - rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + O2(7) => CO(10) + H(4) + OH(5) - rate-constant: {A: 5000000000.000001, b: 0.0, Ea: 6276000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + H2(3) <=> CH3(14) + H(4) - rate-constant: {A: 500.0000000000001, b: 2.0, Ea: 30250320.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 CH2(11) <=> C2H2(22) + H2(3) - rate-constant: {A: 1600000000000.0002, b: 0.0, Ea: 49973696.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + CH3(14) <=> C2H4(26) + H(4) - rate-constant: {A: 40000000000.00001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + CH4(16) <=> 2 CH3(14) - rate-constant: {A: 2460.0000000000005, b: 2.0, Ea: 34601680.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + HCCO(23) <=> C2H3(24) + CO(10) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + O2(7) <=> CO(10) + H(4) + OH(5) - rate-constant: {A: 28000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + O2(7) <=> CO(10) + H2O(28) - rate-constant: {A: 12000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + H2(3) <=> CH3(14) + H(4) - rate-constant: {A: 70000000000.00002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + H2O(28) <=> CH2(11) + H2O(28) - rate-constant: {A: 30000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CH3(14) <=> C2H4(26) + H(4) - rate-constant: {A: 12000000000.000002, b: 0.0, Ea: -2384880.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CH4(16) <=> 2 CH3(14) - rate-constant: {A: 16000000000.000002, b: 0.0, Ea: -2384880.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CO(10) <=> CH2(11) + CO(10) - rate-constant: {A: 9000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CO2(17) <=> CH2(11) + CO2(17) - rate-constant: {A: 7000000000.000001, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + CO2(17) <=> CH2O(15) + CO(10) - rate-constant: {A: 14000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + ethane(1) <=> C2H5(27) + CH3(14) - rate-constant: {A: 40000000000.00001, b: 0.0, Ea: -2301200.0000000005} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + O2(7) <=> CH3O(19) + O(2) - rate-constant: {A: 35600000000.00001, b: 0.0, Ea: 127528320.00000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + O2(7) <=> CH2O(15) + OH(5) - rate-constant: {A: 2310000000.0000005, b: 0.0, Ea: 84997960.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + H2O2(8) <=> CH4(16) + HO2(6) - rate-constant: {A: 24.500000000000004, b: 2.47, Ea: 21673120.000000004} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 CH3(14) <=> C2H5(27) + H(4) - rate-constant: {A: 6840000000.000001, b: 0.1, Ea: 44350400.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + HCO(12) <=> CH4(16) + CO(10) - rate-constant: {A: 26480000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + CH3(14) <=> CH4(16) + HCO(12) - rate-constant: {A: 3.3200000000000003, b: 2.81, Ea: 24518240.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + CH3OH(20) <=> CH2OH(18) + CH4(16) - rate-constant: {A: 30000.000000000004, b: 1.5, Ea: 41588960.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + CH3OH(20) <=> CH3O(19) + CH4(16) - rate-constant: {A: 10000.000000000002, b: 1.5, Ea: 41588960.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) + CH3(14) <=> C2H3(24) + CH4(16) - rate-constant: {A: 227.00000000000003, b: 2.0, Ea: 38492800.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + ethane(1) <=> C2H5(27) + CH4(16) - rate-constant: {A: 6140.000000000002, b: 1.74, Ea: 43722800.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCO(12) + H2O(28) <=> CO(10) + H(4) + H2O(28) - rate-constant: {A: 1500000000000000.2, b: -1.0, Ea: 71128000.0} - efficiencies: {H2O(28): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCO(12) + O2(7) <=> CO(10) + HO2(6) - rate-constant: {A: 13450000000.000002, b: 0.0, Ea: 1673600.0000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + O2(7) <=> CH2O(15) + HO2(6) - rate-constant: {A: 18000000000.000004, b: 0.0, Ea: 3765600.000000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + O2(7) <=> CH2O(15) + HO2(6) - rate-constant: {A: 4.2800000000000005e-16, b: 7.6, Ea: -14769520.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H(21) + O2(7) <=> CO(10) + HCO(12) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: -3158920.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H(21) + H2(3) <=> C2H2(22) + H(4) - rate-constant: {A: 56800000.00000001, b: 0.9, Ea: 8338712.000000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + O2(7) <=> CH2O(15) + HCO(12) - rate-constant: {A: 45800000000000.01, b: -1.39, Ea: 4246760.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H5(27) + O2(7) <=> C2H4(26) + HO2(6) - rate-constant: {A: 840000000.0000001, b: 0.0, Ea: 16213000.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCCO(23) + O2(7) <=> 2 CO(10) + OH(5) - rate-constant: {A: 3200000000.0000005, b: 0.0, Ea: 3573136.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 HCCO(23) <=> C2H2(22) + 2 CO(10) - rate-constant: {A: 10000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + O(2) => CO(10) + H(4) + H2(3) - rate-constant: {A: 33700000000.000008, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) + O(2) <=> CH2CHO(31) + H(4) - rate-constant: {A: 6700.000000000001, b: 1.83, Ea: 920480.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H5(27) + O(2) <=> CH3CHO(32) + H(4) - rate-constant: {A: 109600000000.00002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + OH(5) => CH2O(15) + H2(3) - rate-constant: {A: 8000000.000000001, b: 0.5, Ea: -7342920.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + O2(7) => CO2(17) + 2 H(4) - rate-constant: {A: 5800000000.000001, b: 0.0, Ea: 6276000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + O2(7) <=> CH2O(15) + O(2) - rate-constant: {A: 2400000000.0000005, b: 0.0, Ea: 6276000.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 CH2(11) => C2H2(22) + 2 H(4) - rate-constant: {A: 200000000000.00003, b: 0.0, Ea: 45977976.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + H2O(28) => CH2O(15) + H2(3) - rate-constant: {A: 68200000.00000001, b: 0.25, Ea: -3912040.0000000005} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + O2(7) <=> CH2CHO(31) + O(2) - rate-constant: {A: 303000000.00000006, b: 0.29, Ea: 46024.00000000001} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + O2(7) <=> C2H2(22) + HO2(6) - rate-constant: {A: 1337.0000000000002, b: 1.61, Ea: -1606656.0000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + O(2) <=> CH2CHO(31) + OH(5) - rate-constant: {A: 2920000000.0000005, b: 0.0, Ea: 7564672.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + O(2) => CH3(14) + CO(10) + OH(5) - rate-constant: {A: 2920000000.0000005, b: 0.0, Ea: 7564672.000000002} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + O2(7) => CH3(14) + CO(10) + HO2(6) - rate-constant: {A: 30100000000.000004, b: 0.0, Ea: 163803600.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + H(4) <=> CH2CHO(31) + H2(3) - rate-constant: {A: 2050000.0000000005, b: 1.16, Ea: 10062520.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + H(4) => CH3(14) + CO(10) + H2(3) - rate-constant: {A: 2050000.0000000005, b: 1.16, Ea: 10062520.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + OH(5) => CH3(14) + CO(10) + H2O(28) - rate-constant: {A: 23430000.000000004, b: 0.73, Ea: -4656792.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + HO2(6) => CH3(14) + CO(10) + H2O2(8) - rate-constant: {A: 3010000000.0000005, b: 0.0, Ea: 49885832.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3CHO(32) + CH3(14) => CH4(16) + CO(10) + CH3(14) - rate-constant: {A: 2720.0000000000005, b: 1.77, Ea: 24769280.000000004} - efficiencies: {CH3(14): 1.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + O(2) => CH2(11) + CO2(17) + H(4) - rate-constant: {A: 150000000000.00003, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + O2(7) => CH2O(15) + CO(10) + OH(5) - rate-constant: {A: 18100000.000000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + O2(7) => 2 HCO(12) + OH(5) - rate-constant: {A: 23500000.000000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + H(4) <=> CH3(14) + HCO(12) - rate-constant: {A: 22000000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + H(4) <=> CH2CO(25) + H2(3) - rate-constant: {A: 11000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + OH(5) <=> CH2CO(25) + H2O(28) - rate-constant: {A: 12000000000.000002, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CHO(31) + OH(5) <=> CH2OH(18) + HCO(12) - rate-constant: {A: 30100000000.000004, b: 0.0, Ea: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 O(2) + M <=> O2(7) + M - rate-constant: {A: 120000000000.00002, b: -1.0, Ea: 0.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.4, CH4(16): 2.0, CO2(17): 3.6, H2O(28): 15.4, - Ar: 0.83} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + O(2) + M <=> OH(5) + M - rate-constant: {A: 500000000000.0001, b: -1.0, Ea: 0.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + O2(7) + M <=> HO2(6) + M - rate-constant: {A: 2800000000000.0005, b: -0.86, Ea: 0.0} - efficiencies: {ethane(1): 1.5, O2(7): 0.0, CO2(17): 1.5, H2O(28): 0.0, N2: 0.0, - Ar: 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 H(4) + M <=> H2(3) + M - rate-constant: {A: 1000000000000.0002, b: -1.0, Ea: 0.0} - efficiencies: {ethane(1): 3.0, H2(3): 0.0, CH4(16): 2.0, CO2(17): 0.0, H2O(28): 0.0, - Ar: 0.63} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + OH(5) + M <=> H2O(28) + M - rate-constant: {A: 2.2000000000000004e+16, b: -2.0, Ea: 0.0} - efficiencies: {ethane(1): 3.0, H2(3): 0.73, CH4(16): 2.0, H2O(28): 3.65, Ar: 0.38} - note: 'Library reaction: GRI-Mech3.0' -- equation: HCO(12) + M <=> CO(10) + H(4) + M - rate-constant: {A: 187000000000000.03, b: -1.0, Ea: 71128000.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 0.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CO(10) + O(2) (+M) <=> CO2(17) (+M) - type: falloff - low-P-rate-constant: {A: 602000000.0000001, b: 0.0, Ea: 12552000.0} - high-P-rate-constant: {A: 18000000.000000004, b: 0.0, Ea: 9978840.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, O2(7): 6.0, CH4(16): 2.0, CO2(17): 3.5, - H2O(28): 6.0, Ar: 0.5} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + H(4) (+M) <=> CH3(14) (+M) - type: falloff - low-P-rate-constant: {A: 1.0400000000000002e+20, b: -2.76, Ea: 6694400.000000001} - high-P-rate-constant: {A: 600000000000.0001, b: 0.0, Ea: 0.0} - Troe: {A: 0.562, T3: 91.0, T1: 5836.0, T2: 8552.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + H(4) (+M) <=> CH4(16) (+M) - type: falloff - low-P-rate-constant: {A: 2.6200000000000006e+27, b: -4.76, Ea: 10208960.000000002} - high-P-rate-constant: {A: 13900000000000.002, b: -0.534, Ea: 2242624.0000000005} - Troe: {A: 0.783, T3: 74.0, T1: 2941.0, T2: 6964.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 3.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HCO(12) (+M) <=> CH2O(15) (+M) - type: falloff - low-P-rate-constant: {A: 2.4700000000000005e+18, b: -2.57, Ea: 1778200.0} - high-P-rate-constant: {A: 1090000000.0000002, b: 0.48, Ea: -1087840.0000000005} - Troe: {A: 0.7824, T3: 271.0, T1: 2755.0, T2: 6570.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + H(4) (+M) <=> CH2OH(18) (+M) - type: falloff - low-P-rate-constant: {A: 1.2700000000000002e+26, b: -4.82, Ea: 27321520.0} - high-P-rate-constant: {A: 540000000.0000001, b: 0.454, Ea: 15062400.000000004} - Troe: {A: 0.7187, T3: 103.00000000000001, T1: 1291.0, T2: 4160.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2O(15) + H(4) (+M) <=> CH3O(19) (+M) - type: falloff - low-P-rate-constant: {A: 2.2000000000000006e+24, b: -4.8, Ea: 23263040.0} - high-P-rate-constant: {A: 540000000.0000001, b: 0.454, Ea: 10878400.000000002} - Troe: {A: 0.758, T3: 94.0, T1: 1555.0, T2: 4200.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2OH(18) + H(4) (+M) <=> CH3OH(20) (+M) - type: falloff - low-P-rate-constant: {A: 4.360000000000001e+25, b: -4.65, Ea: 21254720.0} - high-P-rate-constant: {A: 1055000000.0000002, b: 0.5, Ea: 359824.0} - Troe: {A: 0.6, T3: 100.0, T1: 90000.0, T2: 10000.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3O(19) + H(4) (+M) <=> CH3OH(20) (+M) - type: falloff - low-P-rate-constant: {A: 4.660000000000001e+35, b: -7.44, Ea: 58910720.0} - high-P-rate-constant: {A: 2430000000.0000005, b: 0.515, Ea: 209200.00000000003} - Troe: {A: 0.7, T3: 100.0, T1: 90000.0, T2: 10000.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H(21) + H(4) (+M) <=> C2H2(22) (+M) - type: falloff - low-P-rate-constant: {A: 3.750000000000001e+27, b: -4.8, Ea: 7949600.000000001} - high-P-rate-constant: {A: 100000000000000.02, b: -1.0, Ea: 0.0} - Troe: {A: 0.6464, T3: 132.0, T1: 1315.0, T2: 5566.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H2(22) + H(4) (+M) <=> C2H3(24) (+M) - type: falloff - low-P-rate-constant: {A: 3.8000000000000006e+34, b: -7.27, Ea: 30208480.0} - high-P-rate-constant: {A: 5600000000.000001, b: 0.0, Ea: 10041600.0} - Troe: {A: 0.7507, T3: 98.50000000000001, T1: 1302.0, T2: 4167.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H3(24) + H(4) (+M) <=> C2H4(26) (+M) - type: falloff - low-P-rate-constant: {A: 1.4000000000000004e+24, b: -3.86, Ea: 13890880.000000004} - high-P-rate-constant: {A: 6080000000.000001, b: 0.27, Ea: 1171520.0} - Troe: {A: 0.782, T3: 207.49999999999997, T1: 2663.0, T2: 6095.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) + H(4) (+M) <=> C2H5(27) (+M) - type: falloff - low-P-rate-constant: {A: 6.0000000000000005e+35, b: -7.62, Ea: 29162480.0} - high-P-rate-constant: {A: 540000000.0000001, b: 0.454, Ea: 7614880.000000001} - Troe: {A: 0.9753, T3: 209.99999999999997, T1: 983.9999999999999, T2: 4374.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H5(27) + H(4) (+M) <=> ethane(1) (+M) - type: falloff - low-P-rate-constant: {A: 1.9900000000000005e+35, b: -7.08, Ea: 27970040.0} - high-P-rate-constant: {A: 521000000000000.06, b: -0.99, Ea: 6610720.0} - Troe: {A: 0.8422, T3: 125.0, T1: 2219.0, T2: 6882.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CO(10) + H2(3) (+M) <=> CH2O(15) (+M) - type: falloff - low-P-rate-constant: {A: 5.07e+21, b: -3.42, Ea: 352920400.0} - high-P-rate-constant: {A: 43000.00000000001, b: 1.5, Ea: 333046400.0} - Troe: {A: 0.932, T3: 197.00000000000003, T1: 1540.0, T2: 10300.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 OH(5) (+M) <=> H2O2(8) (+M) - type: falloff - low-P-rate-constant: {A: 2300000000000.0005, b: -0.9, Ea: -7112800.0} - high-P-rate-constant: {A: 74000000000.00002, b: -0.37, Ea: 0.0} - Troe: {A: 0.7346, T3: 94.0, T1: 1756.0, T2: 5182.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH3(14) + OH(5) (+M) <=> CH3OH(20) (+M) - type: falloff - low-P-rate-constant: {A: 4.000000000000001e+30, b: -5.92, Ea: 13137760.0} - high-P-rate-constant: {A: 2790000000000000.5, b: -1.43, Ea: 5564720.0} - Troe: {A: 0.412, T3: 195.0, T1: 5900.0, T2: 6394.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + CO(10) (+M) <=> HCCO(23) (+M) - type: falloff - low-P-rate-constant: {A: 2.6900000000000003e+22, b: -3.74, Ea: 8100224.000000001} - high-P-rate-constant: {A: 50000000000.00001, b: 0.0, Ea: 0.0} - Troe: {A: 0.5757, T3: 237.00000000000003, T1: 1652.0, T2: 5069.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(11) + CO(10) (+M) <=> CH2CO(25) (+M) - type: falloff - low-P-rate-constant: {A: 2.6900000000000006e+27, b: -5.11, Ea: 29685480.0} - high-P-rate-constant: {A: 810000000.0000001, b: 0.5, Ea: 18869840.000000004} - Troe: {A: 0.5907, T3: 275.0, T1: 1226.0, T2: 5185.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2(S)(13) + H2O(28) (+M) <=> CH3OH(20) (+M) - type: falloff - low-P-rate-constant: {A: 1.88e+32, b: -6.36, Ea: 21087360.0} - high-P-rate-constant: {A: 482000000000000.06, b: -1.16, Ea: 4790680.000000001} - Troe: {A: 0.6027, T3: 208.0, T1: 3921.9999999999995, T2: 10180.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0} - note: 'Library reaction: GRI-Mech3.0' -- equation: 2 CH3(14) (+M) <=> ethane(1) (+M) - type: falloff - low-P-rate-constant: {A: 3.400000000000001e+35, b: -7.03, Ea: 11556208.000000002} - high-P-rate-constant: {A: 67700000000000.01, b: -1.18, Ea: 2736336.000000001} - Troe: {A: 0.619, T3: 73.2, T1: 1180.0, T2: 9999.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H4(26) (+M) <=> C2H2(22) + H2(3) (+M) - type: falloff - low-P-rate-constant: {A: 1.5800000000000006e+48, b: -9.3, Ea: 409195200.0} - high-P-rate-constant: {A: 8000000000000.0, b: 0.44, Ea: 363045680.00000006} - Troe: {A: 0.7345, T3: 180.0, T1: 1035.0, T2: 5417.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH(9) + H2(3) (+M) <=> CH3(14) (+M) - type: falloff - low-P-rate-constant: {A: 4.820000000000001e+19, b: -2.8, Ea: 2468560.0000000005} - high-P-rate-constant: {A: 1970000000.0000002, b: 0.43, Ea: -1548080.0000000002} - Troe: {A: 0.578, T3: 122.0, T1: 2535.0, T2: 9365.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: CH2CO(25) + H(4) (+M) <=> CH2CHO(31) (+M) - type: falloff - low-P-rate-constant: {A: 1.0120000000000002e+36, b: -7.63, Ea: 16125136.000000002} - high-P-rate-constant: {A: 486500000.00000006, b: 0.422, Ea: -7342920.0} - Troe: {A: 0.465, T3: 201.0, T1: 1772.9999999999998, T2: 5333.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: C2H5(27) + CH3(14) (+M) <=> C3H8(33) (+M) - type: falloff - low-P-rate-constant: {A: 2.7100000000000003e+68, b: -16.82, Ea: 54663960.00000001} - high-P-rate-constant: {A: 9430000000.000002, b: 0.0, Ea: 0.0} - Troe: {A: 0.1527, T3: 291.0, T1: 2742.0, T2: 7748.0} - efficiencies: {ethane(1): 3.0, H2(3): 2.0, CH4(16): 2.0, CO2(17): 2.0, H2O(28): 6.0, - Ar: 0.7} - note: 'Library reaction: GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> H2O2(8) - rate-constant: {A: 5250690.0, b: 1.27262, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_2CNO->O_3R!H->O - in family R_Recombination.' -- equation: CH(9) + H(4) <=> CH2(S)(13) - rate-constant: {A: 53700000000.0, b: 0.15395, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_N-2CNO->O - in family R_Recombination.' -- equation: H(4) + HCCO(23) <=> CH2CO(25) - rate-constant: {A: 11386000000.0, b: 0.308956, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_Sp-3R!H=2CCNNOO_N-3R!H->O_Ext-3CS-R - in family R_Recombination.' -- equation: C2H(21) + OH(5) <=> HCCOH(30) - rate-constant: {A: 77000000000.0, b: 4.95181e-08, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_N-1R->H_N-1CNOS->N_1COS->O_2R->C_Ext-2C-R - in family R_Recombination.' -- equation: H(4) + HCCO(23) <=> HCCOH(30) - rate-constant: {A: 2805150000.0, b: 0.314888, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_2CNO->O_N-3R!H->O - in family R_Recombination.' -- equation: CH3(14) + HCO(12) <=> CH3CHO(32) - rate-constant: {A: 18100000000.000004, b: 0.0, Ea: 0.0} - note: 'Template reaction: R_Recombination | Matched reaction 71 CH3 + CHO <=> C2H4O - in R_Recombination/training; This reaction matched rate rule [Root_N-1R->H_N-1CNOS->N_N-1COS->O_1CS->C_N-1C-inRing_Ext-2R-R_N-Sp-3R!H-2R_3R!H->O]; - family: R_Recombination' -- equation: CH2CHO(31) + H(4) <=> CH3CHO(32) - rate-constant: {A: 78286700000.0, b: 0.0631113, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_N-2CNO->O_3R!H->C_Sp-3C-2CN - in family R_Recombination.' -- equation: 2 CH(9) <=> C2H2(22) - rate-constant: {A: 99813000.0, b: 0.610916, Ea: 0.0} - note: 'Template reaction: R_Recombination | Estimated from node Root_N-1R->H_N-1CNOS->N_N-1COS->O_1CS->C_N-1C-inRing - in family R_Recombination.' diff --git a/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml b/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml deleted file mode 100644 index 38930866a9..0000000000 --- a/test/rmgpy/test_data/yaml_writer_data/cantera2/from_main_test.yaml +++ /dev/null @@ -1,1255 +0,0 @@ -description: RMG-Py Generated Mechanism -generator: 'RMG-Py CanteraWriter2 at /Users/daniellelucey/RMG-Py/rmgpy/yaml_cantera2.py - (git commit: 063b6b0)' -cantera-version: '3.1' -units: {length: m, time: s, quantity: mol, activation-energy: J/mol} -elements: -- {symbol: D, atomic-weight: 2.014101715758443} -- {symbol: T, atomic-weight: 3.0160490423440933} -- {symbol: CI, atomic-weight: 13.003353960812092} -- {symbol: OI, atomic-weight: 17.999159172177315} -- {symbol: X, atomic-weight: 195.083} -phases: -- name: gas - thermo: ideal-gas - elements: [Ar, Br, C, CI, Cl, D, F, H, He, I, N, Ne, O, OI, S, Si, T, X] - species: [N2, Ar, He, Ne, ethane(1), O(2), H2(3), H(4), OH(5), HO2(6), O2(7), H2O2(8), - CH(9), CO(10), CH2(11), HCO(12), CH2(S)(13), CH3(14), CH2O(15), CH4(16), CO2(17), - CH2OH(18), CH3O(19), CH3OH(20), C2H(21), C2H2(22), HCCO(23), C2H3(24), CH2CO(25), - C2H4(26), C2H5(27), H2O(28), C(29), HCCOH(30), CH2CHO(31), CH3CHO(32), C3H8(33)] - kinetics: gas - transport: mixture-averaged - state: {T: 300.0, P: 1 atm} -species: -- name: ethane(1) - composition: {H: 6, C: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 954.5165316630638, 5000.0] - data: - - [3.7803274333291164, -0.003242536810039668, 5.523771743952032e-05, -6.385765657832756e-08, - 2.286350154835937e-11, -11620.34056878642, 5.2103625138745535] - - [4.589857356655155, 0.01415072957994417, -4.759595608783751e-06, 8.602881051327119e-10, - -6.21711500823632e-14, -12721.776270468992, -3.617537540469888] - note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH)' - transport: {model: gas, geometry: nonlinear, well-depth: 252.30104810022812, diameter: 4.3020000000000005, - rotational-relaxation: 1.5, note: GRI-Mech} -- name: O(2) - composition: {O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 3937.4317070531474, 5000.0] - data: - - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, - 3.793163699805646e-24, 29230.24412855015, 5.126164272659162] - - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, - 1.0844882370603103e-21, 29230.243847087564, 5.126162159943312] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, well-depth: 80.00026940977129, diameter: 2.7500000000000004, - note: GRI-Mech} -- name: H2(3) - composition: {H: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1959.0704060489752, 5000.0] - data: - - [3.4353639487680128, 0.0002127118156028557, -2.7862835897145624e-07, 3.402697677898988e-10, - -7.760384389606823e-14, -1031.3598307378923, -3.9084166738022317] - - [2.788183431931728, 0.0005876180754751174, 1.5902112168376917e-07, -5.527605114100645e-11, - 4.343266442811977e-15, -596.1546540947348, 0.11262832427188434] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, well-depth: 38.00012796964137, diameter: 2.92, - polarizability: 0.7900000000000004, rotational-relaxation: 280.0, note: GRI-Mech} -- name: H(4) - composition: {H: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 3937.4317070531474, 5000.0] - data: - - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, - 3.793163699805646e-24, 25474.217768728387, -0.4449728963637201] - - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, - 1.0844882370603103e-21, 25474.2174872658, -0.4449750090795722] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, well-depth: 145.00018762466215, diameter: 2.0500000000000003, - note: GRI-Mech} -- name: OH(5) - composition: {H: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1145.7521011170168, 5000.0] - data: - - [3.514568038834053, 2.9277405618225407e-05, -5.32163500292442e-07, 1.0194904372190674e-09, - -3.859452377917145e-13, 3414.25419726746, 2.104348847447872] - - [3.071939833652634, 0.0006040156545295, -1.3978269107817313e-08, -2.1344615084426844e-11, - 2.4806570047627186e-15, 3579.3867548969656, 4.577999949781534] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, well-depth: 80.00026940977129, diameter: 2.7500000000000004, - note: GRI-Mech} -- name: HO2(6) - composition: {H: 1, O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 932.1587116923824, 5000.0] - data: - - [4.045943172132462, -0.001734626698454687, 1.0376573386756708e-05, -1.0220143747577855e-08, - 3.3490365122259157e-12, -986.754171996653, 4.635818986467584] - - [3.210243785202328, 0.0036794108355443496, -1.2770104000866958e-06, 2.1804398774112111e-10, - -1.4633687091481033e-14, -910.3706242716864, 8.182889562642405] - note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH) + radical(HOOJ)' - transport: {model: gas, geometry: nonlinear, well-depth: 107.40032560095216, diameter: 3.458000000000001, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: O2(7) - composition: {O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1074.5559874666221, 5000.0] - data: - - [3.5373217113695397, -0.0012157081866178787, 5.3161744753665525e-06, -4.894429543084893e-09, - 1.4584485293487145e-12, -1038.5884568564704, 4.6836844075736] - - [3.1538247849326697, 0.001678037130877558, -7.699705205295331e-07, 1.5127459750571054e-10, - -1.0878170489110307e-14, -1040.8190172537113, 6.167535803814269] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, well-depth: 107.40032560095216, diameter: 3.458000000000001, - polarizability: 1.6000000000000008, rotational-relaxation: 3.8, note: GRI-Mech} -- name: H2O2(8) - composition: {H: 2, O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 908.8554823511466, 5000.0] - data: - - [3.73137614050705, 0.003350482514942175, 9.351187533876275e-06, -1.5211168513411492e-08, - 6.416412701320585e-12, -17721.171582843155, 5.459044225733844] - - [5.415737793495593, 0.0026101678952029977, -4.399430439107962e-07, 4.912101201717723e-11, - -3.3529149506348695e-15, -18302.932441143923, -4.022205933495868] - note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH)' - transport: {model: gas, geometry: nonlinear, well-depth: 107.40032560095216, diameter: 3.458000000000001, - rotational-relaxation: 3.8, note: GRI-Mech} -- name: CH(9) - composition: {H: 1, C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 926.5000868614704, 5000.0] - data: - - [4.114884169085687, -0.0003610608257374108, -6.347367058134333e-06, 1.0588806976351849e-08, - -4.570581724984619e-12, 75083.85534754528, 1.612693511378359] - - [2.3397304757095996, 0.0017585841964054565, -8.029181981027698e-07, 1.4045776206801416e-10, - -8.474993553681503e-15, 75650.7519481187, 11.325457559946967] - note: 'Thermo library: primaryThermoLibrary + radical(Cs_P)' - transport: {model: gas, geometry: linear, well-depth: 80.00026940977129, diameter: 2.7500000000000004, - note: GRI-Mech} -- name: CO(10) - composition: {C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1571.635577343377, 5000.0] - data: - - [3.5683800484025916, -0.0008521262670226395, 2.4891796966658126e-06, -1.5633120860143723e-09, - 3.135957994412226e-13, -14284.2549422392, 3.579121538053434] - - [2.9130626306424436, 0.0016465842199386833, -6.886180363700936e-07, 1.2103804382683996e-10, - -7.840232784477964e-15, -14180.882416118407, 6.710481156838912] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, well-depth: 98.10027624123336, diameter: 3.6500000000000004, - polarizability: 1.9500000000000008, rotational-relaxation: 1.8, note: GRI-Mech} -- name: CH2(11) - composition: {H: 2, C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1104.6267239631795, 5000.0] - data: - - [4.0119238173266885, -0.00015497815596776285, 3.262976760818217e-06, -2.4042168549424923e-09, - 5.694963373961063e-13, 45867.680222863884, 0.5332007195283763] - - [3.149833606344721, 0.0029667430594348385, -9.760561249263692e-07, 1.5411534787212476e-10, - -9.503386955575038e-15, 46058.13913461232, 4.778078110804035] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, well-depth: 144.00072548202698, diameter: 3.8, - note: GRI-Mech} -- name: HCO(12) - composition: {H: 1, C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1565.7120792018852, 5000.0] - data: - - [4.356024400619503, -0.003470912211025233, 1.2566525897003503e-05, -9.994991807684093e-09, - 2.278917370374692e-12, 3995.7703318779218, 2.751111427914028] - - [4.618520755148811, 0.005044772485178862, -4.392513089795063e-06, 9.733048740473051e-10, - -7.074534554082162e-14, 2787.582246997859, -2.2287435033652683] - note: 'Thermo group additivity estimation: group(Cds-OdHH) + radical(HCdsJO)' - transport: {model: gas, geometry: nonlinear, well-depth: 498.001556803607, diameter: 3.5900000000000007, - note: GRI-Mech} -- name: CH2(S)(13) - composition: {H: 2, C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1442.3580101782086, 5000.0] - data: - - [4.102643682622427, -0.0014406835121726618, 5.450688287473449e-06, -3.5800194681993524e-09, - 7.561924806653407e-13, 50400.57849602855, -0.4117655884033766] - - [2.6264740273422635, 0.003947629223585963, -1.4992413415313327e-06, 2.545391499915196e-10, - -1.629558318782858e-14, 50691.75316398369, 6.783790698934837] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, well-depth: 144.00072548202698, diameter: 3.8, - note: GRI-Mech} -- name: CH3(14) - composition: {H: 3, C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1337.627303178629, 5000.0] - data: - - [3.915467627996589, 0.001841543038966437, 3.4874181471700314e-06, -3.327476648677652e-09, - 8.499570768410386e-13, 16285.639371722482, 0.3517414228537716] - - [3.5414572225301972, 0.004767868738173273, -1.8214844677356902e-06, 3.2887663334895645e-10, - -2.2254563074621602e-14, 16223.958038756007, 1.660351193289797] - note: 'Thermo library: primaryThermoLibrary + radical(CH3)' - transport: {model: gas, geometry: nonlinear, well-depth: 144.00072548202698, diameter: 3.8, - note: GRI-Mech} -- name: CH2O(15) - composition: {H: 2, C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1402.2848955097152, 5000.0] - data: - - [4.322893745207224, -0.005063249479937248, 2.1515495168109833e-05, -1.76520795881397e-08, - 4.3181303801961645e-12, -14278.956366088585, 2.3924335479025562] - - [3.1799898971516543, 0.00955593266295388, -6.272986551368634e-06, 1.3355389892308e-09, - -9.68405406001952e-14, -15075.245773494298, 4.310542416920189] - note: 'Thermo group additivity estimation: group(Cds-OdHH)' - transport: {model: gas, geometry: nonlinear, well-depth: 498.001556803607, diameter: 3.5900000000000007, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH4(16) - composition: {H: 4, C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1084.1178897101286, 5000.0] - data: - - [4.205416684633066, -0.005355590254627177, 2.511238250111796e-05, -2.137635320163276e-08, - 5.9752670131915595e-12, -10161.943368029231, -0.9212844871470729] - - [0.9082573996547298, 0.011454099528933412, -4.571746006222714e-06, 8.291934667300837e-10, - -5.66316365457203e-14, -9719.970790335326, 13.993141571614126] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, well-depth: 141.400440100105, diameter: 3.746000000000001, - polarizability: 2.6000000000000014, rotational-relaxation: 13.0, note: GRI-Mech} -- name: CO2(17) - composition: {C: 1, O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 988.874846895476, 5000.0] - data: - - [3.278622967759262, 0.002741382373989827, 7.161238132337091e-06, -1.0803389384388666e-08, - 4.1431045806313505e-12, -48470.314952383545, 5.979323504737395] - - [4.546050274062975, 0.002919210558291122, -1.1548821046550818e-06, 2.276642852647346e-10, - -1.7091875765043676e-14, -48980.34041889094, -1.4324910236617816] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + missing(O2d-Cdd) - + group(Cdd-OdOd)' - transport: {model: gas, geometry: linear, well-depth: 244.00106224424113, diameter: 3.763, - polarizability: 2.650000000000001, rotational-relaxation: 2.1, note: GRI-Mech} -- name: CH2OH(18) - composition: {H: 3, C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 895.0163946403012, 5000.0] - data: - - [3.711740249971209, 0.0019311457977334778, 2.123385699735588e-05, -3.031528812969471e-08, - 1.2487574647076677e-11, -4007.4592181376324, 7.292020622080347] - - [6.056318547324978, 0.0030217036257262145, 1.723010962975875e-08, -6.963233382451129e-11, - 5.182581927964743e-15, -4890.513428418116, -6.34776466810346] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + - radical(CsJOH)' - transport: {model: gas, geometry: nonlinear, well-depth: 417.00182525120056, diameter: 3.690000000000001, - dipole: 1.7000000000000006, rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH3O(19) - composition: {H: 3, C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 916.8968434206298, 5000.0] - data: - - [4.0013327502495155, -0.004156526476422401, 3.263426883212575e-05, -3.7110180766619686e-08, - 1.3570166892492088e-11, -6.151515491093088, 6.8138019013791435] - - [4.016294811471149, 0.006268007893365234, -1.5806074006739916e-06, 2.445890523709642e-10, - -1.70322515470223e-14, -449.83419135504226, 4.338398992219582] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) + - radical(H3COJ)' - transport: {model: gas, geometry: nonlinear, well-depth: 417.00182525120056, diameter: 3.690000000000001, - dipole: 1.7000000000000006, rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH3OH(20) - composition: {H: 4, C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 952.1389545704913, 5000.0] - data: - - [3.8949619311009682, -0.0007713539892289695, 2.6475518384892784e-05, -2.917936605714971e-08, - 1.0083471431111355e-11, -26335.854771452, 6.364759035632583] - - [3.138078144441756, 0.010354206693580961, -3.5695733697248403e-06, 6.222867410402885e-10, - -4.278055990314069e-14, -26551.895548904657, 8.087778812494083] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH)' - transport: {model: gas, geometry: nonlinear, well-depth: 481.802091582003, diameter: 3.626000000000001, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: C2H(21) - composition: {H: 1, C: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1076.5707431623787, 5000.0] - data: - - [3.038526076764681, 0.011544971712654409, -2.1326577630156857e-05, 1.8193498854298534e-08, - -5.415989423373292e-12, 66398.01423981925, 5.966772314365718] - - [4.0084898009954175, 0.0020681108532139827, 6.052628413041129e-08, -1.1771428006220733e-10, - 1.2928664540905204e-14, 66529.5066627588, 2.796357444487442] - note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH) + radical(Acetyl)' - transport: {model: gas, geometry: linear, well-depth: 209.00064369691785, diameter: 4.1000000000000005, - rotational-relaxation: 2.5, note: GRI-Mech} -- name: C2H2(22) - composition: {H: 2, C: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 888.6312703495089, 5000.0] - data: - - [3.035741541159452, 0.007712463869898586, 2.5346473132966697e-06, -1.0812907257939146e-08, - 5.507378740942841e-12, 25852.644572333335, 4.544633504234925] - - [5.762059744831072, 0.002371561933486471, -1.495673463818596e-07, -2.1919166811126934e-11, - 2.218103671549502e-15, 25094.44423800569, -9.826166661316744] - note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH)' - transport: {model: gas, geometry: linear, well-depth: 209.00064369691785, diameter: 4.1000000000000005, - rotational-relaxation: 2.5, note: GRI-Mech} -- name: HCCO(23) - composition: {H: 1, C: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 936.0638710543434, 5000.0] - data: - - [3.4564741766825713, 0.010572846175575629, -7.359888529672018e-06, 7.973614621605504e-10, - 8.64535565921129e-13, 22595.687980009596, 7.094959264554976] - - [5.998100816612723, 0.0031448048531052264, -9.578070191018402e-07, 1.5562256617433557e-10, - -1.0430952759847218e-14, 21969.466304795515, -5.802337182407708] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) - + missing(Cdd-CdO2d) + radical(Cds_P)' - transport: {model: gas, geometry: nonlinear, well-depth: 150.00110650441783, diameter: 2.500000000000001, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: C2H3(24) - composition: {H: 3, C: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 931.9620386849122, 5000.0] - data: - - [3.9067052224888306, -0.004062407608381454, 3.867799265691756e-05, -4.629762490027485e-08, - 1.729003139946922e-11, 34797.178267497635, 6.097890545879522] - - [5.447966243943666, 0.004983560085949153, -1.0882069947704135e-06, 1.798371274522559e-10, - -1.4509613313229812e-14, 33829.77433382413, -4.878086417352228] - note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH) - + radical(Cds_P)' - transport: {model: gas, geometry: nonlinear, well-depth: 209.00064369691785, diameter: 4.1000000000000005, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: CH2CO(25) - composition: {H: 2, C: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 956.6689491705725, 5000.0] - data: - - [3.5274804055011524, 0.007083486242205215, 9.177900378006544e-06, -1.6426489708137257e-08, - 6.711635150789706e-12, -7123.942382209249, 5.743734168371629] - - [5.764889204717002, 0.005965697671832553, -1.9849265041966017e-06, 3.5275927958549083e-10, - -2.5163174396771523e-14, -7928.975322079587, -6.92142788806353] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) - + missing(Cdd-CdO2d)' - transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: C2H4(26) - composition: {H: 4, C: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 940.418247087086, 5000.0] - data: - - [3.9798415026745158, -0.007576795695064226, 5.5301749021260425e-05, -6.36282467356439e-08, - 2.3179461952714415e-11, 5077.456720344708, 4.0458828180531095] - - [5.202685599067635, 0.00782495932129625, -2.127146740857326e-06, 3.797651593095124e-10, - -2.9473306602423246e-14, 3936.4075648915114, -6.622380040353341] - note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH)' - transport: {model: gas, geometry: nonlinear, well-depth: 280.80075319274636, diameter: 3.9710000000000005, - rotational-relaxation: 1.5, note: GRI-Mech} -- name: C2H5(27) - composition: {H: 5, C: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 900.3134894489242, 5000.0] - data: - - [3.821836273781996, -0.0034336085398177577, 5.0925745698192944e-05, -6.202118789954702e-08, - 2.3707347111588728e-11, 13066.012891898954, 7.61643257724655] - - [5.156208306185573, 0.009431226276708927, -1.8194603109290526e-06, 2.2119584928108884e-10, - -1.434813619419196e-14, 12064.082793230154, -2.910983837429268] - note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH) + - radical(CCJ)' - transport: {model: gas, geometry: nonlinear, well-depth: 252.30104810022812, diameter: 4.3020000000000005, - rotational-relaxation: 1.5, note: GRI-Mech} -- name: H2O(28) - composition: {H: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1130.229527376887, 5000.0] - data: - - [4.0576350324382435, -0.0007879268259766038, 2.908745359555667e-06, -1.4751533432712154e-09, - 2.128292857644156e-13, -30281.58660142529, -0.31136116480217385] - - [2.8432560092133228, 0.0027510764450291783, -7.81026468417208e-07, 1.072424842465603e-10, - -5.79382842272479e-15, -29958.615252484073, 5.910388340788128] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: nonlinear, well-depth: 572.4019516813576, diameter: 2.6050000000000004, - dipole: 1.8440000000000003, rotational-relaxation: 4.0, note: GRI-Mech} -- name: C(29) - composition: {C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 3937.4317070531474, 5000.0] - data: - - [2.500000000007047, -4.355965157936201e-14, 6.018702929241786e-17, -2.722301540443986e-20, - 3.793163699805646e-24, 85474.52470343211, 3.6597842066730095] - - [2.5000003378922293, -3.234537149837559e-10, 1.1570635152611676e-13, -1.832787034677946e-17, - 1.0844882370603103e-21, 85474.52442196952, 3.659782093957159] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, well-depth: 71.40020436655509, diameter: 3.2980000000000005, - note: GRI-Mech} -- name: HCCOH(30) - composition: {H: 2, C: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1009.8708057502912, 5000.0] - data: - - [3.304087973229727, 0.01250248485622879, -3.7951924250664015e-06, -4.463122728730499e-09, - 2.6631496728579284e-12, 8782.035556651996, 7.197180637326219] - - [6.712469069000979, 0.005148306955083985, -2.0007699389212864e-06, 3.78815894942322e-10, - -2.740886117401159e-14, 7780.2296193740285, -10.831455133638801] - note: 'Thermo group additivity estimation: group(O2s-CtH) + group(Ct-CtOs) + group(Ct-CtH)' - transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH2CHO(31) - composition: {H: 3, C: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 914.2116020861831, 5000.0] - data: - - [3.347196840427565, 0.0012872740814258146, 5.399868121989472e-05, -7.841438689681067e-08, - 3.240855021277469e-11, -2992.8460602521013, 8.972932135895645] - - [11.726019036050477, -0.0014734544263003628, 2.9073446308875385e-06, -5.969827568656105e-10, - 3.702693978288885e-14, -5941.484167993394, -38.44636767007471] - note: 'Thermo group additivity estimation: group(O2s-(Cds-Cd)H) + group(Cds-CdsOsH) - + group(Cds-CdsHH) + radical(C=COJ)' - transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: CH3CHO(32) - composition: {H: 4, C: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 984.197680603768, 5000.0] - data: - - [3.7007899203288224, 0.00038782542085882675, 3.8692905312513264e-05, -4.524473009262779e-08, - 1.5885930165726808e-11, -21380.908380185487, 9.13562173300882] - - [4.588891681956185, 0.012889376676989747, -4.915021813955812e-06, 9.26508715798075e-10, - -6.710116145936973e-14, -22336.013760155674, 0.9010890403489865] - note: 'Thermo group additivity estimation: group(Cs-(Cds-O2d)HHH) + group(Cds-OdCsH)' - transport: {model: gas, geometry: nonlinear, well-depth: 436.0012277388149, diameter: 3.9700000000000006, - rotational-relaxation: 2.0, note: GRI-Mech} -- name: C3H8(33) - composition: {H: 8, C: 3} - thermo: - model: NASA7 - temperature-ranges: [100.0, 986.5783141978117, 5000.0] - data: - - [3.052552781024803, 0.0125100989428809, 3.7938058095217115e-05, -5.120145693587291e-08, - 1.8706167044773312e-11, -14454.176212770122, 10.067292928454926] - - [5.9132148512337706, 0.021876166894657482, -8.176557517977191e-06, 1.4985333815155727e-09, - -1.0599036819008721e-13, -16038.899994267074, -8.865844996334646] - note: 'Thermo group additivity estimation: group(Cs-CsCsHH) + group(Cs-CsHHH) - + group(Cs-CsHHH)' - transport: {model: gas, geometry: nonlinear, well-depth: 266.8010668626943, diameter: 4.982000000000001, - rotational-relaxation: 1.0, note: GRI-Mech} -- name: N2 - composition: {N: 2} - thermo: - model: NASA7 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [3.53101, -0.000123661, -5.02999e-07, 2.43531e-09, -1.40881e-12, -1046.98, 2.96747] - - [2.95258, 0.0013969, -4.92632e-07, 7.8601e-11, -4.60755e-15, -923.949, 5.87189] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: linear, well-depth: 97.53030619382686, diameter: 3.621000000000001, - polarizability: 1.760000000000001, rotational-relaxation: 4.0, note: GRI-Mech} -- name: Ar - composition: {Ar: 1} - thermo: - model: NASA7 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 4.37967] - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 4.37967] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, well-depth: 136.50054988458677, diameter: 3.3300000000000005, - note: GRI-Mech} -- name: He - composition: {He: 1} - thermo: - model: NASA7 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 0.928724] - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 0.928724] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, well-depth: 10.2, diameter: 2.5760000000000005, - note: NOx2018} -- name: Ne - composition: {Ne: 1} - thermo: - model: NASA7 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 3.35532] - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 3.35532] - note: 'Thermo library: primaryThermoLibrary' - transport: {model: gas, geometry: atom, well-depth: 148.6, diameter: 3.758, note: Epsilon - & sigma estimated with fixed Lennard Jones Parameters. This is the fallback - method! Try improving transport databases!} -reactions: -- equation: O(2) + H2(3) <=> H(4) + OH(5) - rate-constant: {A: 0.038700000000000005, b: 2.7, Ea: 26191.84} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + HO2(6) <=> O2(7) + OH(5) - rate-constant: {A: 20000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + H2O2(8) <=> OH(5) + HO2(6) - rate-constant: {A: 9.63, b: 2.0, Ea: 16736.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH(9) <=> H(4) + CO(10) - rate-constant: {A: 57000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2(11) <=> H(4) + HCO(12) - rate-constant: {A: 80000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2(S)(13) <=> H2(3) + CO(10) - rate-constant: {A: 15000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2(S)(13) <=> H(4) + HCO(12) - rate-constant: {A: 15000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3(14) <=> H(4) + CH2O(15) - rate-constant: {A: 50600000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH4(16) <=> OH(5) + CH3(14) - rate-constant: {A: 1020.0000000000001, b: 1.5, Ea: 35982.4} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + HCO(12) <=> OH(5) + CO(10) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + HCO(12) <=> H(4) + CO2(17) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2O(15) <=> OH(5) + HCO(12) - rate-constant: {A: 39000000.00000001, b: 0.0, Ea: 14811.36} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2OH(18) <=> OH(5) + CH2O(15) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3O(19) <=> OH(5) + CH2O(15) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3OH(20) <=> OH(5) + CH2OH(18) - rate-constant: {A: 0.38800000000000007, b: 2.5, Ea: 12970.4} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3OH(20) <=> OH(5) + CH3O(19) - rate-constant: {A: 0.13000000000000003, b: 2.5, Ea: 20920.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H(21) <=> CO(10) + CH(9) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H2(22) <=> H(4) + HCCO(23) - rate-constant: {A: 13.500000000000002, b: 2.0, Ea: 7949.6} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H2(22) <=> OH(5) + C2H(21) - rate-constant: {A: 46000000000000.01, b: -1.41, Ea: 121126.8} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H2(22) <=> CO(10) + CH2(11) - rate-constant: {A: 6.940000000000001, b: 2.0, Ea: 7949.6} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H3(24) <=> H(4) + CH2CO(25) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H4(26) <=> HCO(12) + CH3(14) - rate-constant: {A: 12.500000000000002, b: 1.83, Ea: 920.48} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H5(27) <=> CH2O(15) + CH3(14) - rate-constant: {A: 22400000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + ethane(1) <=> OH(5) + C2H5(27) - rate-constant: {A: 89.80000000000001, b: 1.92, Ea: 23806.96} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + HCCO(23) <=> H(4) + CO(10) + CO(10) - rate-constant: {A: 100000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2CO(25) <=> OH(5) + HCCO(23) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: 33472.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2CO(25) <=> CO2(17) + CH2(11) - rate-constant: {A: 1750000.0000000002, b: 0.0, Ea: 5648.400000000001} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CO(10) <=> O(2) + CO2(17) - rate-constant: {A: 2500000.0000000005, b: 0.0, Ea: 199995.2} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2O(15) <=> HO2(6) + HCO(12) - rate-constant: {A: 100000000.00000001, b: 0.0, Ea: 167360.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + O2(7) + H(4) <=> O2(7) + HO2(6) - rate-constant: {A: 20800000.000000004, b: -1.24, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + H(4) + H2O(28) <=> HO2(6) + H2O(28) - rate-constant: {A: 11260000.000000002, b: -0.76, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + H(4) <=> O(2) + OH(5) - rate-constant: {A: 26500000000.000004, b: -0.6707, Ea: 71299.54400000001} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + H(4) + H2(3) <=> H2(3) + H2(3) - rate-constant: {A: 90000.00000000001, b: -0.6, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + H(4) + H2O(28) <=> H2(3) + H2O(28) - rate-constant: {A: 60000000.00000001, b: -1.25, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + H(4) + CO2(17) <=> H2(3) + CO2(17) - rate-constant: {A: 550000000.0000001, b: -2.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> O(2) + H2O(28) - rate-constant: {A: 3970000.0000000005, b: 0.0, Ea: 2807.464} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> O2(7) + H2(3) - rate-constant: {A: 44800000.00000001, b: 0.0, Ea: 4468.512000000001} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> OH(5) + OH(5) - rate-constant: {A: 84000000.00000001, b: 0.0, Ea: 2656.84} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + H2O2(8) <=> HO2(6) + H2(3) - rate-constant: {A: 12.100000000000001, b: 2.0, Ea: 21756.8} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + H2O2(8) <=> OH(5) + H2O(28) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: 15062.400000000001} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH(9) <=> H2(3) + C(29) - rate-constant: {A: 165000000.00000003, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2(S)(13) <=> H2(3) + CH(9) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH4(16) <=> H2(3) + CH3(14) - rate-constant: {A: 660.0000000000001, b: 1.62, Ea: 45354.560000000005} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HCO(12) <=> H2(3) + CO(10) - rate-constant: {A: 73400000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2O(15) <=> H2(3) + HCO(12) - rate-constant: {A: 57.40000000000001, b: 1.9, Ea: 11472.528} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2OH(18) <=> H2(3) + CH2O(15) - rate-constant: {A: 20000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2OH(18) <=> OH(5) + CH3(14) - rate-constant: {A: 165000.00000000003, b: 0.65, Ea: -1188.256} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2OH(18) <=> H2O(28) + CH2(S)(13) - rate-constant: {A: 32800000.000000004, b: -0.09, Ea: 2552.2400000000002} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3O(19) <=> H(4) + CH2OH(18) - rate-constant: {A: 41.50000000000001, b: 1.63, Ea: 8050.0160000000005} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3O(19) <=> H2(3) + CH2O(15) - rate-constant: {A: 20000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3O(19) <=> OH(5) + CH3(14) - rate-constant: {A: 1500000.0000000002, b: 0.5, Ea: -460.24} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3O(19) <=> H2O(28) + CH2(S)(13) - rate-constant: {A: 262000000.00000003, b: -0.23, Ea: 4476.88} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3OH(20) <=> H2(3) + CH2OH(18) - rate-constant: {A: 17.000000000000004, b: 2.1, Ea: 20376.08} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3OH(20) <=> H2(3) + CH3O(19) - rate-constant: {A: 4.200000000000001, b: 2.1, Ea: 20376.08} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H3(24) <=> H2(3) + C2H2(22) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H4(26) <=> H2(3) + C2H3(24) - rate-constant: {A: 1.3250000000000002, b: 2.53, Ea: 51212.16} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H5(27) <=> H2(3) + C2H4(26) - rate-constant: {A: 2000000.0000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + ethane(1) <=> H2(3) + C2H5(27) - rate-constant: {A: 115.00000000000001, b: 1.9, Ea: 31505.52} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HCCO(23) <=> CO(10) + CH2(S)(13) - rate-constant: {A: 100000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2CO(25) <=> H2(3) + HCCO(23) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 33472.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2CO(25) <=> CO(10) + CH3(14) - rate-constant: {A: 11300000.000000002, b: 0.0, Ea: 14342.752} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HCCOH(30) <=> H(4) + CH2CO(25) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + H2(3) <=> H(4) + H2O(28) - rate-constant: {A: 216.00000000000003, b: 1.51, Ea: 14351.12} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + OH(5) <=> O(2) + H2O(28) - rate-constant: {A: 0.0357, b: 2.4, Ea: -8828.24} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + HO2(6) <=> O2(7) + H2O(28) - duplicate: true - rate-constant: {A: 14500000.000000002, b: 0.0, Ea: -2092.0} -- equation: OH(5) + HO2(6) <=> O2(7) + H2O(28) - duplicate: true - rate-constant: {A: 5000000000.000001, b: 0.0, Ea: 72508.72} -- equation: OH(5) + H2O2(8) <=> HO2(6) + H2O(28) - duplicate: true - rate-constant: {A: 2000000.0000000002, b: 0.0, Ea: 1786.568} -- equation: OH(5) + H2O2(8) <=> HO2(6) + H2O(28) - duplicate: true - rate-constant: {A: 1700000000000.0002, b: 0.0, Ea: 123051.44} -- equation: OH(5) + C(29) <=> H(4) + CO(10) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH(9) <=> H(4) + HCO(12) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2(11) <=> H(4) + CH2O(15) - rate-constant: {A: 20000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2(11) <=> H2O(28) + CH(9) - rate-constant: {A: 11.300000000000002, b: 2.0, Ea: 12552.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2(S)(13) <=> H(4) + CH2O(15) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3(14) <=> H2O(28) + CH2(11) - rate-constant: {A: 56.00000000000001, b: 1.6, Ea: 22677.280000000002} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3(14) <=> H2O(28) + CH2(S)(13) - rate-constant: {A: 644000000000.0001, b: -1.34, Ea: 5928.728} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH4(16) <=> H2O(28) + CH3(14) - rate-constant: {A: 100.00000000000001, b: 1.6, Ea: 13054.08} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CO(10) <=> H(4) + CO2(17) - rate-constant: {A: 47.60000000000001, b: 1.228, Ea: 292.88} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + HCO(12) <=> H2O(28) + CO(10) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2O(15) <=> H2O(28) + HCO(12) - rate-constant: {A: 3430.0000000000005, b: 1.18, Ea: -1870.248} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2OH(18) <=> H2O(28) + CH2O(15) - rate-constant: {A: 5000000.000000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3O(19) <=> H2O(28) + CH2O(15) - rate-constant: {A: 5000000.000000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3OH(20) <=> H2O(28) + CH2OH(18) - rate-constant: {A: 1.4400000000000002, b: 2.0, Ea: -3514.56} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3OH(20) <=> H2O(28) + CH3O(19) - rate-constant: {A: 6.300000000000001, b: 2.0, Ea: 6276.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H(21) <=> H(4) + HCCO(23) - rate-constant: {A: 20000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H2(22) <=> H(4) + CH2CO(25) - rate-constant: {A: 2.1800000000000005e-10, b: 4.5, Ea: -4184.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H2(22) <=> H(4) + HCCOH(30) - rate-constant: {A: 0.5040000000000001, b: 2.3, Ea: 56484.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H2(22) <=> H2O(28) + C2H(21) - rate-constant: {A: 33.7, b: 2.0, Ea: 58576.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H2(22) <=> CO(10) + CH3(14) - rate-constant: {A: 4.830000000000001e-10, b: 4.0, Ea: -8368.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H3(24) <=> H2O(28) + C2H2(22) - rate-constant: {A: 5000000.000000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + C2H4(26) <=> H2O(28) + C2H3(24) - rate-constant: {A: 3.6000000000000005, b: 2.0, Ea: 10460.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + ethane(1) <=> H2O(28) + C2H5(27) - rate-constant: {A: 3.5400000000000005, b: 2.12, Ea: 3640.08} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2CO(25) <=> H2O(28) + HCCO(23) - rate-constant: {A: 7500000.000000001, b: 0.0, Ea: 8368.0} - note: 'Source: Library GRI-Mech3.0' -- equation: HO2(6) + HO2(6) <=> O2(7) + H2O2(8) - duplicate: true - rate-constant: {A: 130000.00000000001, b: 0.0, Ea: -6819.92} -- equation: HO2(6) + HO2(6) <=> O2(7) + H2O2(8) - duplicate: true - rate-constant: {A: 420000000.00000006, b: 0.0, Ea: 50208.0} -- equation: HO2(6) + CH2(11) <=> OH(5) + CH2O(15) - rate-constant: {A: 20000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: HO2(6) + CH3(14) <=> O2(7) + CH4(16) - rate-constant: {A: 1000000.0000000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: HO2(6) + CH3(14) <=> OH(5) + CH3O(19) - rate-constant: {A: 37800000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: HO2(6) + CO(10) <=> OH(5) + CO2(17) - rate-constant: {A: 150000000.00000003, b: 0.0, Ea: 98742.40000000001} - note: 'Source: Library GRI-Mech3.0' -- equation: HO2(6) + CH2O(15) <=> H2O2(8) + HCO(12) - rate-constant: {A: 5.6000000000000005, b: 2.0, Ea: 50208.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + C(29) <=> O(2) + CO(10) - rate-constant: {A: 58000000.00000001, b: 0.0, Ea: 2409.984} - note: 'Source: Library GRI-Mech3.0' -- equation: C(29) + CH2(11) <=> H(4) + C2H(21) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: C(29) + CH3(14) <=> H(4) + C2H2(22) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH(9) <=> O(2) + HCO(12) - rate-constant: {A: 67100000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H2(3) + CH(9) <=> H(4) + CH2(11) - rate-constant: {A: 108000000.00000001, b: 0.0, Ea: 13012.24} - note: 'Source: Library GRI-Mech3.0' -- equation: H2O(28) + CH(9) <=> H(4) + CH2O(15) - rate-constant: {A: 5710000.000000001, b: 0.0, Ea: -3158.92} - note: 'Source: Library GRI-Mech3.0' -- equation: CH(9) + CH2(11) <=> H(4) + C2H2(22) - rate-constant: {A: 40000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH(9) + CH3(14) <=> H(4) + C2H3(24) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH(9) + CH4(16) <=> H(4) + C2H4(26) - rate-constant: {A: 60000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CO2(17) + CH(9) <=> CO(10) + HCO(12) - rate-constant: {A: 190000000.00000003, b: 0.0, Ea: 66073.728} - note: 'Source: Library GRI-Mech3.0' -- equation: CH(9) + CH2O(15) <=> H(4) + CH2CO(25) - rate-constant: {A: 94600000.00000001, b: 0.0, Ea: -2154.76} - note: 'Source: Library GRI-Mech3.0' -- equation: CH(9) + HCCO(23) <=> CO(10) + C2H2(22) - rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2(11) <=> H(4) + OH(5) + CO(10) - rate-constant: {A: 5000000.000000001, b: 0.0, Ea: 6276.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H2(3) + CH2(11) <=> H(4) + CH3(14) - rate-constant: {A: 0.5000000000000001, b: 2.0, Ea: 30250.32} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(11) + CH2(11) <=> H2(3) + C2H2(22) - rate-constant: {A: 1600000000.0000002, b: 0.0, Ea: 49973.696} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(11) + CH3(14) <=> H(4) + C2H4(26) - rate-constant: {A: 40000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(11) + CH4(16) <=> CH3(14) + CH3(14) - rate-constant: {A: 2.4600000000000004, b: 2.0, Ea: 34601.68} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(11) + HCCO(23) <=> CO(10) + C2H3(24) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2(S)(13) <=> H(4) + OH(5) + CO(10) - rate-constant: {A: 28000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2(S)(13) <=> H2O(28) + CO(10) - rate-constant: {A: 12000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H2(3) + CH2(S)(13) <=> H(4) + CH3(14) - rate-constant: {A: 70000000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H2O(28) + CH2(S)(13) <=> H2O(28) + CH2(11) - rate-constant: {A: 30000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(S)(13) + CH3(14) <=> H(4) + C2H4(26) - rate-constant: {A: 12000000.000000002, b: 0.0, Ea: -2384.88} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(S)(13) + CH4(16) <=> CH3(14) + CH3(14) - rate-constant: {A: 16000000.000000002, b: 0.0, Ea: -2384.88} - note: 'Source: Library GRI-Mech3.0' -- equation: CO(10) + CH2(S)(13) <=> CO(10) + CH2(11) - rate-constant: {A: 9000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CO2(17) + CH2(S)(13) <=> CO2(17) + CH2(11) - rate-constant: {A: 7000000.000000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CO2(17) + CH2(S)(13) <=> CO(10) + CH2O(15) - rate-constant: {A: 14000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(S)(13) + ethane(1) <=> CH3(14) + C2H5(27) - rate-constant: {A: 40000000.00000001, b: 0.0, Ea: -2301.2000000000003} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH3(14) <=> O(2) + CH3O(19) - rate-constant: {A: 35600000.00000001, b: 0.0, Ea: 127528.32} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH3(14) <=> OH(5) + CH2O(15) - rate-constant: {A: 2310000.0000000005, b: 0.0, Ea: 84997.96} - note: 'Source: Library GRI-Mech3.0' -- equation: H2O2(8) + CH3(14) <=> HO2(6) + CH4(16) - rate-constant: {A: 0.024500000000000004, b: 2.47, Ea: 21673.120000000003} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + CH3(14) <=> H(4) + C2H5(27) - rate-constant: {A: 6840000.000000001, b: 0.1, Ea: 44350.4} - note: 'Source: Library GRI-Mech3.0' -- equation: HCO(12) + CH3(14) <=> CO(10) + CH4(16) - rate-constant: {A: 26480000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2O(15) + CH3(14) <=> HCO(12) + CH4(16) - rate-constant: {A: 0.0033200000000000005, b: 2.81, Ea: 24518.24} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + CH3OH(20) <=> CH2OH(18) + CH4(16) - rate-constant: {A: 30.000000000000004, b: 1.5, Ea: 41588.96} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + CH3OH(20) <=> CH3O(19) + CH4(16) - rate-constant: {A: 10.000000000000002, b: 1.5, Ea: 41588.96} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + C2H4(26) <=> CH4(16) + C2H3(24) - rate-constant: {A: 0.22700000000000004, b: 2.0, Ea: 38492.8} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + ethane(1) <=> CH4(16) + C2H5(27) - rate-constant: {A: 6.1400000000000015, b: 1.74, Ea: 43722.8} - note: 'Source: Library GRI-Mech3.0' -- equation: H2O(28) + HCO(12) <=> H(4) + H2O(28) + CO(10) - rate-constant: {A: 1500000000000.0002, b: -1.0, Ea: 71128.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + HCO(12) <=> HO2(6) + CO(10) - rate-constant: {A: 13450000.000000002, b: 0.0, Ea: 1673.6000000000001} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2OH(18) <=> HO2(6) + CH2O(15) - rate-constant: {A: 18000000.000000004, b: 0.0, Ea: 3765.6000000000004} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH3O(19) <=> HO2(6) + CH2O(15) - rate-constant: {A: 4.2800000000000005e-19, b: 7.6, Ea: -14769.52} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + C2H(21) <=> CO(10) + HCO(12) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: -3158.92} - note: 'Source: Library GRI-Mech3.0' -- equation: H2(3) + C2H(21) <=> H(4) + C2H2(22) - rate-constant: {A: 56800.00000000001, b: 0.9, Ea: 8338.712} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + C2H3(24) <=> HCO(12) + CH2O(15) - rate-constant: {A: 45800000000.00001, b: -1.39, Ea: 4246.76} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + C2H5(27) <=> HO2(6) + C2H4(26) - rate-constant: {A: 840000.0000000001, b: 0.0, Ea: 16213.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + HCCO(23) <=> OH(5) + CO(10) + CO(10) - rate-constant: {A: 3200000.0000000005, b: 0.0, Ea: 3573.136} - note: 'Source: Library GRI-Mech3.0' -- equation: HCCO(23) + HCCO(23) <=> CO(10) + CO(10) + C2H2(22) - rate-constant: {A: 10000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3(14) <=> H(4) + H2(3) + CO(10) - rate-constant: {A: 33700000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H4(26) <=> H(4) + CH2CHO(31) - rate-constant: {A: 6.700000000000001, b: 1.83, Ea: 920.48} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + C2H5(27) <=> H(4) + CH3CHO(32) - rate-constant: {A: 109600000.00000001, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3(14) <=> H2(3) + CH2O(15) - rate-constant: {A: 8000.000000000001, b: 0.5, Ea: -7342.92} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2(11) <=> H(4) + H(4) + CO2(17) - rate-constant: {A: 5800000.000000001, b: 0.0, Ea: 6276.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2(11) <=> O(2) + CH2O(15) - rate-constant: {A: 2400000.0000000005, b: 0.0, Ea: 6276.0} - note: 'Source: Library GRI-Mech3.0' -- equation: CH2(11) + CH2(11) <=> H(4) + H(4) + C2H2(22) - rate-constant: {A: 200000000.00000003, b: 0.0, Ea: 45977.976} - note: 'Source: Library GRI-Mech3.0' -- equation: H2O(28) + CH2(S)(13) <=> H2(3) + CH2O(15) - rate-constant: {A: 68200.00000000001, b: 0.25, Ea: -3912.04} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + C2H3(24) <=> O(2) + CH2CHO(31) - rate-constant: {A: 303000.00000000006, b: 0.29, Ea: 46.024} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + C2H3(24) <=> HO2(6) + C2H2(22) - rate-constant: {A: 1.3370000000000002, b: 1.61, Ea: -1606.656} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3CHO(32) <=> OH(5) + CH2CHO(31) - rate-constant: {A: 2920000.0000000005, b: 0.0, Ea: 7564.6720000000005} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH3CHO(32) <=> OH(5) + CO(10) + CH3(14) - rate-constant: {A: 2920000.0000000005, b: 0.0, Ea: 7564.6720000000005} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH3CHO(32) <=> HO2(6) + CO(10) + CH3(14) - rate-constant: {A: 30100000.000000004, b: 0.0, Ea: 163803.6} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3CHO(32) <=> H2(3) + CH2CHO(31) - rate-constant: {A: 2050.0000000000005, b: 1.16, Ea: 10062.52} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3CHO(32) <=> H2(3) + CO(10) + CH3(14) - rate-constant: {A: 2050.0000000000005, b: 1.16, Ea: 10062.52} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3CHO(32) <=> H2O(28) + CO(10) + CH3(14) - rate-constant: {A: 23430.000000000004, b: 0.73, Ea: -4656.792} - note: 'Source: Library GRI-Mech3.0' -- equation: HO2(6) + CH3CHO(32) <=> H2O2(8) + CO(10) + CH3(14) - rate-constant: {A: 3010000.0000000005, b: 0.0, Ea: 49885.832} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + CH3CHO(32) <=> CO(10) + CH3(14) + CH4(16) - rate-constant: {A: 2.7200000000000006, b: 1.77, Ea: 24769.280000000002} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CH2CHO(31) <=> H(4) + CO2(17) + CH2(11) - rate-constant: {A: 150000000.00000003, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2CHO(31) <=> OH(5) + CO(10) + CH2O(15) - rate-constant: {A: 18100.000000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + CH2CHO(31) <=> OH(5) + HCO(12) + HCO(12) - rate-constant: {A: 23500.000000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2CHO(31) <=> HCO(12) + CH3(14) - rate-constant: {A: 22000000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2CHO(31) <=> H2(3) + CH2CO(25) - rate-constant: {A: 11000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2CHO(31) <=> H2O(28) + CH2CO(25) - rate-constant: {A: 12000000.000000002, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH2CHO(31) <=> HCO(12) + CH2OH(18) - rate-constant: {A: 30100000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + O(2) (+ M) <=> O2(7) (+ M) - type: three-body - rate-constant: {A: 120000.00000000001, b: -1.0, Ea: 0.0} - efficiencies: {CH4(16): 2, CO2(17): 3.6, ethane(1): 3, H2O(28): 15.4, H2(3): 2.4, - Ar: 0.83} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + H(4) (+ M) <=> OH(5) (+ M) - type: three-body - rate-constant: {A: 500000.0000000001, b: -1.0, Ea: 0.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: O2(7) + H(4) (+ M) <=> HO2(6) (+ M) - type: three-body - rate-constant: {A: 2800000.0000000005, b: -0.86, Ea: 0.0} - efficiencies: {CO2(17): 1.5, ethane(1): 1.5, H2O(28): 0, O2(7): 0, N2: 0, Ar: 0} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + H(4) (+ M) <=> H2(3) (+ M) - type: three-body - rate-constant: {A: 1000000.0000000002, b: -1.0, Ea: 0.0} - efficiencies: {CH4(16): 2, CO2(17): 0, ethane(1): 3, H2O(28): 0, H2(3): 0, Ar: 0.63} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + OH(5) (+ M) <=> H2O(28) (+ M) - type: three-body - rate-constant: {A: 22000000000.000004, b: -2.0, Ea: 0.0} - efficiencies: {ethane(1): 3, CH4(16): 2, H2(3): 0.73, H2O(28): 3.65, Ar: 0.38} - note: 'Source: Library GRI-Mech3.0' -- equation: HCO(12) (+ M) <=> H(4) + CO(10) (+ M) - type: three-body - rate-constant: {A: 187000000000.00003, b: -1.0, Ea: 71128.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 0, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: O(2) + CO(10) (+ M) <=> CO2(17) (+ M) - type: falloff - high-P-rate-constant: {A: 18000.000000000004, b: 0.0, Ea: 9978.84} - low-P-rate-constant: {A: 602.0000000000001, b: 0.0, Ea: 12552.0} - efficiencies: {CH4(16): 2, CO2(17): 3.5, ethane(1): 3, H2O(28): 6, H2(3): 2, O2(7): 6, - Ar: 0.5} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2(11) (+ M) <=> CH3(14) (+ M) - type: falloff - high-P-rate-constant: {A: 600000000.0000001, b: 0.0, Ea: 0.0} - low-P-rate-constant: {A: 104000000000000.02, b: -2.76, Ea: 6694.400000000001} - Troe: {A: 0.562, T3: 91.0, T1: 5836.0, T2: 8552.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3(14) (+ M) <=> CH4(16) (+ M) - type: falloff - high-P-rate-constant: {A: 13900000000.000002, b: -0.534, Ea: 2242.6240000000003} - low-P-rate-constant: {A: 2.6200000000000005e+21, b: -4.76, Ea: 10208.960000000001} - Troe: {A: 0.783, T3: 74.0, T1: 2941.0, T2: 6964.0} - efficiencies: {CH4(16): 3, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HCO(12) (+ M) <=> CH2O(15) (+ M) - type: falloff - high-P-rate-constant: {A: 1090000.0000000002, b: 0.48, Ea: -1087.8400000000001} - low-P-rate-constant: {A: 2470000000000.0005, b: -2.57, Ea: 1778.2} - Troe: {A: 0.7824, T3: 271.0, T1: 2755.0, T2: 6570.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2O(15) (+ M) <=> CH2OH(18) (+ M) - type: falloff - high-P-rate-constant: {A: 540000.0000000001, b: 0.454, Ea: 15062.400000000001} - low-P-rate-constant: {A: 1.2700000000000002e+20, b: -4.82, Ea: 27321.52} - Troe: {A: 0.7187, T3: 103.0, T1: 1291.0, T2: 4160.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2O(15) (+ M) <=> CH3O(19) (+ M) - type: falloff - high-P-rate-constant: {A: 540000.0000000001, b: 0.454, Ea: 10878.4} - low-P-rate-constant: {A: 2.2000000000000005e+18, b: -4.8, Ea: 23263.04} - Troe: {A: 0.758, T3: 94.0, T1: 1555.0, T2: 4200.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2OH(18) (+ M) <=> CH3OH(20) (+ M) - type: falloff - high-P-rate-constant: {A: 1055000.0000000002, b: 0.5, Ea: 359.824} - low-P-rate-constant: {A: 4.360000000000001e+19, b: -4.65, Ea: 21254.72} - Troe: {A: 0.6, T3: 100.0, T1: 90000.0, T2: 10000.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH3O(19) (+ M) <=> CH3OH(20) (+ M) - type: falloff - high-P-rate-constant: {A: 2430000.0000000005, b: 0.515, Ea: 209.20000000000002} - low-P-rate-constant: {A: 4.660000000000001e+29, b: -7.44, Ea: 58910.72} - Troe: {A: 0.7, T3: 100.0, T1: 90000.0, T2: 10000.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H(21) (+ M) <=> C2H2(22) (+ M) - type: falloff - high-P-rate-constant: {A: 100000000000.00002, b: -1.0, Ea: 0.0} - low-P-rate-constant: {A: 3.750000000000001e+21, b: -4.8, Ea: 7949.6} - Troe: {A: 0.6464, T3: 132.0, T1: 1315.0, T2: 5566.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H2(22) (+ M) <=> C2H3(24) (+ M) - type: falloff - high-P-rate-constant: {A: 5600000.000000001, b: 0.0, Ea: 10041.6} - low-P-rate-constant: {A: 3.8000000000000008e+28, b: -7.27, Ea: 30208.48} - Troe: {A: 0.7507, T3: 98.5, T1: 1302.0, T2: 4167.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H3(24) (+ M) <=> C2H4(26) (+ M) - type: falloff - high-P-rate-constant: {A: 6080000.000000001, b: 0.27, Ea: 1171.52} - low-P-rate-constant: {A: 1.4000000000000003e+18, b: -3.86, Ea: 13890.880000000001} - Troe: {A: 0.782, T3: 207.5, T1: 2663.0, T2: 6095.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H4(26) (+ M) <=> C2H5(27) (+ M) - type: falloff - high-P-rate-constant: {A: 540000.0000000001, b: 0.454, Ea: 7614.88} - low-P-rate-constant: {A: 6.0000000000000005e+29, b: -7.62, Ea: 29162.48} - Troe: {A: 0.9753, T3: 210.0, T1: 984.0, T2: 4374.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + C2H5(27) (+ M) <=> ethane(1) (+ M) - type: falloff - high-P-rate-constant: {A: 521000000000.00006, b: -0.99, Ea: 6610.72} - low-P-rate-constant: {A: 1.9900000000000005e+29, b: -7.08, Ea: 27970.04} - Troe: {A: 0.8422, T3: 125.0, T1: 2219.0, T2: 6882.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H2(3) + CO(10) (+ M) <=> CH2O(15) (+ M) - type: falloff - high-P-rate-constant: {A: 43.00000000000001, b: 1.5, Ea: 333046.4} - low-P-rate-constant: {A: 5070000000000001.0, b: -3.42, Ea: 352920.4} - Troe: {A: 0.932, T3: 197.0, T1: 1540.0, T2: 10300.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + OH(5) (+ M) <=> H2O2(8) (+ M) - type: falloff - high-P-rate-constant: {A: 74000000.00000001, b: -0.37, Ea: 0.0} - low-P-rate-constant: {A: 2300000.0000000005, b: -0.9, Ea: -7112.8} - Troe: {A: 0.7346, T3: 94.0, T1: 1756.0, T2: 5182.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: OH(5) + CH3(14) (+ M) <=> CH3OH(20) (+ M) - type: falloff - high-P-rate-constant: {A: 2790000000000.0005, b: -1.43, Ea: 5564.72} - low-P-rate-constant: {A: 4.000000000000001e+24, b: -5.92, Ea: 13137.76} - Troe: {A: 0.412, T3: 195.0, T1: 5900.0, T2: 6394.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: CO(10) + CH(9) (+ M) <=> HCCO(23) (+ M) - type: falloff - high-P-rate-constant: {A: 50000000.00000001, b: 0.0, Ea: 0.0} - low-P-rate-constant: {A: 2.6900000000000004e+16, b: -3.74, Ea: 8100.224} - Troe: {A: 0.5757, T3: 237.0, T1: 1652.0, T2: 5069.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: CO(10) + CH2(11) (+ M) <=> CH2CO(25) (+ M) - type: falloff - high-P-rate-constant: {A: 810000.0000000001, b: 0.5, Ea: 18869.84} - low-P-rate-constant: {A: 2.6900000000000005e+21, b: -5.11, Ea: 29685.48} - Troe: {A: 0.5907, T3: 275.0, T1: 1226.0, T2: 5185.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H2O(28) + CH2(S)(13) (+ M) <=> CH3OH(20) (+ M) - type: falloff - high-P-rate-constant: {A: 482000000000.00006, b: -1.16, Ea: 4790.68} - low-P-rate-constant: {A: 1.8800000000000002e+26, b: -6.36, Ea: 21087.36} - Troe: {A: 0.6027, T3: 208.0, T1: 3922.0, T2: 10180.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + CH3(14) (+ M) <=> ethane(1) (+ M) - type: falloff - high-P-rate-constant: {A: 67700000000.00001, b: -1.18, Ea: 2736.3360000000002} - low-P-rate-constant: {A: 3.4000000000000005e+29, b: -7.03, Ea: 11556.208} - Troe: {A: 0.619, T3: 73.2, T1: 1180.0, T2: 9999.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: C2H4(26) (+ M) <=> H2(3) + C2H2(22) (+ M) - type: falloff - high-P-rate-constant: {A: 8000000000000.0, b: 0.44, Ea: 363045.68} - low-P-rate-constant: {A: 1.5800000000000004e+45, b: -9.3, Ea: 409195.2} - Troe: {A: 0.7345, T3: 180.0, T1: 1035.0, T2: 5417.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H2(3) + CH(9) (+ M) <=> CH3(14) (+ M) - type: falloff - high-P-rate-constant: {A: 1970000.0000000002, b: 0.43, Ea: -1548.0800000000002} - low-P-rate-constant: {A: 48200000000000.01, b: -2.8, Ea: 2468.56} - Troe: {A: 0.578, T3: 122.0, T1: 2535.0, T2: 9365.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + CH2CO(25) (+ M) <=> CH2CHO(31) (+ M) - type: falloff - high-P-rate-constant: {A: 486500.00000000006, b: 0.422, Ea: -7342.92} - low-P-rate-constant: {A: 1.0120000000000002e+30, b: -7.63, Ea: 16125.136} - Troe: {A: 0.465, T3: 201.0, T1: 1773.0, T2: 5333.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: CH3(14) + C2H5(27) (+ M) <=> C3H8(33) (+ M) - type: falloff - high-P-rate-constant: {A: 9430000.000000002, b: 0.0, Ea: 0.0} - low-P-rate-constant: {A: 2.7100000000000003e+62, b: -16.82, Ea: 54663.96} - Troe: {A: 0.1527, T3: 291.0, T1: 2742.0, T2: 7748.0} - efficiencies: {CH4(16): 2, CO2(17): 2, ethane(1): 3, H2O(28): 6, H2(3): 2, Ar: 0.7} - note: 'Source: Library GRI-Mech3.0' -- equation: H(4) + HO2(6) <=> H2O2(8) - rate-constant: {A: 5250.69, b: 1.27262, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_2CNO->O_3R!H->O - in family R_Recombination.' -- equation: H(4) + CH(9) <=> CH2(S)(13) - rate-constant: {A: 53700000.0, b: 0.15395, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_N-2CNO->O - in family R_Recombination.' -- equation: H(4) + HCCO(23) <=> CH2CO(25) - rate-constant: {A: 11386000.0, b: 0.308956, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_Sp-3R!H=2CCNNOO_N-3R!H->O_Ext-3CS-R - in family R_Recombination.' -- equation: OH(5) + C2H(21) <=> HCCOH(30) - rate-constant: {A: 77000000.0, b: 4.95181e-08, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_N-1R->H_N-1CNOS->N_1COS->O_2R->C_Ext-2C-R - in family R_Recombination.' -- equation: H(4) + HCCO(23) <=> HCCOH(30) - rate-constant: {A: 2805150.0, b: 0.314888, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_2CNO->O_N-3R!H->O - in family R_Recombination.' -- equation: HCO(12) + CH3(14) <=> CH3CHO(32) - rate-constant: {A: 18100000.000000004, b: 0.0, Ea: 0.0} - note: 'Source: Template family R_Recombination | Matched reaction 71 CH3 + CHO <=> - C2H4O in R_Recombination/training; This reaction matched rate rule [Root_N-1R->H_N-1CNOS->N_N-1COS->O_1CS->C_N-1C-inRing_Ext-2R-R_N-Sp-3R!H-2R_3R!H->O]; - family: R_Recombination' -- equation: H(4) + CH2CHO(31) <=> CH3CHO(32) - rate-constant: {A: 78286700.0, b: 0.0631113, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_N-2CNO->O_3R!H->C_Sp-3C-2CN - in family R_Recombination.' -- equation: CH(9) + CH(9) <=> C2H2(22) - rate-constant: {A: 99813.0, b: 0.610916, Ea: 0.0} - note: 'Source: Template family R_Recombination | Estimated from node Root_N-1R->H_N-1CNOS->N_N-1COS->O_1CS->C_N-1C-inRing - in family R_Recombination.' diff --git a/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml b/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml deleted file mode 100644 index cc02d4340e..0000000000 --- a/test/rmgpy/test_data/yaml_writer_data/ck2yaml/from_main_test.yaml +++ /dev/null @@ -1,2151 +0,0 @@ -generator: ck2yaml -input-files: [chem_annotated.inp, tran.dat] -cantera-version: 3.1.0 -date: Mon, 11 May 2026 23:59:04 -0400 - -units: {length: cm, time: s, quantity: mol, activation-energy: - kcal/mol} - -phases: -- name: gas - thermo: ideal-gas - elements: [H, D, T, C, Ci, O, Oi, N, Ne, Ar, He, Si, S, F, Cl, Br, I, - X] - species: [N2, Ar, He, Ne, ethane(1), O(2), H2(3), H(4), OH(5), - HO2(6), O2(7), H2O2(8), CH(9), CO(10), CH2(11), HCO(12), - CH2(S)(13), CH3(14), CH2O(15), CH4(16), CO2(17), CH2OH(18), - CH3O(19), CH3OH(20), C2H(21), C2H2(22), HCCO(23), C2H3(24), - CH2CO(25), C2H4(26), C2H5(27), H2O(28), C(29), HCCOH(30), - CH2CHO(31), CH3CHO(32), C3H8(33)] - kinetics: gas - transport: mixture-averaged - state: {T: 300.0, P: 1 atm} - -elements: -- symbol: Ci - atomic-weight: 13.003 -- symbol: D - atomic-weight: 2.014 -- symbol: Oi - atomic-weight: 17.999 -- symbol: T - atomic-weight: 3.016 -- symbol: X - atomic-weight: 195.083 - -species: -- name: N2 - composition: {N: 2} - thermo: - model: NASA7 - temperature-ranges: [200.0, 1000.0, 6000.0] - data: - - [3.53101, -1.23661e-04, -5.02999e-07, 2.43531e-09, -1.40881e-12, - -1046.98, 2.96747] - - [2.95258, 1.3969e-03, -4.92632e-07, 7.8601e-11, -4.60755e-15, - -923.949, 5.87189] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: linear - well-depth: 97.53 - diameter: 3.621 - polarizability: 1.76 - rotational-relaxation: 4.0 - note: GRI-Mech - note: ' N2' -- name: Ar - composition: {Ar: 1} - thermo: - model: NASA7 - temperature-ranges: [200.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 4.37967] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: atom - well-depth: 136.501 - diameter: 3.33 - note: GRI-Mech - note: ' Ar' -- name: He - composition: {He: 1} - thermo: - model: NASA7 - temperature-ranges: [200.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 0.928724] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: atom - well-depth: 10.2 - diameter: 2.576 - note: NOx2018 - note: ' He' -- name: Ne - composition: {Ne: 1} - thermo: - model: NASA7 - temperature-ranges: [200.0, 6000.0] - data: - - [2.5, 0.0, 0.0, 0.0, 0.0, -745.375, 3.35532] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: atom - well-depth: 148.6 - diameter: 3.758 - note: Epsilon & sigma estimated with fixed Lennard Jones - Parameters. This is the fallback method! Try improving transport - databases! - note: ' Ne' -- name: ethane(1) - composition: {C: 2, H: 6} - thermo: - model: NASA7 - temperature-ranges: [100.0, 954.52, 5000.0] - data: - - [3.78032743, -3.24253681e-03, 5.52377174e-05, -6.38576566e-08, - 2.28635015e-11, -1.16203406e+04, 5.21036251] - - [4.58985736, 0.0141507296, -4.75959561e-06, 8.60288105e-10, - -6.21711501e-14, -1.27217763e+04, -3.61753754] - note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH)' - transport: - model: gas - geometry: nonlinear - well-depth: 252.301 - diameter: 4.302 - rotational-relaxation: 1.5 - note: GRI-Mech - note: ' ethane(1)' -- name: O(2) - composition: {O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 3937.43, 5000.0] - data: - - [2.5, -4.35596516e-14, 6.01870293e-17, -2.72230154e-20, - 3.7931637e-24, 2.92302441e+04, 5.12616427] - - [2.50000034, -3.23453715e-10, 1.15706352e-13, -1.83278703e-17, - 1.08448824e-21, 2.92302438e+04, 5.12616216] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: atom - well-depth: 80.0 - diameter: 2.75 - note: GRI-Mech - note: ' O(2)' -- name: H2(3) - composition: {H: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1959.07, 5000.0] - data: - - [3.43536395, 2.12711816e-04, -2.78628359e-07, 3.40269768e-10, - -7.76038439e-14, -1031.35983, -3.90841667] - - [2.78818343, 5.87618075e-04, 1.59021122e-07, -5.52760511e-11, - 4.34326644e-15, -596.154654, 0.112628324] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: linear - well-depth: 38.0 - diameter: 2.92 - polarizability: 0.79 - rotational-relaxation: 280.0 - note: GRI-Mech - note: ' H2(3)' -- name: H(4) - composition: {H: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 3937.43, 5000.0] - data: - - [2.5, -4.35596516e-14, 6.01870293e-17, -2.72230154e-20, - 3.7931637e-24, 2.54742178e+04, -0.444972896] - - [2.50000034, -3.23453715e-10, 1.15706352e-13, -1.83278703e-17, - 1.08448824e-21, 2.54742175e+04, -0.444975009] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: atom - well-depth: 145.0 - diameter: 2.05 - note: GRI-Mech - note: ' H(4)' -- name: OH(5) - composition: {H: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1145.75, 5000.0] - data: - - [3.51456804, 2.92774056e-05, -5.321635e-07, 1.01949044e-09, - -3.85945238e-13, 3414.2542, 2.10434885] - - [3.07193983, 6.04015655e-04, -1.39782691e-08, -2.13446151e-11, - 2.480657e-15, 3579.38675, 4.57799995] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: linear - well-depth: 80.0 - diameter: 2.75 - note: GRI-Mech - note: ' OH(5)' -- name: HO2(6) - composition: {H: 1, O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 932.16, 5000.0] - data: - - [4.04594317, -1.7346267e-03, 1.03765734e-05, -1.02201437e-08, - 3.34903651e-12, -986.754172, 4.63581899] - - [3.21024379, 3.67941084e-03, -1.2770104e-06, 2.18043988e-10, - -1.46336871e-14, -910.370624, 8.18288956] - note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH) - + radical(HOOJ)' - transport: - model: gas - geometry: nonlinear - well-depth: 107.4 - diameter: 3.458 - rotational-relaxation: 1.0 - note: GRI-Mech - note: ' HO2(6)' -- name: O2(7) - composition: {O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1074.56, 5000.0] - data: - - [3.53732171, -1.21570819e-03, 5.31617448e-06, -4.89442954e-09, - 1.45844853e-12, -1038.58846, 4.68368441] - - [3.15382478, 1.67803713e-03, -7.69970521e-07, 1.51274598e-10, - -1.08781705e-14, -1040.81902, 6.1675358] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: linear - well-depth: 107.4 - diameter: 3.458 - polarizability: 1.6 - rotational-relaxation: 3.8 - note: GRI-Mech - note: ' O2(7)' -- name: H2O2(8) - composition: {H: 2, O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 908.86, 5000.0] - data: - - [3.73137614, 3.35048251e-03, 9.35118753e-06, -1.52111685e-08, - 6.4164127e-12, -1.77211716e+04, 5.45904423] - - [5.41573779, 2.6101679e-03, -4.39943044e-07, 4.9121012e-11, - -3.35291495e-15, -1.83029324e+04, -4.02220593] - note: 'Thermo group additivity estimation: group(O2s-OsH) + group(O2s-OsH)' - transport: - model: gas - geometry: nonlinear - well-depth: 107.4 - diameter: 3.458 - rotational-relaxation: 3.8 - note: GRI-Mech - note: ' H2O2(8)' -- name: CH(9) - composition: {C: 1, H: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 926.5, 5000.0] - data: - - [4.11488417, -3.61060826e-04, -6.34736706e-06, 1.0588807e-08, - -4.57058172e-12, 7.50838553e+04, 1.61269351] - - [2.33973048, 1.7585842e-03, -8.02918198e-07, 1.40457762e-10, - -8.47499355e-15, 7.56507519e+04, 11.3254576] - note: 'Thermo library: primaryThermoLibrary + radical(Cs_P)' - transport: - model: gas - geometry: linear - well-depth: 80.0 - diameter: 2.75 - note: GRI-Mech - note: ' CH(9)' -- name: CO(10) - composition: {C: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1571.64, 5000.0] - data: - - [3.56838005, -8.52126267e-04, 2.4891797e-06, -1.56331209e-09, - 3.13595799e-13, -1.42842549e+04, 3.57912154] - - [2.91306263, 1.64658422e-03, -6.88618036e-07, 1.21038044e-10, - -7.84023278e-15, -1.41808824e+04, 6.71048116] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: linear - well-depth: 98.1 - diameter: 3.65 - polarizability: 1.95 - rotational-relaxation: 1.8 - note: GRI-Mech - note: ' CO(10)' -- name: CH2(11) - composition: {C: 1, H: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1104.63, 5000.0] - data: - - [4.01192382, -1.54978156e-04, 3.26297676e-06, -2.40421685e-09, - 5.69496337e-13, 4.58676802e+04, 0.53320072] - - [3.14983361, 2.96674306e-03, -9.76056125e-07, 1.54115348e-10, - -9.50338696e-15, 4.60581391e+04, 4.77807811] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: nonlinear - well-depth: 144.001 - diameter: 3.8 - note: GRI-Mech - note: ' CH2(11)' -- name: HCO(12) - composition: {C: 1, H: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1565.71, 5000.0] - data: - - [4.3560244, -3.47091221e-03, 1.25665259e-05, -9.99499181e-09, - 2.27891737e-12, 3995.77033, 2.75111143] - - [4.61852076, 5.04477249e-03, -4.39251309e-06, 9.73304874e-10, - -7.07453455e-14, 2787.58225, -2.2287435] - note: 'Thermo group additivity estimation: group(Cds-OdHH) + radical(HCdsJO)' - transport: - model: gas - geometry: nonlinear - well-depth: 498.002 - diameter: 3.59 - note: GRI-Mech - note: ' HCO(12)' -- name: CH2(S)(13) - composition: {C: 1, H: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1442.36, 5000.0] - data: - - [4.10264368, -1.44068351e-03, 5.45068829e-06, -3.58001947e-09, - 7.56192481e-13, 5.04005785e+04, -0.411765588] - - [2.62647403, 3.94762922e-03, -1.49924134e-06, 2.5453915e-10, - -1.62955832e-14, 5.06917532e+04, 6.7837907] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: nonlinear - well-depth: 144.001 - diameter: 3.8 - note: GRI-Mech - note: ' CH2(S)(13)' -- name: CH3(14) - composition: {C: 1, H: 3} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1337.63, 5000.0] - data: - - [3.91546763, 1.84154304e-03, 3.48741815e-06, -3.32747665e-09, - 8.49957077e-13, 1.62856394e+04, 0.351741423] - - [3.54145722, 4.76786874e-03, -1.82148447e-06, 3.28876633e-10, - -2.22545631e-14, 1.6223958e+04, 1.66035119] - note: 'Thermo library: primaryThermoLibrary + radical(CH3)' - transport: - model: gas - geometry: nonlinear - well-depth: 144.001 - diameter: 3.8 - note: GRI-Mech - note: ' CH3(14)' -- name: CH2O(15) - composition: {C: 1, H: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1402.28, 5000.0] - data: - - [4.32289375, -5.06324948e-03, 2.15154952e-05, -1.76520796e-08, - 4.31813038e-12, -1.42789564e+04, 2.39243355] - - [3.1799899, 9.55593266e-03, -6.27298655e-06, 1.33553899e-09, - -9.68405406e-14, -1.50752458e+04, 4.31054242] - note: 'Thermo group additivity estimation: group(Cds-OdHH)' - transport: - model: gas - geometry: nonlinear - well-depth: 498.002 - diameter: 3.59 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' CH2O(15)' -- name: CH4(16) - composition: {C: 1, H: 4} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1084.12, 5000.0] - data: - - [4.20541668, -5.35559025e-03, 2.51123825e-05, -2.13763532e-08, - 5.97526701e-12, -1.01619434e+04, -0.921284487] - - [0.9082574, 0.0114540995, -4.57174601e-06, 8.29193467e-10, - -5.66316365e-14, -9719.97079, 13.9931416] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: nonlinear - well-depth: 141.4 - diameter: 3.746 - polarizability: 2.6 - rotational-relaxation: 13.0 - note: GRI-Mech - note: ' CH4(16)' -- name: CO2(17) - composition: {C: 1, O: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 988.87, 5000.0] - data: - - [3.27862297, 2.74138237e-03, 7.16123813e-06, -1.08033894e-08, - 4.14310458e-12, -4.8470315e+04, 5.9793235] - - [4.54605027, 2.91921056e-03, -1.1548821e-06, 2.27664285e-10, - -1.70918758e-14, -4.89803404e+04, -1.43249102] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + missing(O2d-Cdd) - + group(Cdd-OdOd)' - transport: - model: gas - geometry: linear - well-depth: 244.001 - diameter: 3.763 - polarizability: 2.65 - rotational-relaxation: 2.1 - note: GRI-Mech - note: ' CO2(17)' -- name: CH2OH(18) - composition: {C: 1, H: 3, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 895.02, 5000.0] - data: - - [3.71174025, 1.9311458e-03, 2.1233857e-05, -3.03152881e-08, - 1.24875746e-11, -4007.45922, 7.29202062] - - [6.05631855, 3.02170363e-03, 1.72301096e-08, -6.96323338e-11, - 5.18258193e-15, -4890.51343, -6.34776467] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) - + radical(CsJOH)' - transport: - model: gas - geometry: nonlinear - well-depth: 417.002 - diameter: 3.69 - dipole: 1.7 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' CH2OH(18)' -- name: CH3O(19) - composition: {C: 1, H: 3, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 916.9, 5000.0] - data: - - [4.00133275, -4.15652648e-03, 3.26342688e-05, -3.71101808e-08, - 1.35701669e-11, -6.15151549, 6.8138019] - - [4.01629481, 6.26800789e-03, -1.5806074e-06, 2.44589052e-10, - -1.70322515e-14, -449.834191, 4.33839899] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH) - + radical(H3COJ)' - transport: - model: gas - geometry: nonlinear - well-depth: 417.002 - diameter: 3.69 - dipole: 1.7 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' CH3O(19)' -- name: CH3OH(20) - composition: {C: 1, H: 4, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 952.14, 5000.0] - data: - - [3.89496193, -7.71353989e-04, 2.64755184e-05, -2.91793661e-08, - 1.00834714e-11, -2.63358548e+04, 6.36475904] - - [3.13807814, 0.0103542067, -3.56957337e-06, 6.22286741e-10, - -4.27805599e-14, -2.65518955e+04, 8.08777881] - note: 'Thermo group additivity estimation: group(O2s-CsH) + group(Cs-OsHHH)' - transport: - model: gas - geometry: nonlinear - well-depth: 481.802 - diameter: 3.626 - rotational-relaxation: 1.0 - note: GRI-Mech - note: ' CH3OH(20)' -- name: C2H(21) - composition: {C: 2, H: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1076.57, 5000.0] - data: - - [3.03852608, 0.0115449717, -2.13265776e-05, 1.81934989e-08, - -5.41598942e-12, 6.63980142e+04, 5.96677231] - - [4.0084898, 2.06811085e-03, 6.05262841e-08, -1.1771428e-10, - 1.29286645e-14, 6.65295067e+04, 2.79635744] - note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH) - + radical(Acetyl)' - transport: - model: gas - geometry: linear - well-depth: 209.001 - diameter: 4.1 - rotational-relaxation: 2.5 - note: GRI-Mech - note: ' C2H(21)' -- name: C2H2(22) - composition: {C: 2, H: 2} - thermo: - model: NASA7 - temperature-ranges: [100.0, 888.63, 5000.0] - data: - - [3.03574154, 7.71246387e-03, 2.53464731e-06, -1.08129073e-08, - 5.50737874e-12, 2.58526446e+04, 4.5446335] - - [5.76205974, 2.37156193e-03, -1.49567346e-07, -2.19191668e-11, - 2.21810367e-15, 2.50944442e+04, -9.82616666] - note: 'Thermo group additivity estimation: group(Ct-CtH) + group(Ct-CtH)' - transport: - model: gas - geometry: linear - well-depth: 209.001 - diameter: 4.1 - rotational-relaxation: 2.5 - note: GRI-Mech - note: ' C2H2(22)' -- name: HCCO(23) - composition: {C: 2, H: 1, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 936.06, 5000.0] - data: - - [3.45647418, 0.0105728462, -7.35988853e-06, 7.97361462e-10, - 8.64535566e-13, 2.2595688e+04, 7.09495926] - - [5.99810082, 3.14480485e-03, -9.57807019e-07, 1.55622566e-10, - -1.04309528e-14, 2.19694663e+04, -5.80233718] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) - + missing(Cdd-CdO2d) + radical(Cds_P)' - transport: - model: gas - geometry: nonlinear - well-depth: 150.001 - diameter: 2.5 - rotational-relaxation: 1.0 - note: GRI-Mech - note: ' HCCO(23)' -- name: C2H3(24) - composition: {C: 2, H: 3} - thermo: - model: NASA7 - temperature-ranges: [100.0, 931.96, 5000.0] - data: - - [3.90670522, -4.06240761e-03, 3.86779927e-05, -4.62976249e-08, - 1.72900314e-11, 3.47971783e+04, 6.09789055] - - [5.44796624, 4.98356009e-03, -1.08820699e-06, 1.79837127e-10, - -1.45096133e-14, 3.38297743e+04, -4.87808642] - note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH) - + radical(Cds_P)' - transport: - model: gas - geometry: nonlinear - well-depth: 209.001 - diameter: 4.1 - rotational-relaxation: 1.0 - note: GRI-Mech - note: ' C2H3(24)' -- name: CH2CO(25) - composition: {C: 2, H: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 956.67, 5000.0] - data: - - [3.52748041, 7.08348624e-03, 9.17790038e-06, -1.64264897e-08, - 6.71163515e-12, -7123.94238, 5.74373417] - - [5.7648892, 5.96569767e-03, -1.9849265e-06, 3.5275928e-10, - -2.51631744e-14, -7928.97532, -6.92142789] - note: 'Thermo group additivity estimation: missing(O2d-Cdd) + group(Cds-(Cdd-O2d)HH) - + missing(Cdd-CdO2d)' - transport: - model: gas - geometry: nonlinear - well-depth: 436.001 - diameter: 3.97 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' CH2CO(25)' -- name: C2H4(26) - composition: {C: 2, H: 4} - thermo: - model: NASA7 - temperature-ranges: [100.0, 940.42, 5000.0] - data: - - [3.9798415, -7.5767957e-03, 5.5301749e-05, -6.36282467e-08, - 2.3179462e-11, 5077.45672, 4.04588282] - - [5.2026856, 7.82495932e-03, -2.12714674e-06, 3.79765159e-10, - -2.94733066e-14, 3936.40756, -6.62238004] - note: 'Thermo group additivity estimation: group(Cds-CdsHH) + group(Cds-CdsHH)' - transport: - model: gas - geometry: nonlinear - well-depth: 280.801 - diameter: 3.971 - rotational-relaxation: 1.5 - note: GRI-Mech - note: ' C2H4(26)' -- name: C2H5(27) - composition: {C: 2, H: 5} - thermo: - model: NASA7 - temperature-ranges: [100.0, 900.31, 5000.0] - data: - - [3.82183627, -3.43360854e-03, 5.09257457e-05, -6.20211879e-08, - 2.37073471e-11, 1.30660129e+04, 7.61643258] - - [5.15620831, 9.43122628e-03, -1.81946031e-06, 2.21195849e-10, - -1.43481362e-14, 1.20640828e+04, -2.91098384] - note: 'Thermo group additivity estimation: group(Cs-CsHHH) + group(Cs-CsHHH) - + radical(CCJ)' - transport: - model: gas - geometry: nonlinear - well-depth: 252.301 - diameter: 4.302 - rotational-relaxation: 1.5 - note: GRI-Mech - note: ' C2H5(27)' -- name: H2O(28) - composition: {H: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1130.23, 5000.0] - data: - - [4.05763503, -7.87926826e-04, 2.90874536e-06, -1.47515334e-09, - 2.12829286e-13, -3.02815866e+04, -0.311361165] - - [2.84325601, 2.75107645e-03, -7.81026468e-07, 1.07242484e-10, - -5.79382842e-15, -2.99586153e+04, 5.91038834] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: nonlinear - well-depth: 572.402 - diameter: 2.605 - dipole: 1.844 - rotational-relaxation: 4.0 - note: GRI-Mech - note: ' H2O(28)' -- name: C(29) - composition: {C: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 3937.43, 5000.0] - data: - - [2.5, -4.35596516e-14, 6.01870293e-17, -2.72230154e-20, - 3.7931637e-24, 8.54745247e+04, 3.65978421] - - [2.50000034, -3.23453715e-10, 1.15706352e-13, -1.83278703e-17, - 1.08448824e-21, 8.54745244e+04, 3.65978209] - note: 'Thermo library: primaryThermoLibrary' - transport: - model: gas - geometry: atom - well-depth: 71.4 - diameter: 3.298 - note: GRI-Mech - note: ' C(29)' -- name: HCCOH(30) - composition: {C: 2, H: 2, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 1009.87, 5000.0] - data: - - [3.30408797, 0.0125024849, -3.79519243e-06, -4.46312273e-09, - 2.66314967e-12, 8782.03556, 7.19718064] - - [6.71246907, 5.14830696e-03, -2.00076994e-06, 3.78815895e-10, - -2.74088612e-14, 7780.22962, -10.8314551] - note: 'Thermo group additivity estimation: group(O2s-CtH) + group(Ct-CtOs) - + group(Ct-CtH)' - transport: - model: gas - geometry: nonlinear - well-depth: 436.001 - diameter: 3.97 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' HCCOH(30)' -- name: CH2CHO(31) - composition: {C: 2, H: 3, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 914.21, 5000.0] - data: - - [3.34719684, 1.28727408e-03, 5.39986812e-05, -7.84143869e-08, - 3.24085502e-11, -2992.84606, 8.97293214] - - [11.726019, -1.47345443e-03, 2.90734463e-06, -5.96982757e-10, - 3.70269398e-14, -5941.48417, -38.4463677] - note: 'Thermo group additivity estimation: group(O2s-(Cds-Cd)H) + group(Cds-CdsOsH) - + group(Cds-CdsHH) + radical(C=COJ)' - transport: - model: gas - geometry: nonlinear - well-depth: 436.001 - diameter: 3.97 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' CH2CHO(31)' -- name: CH3CHO(32) - composition: {C: 2, H: 4, O: 1} - thermo: - model: NASA7 - temperature-ranges: [100.0, 984.2, 5000.0] - data: - - [3.70078992, 3.87825421e-04, 3.86929053e-05, -4.52447301e-08, - 1.58859302e-11, -2.13809084e+04, 9.13562173] - - [4.58889168, 0.0128893767, -4.91502181e-06, 9.26508716e-10, - -6.71011615e-14, -2.23360138e+04, 0.90108904] - note: 'Thermo group additivity estimation: group(Cs-(Cds-O2d)HHH) + - group(Cds-OdCsH)' - transport: - model: gas - geometry: nonlinear - well-depth: 436.001 - diameter: 3.97 - rotational-relaxation: 2.0 - note: GRI-Mech - note: ' CH3CHO(32)' -- name: C3H8(33) - composition: {C: 3, H: 8} - thermo: - model: NASA7 - temperature-ranges: [100.0, 986.58, 5000.0] - data: - - [3.05255278, 0.0125100989, 3.79380581e-05, -5.12014569e-08, - 1.8706167e-11, -1.44541762e+04, 10.0672929] - - [5.91321485, 0.0218761669, -8.17655752e-06, 1.49853338e-09, - -1.05990368e-13, -1.60389e+04, -8.865845] - note: 'Thermo group additivity estimation: group(Cs-CsCsHH) + group(Cs-CsHHH) - + group(Cs-CsHHH)' - transport: - model: gas - geometry: nonlinear - well-depth: 266.801 - diameter: 4.982 - rotational-relaxation: 1.0 - note: GRI-Mech - note: ' C3H8(33)' - -reactions: -- equation: O(2) + H2(3) <=> H(4) + OH(5) # Reaction 1 - rate-constant: {A: 3.87e+04, b: 2.7, Ea: 6.26} - note: | - Reaction index: Chemkin #1; RMG #1 - Library reaction: GRI-Mech3.0 - Flux pairs: O(2), OH(5); H2(3), H(4); -- equation: O(2) + HO2(6) <=> O2(7) + OH(5) # Reaction 2 - rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #2; RMG #2 - Library reaction: GRI-Mech3.0 - Flux pairs: HO2(6), O2(7); O(2), OH(5); -- equation: O(2) + H2O2(8) <=> OH(5) + HO2(6) # Reaction 3 - rate-constant: {A: 9.63e+06, b: 2.0, Ea: 4.0} - note: | - Reaction index: Chemkin #3; RMG #3 - Library reaction: GRI-Mech3.0 - Flux pairs: H2O2(8), HO2(6); O(2), OH(5); -- equation: O(2) + CH(9) <=> H(4) + CO(10) # Reaction 4 - rate-constant: {A: 5.7e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #4; RMG #4 - Library reaction: GRI-Mech3.0 - Flux pairs: CH(9), CO(10); O(2), H(4); -- equation: O(2) + CH2(11) <=> H(4) + HCO(12) # Reaction 5 - rate-constant: {A: 8.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #5; RMG #5 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), HCO(12); O(2), H(4); -- equation: O(2) + CH2(S)(13) <=> H2(3) + CO(10) # Reaction 6 - rate-constant: {A: 1.5e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #6; RMG #6 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CO(10); O(2), H2(3); -- equation: O(2) + CH2(S)(13) <=> H(4) + HCO(12) # Reaction 7 - rate-constant: {A: 1.5e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #7; RMG #7 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), HCO(12); O(2), H(4); -- equation: O(2) + CH3(14) <=> H(4) + CH2O(15) # Reaction 8 - rate-constant: {A: 5.06e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #8; RMG #8 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH2O(15); O(2), H(4); -- equation: O(2) + CH4(16) <=> OH(5) + CH3(14) # Reaction 9 - rate-constant: {A: 1.02e+09, b: 1.5, Ea: 8.6} - note: | - Reaction index: Chemkin #9; RMG #9 - Library reaction: GRI-Mech3.0 - Flux pairs: CH4(16), CH3(14); O(2), OH(5); -- equation: O(2) + HCO(12) <=> OH(5) + CO(10) # Reaction 10 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #10; RMG #10 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO(10); O(2), OH(5); -- equation: O(2) + HCO(12) <=> H(4) + CO2(17) # Reaction 11 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #11; RMG #11 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO2(17); O(2), H(4); -- equation: O(2) + CH2O(15) <=> OH(5) + HCO(12) # Reaction 12 - rate-constant: {A: 3.9e+13, b: 0.0, Ea: 3.54} - note: | - Reaction index: Chemkin #12; RMG #12 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), HCO(12); O(2), OH(5); -- equation: O(2) + CH2OH(18) <=> OH(5) + CH2O(15) # Reaction 13 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #13; RMG #13 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2OH(18), CH2O(15); O(2), OH(5); -- equation: O(2) + CH3O(19) <=> OH(5) + CH2O(15) # Reaction 14 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #14; RMG #14 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH2O(15); O(2), OH(5); -- equation: O(2) + CH3OH(20) <=> OH(5) + CH2OH(18) # Reaction 15 - rate-constant: {A: 3.88e+05, b: 2.5, Ea: 3.1} - note: | - Reaction index: Chemkin #15; RMG #15 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH2OH(18); O(2), OH(5); -- equation: O(2) + CH3OH(20) <=> OH(5) + CH3O(19) # Reaction 16 - rate-constant: {A: 1.3e+05, b: 2.5, Ea: 5.0} - note: | - Reaction index: Chemkin #16; RMG #16 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH3O(19); O(2), OH(5); -- equation: O(2) + C2H(21) <=> CO(10) + CH(9) # Reaction 17 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #17; RMG #17 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H(21), CO(10); O(2), CH(9); -- equation: O(2) + C2H2(22) <=> H(4) + HCCO(23) # Reaction 18 - rate-constant: {A: 1.35e+07, b: 2.0, Ea: 1.9} - note: | - Reaction index: Chemkin #18; RMG #18 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), HCCO(23); O(2), H(4); -- equation: O(2) + C2H2(22) <=> OH(5) + C2H(21) # Reaction 19 - rate-constant: {A: 4.6e+19, b: -1.41, Ea: 28.95} - note: | - Reaction index: Chemkin #19; RMG #19 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), C2H(21); O(2), OH(5); -- equation: O(2) + C2H2(22) <=> CO(10) + CH2(11) # Reaction 20 - rate-constant: {A: 6.94e+06, b: 2.0, Ea: 1.9} - note: | - Reaction index: Chemkin #20; RMG #20 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), CO(10); O(2), CH2(11); -- equation: O(2) + C2H3(24) <=> H(4) + CH2CO(25) # Reaction 21 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #21; RMG #21 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H3(24), CH2CO(25); O(2), H(4); -- equation: O(2) + C2H4(26) <=> HCO(12) + CH3(14) # Reaction 22 - rate-constant: {A: 1.25e+07, b: 1.83, Ea: 0.22} - note: | - Reaction index: Chemkin #22; RMG #22 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H4(26), HCO(12); O(2), CH3(14); -- equation: O(2) + C2H5(27) <=> CH2O(15) + CH3(14) # Reaction 23 - rate-constant: {A: 2.24e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #23; RMG #23 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H5(27), CH2O(15); O(2), CH3(14); -- equation: O(2) + ethane(1) <=> OH(5) + C2H5(27) # Reaction 24 - rate-constant: {A: 8.98e+07, b: 1.92, Ea: 5.69} - note: | - Reaction index: Chemkin #24; RMG #24 - Library reaction: GRI-Mech3.0 - Flux pairs: ethane(1), C2H5(27); O(2), OH(5); -- equation: O(2) + HCCO(23) <=> H(4) + CO(10) + CO(10) # Reaction 25 - rate-constant: {A: 1.0e+14, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #25; RMG #25 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCO(23), CO(10); O(2), H(4); O(2), CO(10); -- equation: O(2) + CH2CO(25) <=> OH(5) + HCCO(23) # Reaction 26 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: 8.0} - note: | - Reaction index: Chemkin #26; RMG #26 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CO(25), HCCO(23); O(2), OH(5); -- equation: O(2) + CH2CO(25) <=> CO2(17) + CH2(11) # Reaction 27 - rate-constant: {A: 1.75e+12, b: 0.0, Ea: 1.35} - note: | - Reaction index: Chemkin #27; RMG #27 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CO(25), CO2(17); O(2), CH2(11); -- equation: O2(7) + CO(10) <=> O(2) + CO2(17) # Reaction 28 - rate-constant: {A: 2.5e+12, b: 0.0, Ea: 47.8} - note: | - Reaction index: Chemkin #28; RMG #28 - Library reaction: GRI-Mech3.0 - Flux pairs: CO(10), CO2(17); O2(7), O(2); -- equation: O2(7) + CH2O(15) <=> HO2(6) + HCO(12) # Reaction 29 - rate-constant: {A: 1.0e+14, b: 0.0, Ea: 40.0} - note: | - Reaction index: Chemkin #29; RMG #29 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), HCO(12); O2(7), HO2(6); -- equation: O2(7) + O2(7) + H(4) <=> O2(7) + HO2(6) # Reaction 30 - rate-constant: {A: 2.08e+19, b: -1.24, Ea: 0.0} - note: | - Reaction index: Chemkin #30; RMG #30 - Library reaction: GRI-Mech3.0 - Flux pairs: O2(7), HO2(6); H(4), O2(7); O2(7), O2(7); -- equation: O2(7) + H(4) + H2O(28) <=> HO2(6) + H2O(28) # Reaction 31 - rate-constant: {A: 1.126e+19, b: -0.76, Ea: 0.0} - note: | - Reaction index: Chemkin #31; RMG #31 - Library reaction: GRI-Mech3.0 - Flux pairs: O2(7), HO2(6); H(4), H2O(28); H2O(28), H2O(28); -- equation: O2(7) + H(4) <=> O(2) + OH(5) # Reaction 32 - rate-constant: {A: 2.65e+16, b: -0.671, Ea: 17.041} - note: | - Reaction index: Chemkin #32; RMG #32 - Library reaction: GRI-Mech3.0 - Flux pairs: O2(7), OH(5); H(4), O(2); -- equation: H(4) + H(4) + H2(3) <=> H2(3) + H2(3) # Reaction 33 - rate-constant: {A: 9.0e+16, b: -0.6, Ea: 0.0} - note: | - Reaction index: Chemkin #33; RMG #33 - Library reaction: GRI-Mech3.0 - Flux pairs: H2(3), H2(3); H(4), H2(3); H(4), H2(3); -- equation: H(4) + H(4) + H2O(28) <=> H2(3) + H2O(28) # Reaction 34 - rate-constant: {A: 6.0e+19, b: -1.25, Ea: 0.0} - note: | - Reaction index: Chemkin #34; RMG #34 - Library reaction: GRI-Mech3.0 - Flux pairs: H2O(28), H2O(28); H(4), H2(3); H(4), H2(3); -- equation: H(4) + H(4) + CO2(17) <=> H2(3) + CO2(17) # Reaction 35 - rate-constant: {A: 5.5e+20, b: -2.0, Ea: 0.0} - note: | - Reaction index: Chemkin #35; RMG #35 - Library reaction: GRI-Mech3.0 - Flux pairs: CO2(17), CO2(17); H(4), H2(3); H(4), H2(3); -- equation: H(4) + HO2(6) <=> O(2) + H2O(28) # Reaction 36 - rate-constant: {A: 3.97e+12, b: 0.0, Ea: 0.671} - note: | - Reaction index: Chemkin #36; RMG #36 - Library reaction: GRI-Mech3.0 - Flux pairs: HO2(6), H2O(28); H(4), O(2); -- equation: H(4) + HO2(6) <=> O2(7) + H2(3) # Reaction 37 - rate-constant: {A: 4.48e+13, b: 0.0, Ea: 1.068} - note: | - Reaction index: Chemkin #37; RMG #37 - Library reaction: GRI-Mech3.0 - Flux pairs: HO2(6), O2(7); H(4), H2(3); -- equation: H(4) + HO2(6) <=> OH(5) + OH(5) # Reaction 38 - rate-constant: {A: 8.4e+13, b: 0.0, Ea: 0.635} - note: | - Reaction index: Chemkin #38; RMG #38 - Library reaction: GRI-Mech3.0 - Flux pairs: HO2(6), OH(5); H(4), OH(5); -- equation: H(4) + H2O2(8) <=> HO2(6) + H2(3) # Reaction 39 - rate-constant: {A: 1.21e+07, b: 2.0, Ea: 5.2} - note: | - Reaction index: Chemkin #39; RMG #39 - Library reaction: GRI-Mech3.0 - Flux pairs: H2O2(8), HO2(6); H(4), H2(3); -- equation: H(4) + H2O2(8) <=> OH(5) + H2O(28) # Reaction 40 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: 3.6} - note: | - Reaction index: Chemkin #40; RMG #40 - Library reaction: GRI-Mech3.0 - Flux pairs: H2O2(8), H2O(28); H(4), OH(5); -- equation: H(4) + CH(9) <=> H2(3) + C(29) # Reaction 41 - rate-constant: {A: 1.65e+14, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #41; RMG #41 - Library reaction: GRI-Mech3.0 - Flux pairs: CH(9), C(29); H(4), H2(3); -- equation: H(4) + CH2(S)(13) <=> H2(3) + CH(9) # Reaction 42 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #42; RMG #42 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CH(9); H(4), H2(3); -- equation: H(4) + CH4(16) <=> H2(3) + CH3(14) # Reaction 43 - rate-constant: {A: 6.6e+08, b: 1.62, Ea: 10.84} - note: | - Reaction index: Chemkin #43; RMG #43 - Library reaction: GRI-Mech3.0 - Flux pairs: CH4(16), CH3(14); H(4), H2(3); -- equation: H(4) + HCO(12) <=> H2(3) + CO(10) # Reaction 44 - rate-constant: {A: 7.34e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #44; RMG #44 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO(10); H(4), H2(3); -- equation: H(4) + CH2O(15) <=> H2(3) + HCO(12) # Reaction 45 - rate-constant: {A: 5.74e+07, b: 1.9, Ea: 2.742} - note: | - Reaction index: Chemkin #45; RMG #45 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), HCO(12); H(4), H2(3); -- equation: H(4) + CH2OH(18) <=> H2(3) + CH2O(15) # Reaction 46 - rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #46; RMG #46 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2OH(18), CH2O(15); H(4), H2(3); -- equation: H(4) + CH2OH(18) <=> OH(5) + CH3(14) # Reaction 47 - rate-constant: {A: 1.65e+11, b: 0.65, Ea: -0.284} - note: | - Reaction index: Chemkin #47; RMG #47 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2OH(18), CH3(14); H(4), OH(5); -- equation: H(4) + CH2OH(18) <=> H2O(28) + CH2(S)(13) # Reaction 48 - rate-constant: {A: 3.28e+13, b: -0.09, Ea: 0.61} - note: | - Reaction index: Chemkin #48; RMG #48 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2OH(18), CH2(S)(13); H(4), H2O(28); -- equation: H(4) + CH3O(19) <=> H(4) + CH2OH(18) # Reaction 49 - rate-constant: {A: 4.15e+07, b: 1.63, Ea: 1.924} - note: | - Reaction index: Chemkin #49; RMG #49 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH2OH(18); H(4), H(4); -- equation: H(4) + CH3O(19) <=> H2(3) + CH2O(15) # Reaction 50 - rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #50; RMG #50 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH2O(15); H(4), H2(3); -- equation: H(4) + CH3O(19) <=> OH(5) + CH3(14) # Reaction 51 - rate-constant: {A: 1.5e+12, b: 0.5, Ea: -0.11} - note: | - Reaction index: Chemkin #51; RMG #51 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH3(14); H(4), OH(5); -- equation: H(4) + CH3O(19) <=> H2O(28) + CH2(S)(13) # Reaction 52 - rate-constant: {A: 2.62e+14, b: -0.23, Ea: 1.07} - note: | - Reaction index: Chemkin #52; RMG #52 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH2(S)(13); H(4), H2O(28); -- equation: H(4) + CH3OH(20) <=> H2(3) + CH2OH(18) # Reaction 53 - rate-constant: {A: 1.7e+07, b: 2.1, Ea: 4.87} - note: | - Reaction index: Chemkin #53; RMG #53 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH2OH(18); H(4), H2(3); -- equation: H(4) + CH3OH(20) <=> H2(3) + CH3O(19) # Reaction 54 - rate-constant: {A: 4.2e+06, b: 2.1, Ea: 4.87} - note: | - Reaction index: Chemkin #54; RMG #54 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH3O(19); H(4), H2(3); -- equation: H(4) + C2H3(24) <=> H2(3) + C2H2(22) # Reaction 55 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #55; RMG #55 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H3(24), C2H2(22); H(4), H2(3); -- equation: H(4) + C2H4(26) <=> H2(3) + C2H3(24) # Reaction 56 - rate-constant: {A: 1.325e+06, b: 2.53, Ea: 12.24} - note: | - Reaction index: Chemkin #56; RMG #56 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H4(26), C2H3(24); H(4), H2(3); -- equation: H(4) + C2H5(27) <=> H2(3) + C2H4(26) # Reaction 57 - rate-constant: {A: 2.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #57; RMG #57 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H5(27), C2H4(26); H(4), H2(3); -- equation: H(4) + ethane(1) <=> H2(3) + C2H5(27) # Reaction 58 - rate-constant: {A: 1.15e+08, b: 1.9, Ea: 7.53} - note: | - Reaction index: Chemkin #58; RMG #58 - Library reaction: GRI-Mech3.0 - Flux pairs: ethane(1), C2H5(27); H(4), H2(3); -- equation: H(4) + HCCO(23) <=> CO(10) + CH2(S)(13) # Reaction 59 - rate-constant: {A: 1.0e+14, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #59; RMG #59 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCO(23), CO(10); H(4), CH2(S)(13); -- equation: H(4) + CH2CO(25) <=> H2(3) + HCCO(23) # Reaction 60 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 8.0} - note: | - Reaction index: Chemkin #60; RMG #60 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CO(25), HCCO(23); H(4), H2(3); -- equation: H(4) + CH2CO(25) <=> CO(10) + CH3(14) # Reaction 61 - rate-constant: {A: 1.13e+13, b: 0.0, Ea: 3.428} - note: | - Reaction index: Chemkin #61; RMG #61 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CO(25), CO(10); H(4), CH3(14); -- equation: H(4) + HCCOH(30) <=> H(4) + CH2CO(25) # Reaction 62 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #62; RMG #62 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCOH(30), CH2CO(25); H(4), H(4); -- equation: OH(5) + H2(3) <=> H(4) + H2O(28) # Reaction 63 - rate-constant: {A: 2.16e+08, b: 1.51, Ea: 3.43} - note: | - Reaction index: Chemkin #63; RMG #63 - Library reaction: GRI-Mech3.0 - Flux pairs: OH(5), H2O(28); H2(3), H(4); -- equation: OH(5) + OH(5) <=> O(2) + H2O(28) # Reaction 64 - rate-constant: {A: 3.57e+04, b: 2.4, Ea: -2.11} - note: | - Reaction index: Chemkin #64; RMG #64 - Library reaction: GRI-Mech3.0 - Flux pairs: OH(5), H2O(28); OH(5), O(2); -- equation: OH(5) + HO2(6) <=> O2(7) + H2O(28) # Reaction 65 - duplicate: true - rate-constant: {A: 1.45e+13, b: 0.0, Ea: -0.5} - note: | - Reaction index: Chemkin #65; RMG #65 - Library reaction: GRI-Mech3.0 -- equation: OH(5) + HO2(6) <=> O2(7) + H2O(28) # Reaction 66 - duplicate: true - rate-constant: {A: 5.0e+15, b: 0.0, Ea: 17.33} - note: | - Reaction index: Chemkin #66; RMG #65 - Library reaction: GRI-Mech3.0 -- equation: OH(5) + H2O2(8) <=> HO2(6) + H2O(28) # Reaction 67 - duplicate: true - rate-constant: {A: 2.0e+12, b: 0.0, Ea: 0.427} - note: | - Reaction index: Chemkin #67; RMG #66 - Library reaction: GRI-Mech3.0 -- equation: OH(5) + H2O2(8) <=> HO2(6) + H2O(28) # Reaction 68 - duplicate: true - rate-constant: {A: 1.7e+18, b: 0.0, Ea: 29.41} - note: | - Reaction index: Chemkin #68; RMG #66 - Library reaction: GRI-Mech3.0 -- equation: OH(5) + C(29) <=> H(4) + CO(10) # Reaction 69 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #69; RMG #67 - Library reaction: GRI-Mech3.0 - Flux pairs: C(29), CO(10); OH(5), H(4); -- equation: OH(5) + CH(9) <=> H(4) + HCO(12) # Reaction 70 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #70; RMG #68 - Library reaction: GRI-Mech3.0 - Flux pairs: CH(9), HCO(12); OH(5), H(4); -- equation: OH(5) + CH2(11) <=> H(4) + CH2O(15) # Reaction 71 - rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #71; RMG #69 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CH2O(15); OH(5), H(4); -- equation: OH(5) + CH2(11) <=> H2O(28) + CH(9) # Reaction 72 - rate-constant: {A: 1.13e+07, b: 2.0, Ea: 3.0} - note: | - Reaction index: Chemkin #72; RMG #70 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CH(9); OH(5), H2O(28); -- equation: OH(5) + CH2(S)(13) <=> H(4) + CH2O(15) # Reaction 73 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #73; RMG #71 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CH2O(15); OH(5), H(4); -- equation: OH(5) + CH3(14) <=> H2O(28) + CH2(11) # Reaction 74 - rate-constant: {A: 5.6e+07, b: 1.6, Ea: 5.42} - note: | - Reaction index: Chemkin #74; RMG #72 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH2(11); OH(5), H2O(28); -- equation: OH(5) + CH3(14) <=> H2O(28) + CH2(S)(13) # Reaction 75 - rate-constant: {A: 6.44e+17, b: -1.34, Ea: 1.417} - note: | - Reaction index: Chemkin #75; RMG #73 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH2(S)(13); OH(5), H2O(28); -- equation: OH(5) + CH4(16) <=> H2O(28) + CH3(14) # Reaction 76 - rate-constant: {A: 1.0e+08, b: 1.6, Ea: 3.12} - note: | - Reaction index: Chemkin #76; RMG #74 - Library reaction: GRI-Mech3.0 - Flux pairs: CH4(16), CH3(14); OH(5), H2O(28); -- equation: OH(5) + CO(10) <=> H(4) + CO2(17) # Reaction 77 - rate-constant: {A: 4.76e+07, b: 1.228, Ea: 0.07} - note: | - Reaction index: Chemkin #77; RMG #75 - Library reaction: GRI-Mech3.0 - Flux pairs: CO(10), CO2(17); OH(5), H(4); -- equation: OH(5) + HCO(12) <=> H2O(28) + CO(10) # Reaction 78 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #78; RMG #76 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO(10); OH(5), H2O(28); -- equation: OH(5) + CH2O(15) <=> H2O(28) + HCO(12) # Reaction 79 - rate-constant: {A: 3.43e+09, b: 1.18, Ea: -0.447} - note: | - Reaction index: Chemkin #79; RMG #77 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), HCO(12); OH(5), H2O(28); -- equation: OH(5) + CH2OH(18) <=> H2O(28) + CH2O(15) # Reaction 80 - rate-constant: {A: 5.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #80; RMG #78 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2OH(18), CH2O(15); OH(5), H2O(28); -- equation: OH(5) + CH3O(19) <=> H2O(28) + CH2O(15) # Reaction 81 - rate-constant: {A: 5.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #81; RMG #79 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH2O(15); OH(5), H2O(28); -- equation: OH(5) + CH3OH(20) <=> H2O(28) + CH2OH(18) # Reaction 82 - rate-constant: {A: 1.44e+06, b: 2.0, Ea: -0.84} - note: | - Reaction index: Chemkin #82; RMG #80 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH2OH(18); OH(5), H2O(28); -- equation: OH(5) + CH3OH(20) <=> H2O(28) + CH3O(19) # Reaction 83 - rate-constant: {A: 6.3e+06, b: 2.0, Ea: 1.5} - note: | - Reaction index: Chemkin #83; RMG #81 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH3O(19); OH(5), H2O(28); -- equation: OH(5) + C2H(21) <=> H(4) + HCCO(23) # Reaction 84 - rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #84; RMG #82 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H(21), HCCO(23); OH(5), H(4); -- equation: OH(5) + C2H2(22) <=> H(4) + CH2CO(25) # Reaction 85 - rate-constant: {A: 2.18e-04, b: 4.5, Ea: -1.0} - note: | - Reaction index: Chemkin #85; RMG #83 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), CH2CO(25); OH(5), H(4); -- equation: OH(5) + C2H2(22) <=> H(4) + HCCOH(30) # Reaction 86 - rate-constant: {A: 5.04e+05, b: 2.3, Ea: 13.5} - note: | - Reaction index: Chemkin #86; RMG #84 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), HCCOH(30); OH(5), H(4); -- equation: OH(5) + C2H2(22) <=> H2O(28) + C2H(21) # Reaction 87 - rate-constant: {A: 3.37e+07, b: 2.0, Ea: 14.0} - note: | - Reaction index: Chemkin #87; RMG #85 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), C2H(21); OH(5), H2O(28); -- equation: OH(5) + C2H2(22) <=> CO(10) + CH3(14) # Reaction 88 - rate-constant: {A: 4.83e-04, b: 4.0, Ea: -2.0} - note: | - Reaction index: Chemkin #88; RMG #86 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H2(22), CO(10); OH(5), CH3(14); -- equation: OH(5) + C2H3(24) <=> H2O(28) + C2H2(22) # Reaction 89 - rate-constant: {A: 5.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #89; RMG #87 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H3(24), C2H2(22); OH(5), H2O(28); -- equation: OH(5) + C2H4(26) <=> H2O(28) + C2H3(24) # Reaction 90 - rate-constant: {A: 3.6e+06, b: 2.0, Ea: 2.5} - note: | - Reaction index: Chemkin #90; RMG #88 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H4(26), C2H3(24); OH(5), H2O(28); -- equation: OH(5) + ethane(1) <=> H2O(28) + C2H5(27) # Reaction 91 - rate-constant: {A: 3.54e+06, b: 2.12, Ea: 0.87} - note: | - Reaction index: Chemkin #91; RMG #89 - Library reaction: GRI-Mech3.0 - Flux pairs: ethane(1), C2H5(27); OH(5), H2O(28); -- equation: OH(5) + CH2CO(25) <=> H2O(28) + HCCO(23) # Reaction 92 - rate-constant: {A: 7.5e+12, b: 0.0, Ea: 2.0} - note: | - Reaction index: Chemkin #92; RMG #90 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CO(25), HCCO(23); OH(5), H2O(28); -- equation: HO2(6) + HO2(6) <=> O2(7) + H2O2(8) # Reaction 93 - duplicate: true - rate-constant: {A: 1.3e+11, b: 0.0, Ea: -1.63} - note: | - Reaction index: Chemkin #93; RMG #91 - Library reaction: GRI-Mech3.0 -- equation: HO2(6) + HO2(6) <=> O2(7) + H2O2(8) # Reaction 94 - duplicate: true - rate-constant: {A: 4.2e+14, b: 0.0, Ea: 12.0} - note: | - Reaction index: Chemkin #94; RMG #91 - Library reaction: GRI-Mech3.0 -- equation: HO2(6) + CH2(11) <=> OH(5) + CH2O(15) # Reaction 95 - rate-constant: {A: 2.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #95; RMG #92 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CH2O(15); HO2(6), OH(5); -- equation: HO2(6) + CH3(14) <=> O2(7) + CH4(16) # Reaction 96 - rate-constant: {A: 1.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #96; RMG #93 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH4(16); HO2(6), O2(7); -- equation: HO2(6) + CH3(14) <=> OH(5) + CH3O(19) # Reaction 97 - rate-constant: {A: 3.78e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #97; RMG #94 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH3O(19); HO2(6), OH(5); -- equation: HO2(6) + CO(10) <=> OH(5) + CO2(17) # Reaction 98 - rate-constant: {A: 1.5e+14, b: 0.0, Ea: 23.6} - note: | - Reaction index: Chemkin #98; RMG #95 - Library reaction: GRI-Mech3.0 - Flux pairs: CO(10), CO2(17); HO2(6), OH(5); -- equation: HO2(6) + CH2O(15) <=> H2O2(8) + HCO(12) # Reaction 99 - rate-constant: {A: 5.6e+06, b: 2.0, Ea: 12.0} - note: | - Reaction index: Chemkin #99; RMG #96 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), HCO(12); HO2(6), H2O2(8); -- equation: O2(7) + C(29) <=> O(2) + CO(10) # Reaction 100 - rate-constant: {A: 5.8e+13, b: 0.0, Ea: 0.576} - note: | - Reaction index: Chemkin #100; RMG #97 - Library reaction: GRI-Mech3.0 - Flux pairs: C(29), CO(10); O2(7), O(2); -- equation: C(29) + CH2(11) <=> H(4) + C2H(21) # Reaction 101 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #101; RMG #98 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), C2H(21); C(29), H(4); -- equation: C(29) + CH3(14) <=> H(4) + C2H2(22) # Reaction 102 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #102; RMG #99 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), C2H2(22); C(29), H(4); -- equation: O2(7) + CH(9) <=> O(2) + HCO(12) # Reaction 103 - rate-constant: {A: 6.71e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #103; RMG #100 - Library reaction: GRI-Mech3.0 - Flux pairs: CH(9), HCO(12); O2(7), O(2); -- equation: H2(3) + CH(9) <=> H(4) + CH2(11) # Reaction 104 - rate-constant: {A: 1.08e+14, b: 0.0, Ea: 3.11} - note: | - Reaction index: Chemkin #104; RMG #101 - Library reaction: GRI-Mech3.0 - Flux pairs: CH(9), CH2(11); H2(3), H(4); -- equation: H2O(28) + CH(9) <=> H(4) + CH2O(15) # Reaction 105 - rate-constant: {A: 5.71e+12, b: 0.0, Ea: -0.755} - note: | - Reaction index: Chemkin #105; RMG #102 - Library reaction: GRI-Mech3.0 - Flux pairs: CH(9), CH2O(15); H2O(28), H(4); -- equation: CH(9) + CH2(11) <=> H(4) + C2H2(22) # Reaction 106 - rate-constant: {A: 4.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #106; RMG #103 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), C2H2(22); CH(9), H(4); -- equation: CH(9) + CH3(14) <=> H(4) + C2H3(24) # Reaction 107 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #107; RMG #104 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), C2H3(24); CH(9), H(4); -- equation: CH(9) + CH4(16) <=> H(4) + C2H4(26) # Reaction 108 - rate-constant: {A: 6.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #108; RMG #105 - Library reaction: GRI-Mech3.0 - Flux pairs: CH4(16), C2H4(26); CH(9), H(4); -- equation: CO2(17) + CH(9) <=> CO(10) + HCO(12) # Reaction 109 - rate-constant: {A: 1.9e+14, b: 0.0, Ea: 15.792} - note: | - Reaction index: Chemkin #109; RMG #106 - Library reaction: GRI-Mech3.0 - Flux pairs: CO2(17), HCO(12); CH(9), CO(10); -- equation: CH(9) + CH2O(15) <=> H(4) + CH2CO(25) # Reaction 110 - rate-constant: {A: 9.46e+13, b: 0.0, Ea: -0.515} - note: | - Reaction index: Chemkin #110; RMG #107 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), CH2CO(25); CH(9), H(4); -- equation: CH(9) + HCCO(23) <=> CO(10) + C2H2(22) # Reaction 111 - rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #111; RMG #108 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCO(23), C2H2(22); CH(9), CO(10); -- equation: O2(7) + CH2(11) => H(4) + OH(5) + CO(10) # Reaction 112 - rate-constant: {A: 5.0e+12, b: 0.0, Ea: 1.5} - note: | - Reaction index: Chemkin #112; RMG #109 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CO(10); O2(7), H(4); O2(7), OH(5); -- equation: H2(3) + CH2(11) <=> H(4) + CH3(14) # Reaction 113 - rate-constant: {A: 5.0e+05, b: 2.0, Ea: 7.23} - note: | - Reaction index: Chemkin #113; RMG #110 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CH3(14); H2(3), H(4); -- equation: CH2(11) + CH2(11) <=> H2(3) + C2H2(22) # Reaction 114 - rate-constant: {A: 1.6e+15, b: 0.0, Ea: 11.944} - note: | - Reaction index: Chemkin #114; RMG #111 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), C2H2(22); CH2(11), H2(3); -- equation: CH2(11) + CH3(14) <=> H(4) + C2H4(26) # Reaction 115 - rate-constant: {A: 4.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #115; RMG #112 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), C2H4(26); CH2(11), H(4); -- equation: CH2(11) + CH4(16) <=> CH3(14) + CH3(14) # Reaction 116 - rate-constant: {A: 2.46e+06, b: 2.0, Ea: 8.27} - note: | - Reaction index: Chemkin #116; RMG #113 - Library reaction: GRI-Mech3.0 - Flux pairs: CH4(16), CH3(14); CH2(11), CH3(14); -- equation: CH2(11) + HCCO(23) <=> CO(10) + C2H3(24) # Reaction 117 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #117; RMG #114 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCO(23), C2H3(24); CH2(11), CO(10); -- equation: O2(7) + CH2(S)(13) <=> H(4) + OH(5) + CO(10) # Reaction 118 - rate-constant: {A: 2.8e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #118; RMG #115 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CO(10); O2(7), H(4); O2(7), OH(5); -- equation: O2(7) + CH2(S)(13) <=> H2O(28) + CO(10) # Reaction 119 - rate-constant: {A: 1.2e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #119; RMG #116 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CO(10); O2(7), H2O(28); -- equation: H2(3) + CH2(S)(13) <=> H(4) + CH3(14) # Reaction 120 - rate-constant: {A: 7.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #120; RMG #117 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CH3(14); H2(3), H(4); -- equation: H2O(28) + CH2(S)(13) <=> H2O(28) + CH2(11) # Reaction 121 - rate-constant: {A: 3.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #121; RMG #118 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CH2(11); H2O(28), H2O(28); -- equation: CH2(S)(13) + CH3(14) <=> H(4) + C2H4(26) # Reaction 122 - rate-constant: {A: 1.2e+13, b: 0.0, Ea: -0.57} - note: | - Reaction index: Chemkin #122; RMG #119 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), C2H4(26); CH2(S)(13), H(4); -- equation: CH2(S)(13) + CH4(16) <=> CH3(14) + CH3(14) # Reaction 123 - rate-constant: {A: 1.6e+13, b: 0.0, Ea: -0.57} - note: | - Reaction index: Chemkin #123; RMG #120 - Library reaction: GRI-Mech3.0 - Flux pairs: CH4(16), CH3(14); CH2(S)(13), CH3(14); -- equation: CO(10) + CH2(S)(13) <=> CO(10) + CH2(11) # Reaction 124 - rate-constant: {A: 9.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #124; RMG #121 - Library reaction: GRI-Mech3.0 - Flux pairs: CO(10), CO(10); CH2(S)(13), CH2(11); -- equation: CO2(17) + CH2(S)(13) <=> CO2(17) + CH2(11) # Reaction 125 - rate-constant: {A: 7.0e+12, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #125; RMG #122 - Library reaction: GRI-Mech3.0 - Flux pairs: CO2(17), CO2(17); CH2(S)(13), CH2(11); -- equation: CO2(17) + CH2(S)(13) <=> CO(10) + CH2O(15) # Reaction 126 - rate-constant: {A: 1.4e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #126; RMG #123 - Library reaction: GRI-Mech3.0 - Flux pairs: CO2(17), CH2O(15); CH2(S)(13), CO(10); -- equation: CH2(S)(13) + ethane(1) <=> CH3(14) + C2H5(27) # Reaction 127 - rate-constant: {A: 4.0e+13, b: 0.0, Ea: -0.55} - note: | - Reaction index: Chemkin #127; RMG #124 - Library reaction: GRI-Mech3.0 - Flux pairs: ethane(1), C2H5(27); CH2(S)(13), CH3(14); -- equation: O2(7) + CH3(14) <=> O(2) + CH3O(19) # Reaction 128 - rate-constant: {A: 3.56e+13, b: 0.0, Ea: 30.48} - note: | - Reaction index: Chemkin #128; RMG #125 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH3O(19); O2(7), O(2); -- equation: O2(7) + CH3(14) <=> OH(5) + CH2O(15) # Reaction 129 - rate-constant: {A: 2.31e+12, b: 0.0, Ea: 20.315} - note: | - Reaction index: Chemkin #129; RMG #126 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH2O(15); O2(7), OH(5); -- equation: H2O2(8) + CH3(14) <=> HO2(6) + CH4(16) # Reaction 130 - rate-constant: {A: 2.45e+04, b: 2.47, Ea: 5.18} - note: | - Reaction index: Chemkin #130; RMG #127 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH4(16); H2O2(8), HO2(6); -- equation: CH3(14) + CH3(14) <=> H(4) + C2H5(27) # Reaction 131 - rate-constant: {A: 6.84e+12, b: 0.1, Ea: 10.6} - note: | - Reaction index: Chemkin #131; RMG #128 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), C2H5(27); CH3(14), H(4); -- equation: HCO(12) + CH3(14) <=> CO(10) + CH4(16) # Reaction 132 - rate-constant: {A: 2.648e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #132; RMG #129 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO(10); CH3(14), CH4(16); -- equation: CH2O(15) + CH3(14) <=> HCO(12) + CH4(16) # Reaction 133 - rate-constant: {A: 3320.0, b: 2.81, Ea: 5.86} - note: | - Reaction index: Chemkin #133; RMG #130 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2O(15), HCO(12); CH3(14), CH4(16); -- equation: CH3(14) + CH3OH(20) <=> CH2OH(18) + CH4(16) # Reaction 134 - rate-constant: {A: 3.0e+07, b: 1.5, Ea: 9.94} - note: | - Reaction index: Chemkin #134; RMG #131 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH2OH(18); CH3(14), CH4(16); -- equation: CH3(14) + CH3OH(20) <=> CH3O(19) + CH4(16) # Reaction 135 - rate-constant: {A: 1.0e+07, b: 1.5, Ea: 9.94} - note: | - Reaction index: Chemkin #135; RMG #132 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3OH(20), CH3O(19); CH3(14), CH4(16); -- equation: CH3(14) + C2H4(26) <=> CH4(16) + C2H3(24) # Reaction 136 - rate-constant: {A: 2.27e+05, b: 2.0, Ea: 9.2} - note: | - Reaction index: Chemkin #136; RMG #133 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H4(26), C2H3(24); CH3(14), CH4(16); -- equation: CH3(14) + ethane(1) <=> CH4(16) + C2H5(27) # Reaction 137 - rate-constant: {A: 6.14e+06, b: 1.74, Ea: 10.45} - note: | - Reaction index: Chemkin #137; RMG #134 - Library reaction: GRI-Mech3.0 - Flux pairs: ethane(1), C2H5(27); CH3(14), CH4(16); -- equation: H2O(28) + HCO(12) <=> H(4) + H2O(28) + CO(10) # Reaction 138 - rate-constant: {A: 1.5e+18, b: -1.0, Ea: 17.0} - note: | - Reaction index: Chemkin #138; RMG #135 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO(10); H2O(28), H(4); H2O(28), H2O(28); -- equation: O2(7) + HCO(12) <=> HO2(6) + CO(10) # Reaction 139 - rate-constant: {A: 1.345e+13, b: 0.0, Ea: 0.4} - note: | - Reaction index: Chemkin #139; RMG #136 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), CO(10); O2(7), HO2(6); -- equation: O2(7) + CH2OH(18) <=> HO2(6) + CH2O(15) # Reaction 140 - rate-constant: {A: 1.8e+13, b: 0.0, Ea: 0.9} - note: | - Reaction index: Chemkin #140; RMG #137 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2OH(18), CH2O(15); O2(7), HO2(6); -- equation: O2(7) + CH3O(19) <=> HO2(6) + CH2O(15) # Reaction 141 - rate-constant: {A: 4.28e-13, b: 7.6, Ea: -3.53} - note: | - Reaction index: Chemkin #141; RMG #138 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3O(19), CH2O(15); O2(7), HO2(6); -- equation: O2(7) + C2H(21) <=> CO(10) + HCO(12) # Reaction 142 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: -0.755} - note: | - Reaction index: Chemkin #142; RMG #139 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H(21), HCO(12); O2(7), CO(10); -- equation: H2(3) + C2H(21) <=> H(4) + C2H2(22) # Reaction 143 - rate-constant: {A: 5.68e+10, b: 0.9, Ea: 1.993} - note: | - Reaction index: Chemkin #143; RMG #140 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H(21), C2H2(22); H2(3), H(4); -- equation: O2(7) + C2H3(24) <=> HCO(12) + CH2O(15) # Reaction 144 - rate-constant: {A: 4.58e+16, b: -1.39, Ea: 1.015} - note: | - Reaction index: Chemkin #144; RMG #141 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H3(24), CH2O(15); O2(7), HCO(12); -- equation: O2(7) + C2H5(27) <=> HO2(6) + C2H4(26) # Reaction 145 - rate-constant: {A: 8.4e+11, b: 0.0, Ea: 3.875} - note: | - Reaction index: Chemkin #145; RMG #142 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H5(27), C2H4(26); O2(7), HO2(6); -- equation: O2(7) + HCCO(23) <=> OH(5) + CO(10) + CO(10) # Reaction 146 - rate-constant: {A: 3.2e+12, b: 0.0, Ea: 0.854} - note: | - Reaction index: Chemkin #146; RMG #143 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCO(23), CO(10); O2(7), OH(5); O2(7), CO(10); -- equation: HCCO(23) + HCCO(23) <=> CO(10) + CO(10) + C2H2(22) # Reaction 147 - rate-constant: {A: 1.0e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #147; RMG #144 - Library reaction: GRI-Mech3.0 - Flux pairs: HCCO(23), C2H2(22); HCCO(23), CO(10); HCCO(23), CO(10); -- equation: O(2) + CH3(14) => H(4) + H2(3) + CO(10) # Reaction 148 - rate-constant: {A: 3.37e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #148; RMG #145 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CO(10); O(2), H(4); O(2), H2(3); -- equation: O(2) + C2H4(26) <=> H(4) + CH2CHO(31) # Reaction 149 - rate-constant: {A: 6.7e+06, b: 1.83, Ea: 0.22} - note: | - Reaction index: Chemkin #149; RMG #146 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H4(26), CH2CHO(31); O(2), H(4); -- equation: O(2) + C2H5(27) <=> H(4) + CH3CHO(32) # Reaction 150 - rate-constant: {A: 1.096e+14, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #150; RMG #147 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H5(27), CH3CHO(32); O(2), H(4); -- equation: OH(5) + CH3(14) => H2(3) + CH2O(15) # Reaction 151 - rate-constant: {A: 8.0e+09, b: 0.5, Ea: -1.755} - note: | - Reaction index: Chemkin #151; RMG #148 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), CH2O(15); OH(5), H2(3); -- equation: O2(7) + CH2(11) => H(4) + H(4) + CO2(17) # Reaction 152 - rate-constant: {A: 5.8e+12, b: 0.0, Ea: 1.5} - note: | - Reaction index: Chemkin #152; RMG #149 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CO2(17); O2(7), H(4); O2(7), H(4); -- equation: O2(7) + CH2(11) <=> O(2) + CH2O(15) # Reaction 153 - rate-constant: {A: 2.4e+12, b: 0.0, Ea: 1.5} - note: | - Reaction index: Chemkin #153; RMG #150 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), CH2O(15); O2(7), O(2); -- equation: CH2(11) + CH2(11) => H(4) + H(4) + C2H2(22) # Reaction 154 - rate-constant: {A: 2.0e+14, b: 0.0, Ea: 10.989} - note: | - Reaction index: Chemkin #154; RMG #151 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(11), C2H2(22); CH2(11), H(4); CH2(11), H(4); -- equation: H2O(28) + CH2(S)(13) => H2(3) + CH2O(15) # Reaction 155 - rate-constant: {A: 6.82e+10, b: 0.25, Ea: -0.935} - note: | - Reaction index: Chemkin #155; RMG #152 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2(S)(13), CH2O(15); H2O(28), H2(3); -- equation: O2(7) + C2H3(24) <=> O(2) + CH2CHO(31) # Reaction 156 - rate-constant: {A: 3.03e+11, b: 0.29, Ea: 0.011} - note: | - Reaction index: Chemkin #156; RMG #153 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H3(24), CH2CHO(31); O2(7), O(2); -- equation: O2(7) + C2H3(24) <=> HO2(6) + C2H2(22) # Reaction 157 - rate-constant: {A: 1.337e+06, b: 1.61, Ea: -0.384} - note: | - Reaction index: Chemkin #157; RMG #154 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H3(24), C2H2(22); O2(7), HO2(6); -- equation: O(2) + CH3CHO(32) <=> OH(5) + CH2CHO(31) # Reaction 158 - rate-constant: {A: 2.92e+12, b: 0.0, Ea: 1.808} - note: | - Reaction index: Chemkin #158; RMG #155 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CH2CHO(31); O(2), OH(5); -- equation: O(2) + CH3CHO(32) => OH(5) + CO(10) + CH3(14) # Reaction 159 - rate-constant: {A: 2.92e+12, b: 0.0, Ea: 1.808} - note: | - Reaction index: Chemkin #159; RMG #156 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CO(10); O(2), OH(5); O(2), CH3(14); -- equation: O2(7) + CH3CHO(32) => HO2(6) + CO(10) + CH3(14) # Reaction 160 - rate-constant: {A: 3.01e+13, b: 0.0, Ea: 39.15} - note: | - Reaction index: Chemkin #160; RMG #157 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CO(10); O2(7), HO2(6); O2(7), CH3(14); -- equation: H(4) + CH3CHO(32) <=> H2(3) + CH2CHO(31) # Reaction 161 - rate-constant: {A: 2.05e+09, b: 1.16, Ea: 2.405} - note: | - Reaction index: Chemkin #161; RMG #158 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CH2CHO(31); H(4), H2(3); -- equation: H(4) + CH3CHO(32) => H2(3) + CO(10) + CH3(14) # Reaction 162 - rate-constant: {A: 2.05e+09, b: 1.16, Ea: 2.405} - note: | - Reaction index: Chemkin #162; RMG #159 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CO(10); H(4), H2(3); H(4), CH3(14); -- equation: OH(5) + CH3CHO(32) => H2O(28) + CO(10) + CH3(14) # Reaction 163 - rate-constant: {A: 2.343e+10, b: 0.73, Ea: -1.113} - note: | - Reaction index: Chemkin #163; RMG #160 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CO(10); OH(5), H2O(28); OH(5), CH3(14); -- equation: HO2(6) + CH3CHO(32) => H2O2(8) + CO(10) + CH3(14) # Reaction 164 - rate-constant: {A: 3.01e+12, b: 0.0, Ea: 11.923} - note: | - Reaction index: Chemkin #164; RMG #161 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CO(10); HO2(6), H2O2(8); HO2(6), CH3(14); -- equation: CH3(14) + CH3CHO(32) => CO(10) + CH3(14) + CH4(16) # Reaction 165 - rate-constant: {A: 2.72e+06, b: 1.77, Ea: 5.92} - note: | - Reaction index: Chemkin #165; RMG #162 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3CHO(32), CO(10); CH3(14), CH3(14); CH3(14), CH4(16); -- equation: O(2) + CH2CHO(31) => H(4) + CO2(17) + CH2(11) # Reaction 166 - rate-constant: {A: 1.5e+14, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #166; RMG #163 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), CO2(17); O(2), H(4); O(2), CH2(11); -- equation: O2(7) + CH2CHO(31) => OH(5) + CO(10) + CH2O(15) # Reaction 167 - rate-constant: {A: 1.81e+10, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #167; RMG #164 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), CH2O(15); O2(7), OH(5); O2(7), CO(10); -- equation: O2(7) + CH2CHO(31) => OH(5) + HCO(12) + HCO(12) # Reaction 168 - rate-constant: {A: 2.35e+10, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #168; RMG #165 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), HCO(12); O2(7), OH(5); O2(7), HCO(12); -- equation: H(4) + CH2CHO(31) <=> HCO(12) + CH3(14) # Reaction 169 - rate-constant: {A: 2.2e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #169; RMG #166 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), HCO(12); H(4), CH3(14); -- equation: H(4) + CH2CHO(31) <=> H2(3) + CH2CO(25) # Reaction 170 - rate-constant: {A: 1.1e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #170; RMG #167 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), CH2CO(25); H(4), H2(3); -- equation: OH(5) + CH2CHO(31) <=> H2O(28) + CH2CO(25) # Reaction 171 - rate-constant: {A: 1.2e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #171; RMG #168 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), CH2CO(25); OH(5), H2O(28); -- equation: OH(5) + CH2CHO(31) <=> HCO(12) + CH2OH(18) # Reaction 172 - rate-constant: {A: 3.01e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #172; RMG #169 - Library reaction: GRI-Mech3.0 - Flux pairs: CH2CHO(31), CH2OH(18); OH(5), HCO(12); -- equation: O(2) + O(2) + M <=> O2(7) + M # Reaction 173 - type: three-body - rate-constant: {A: 1.2e+17, b: -1.0, Ea: 0.0} - efficiencies: {CO2(17): 3.6, CH4(16): 2.0, ethane(1): 3.0, H2O(28): - 15.4, H2(3): 2.4, Ar: 0.83} - note: | - Reaction index: Chemkin #173; RMG #170 - Library reaction: GRI-Mech3.0 - Flux pairs: O(2), O2(7); O(2), O2(7); -- equation: O(2) + H(4) + M <=> OH(5) + M # Reaction 174 - type: three-body - rate-constant: {A: 5.0e+17, b: -1.0, Ea: 0.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #174; RMG #171 - Library reaction: GRI-Mech3.0 - Flux pairs: O(2), OH(5); H(4), OH(5); -- equation: O2(7) + H(4) + M <=> HO2(6) + M # Reaction 175 - type: three-body - rate-constant: {A: 2.8e+18, b: -0.86, Ea: 0.0} - efficiencies: {CO2(17): 1.5, ethane(1): 1.5, H2O(28): 0.0, O2(7): - 0.0, N2: 0.0, Ar: 0.0} - note: | - Reaction index: Chemkin #175; RMG #172 - Library reaction: GRI-Mech3.0 - Flux pairs: O2(7), HO2(6); H(4), HO2(6); -- equation: H(4) + H(4) + M <=> H2(3) + M # Reaction 176 - type: three-body - rate-constant: {A: 1.0e+18, b: -1.0, Ea: 0.0} - efficiencies: {CH4(16): 2.0, CO2(17): 0.0, ethane(1): 3.0, H2O(28): - 0.0, H2(3): 0.0, Ar: 0.63} - note: | - Reaction index: Chemkin #176; RMG #173 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), H2(3); H(4), H2(3); -- equation: H(4) + OH(5) + M <=> H2O(28) + M # Reaction 177 - type: three-body - rate-constant: {A: 2.2e+22, b: -2.0, Ea: 0.0} - efficiencies: {ethane(1): 3.0, CH4(16): 2.0, H2(3): 0.73, H2O(28): - 3.65, Ar: 0.38} - note: | - Reaction index: Chemkin #177; RMG #174 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), H2O(28); OH(5), H2O(28); -- equation: HCO(12) + M <=> H(4) + CO(10) + M # Reaction 178 - type: three-body - rate-constant: {A: 1.87e+17, b: -1.0, Ea: 17.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 0.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #178; RMG #175 - Library reaction: GRI-Mech3.0 - Flux pairs: HCO(12), H(4); HCO(12), CO(10); -- equation: O(2) + CO(10) (+M) <=> CO2(17) (+M) # Reaction 179 - type: falloff - low-P-rate-constant: {A: 6.02e+14, b: 0.0, Ea: 3.0} - high-P-rate-constant: {A: 1.8e+10, b: 0.0, Ea: 2.385} - efficiencies: {CH4(16): 2.0, CO2(17): 3.5, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, O2(7): 6.0, Ar: 0.5} - note: | - Reaction index: Chemkin #179; RMG #176 - Library reaction: GRI-Mech3.0 - Flux pairs: O(2), CO2(17); CO(10), CO2(17); -- equation: H(4) + CH2(11) (+M) <=> CH3(14) (+M) # Reaction 180 - type: falloff - low-P-rate-constant: {A: 1.04e+26, b: -2.76, Ea: 1.6} - high-P-rate-constant: {A: 6.0e+14, b: 0.0, Ea: 0.0} - Troe: {A: 0.562, T3: 91.0, T1: 5840.0, T2: 8550.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #180; RMG #177 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH3(14); CH2(11), CH3(14); -- equation: H(4) + CH3(14) (+M) <=> CH4(16) (+M) # Reaction 181 - type: falloff - low-P-rate-constant: {A: 2.62e+33, b: -4.76, Ea: 2.44} - high-P-rate-constant: {A: 1.39e+16, b: -0.534, Ea: 0.536} - Troe: {A: 0.783, T3: 74.0, T1: 2940.0, T2: 6960.0} - efficiencies: {CH4(16): 3.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #181; RMG #178 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH4(16); CH3(14), CH4(16); -- equation: H(4) + HCO(12) (+M) <=> CH2O(15) (+M) # Reaction 182 - type: falloff - low-P-rate-constant: {A: 2.47e+24, b: -2.57, Ea: 0.425} - high-P-rate-constant: {A: 1.09e+12, b: 0.48, Ea: -0.26} - Troe: {A: 0.7824, T3: 271.0, T1: 2760.0, T2: 6570.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #182; RMG #179 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH2O(15); HCO(12), CH2O(15); -- equation: H(4) + CH2O(15) (+M) <=> CH2OH(18) (+M) # Reaction 183 - type: falloff - low-P-rate-constant: {A: 1.27e+32, b: -4.82, Ea: 6.53} - high-P-rate-constant: {A: 5.4e+11, b: 0.454, Ea: 3.6} - Troe: {A: 0.7187, T3: 103.0, T1: 1290.0, T2: 4160.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #183; RMG #180 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH2OH(18); CH2O(15), CH2OH(18); -- equation: H(4) + CH2O(15) (+M) <=> CH3O(19) (+M) # Reaction 184 - type: falloff - low-P-rate-constant: {A: 2.2e+30, b: -4.8, Ea: 5.56} - high-P-rate-constant: {A: 5.4e+11, b: 0.454, Ea: 2.6} - Troe: {A: 0.758, T3: 94.0, T1: 1560.0, T2: 4200.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #184; RMG #181 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH3O(19); CH2O(15), CH3O(19); -- equation: H(4) + CH2OH(18) (+M) <=> CH3OH(20) (+M) # Reaction 185 - type: falloff - low-P-rate-constant: {A: 4.36e+31, b: -4.65, Ea: 5.08} - high-P-rate-constant: {A: 1.055e+12, b: 0.5, Ea: 0.086} - Troe: {A: 0.6, T3: 100.0, T1: 9.0e+04, T2: 1.0e+04} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #185; RMG #182 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH3OH(20); CH2OH(18), CH3OH(20); -- equation: H(4) + CH3O(19) (+M) <=> CH3OH(20) (+M) # Reaction 186 - type: falloff - low-P-rate-constant: {A: 4.66e+41, b: -7.44, Ea: 14.08} - high-P-rate-constant: {A: 2.43e+12, b: 0.515, Ea: 0.05} - Troe: {A: 0.7, T3: 100.0, T1: 9.0e+04, T2: 1.0e+04} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #186; RMG #183 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH3OH(20); CH3O(19), CH3OH(20); -- equation: H(4) + C2H(21) (+M) <=> C2H2(22) (+M) # Reaction 187 - type: falloff - low-P-rate-constant: {A: 3.75e+33, b: -4.8, Ea: 1.9} - high-P-rate-constant: {A: 1.0e+17, b: -1.0, Ea: 0.0} - Troe: {A: 0.6464, T3: 132.0, T1: 1320.0, T2: 5570.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #187; RMG #184 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), C2H2(22); C2H(21), C2H2(22); -- equation: H(4) + C2H2(22) (+M) <=> C2H3(24) (+M) # Reaction 188 - type: falloff - low-P-rate-constant: {A: 3.8e+40, b: -7.27, Ea: 7.22} - high-P-rate-constant: {A: 5.6e+12, b: 0.0, Ea: 2.4} - Troe: {A: 0.7507, T3: 98.5, T1: 1300.0, T2: 4170.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #188; RMG #185 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), C2H3(24); C2H2(22), C2H3(24); -- equation: H(4) + C2H3(24) (+M) <=> C2H4(26) (+M) # Reaction 189 - type: falloff - low-P-rate-constant: {A: 1.4e+30, b: -3.86, Ea: 3.32} - high-P-rate-constant: {A: 6.08e+12, b: 0.27, Ea: 0.28} - Troe: {A: 0.782, T3: 208.0, T1: 2660.0, T2: 6100.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #189; RMG #186 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), C2H4(26); C2H3(24), C2H4(26); -- equation: H(4) + C2H4(26) (+M) <=> C2H5(27) (+M) # Reaction 190 - type: falloff - low-P-rate-constant: {A: 6.0e+41, b: -7.62, Ea: 6.97} - high-P-rate-constant: {A: 5.4e+11, b: 0.454, Ea: 1.82} - Troe: {A: 0.9753, T3: 210.0, T1: 984.0, T2: 4370.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #190; RMG #187 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), C2H5(27); C2H4(26), C2H5(27); -- equation: H(4) + C2H5(27) (+M) <=> ethane(1) (+M) # Reaction 191 - type: falloff - low-P-rate-constant: {A: 1.99e+41, b: -7.08, Ea: 6.685} - high-P-rate-constant: {A: 5.21e+17, b: -0.99, Ea: 1.58} - Troe: {A: 0.8422, T3: 125.0, T1: 2220.0, T2: 6880.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #191; RMG #188 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), ethane(1); C2H5(27), ethane(1); -- equation: H2(3) + CO(10) (+M) <=> CH2O(15) (+M) # Reaction 192 - type: falloff - low-P-rate-constant: {A: 5.07e+27, b: -3.42, Ea: 84.35} - high-P-rate-constant: {A: 4.3e+07, b: 1.5, Ea: 79.6} - Troe: {A: 0.932, T3: 197.0, T1: 1540.0, T2: 1.03e+04} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #192; RMG #189 - Library reaction: GRI-Mech3.0 - Flux pairs: H2(3), CH2O(15); CO(10), CH2O(15); -- equation: OH(5) + OH(5) (+M) <=> H2O2(8) (+M) # Reaction 193 - type: falloff - low-P-rate-constant: {A: 2.3e+18, b: -0.9, Ea: -1.7} - high-P-rate-constant: {A: 7.4e+13, b: -0.37, Ea: 0.0} - Troe: {A: 0.7346, T3: 94.0, T1: 1760.0, T2: 5180.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #193; RMG #190 - Library reaction: GRI-Mech3.0 - Flux pairs: OH(5), H2O2(8); OH(5), H2O2(8); -- equation: OH(5) + CH3(14) (+M) <=> CH3OH(20) (+M) # Reaction 194 - type: falloff - low-P-rate-constant: {A: 4.0e+36, b: -5.92, Ea: 3.14} - high-P-rate-constant: {A: 2.79e+18, b: -1.43, Ea: 1.33} - Troe: {A: 0.412, T3: 195.0, T1: 5900.0, T2: 6390.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #194; RMG #191 - Library reaction: GRI-Mech3.0 - Flux pairs: OH(5), CH3OH(20); CH3(14), CH3OH(20); -- equation: CO(10) + CH(9) (+M) <=> HCCO(23) (+M) # Reaction 195 - type: falloff - low-P-rate-constant: {A: 2.69e+28, b: -3.74, Ea: 1.936} - high-P-rate-constant: {A: 5.0e+13, b: 0.0, Ea: 0.0} - Troe: {A: 0.5757, T3: 237.0, T1: 1650.0, T2: 5070.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #195; RMG #192 - Library reaction: GRI-Mech3.0 - Flux pairs: CO(10), HCCO(23); CH(9), HCCO(23); -- equation: CO(10) + CH2(11) (+M) <=> CH2CO(25) (+M) # Reaction 196 - type: falloff - low-P-rate-constant: {A: 2.69e+33, b: -5.11, Ea: 7.095} - high-P-rate-constant: {A: 8.1e+11, b: 0.5, Ea: 4.51} - Troe: {A: 0.5907, T3: 275.0, T1: 1230.0, T2: 5180.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #196; RMG #193 - Library reaction: GRI-Mech3.0 - Flux pairs: CO(10), CH2CO(25); CH2(11), CH2CO(25); -- equation: H2O(28) + CH2(S)(13) (+M) <=> CH3OH(20) (+M) # Reaction 197 - type: falloff - low-P-rate-constant: {A: 1.88e+38, b: -6.36, Ea: 5.04} - high-P-rate-constant: {A: 4.82e+17, b: -1.16, Ea: 1.145} - Troe: {A: 0.6027, T3: 208.0, T1: 3920.0, T2: 1.02e+04} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0} - note: | - Reaction index: Chemkin #197; RMG #194 - Library reaction: GRI-Mech3.0 - Flux pairs: H2O(28), CH3OH(20); CH2(S)(13), CH3OH(20); -- equation: CH3(14) + CH3(14) (+M) <=> ethane(1) (+M) # Reaction 198 - type: falloff - low-P-rate-constant: {A: 3.4e+41, b: -7.03, Ea: 2.762} - high-P-rate-constant: {A: 6.77e+16, b: -1.18, Ea: 0.654} - Troe: {A: 0.619, T3: 73.2, T1: 1180.0, T2: 1.0e+04} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #198; RMG #195 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), ethane(1); CH3(14), ethane(1); -- equation: C2H4(26) (+M) <=> H2(3) + C2H2(22) (+M) # Reaction 199 - type: falloff - low-P-rate-constant: {A: 1.58e+51, b: -9.3, Ea: 97.8} - high-P-rate-constant: {A: 8.0e+12, b: 0.44, Ea: 86.77} - Troe: {A: 0.7345, T3: 180.0, T1: 1040.0, T2: 5420.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #199; RMG #196 - Library reaction: GRI-Mech3.0 - Flux pairs: C2H4(26), H2(3); C2H4(26), C2H2(22); -- equation: H2(3) + CH(9) (+M) <=> CH3(14) (+M) # Reaction 200 - type: falloff - low-P-rate-constant: {A: 4.82e+25, b: -2.8, Ea: 0.59} - high-P-rate-constant: {A: 1.97e+12, b: 0.43, Ea: -0.37} - Troe: {A: 0.578, T3: 122.0, T1: 2540.0, T2: 9360.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #200; RMG #197 - Library reaction: GRI-Mech3.0 - Flux pairs: H2(3), CH3(14); CH(9), CH3(14); -- equation: H(4) + CH2CO(25) (+M) <=> CH2CHO(31) (+M) # Reaction 201 - type: falloff - low-P-rate-constant: {A: 1.012e+42, b: -7.63, Ea: 3.854} - high-P-rate-constant: {A: 4.865e+11, b: 0.422, Ea: -1.755} - Troe: {A: 0.465, T3: 201.0, T1: 1770.0, T2: 5330.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #201; RMG #198 - Library reaction: GRI-Mech3.0 - Flux pairs: H(4), CH2CHO(31); CH2CO(25), CH2CHO(31); -- equation: CH3(14) + C2H5(27) (+M) <=> C3H8(33) (+M) # Reaction 202 - type: falloff - low-P-rate-constant: {A: 2.71e+74, b: -16.82, Ea: 13.065} - high-P-rate-constant: {A: 9.43e+12, b: 0.0, Ea: 0.0} - Troe: {A: 0.1527, T3: 291.0, T1: 2740.0, T2: 7750.0} - efficiencies: {CH4(16): 2.0, CO2(17): 2.0, ethane(1): 3.0, H2O(28): - 6.0, H2(3): 2.0, Ar: 0.7} - note: | - Reaction index: Chemkin #202; RMG #199 - Library reaction: GRI-Mech3.0 - Flux pairs: CH3(14), C3H8(33); C2H5(27), C3H8(33); -- equation: H(4) + HO2(6) <=> H2O2(8) # Reaction 203 - rate-constant: {A: 5.25069e+09, b: 1.273, Ea: 0.0} - note: | - Reaction index: Chemkin #203; RMG #200 - Template reaction: R_Recombination - Flux pairs: HO2(6), H2O2(8); H(4), H2O2(8); - Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_2CNO->O_3R!H->O in family R_Recombination. -- equation: H(4) + CH(9) <=> CH2(S)(13) # Reaction 204 - rate-constant: {A: 5.37e+13, b: 0.154, Ea: 0.0} - note: | - Reaction index: Chemkin #204; RMG #201 - Template reaction: R_Recombination - Flux pairs: CH(9), CH2(S)(13); H(4), CH2(S)(13); - Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_N-2CNO->O in family R_Recombination. -- equation: H(4) + HCCO(23) <=> CH2CO(25) # Reaction 205 - rate-constant: {A: 1.1386e+13, b: 0.309, Ea: 0.0} - note: | - Reaction index: Chemkin #205; RMG #207 - Template reaction: R_Recombination - Flux pairs: HCCO(23), CH2CO(25); H(4), CH2CO(25); - Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_Sp-3R!H=2CCNNOO_N-3R!H->O_Ext-3CS-R in family R_Recombination. -- equation: OH(5) + C2H(21) <=> HCCOH(30) # Reaction 206 - rate-constant: {A: 7.7e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #206; RMG #209 - Template reaction: R_Recombination - Flux pairs: OH(5), HCCOH(30); C2H(21), HCCOH(30); - Estimated from node Root_N-1R->H_N-1CNOS->N_1COS->O_2R->C_Ext-2C-R in family R_Recombination. -- equation: H(4) + HCCO(23) <=> HCCOH(30) # Reaction 207 - rate-constant: {A: 2.80515e+12, b: 0.315, Ea: 0.0} - note: | - Reaction index: Chemkin #207; RMG #210 - Template reaction: R_Recombination - Flux pairs: H(4), HCCOH(30); HCCO(23), HCCOH(30); - Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_2CNO->O_N-3R!H->O in family R_Recombination. -- equation: HCO(12) + CH3(14) <=> CH3CHO(32) # Reaction 208 - rate-constant: {A: 1.81e+13, b: 0.0, Ea: 0.0} - note: | - Reaction index: Chemkin #208; RMG #214 - Template reaction: R_Recombination - Flux pairs: HCO(12), CH3CHO(32); CH3(14), CH3CHO(32); - Matched reaction 71 CH3 + CHO <=> C2H4O in R_Recombination/training - This reaction matched rate rule [Root_N-1R->H_N-1CNOS->N_N-1COS->O_1CS->C_N-1C-inRing_Ext-2R-R_N-Sp-3R!H-2R_3R!H->O] - family: R_Recombination -- equation: H(4) + CH2CHO(31) <=> CH3CHO(32) # Reaction 209 - rate-constant: {A: 7.82867e+13, b: 0.063, Ea: 0.0} - note: | - Reaction index: Chemkin #209; RMG #215 - Template reaction: R_Recombination - Flux pairs: CH2CHO(31), CH3CHO(32); H(4), CH3CHO(32); - Estimated from node Root_1R->H_N-2R->S_N-2CHNO->H_N-2CNO-inRing_Ext-2CNO-R_N-Sp-3R!H=2CCNNOO_N-2CNO->O_3R!H->C_Sp-3C-2CN in family R_Recombination. -- equation: CH(9) + CH(9) <=> C2H2(22) # Reaction 210 - rate-constant: {A: 9.9813e+10, b: 0.611, Ea: 0.0} - note: | - Reaction index: Chemkin #210; RMG #258 - Template reaction: R_Recombination - Flux pairs: CH(9), C2H2(22); CH(9), C2H2(22); - Estimated from node Root_N-1R->H_N-1CNOS->N_N-1COS->O_1CS->C_N-1C-inRing in family R_Recombination. From d2e78502c12e5874120280d57af97fb3eee4086e Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 13 May 2026 23:23:02 -0400 Subject: [PATCH 13/55] Create yaml_writer_data subdirs before copying test artifacts The destination directories under test/rmgpy/test_data/yaml_writer_data/ (cantera1, cantera2, ck2yaml) are not guaranteed to exist on a fresh checkout: we recently removed the committed golden YAML files leaving the subdirectories empty. Git does not track empty directories, so CI failed Co-Authored-By: Claude Opus 4.7 (1M context) --- test/rmgpy/rmg/mainTest.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/rmgpy/rmg/mainTest.py b/test/rmgpy/rmg/mainTest.py index d3c5ace343..00aa547e9f 100644 --- a/test/rmgpy/rmg/mainTest.py +++ b/test/rmgpy/rmg/mainTest.py @@ -230,6 +230,7 @@ def test_cantera_input_files_match_chemkin_later(self): rmg_yaml_path = os.path.join(cantera_dir, 'chem_annotated.yaml') assert os.path.exists(rmg_yaml_path), f"RMG-generated Cantera YAML file {rmg_yaml_path} not found" test_data_cantera_target = os.path.join(self.testDir, '..', 'yaml_writer_data', 'cantera1', 'from_main_test.yaml') + os.makedirs(os.path.dirname(test_data_cantera_target), exist_ok=True) shutil.copy(rmg_yaml_path, test_data_cantera_target) # Copy RMG-generated YAML 2 to test data directory @@ -237,6 +238,7 @@ def test_cantera_input_files_match_chemkin_later(self): rmg_yaml_path = os.path.join(cantera_dir, 'chem_annotated.yaml') assert os.path.exists(rmg_yaml_path), f"RMG-generated Cantera YAML file {rmg_yaml_path} not found" test_data_cantera_target = os.path.join(self.testDir, '..', 'yaml_writer_data', 'cantera2', 'from_main_test.yaml') + os.makedirs(os.path.dirname(test_data_cantera_target), exist_ok=True) shutil.copy(rmg_yaml_path, test_data_cantera_target) # Copy chemkin-converted YAML to test data directory @@ -246,6 +248,7 @@ def test_cantera_input_files_match_chemkin_later(self): ck_yaml_path = os.path.join(cantera_from_ck_dir, "chem_annotated.yaml") assert os.path.exists(ck_yaml_path), f"Chemkin-converted YAML file {ck_yaml_path} not found" test_data_chemkin_target = os.path.join(self.testDir, '..', 'yaml_writer_data', 'ck2yaml', 'from_main_test.yaml') + os.makedirs(os.path.dirname(test_data_chemkin_target), exist_ok=True) shutil.copy(ck_yaml_path, test_data_chemkin_target) From 7001649f82907804e79a23f412b59bd7f42e363c Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 13 May 2026 22:49:13 -0400 Subject: [PATCH 14/55] Trim Cantera YAML and Chemkin elements blocks to elements in use Both Cantera YAML writers and the Chemkin writer were emitting a hardcoded periodic-table grab-bag (H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I plus D/T/CI/OI isotopes plus X) in every output file, regardless of what the model actually contained. This polluted the files and caused diffs against ck2yaml-converted reference outputs. Add ReactionModel.get_elements() that walks each species' molecule[0] atoms and returns the set of Element singletons in use. All three writers now derive their elements block from that set: built-in elements appear only when present; isotopes (D, T, CI, OI) appear only when an isotope atom is on some species; X appears only for surface models. Writer 2's is_plasma path still adds the E pseudo-element without iterating atoms. In chemkin.pyx save_chemkin, the union is computed once across all species before the surface/gas split so that the gas-only Chemkin file in a surface run still lists X (required for downstream ck2yaml conversion to recognize the surface site element). We could cache this list of elements, either updated once per save_all() call, or even just once after model initiation (since no chemistry can create an element that wasn't already there). But that is not done yet. (For simplicity) Side cleanups: drop the unused search_for_additional_elements branch in writer 2 (the new design subsumes it); replace writer 2's inline MixedModel with a real ReactionModel so .get_elements() works without duck typing; remove the module-import-time ELEMENTS_BLOCK/ELEMENTS_LINE globals in writer 1 in favor of per-call computation. Mock containers in the writer 2 tests now inherit ReactionModel for the same reason. Co-Authored-By: Claude Opus 4.7 (1M context) --- rmgpy/chemkin.pyx | 66 ++++++++++++++++---------- rmgpy/rmg/model.py | 15 ++++++ rmgpy/yaml_cantera1.py | 70 +++++++++++++++++----------- rmgpy/yaml_cantera2.py | 82 +++++++++++++++++---------------- test/rmgpy/yaml_cantera1Test.py | 22 ++++++--- test/rmgpy/yaml_cantera2Test.py | 56 ++++++++++++++-------- 6 files changed, 195 insertions(+), 116 deletions(-) diff --git a/rmgpy/chemkin.pyx b/rmgpy/chemkin.pyx index e9f5e78df0..c4d7a611d8 100644 --- a/rmgpy/chemkin.pyx +++ b/rmgpy/chemkin.pyx @@ -2120,23 +2120,32 @@ def save_transport_file(path, species): )) -def save_chemkin_file(path, species, reactions, verbose=True, check_for_duplicates=True): +def save_chemkin_file(path, species, reactions, verbose=True, check_for_duplicates=True, + elements_in_use=None): """ Save a Chemkin input file to `path` on disk containing the provided lists of `species` and `reactions`. If check_for_duplicates is False then we don't check for unlabeled duplicate reactions, thus saving time (eg. if you are sure you've already labeled them as duplicate). + + ``elements_in_use`` is a set of :class:`Element` singletons used to write the + ELEMENTS section. If ``None``, it is computed from ``species`` via + :meth:`rmgpy.rmg.model.ReactionModel.get_elements`. """ # Check for duplicate if check_for_duplicates: mark_duplicate_reactions(reactions) + if elements_in_use is None: + from rmgpy.rmg.model import ReactionModel + elements_in_use = ReactionModel(species=species).get_elements() + f = open(path, 'w') sorted_species = sorted(species, key=lambda species: species.index) # Elements section - write_elements_section(f) + write_elements_section(f, elements_in_use) # Species section f.write('SPECIES\n') @@ -2236,14 +2245,15 @@ def save_chemkin_surface_file(path, species, reactions, verbose=True, check_for_ _chemkin_reaction_count = None -def save_chemkin(reaction_model, path, verbose_path, dictionary_path=None, transport_path=None, +def save_chemkin(reaction_model, path, verbose_path, dictionary_path=None, transport_path=None, save_edge_species=False): """ Save a Chemkin file for the current model as well as any desired output - species and reactions to `path`. If `save_edge_species` is True, then + species and reactions to `path`. If `save_edge_species` is True, then a chemkin file and dictionary file for the core AND edge species and reactions will be saved. It also saves verbose versions of each file. """ + from rmgpy.rmg.model import ReactionModel if save_edge_species: species_list = reaction_model.core.species + reaction_model.edge.species rxn_list = reaction_model.core.reactions + reaction_model.edge.reactions @@ -2251,6 +2261,9 @@ def save_chemkin(reaction_model, path, verbose_path, dictionary_path=None, trans species_list = reaction_model.core.species + reaction_model.output_species_list rxn_list = reaction_model.core.reactions + reaction_model.output_reaction_list + # Same elements list for all files (core and edge) + elements_in_use = ReactionModel(species=species_list).get_elements() + if any([s.contains_surface_site() for s in reaction_model.core.species]): # it's a surface model root, ext = os.path.splitext(path) @@ -2277,19 +2290,23 @@ def save_chemkin(reaction_model, path, verbose_path, dictionary_path=None, trans gas_rxn_list.append(r) # We should already have marked everything as duplicates by now so use check_for_duplicates=False - save_chemkin_file(gas_path, gas_species_list, gas_rxn_list, verbose=False, check_for_duplicates=False) + save_chemkin_file(gas_path, gas_species_list, gas_rxn_list, verbose=False, + check_for_duplicates=False, elements_in_use=elements_in_use) save_chemkin_surface_file(surface_path, surface_species_list, surface_rxn_list, verbose=False, check_for_duplicates=False, surface_site_density=reaction_model.surface_site_density) logging.info('Saving annotated version of Chemkin files...') - save_chemkin_file(gas_verbose_path, gas_species_list, gas_rxn_list, verbose=True, check_for_duplicates=False) + save_chemkin_file(gas_verbose_path, gas_species_list, gas_rxn_list, verbose=True, + check_for_duplicates=False, elements_in_use=elements_in_use) save_chemkin_surface_file(surface_verbose_path, surface_species_list, surface_rxn_list, verbose=True, check_for_duplicates=False, surface_site_density=reaction_model.surface_site_density) else: # Gas phase only - save_chemkin_file(path, species_list, rxn_list, verbose=False, check_for_duplicates=False) + save_chemkin_file(path, species_list, rxn_list, verbose=False, + check_for_duplicates=False, elements_in_use=elements_in_use) logging.info('Saving annotated version of Chemkin file...') - save_chemkin_file(verbose_path, species_list, rxn_list, verbose=True, check_for_duplicates=False) + save_chemkin_file(verbose_path, species_list, rxn_list, verbose=True, + check_for_duplicates=False, elements_in_use=elements_in_use) if dictionary_path: save_species_dictionary(dictionary_path, species_list) if transport_path: @@ -2364,27 +2381,26 @@ def save_chemkin_files(rmg, config=None): shutil.copy2(this_chemkin_path, latest_chemkin_path) -def write_elements_section(f): +def write_elements_section(f, elements_in_use): """ - Write the ELEMENTS section of the chemkin file. This file currently lists - all elements and isotopes available in RMG. It may become useful in the future - to only include elements/isotopes present in the current RMG run. + Write the ELEMENTS section of the chemkin file. Only elements present in + ``elements_in_use`` (a set of :class:`Element` singletons) are emitted. Isotopes + (D, T, CI, OI) and the surface site X are written only when actually used. """ + from rmgpy.molecule.element import H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, C13, O18, X s = 'ELEMENTS\n' - - # map of isotope elements with chemkin-compatible element representation: - elements = ('H', ('H', 2), ('H', 3), 'C', ('C', 13), 'O', ('O', 18), 'N', 'Ne', 'Ar', 'He', 'Si', 'S', - 'F', 'Cl', 'Br', 'I') - for el in elements: - if isinstance(el, tuple): - symbol, isotope = el - chemkin_name = get_element(symbol, isotope=isotope).chemkin_name - mass = 1000 * get_element(symbol, isotope=isotope).mass - s += '\t{0} /{1:.3f}/\n'.format(chemkin_name, mass) - else: - s += '\t' + el + '\n' - s += '\tX /195.083/\n' + builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), + (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] + for element, symbol in builtin_elements: + if element in elements_in_use: + s += f'\t{symbol}\n' + for isotope in (D, T, C13, O18): + if isotope in elements_in_use: + mass = 1000 * isotope.mass + s += f'\t{isotope.chemkin_name} /{mass:.3f}/\n' + if X in elements_in_use: + s += '\tX /195.083/\n' s += 'END\n\n' f.write(s) diff --git a/rmgpy/rmg/model.py b/rmgpy/rmg/model.py index 225c8f5539..9457d2f525 100644 --- a/rmgpy/rmg/model.py +++ b/rmgpy/rmg/model.py @@ -162,6 +162,21 @@ def merge(self, other): # Return the merged model return final_model + def get_elements(self): + """ + Return the set of :class:`Element` singletons used by atoms of species + in this :class:`ReactionModel`. Iterates each species' first resonance + structure (``sp.molecule[0]``) and collects ``atom.element``. Species + with empty ``molecule`` are skipped. + """ + elements = set() + for sp in self.species: + if not sp.molecule: + continue + for atom in sp.molecule[0].atoms: + elements.add(atom.element) + return elements + ################################################################################ diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 6d542643f5..336a80420b 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -92,6 +92,7 @@ def _convert_anymap_to_dict(obj): def write_cantera( spcs, rxns, + elements_in_use, surface_site_density=None, solvent=None, solvent_data=None, @@ -102,6 +103,9 @@ def write_cantera( Writes yaml file depending on the type of system (gas-phase, catalysis). Writes beginning lines of yaml file, then uses yaml.dump(result_dict) to write species/reactions info. If verbose=True, species and reaction notes (SMILES, source, kinetics comment) are included. + + elements_in_use is a set of :class:`Element` singletons. Only those elements + are listed in the YAML 'elements' block and 'phases.elements' lines. """ try: @@ -111,6 +115,8 @@ def write_cantera( except Exception: git_head = '' + elements_block, elements_line = get_elements_block(elements_in_use) + # intro to file will change depending on the presence of surface species is_surface = False for spc in spcs: @@ -125,13 +131,13 @@ def write_cantera( spcs, rxns, solvent=solvent, solvent_data=solvent_data, verbose=verbose ) phases_block = get_phases_with_surface( - spcs, surface_site_density, has_coverage_dependence=has_coverage_dependence + spcs, surface_site_density, elements_line, has_coverage_dependence=has_coverage_dependence ) else: result_dict = get_mech_dict_nonsurface( spcs, rxns, solvent=solvent, solvent_data=solvent_data, verbose=verbose ) - phases_block = get_phases_gas_only(spcs) + phases_block = get_phases_gas_only(spcs, elements_line) with open(path, "w") as f: # generator line @@ -150,40 +156,44 @@ def write_cantera( f.write(phases_block) - f.write(ELEMENTS_BLOCK) + f.write(elements_block) yaml.dump(result_dict, stream=f, Dumper=Dumper, sort_keys=False, default_flow_style=None, width=80) -def get_elements_block(): +def get_elements_block(elements_in_use): """ - Returns the 'elements' section, and elements list for a phase + Returns the 'elements' section, and elements list for a phase. + + elements_in_use is a set of :class:`Element` singletons (e.g. the ones returned by + :meth:`rmgpy.rmg.model.ReactionModel.get_elements`). Only elements present + in the set are emitted; isotopes (D, T, CI, OI) and the surface site X are + written to the elements block only when actually used. """ - from rmgpy.molecule.element import get_element - elements_list = ['H', 'C', 'O', 'N', 'Ne', 'Ar', 'He', 'Si', 'S', - 'F', 'Cl', 'Br', 'I'] - isotopes = (('H', 2), ('H', 3), ('C', 13),('O', 18)) + from rmgpy.molecule.element import H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, C13, O18, X + builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), + (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] + elements_list = [symbol for element, symbol in builtin_elements if element in elements_in_use] elements_block_list = ['', 'elements:'] - for symbol, isotope in isotopes: - element = get_element(symbol, isotope=isotope) - chemkin_name = element.chemkin_name - mass = 1000 * element.mass - elements_block_list.append(f"- symbol: {chemkin_name}\n atomic-weight: {mass:f}") - elements_list.append(chemkin_name) - # Surface sites - elements_list.append('X') - elements_block_list.append("- symbol: X\n atomic-weight: 195.083\n\n") + for isotope in (D, T, C13, O18): + if isotope in elements_in_use: + mass = 1000 * isotope.mass + elements_block_list.append(f"- symbol: {isotope.chemkin_name}\n atomic-weight: {mass:f}") + elements_list.append(isotope.chemkin_name) + if X in elements_in_use: + elements_list.append('X') + elements_block_list.append("- symbol: X\n atomic-weight: 195.083\n\n") elements_block = '\n'.join(elements_block_list) elements_line = f"elements: [{', '.join(elements_list)}]" return elements_block, elements_line -# For now this is not dynamic, and includes everything, so we just evaluate it -# once and use it for all files. -ELEMENTS_BLOCK, ELEMENTS_LINE = get_elements_block() -def get_phases_gas_only(spcs): +def get_phases_gas_only(spcs, elements_line): """ Returns 'phases' sections for a file with only gas-phase species/reactions. + + elements_line is the pre-formatted ``elements: [...]`` string from + :func:`get_elements_block`. """ sorted_species = sorted(spcs, key=lambda spcs: spcs.index) species_to_write = [get_species_identifier(spec) for spec in sorted_species] @@ -196,7 +206,7 @@ def get_phases_gas_only(spcs): phases: - name: gas thermo: ideal-gas - {ELEMENTS_LINE} + {elements_line} species: [{', '.join(species_to_write)}] kinetics: gas transport: mixture-averaged @@ -205,7 +215,7 @@ def get_phases_gas_only(spcs): return phases_block -def get_phases_with_surface(spcs, surface_site_density, has_coverage_dependence=False): +def get_phases_with_surface(spcs, surface_site_density, elements_line, has_coverage_dependence=False): """ Yaml files with surface species begin with the following blocks of text, which includes TWO phases instead of just one. @@ -250,7 +260,7 @@ def get_phases_with_surface(spcs, surface_site_density, has_coverage_dependence= phases: - name: gas thermo: ideal-gas - {ELEMENTS_LINE} + {elements_line} species: [{', '.join(gas_species_to_write)}] kinetics: gas reactions: [gas-reactions] @@ -260,7 +270,7 @@ def get_phases_with_surface(spcs, surface_site_density, has_coverage_dependence= - name: surface thermo: {surface_thermo}{reference_state_line} adjacent-phases: [gas] - {ELEMENTS_LINE} + {elements_line} species: [{', '.join(surface_species_to_write)}] kinetics: surface reactions: [site0-reactions] @@ -480,9 +490,12 @@ def update(self, rmg): if rmg.reaction_model.surface_site_density: surface_site_density = rmg.reaction_model.surface_site_density.value_si + core_elements = rmg.reaction_model.core.get_elements() + write_cantera( rmg.reaction_model.core.species, rmg.reaction_model.core.reactions, + elements_in_use=core_elements, surface_site_density=surface_site_density, solvent=rmg.solvent, solvent_data=solvent_data, @@ -496,6 +509,7 @@ def update(self, rmg): write_cantera( rmg.reaction_model.core.species, rmg.reaction_model.core.reactions, + elements_in_use=core_elements, surface_site_density=surface_site_density, solvent=rmg.solvent, solvent_data=solvent_data, @@ -504,9 +518,11 @@ def update(self, rmg): ) if save_edge: + from rmgpy.rmg.model import ReactionModel logging.info('Saving current model core and edge to Cantera file...') edge_species = rmg.reaction_model.core.species + rmg.reaction_model.edge.species edge_reactions = rmg.reaction_model.core.reactions + rmg.reaction_model.edge.reactions + edge_elements = ReactionModel(species=edge_species, reactions=edge_reactions).get_elements() this_edge_path = os.path.join(self.output_subdirectory, f"chem_edge{num_species:04d}.yaml") @@ -515,6 +531,7 @@ def update(self, rmg): write_cantera( edge_species, edge_reactions, + elements_in_use=edge_elements, surface_site_density=surface_site_density, solvent=rmg.solvent, solvent_data=solvent_data, @@ -529,6 +546,7 @@ def update(self, rmg): write_cantera( edge_species, edge_reactions, + elements_in_use=edge_elements, surface_site_density=surface_site_density, solvent=rmg.solvent, solvent_data=solvent_data, diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 031d387011..457e80d400 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -146,21 +146,16 @@ def save_cantera_files(rmg, config=None): # 2. Save Edge Model (Optional, matching ChemkinWriter logic) # ------------------------------------------------------------------------- if save_edge: + from rmgpy.rmg.model import ReactionModel logging.info('Saving current model core and edge to Cantera file...') this_edge_path = os.path.join(cantera_dir, 'chem_edge{0:04d}.yaml'.format(num_species)) latest_edge_path = os.path.join(cantera_dir, 'chem_edge.yaml') - # Create a simple container object to pass to save_cantera_model - class MixedModel: - def __init__(self, species, reactions): - self.species = species - self.reactions = reactions - - edge_model = MixedModel( - rmg.reaction_model.core.species + rmg.reaction_model.edge.species, - rmg.reaction_model.core.reactions + rmg.reaction_model.edge.reactions + edge_model = ReactionModel( + species=rmg.reaction_model.core.species + rmg.reaction_model.edge.species, + reactions=rmg.reaction_model.core.reactions + rmg.reaction_model.edge.reactions, ) save_cantera_model(edge_model, this_edge_path, site_density=site_density, verbose=False) @@ -179,12 +174,14 @@ def __init__(self, species, reactions): def save_cantera_model(model_container, path, site_density=None, verbose=False): """ Internal helper to generate the dictionary and write the YAML file. - model_container must have .species and .reactions attributes (lists). + model_container must be a :class:`rmgpy.rmg.model.ReactionModel` (or duck-typed + equivalent with .species, .reactions, and .get_elements()). If verbose=True, species/reaction notes (SMILES, source, kinetics comments) are included in the output. """ species_list = model_container.species reaction_list = model_container.reactions + elements_in_use = model_container.get_elements() is_plasma = False for sp in species_list: @@ -193,7 +190,9 @@ def save_cantera_model(model_container, path, site_density=None, verbose=False): break # Generate Data - yaml_data = generate_cantera_data(species_list, reaction_list, is_plasma=is_plasma, + yaml_data = generate_cantera_data(species_list, reaction_list, + elements_in_use=elements_in_use, + is_plasma=is_plasma, site_density=site_density, verbose=verbose) # Write @@ -201,37 +200,49 @@ def save_cantera_model(model_container, path, site_density=None, verbose=False): # sort_keys=False ensures 'units' comes first, then 'phases', etc. yaml.dump(yaml_data, f, Dumper=Dumper, sort_keys=False, default_flow_style=None) -def get_elements_lists(): +def get_elements_lists(elements_in_use): """ - Returns custom element definitions and the full elements list for phases. + Returns custom element definitions and the elements list for phases. + + elements_in_use is a set of :class:`Element` singletons (typically from + :meth:`rmgpy.rmg.model.ReactionModel.get_elements`). Only those elements + are emitted; isotopes (D, T, CI, OI) and X are added only when present in + the set. The plasma pseudo-element 'E' is added separately by the caller + when ``is_plasma`` is true. """ - from rmgpy.molecule.element import get_element - elements_list = ['H', 'C', 'O', 'N', 'Ne', 'Ar', 'He', 'Si', 'S', - 'F', 'Cl', 'Br', 'I', 'E'] - isotopes = (('H', 2), ('H', 3), ('C', 13), ('O', 18)) + from rmgpy.molecule.element import H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, C13, O18, X + builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), + (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] + elements_list = [symbol for element, symbol in builtin_elements if element in elements_in_use] custom_elements = [] - for symbol, isotope in isotopes: - element = get_element(symbol, isotope=isotope) - chemkin_name = element.chemkin_name - mass = 1000 * element.mass - custom_elements.append({'symbol': chemkin_name, 'atomic-weight': mass}) - elements_list.append(chemkin_name) - # Surface sites - elements_list.append('X') - custom_elements.append({'symbol': 'X', 'atomic-weight': 195.083}) + for isotope in (D, T, C13, O18): + if isotope in elements_in_use: + mass = 1000 * isotope.mass + custom_elements.append({'symbol': isotope.chemkin_name, 'atomic-weight': mass}) + elements_list.append(isotope.chemkin_name) + if X in elements_in_use: + elements_list.append('X') + custom_elements.append({'symbol': 'X', 'atomic-weight': 195.083}) return custom_elements, elements_list def generate_cantera_data(species_list, reaction_list, + elements_in_use=None, is_plasma=False, site_density=None, - search_for_additional_elements=False, verbose=False, ): """ Converts RMG objects into a dictionary structure compatible with Cantera YAML. If verbose=True, species/reaction notes are included (SMILES, source, kinetics comments). + + elements_in_use is a set of :class:`Element` singletons (typically from + :meth:`rmgpy.rmg.model.ReactionModel.get_elements`) used to size the + 'elements' block and the per-phase elements lists. Defaults to an empty + set if None. """ + if elements_in_use is None: + elements_in_use = set() # --- 1. Header & Units --- # We output everything in SI units. try: @@ -272,21 +283,12 @@ def generate_cantera_data(species_list, gas_reactions.append(rxn) # --- 3. Phase Definitions --- - custom_elements, all_elements = get_elements_lists() - + custom_elements, all_elements = get_elements_lists(elements_in_use) + data['elements'] = custom_elements elements_set = set(all_elements) - - if search_for_additional_elements: - for spc in sorted_species: - if spc.molecule and len(spc.molecule) > 0: - if spc.is_electron(): - elements_set.add('E') - is_plasma = True - else: - for elem in spc.molecule[0].get_element_count().keys(): - if elem != 'X': - elements_set.add(elem) + if is_plasma: + elements_set.add('E') phases = list() diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index d1dece6c73..6f2dc128ca 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -340,28 +340,35 @@ def test_reaction_to_dicts_surface_spectator_species(self): ) def test_get_elements_block_isotopes_and_surface_site(self): - """get_elements_block returns isotope definitions and X with correct weights.""" - elements_block, elements_line = get_elements_block() + """get_elements_block emits isotope and X definitions only when requested.""" + from rmgpy.molecule.element import H, C, D, T, X - # elements_line should list X + # With D, T, X in use, the block names them with the right masses + elements_block, elements_line = get_elements_block({H, C, D, T, X}) assert 'X' in elements_line - - # elements_block should contain isotope symbols and X assert 'D' in elements_block # H-2 assert 'T' in elements_block # H-3 assert 'X' in elements_block assert '195.083' in elements_block # X atomic weight + # Without isotopes / X in use, neither appears + elements_block, elements_line = get_elements_block({H, C}) + assert 'X' not in elements_line + assert ' D ' not in elements_line and '[D' not in elements_line and ', D' not in elements_line + assert 'D' not in elements_block + assert 'T' not in elements_block + assert 'X' not in elements_block + def test_get_phases_gas_only_has_state(self): """Gas-only phases block includes state with T and P.""" - phases_block = get_phases_gas_only([self.h2, self.h]) + phases_block = get_phases_gas_only([self.h2, self.h], 'elements: [H]') assert 'state:' in phases_block assert 'T: 300.0' in phases_block assert 'P: 1 atm' in phases_block def test_get_phases_gas_only_has_elements(self): """Gas-only phases block includes elements line.""" - phases_block = get_phases_gas_only([self.h2]) + phases_block = get_phases_gas_only([self.h2], 'elements: [H]') assert 'elements:' in phases_block def test_get_mech_dict_nonsurface_reactions_key(self): @@ -394,6 +401,7 @@ def test_get_phases_with_surface_has_state(self): phases_block = get_phases_with_surface( [self.h2, self.x, self.hx], surface_site_density=2.5e-9, # mol/cm^2-equivalent SI + elements_line='elements: [H, X]', ) # Should have two phase definitions each with state assert phases_block.count('state:') == 2 diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index bed7f33f2f..f85941cbe0 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -231,10 +231,11 @@ def test_full_integration_plasma_model(self): # 2. Mock RMG Object Structure # The writer expects: rmg.output_directory and rmg.reaction_model.core - class MockCore: + from rmgpy.rmg.model import ReactionModel + + class MockCore(ReactionModel): def __init__(self): - self.species = species - self.reactions = reactions + super().__init__(species=species, reactions=reactions) class MockModel: def __init__(self): @@ -388,10 +389,11 @@ def _create_dummy_model(self): reaction_list = [rxn_arr] # Mock Object Structure - class MockCore: + from rmgpy.rmg.model import ReactionModel + + class MockCore(ReactionModel): def __init__(self, s, r): - self.species = s - self.reactions = r + super().__init__(species=s, reactions=r) class MockModel: def __init__(self, core): @@ -546,36 +548,52 @@ def test_reaction_to_dict_thirdbody_unit(self): assert np.isclose(d["efficiencies"]["Ar(3)"], 0.7) def test_get_elements_block_isotopes_and_surface_site(self): - """get_elements_lists returns isotope definitions and X with correct weights.""" - custom_elements, elements_list = get_elements_lists() + """get_elements_lists emits isotope and X definitions only when in use.""" + from rmgpy.molecule.element import H, C, D, T, X + # With D, T, X in use: isotope and X entries appear + custom_elements, elements_list = get_elements_lists({H, C, D, T, X}) + assert 'H' in elements_list + assert 'C' in elements_list assert 'X' in elements_list x_entry = next((e for e in custom_elements if e['symbol'] == 'X'), None) assert x_entry is not None assert np.isclose(x_entry['atomic-weight'], 195.083) - symbols = [e['symbol'] for e in custom_elements] assert 'D' in symbols # H-2 assert 'T' in symbols # H-3 for entry in custom_elements: assert entry['atomic-weight'] > 0 + # Without isotopes / X: no custom entries, no X in the elements list + custom_elements, elements_list = get_elements_lists({H, C}) + assert custom_elements == [] + assert 'X' not in elements_list + assert 'D' not in elements_list + assert 'T' not in elements_list + def test_generate_cantera_data_elements_block(self): - """generate_cantera_data includes top-level 'elements' key with custom definitions.""" + """generate_cantera_data emits a top-level 'elements' key whose custom entries + track elements_in_use: empty for plain gas, includes X when a surface site is present.""" + from rmgpy.molecule.element import H, X h2 = self._create_dummy_species("H2", "[H][H]", index=1) - data = generate_cantera_data([h2], []) + # Gas-only H2: no isotopes, no X -> custom 'elements' list is empty. + data = generate_cantera_data([h2], [], elements_in_use={H}) assert 'elements' in data - custom_elements = data['elements'] - assert isinstance(custom_elements, list) - assert len(custom_elements) > 0 - symbols = [e['symbol'] for e in custom_elements] + assert data['elements'] == [] + + # Surface fixture: X is in use, so it appears as a custom element. + x = self._create_surface_species("X", "1 X u0 p0", index=2) + data = generate_cantera_data([h2, x], [], elements_in_use={H, X}) + symbols = [e['symbol'] for e in data['elements']] assert 'X' in symbols def test_generate_cantera_data_gas_phase_state(self): """Gas phase definition includes a 'state' block with T and P.""" + from rmgpy.molecule.element import H h2 = self._create_dummy_species("H2", "[H][H]", index=1) - data = generate_cantera_data([h2], []) + data = generate_cantera_data([h2], [], elements_in_use={H}) gas_phase = data['phases'][0] assert 'state' in gas_phase @@ -584,13 +602,14 @@ def test_generate_cantera_data_gas_phase_state(self): def test_generate_cantera_data_gas_reactions_key(self): """Gas-only model uses top-level 'reactions' key (matching ck2yaml).""" + from rmgpy.molecule.element import H h2 = self._create_dummy_species("H2", "[H][H]", index=1) h = self._create_dummy_species("H", "[H]", index=2) rxn = Reaction( reactants=[h2], products=[h, h], kinetics=Arrhenius(A=(1e13, "s^-1"), n=0, Ea=(400, "kJ/mol"), T0=(1, "K")) ) - data = generate_cantera_data([h2, h], [rxn]) + data = generate_cantera_data([h2, h], [rxn], elements_in_use={H}) gas_phase = data['phases'][0] assert 'reactions' not in gas_phase, "Gas-only phase should not reference reactions" @@ -600,6 +619,7 @@ def test_generate_cantera_data_gas_reactions_key(self): def test_generate_cantera_data_surface_phase_state_and_reactions_key(self): """Surface phase has 'state' and references 'surface-reactions'; data has that key.""" + from rmgpy.molecule.element import H, X h2 = self._create_dummy_species("H2", "[H][H]", index=1) x = self._create_surface_species("X", "1 X u0 p0", index=2) hx = self._create_surface_species( @@ -609,7 +629,7 @@ def test_generate_cantera_data_surface_phase_state_and_reactions_key(self): A=(1e13, "m^2/(mol*s)"), n=0, Ea=(50, "kJ/mol"), T0=(1, "K") ) rxn = Reaction(reactants=[h2, x], products=[hx, hx], kinetics=kin) - data = generate_cantera_data([h2, x, hx], [rxn]) + data = generate_cantera_data([h2, x, hx], [rxn], elements_in_use={H, X}) surface_phase = next(p for p in data['phases'] if p['name'] == 'surface') assert 'state' in surface_phase From bbaf33baa9833192b809b3578c0691dddd28de3f Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 15 May 2026 00:18:19 -0400 Subject: [PATCH 15/55] Wipe stale Cantera/Chemkin output dirs at job startup Previously, cantera_from_ck/ was created lazily and never cleaned up between runs, so stale files from a previous job could persist in a re-used output directory. cantera1/ and cantera2/ were wiped when their writers were initialized but left untouched when the writers were disabled, again allowing stale files to mislead the user. This change: - Adds cantera_from_ck/ to the dirs ChemkinWriter wipes/creates - In register_listeners, deletes the chemkin/, cantera_from_ck/, cantera1/, and cantera2/ folders when their respective writers are not configured for this run. Co-Authored-By: Claude Opus 4.7 (1M context) --- rmgpy/chemkin.pyx | 1 + rmgpy/rmg/main.py | 13 +++++++++++++ 2 files changed, 14 insertions(+) diff --git a/rmgpy/chemkin.pyx b/rmgpy/chemkin.pyx index c4d7a611d8..de8a9d4e3e 100644 --- a/rmgpy/chemkin.pyx +++ b/rmgpy/chemkin.pyx @@ -2432,6 +2432,7 @@ class ChemkinWriter(object): super(ChemkinWriter, self).__init__() self.config = config make_output_subdirectory(output_directory, 'chemkin') + make_output_subdirectory(output_directory, 'cantera_from_ck') def update(self, rmg): if self.config is not None and not self.config.should_write( diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index a9539d5da5..5e41cca631 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -824,12 +824,25 @@ def register_listeners(self, requires_rms=False): if cfg_chemkin.enabled: self.attach(ChemkinWriter(self.output_directory, cfg_chemkin)) + else: + for stale in ("chemkin", "cantera_from_ck"): + stale_dir = os.path.join(self.output_directory, stale) + if os.path.isdir(stale_dir): + shutil.rmtree(stale_dir) if cfg_rms.enabled: self.attach(RMSWriter(self.output_directory, cfg_rms)) if cfg_cantera1.enabled: self.attach(CanteraWriter1(self.output_directory, cfg_cantera1)) + else: + stale_dir = os.path.join(self.output_directory, "cantera1") + if os.path.isdir(stale_dir): + shutil.rmtree(stale_dir) if cfg_cantera2.enabled: self.attach(CanteraWriter2(self.output_directory, cfg_cantera2)) + else: + stale_dir = os.path.join(self.output_directory, "cantera2") + if os.path.isdir(stale_dir): + shutil.rmtree(stale_dir) if cfg_html.enabled: self.attach(OutputHTMLWriter(self.output_directory, cfg_html)) From a5a7e9ab5d3de147f3065078a51c1ddd9c001123 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 15 May 2026 09:30:40 -0400 Subject: [PATCH 16/55] Fix Arkane call to write_elements_section after signature change We recently added a required elements_in_use argument to Chemkin's write_elements_section but only updated the in-tree caller in chemkin.pyx. Arkane's chem.inp writer in arkane/main.py was still calling it with just the file handle, which broke the conda_build test that runs Arkane. Co-Authored-By: Claude Opus 4.7 (1M context) --- arkane/main.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/arkane/main.py b/arkane/main.py index 9526b6e75c..9f1ba58cd4 100644 --- a/arkane/main.py +++ b/arkane/main.py @@ -188,9 +188,17 @@ def execute(self): pass chemkin_file = os.path.join(self.output_directory, 'chem.inp') + # Collect elements used by any species with a known structure so the + # ELEMENTS block lists only what's actually present. + elements_in_use = set() + for job in self.job_list: + if isinstance(job, ThermoJob) and job.species.molecule: + for atom in job.species.molecule[0].atoms: + elements_in_use.add(atom.element) + # write the chemkin files and run the thermo and then kinetics jobs with open(chemkin_file, 'w') as f: - write_elements_section(f) + write_elements_section(f, elements_in_use) f.write('SPECIES\n\n') From de4eb180de922d4ccb25ce62ea6f69f8c347c99d Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 15 May 2026 09:56:00 -0400 Subject: [PATCH 17/55] Skip empty Cantera YAML 'elements' blocks to match ck2yaml output The Cantera YAML writers were emitting a top-level 'elements:' block even when only Cantera's built-in elements (H, C, O, ...) were in use, which ck2yaml never does. Also in yaml_cantera1, get_elements_block prepended an "elements:" header with no trailing newline Both writers now omit the block entirely when there are no non-builtin entries. Co-Authored-By: Claude Opus 4.7 (1M context) --- rmgpy/yaml_cantera1.py | 12 ++++++++---- rmgpy/yaml_cantera2.py | 3 ++- test/rmgpy/yaml_cantera1Test.py | 5 +++-- test/rmgpy/yaml_cantera2Test.py | 14 +++++++------- 4 files changed, 20 insertions(+), 14 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 336a80420b..ab94e2079b 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -173,16 +173,20 @@ def get_elements_block(elements_in_use): builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] elements_list = [symbol for element, symbol in builtin_elements if element in elements_in_use] - elements_block_list = ['', 'elements:'] + custom_elements = [] for isotope in (D, T, C13, O18): if isotope in elements_in_use: mass = 1000 * isotope.mass - elements_block_list.append(f"- symbol: {isotope.chemkin_name}\n atomic-weight: {mass:f}") + custom_elements.append({'symbol': isotope.chemkin_name, 'atomic-weight': mass}) elements_list.append(isotope.chemkin_name) if X in elements_in_use: elements_list.append('X') - elements_block_list.append("- symbol: X\n atomic-weight: 195.083\n\n") - elements_block = '\n'.join(elements_block_list) + custom_elements.append({'symbol': 'X', 'atomic-weight': 195.083}) + # Only emit the top-level 'elements:' block when there are non-builtin entries + if custom_elements: + elements_block = '\nelements:\n' + '\n'.join([f"- symbol: {e['symbol']}\n atomic-weight: {e['atomic-weight']:f}" for e in custom_elements]) + '\n\n' + else: + elements_block = '' elements_line = f"elements: [{', '.join(elements_list)}]" return elements_block, elements_line diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 457e80d400..2b4fcdc131 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -285,7 +285,8 @@ def generate_cantera_data(species_list, # --- 3. Phase Definitions --- custom_elements, all_elements = get_elements_lists(elements_in_use) - data['elements'] = custom_elements + if custom_elements: + data['elements'] = custom_elements elements_set = set(all_elements) if is_plasma: elements_set.add('E') diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 6f2dc128ca..50c056d823 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -509,9 +509,10 @@ def testPhasesMatch(self): def testElementsMatch(self): """Test that the element definitions in both YAML files match.""" - ck2yaml_elements = sorted(self.yaml1['elements'], key=lambda e: e['symbol']) + assert ('elements' in self.yaml1) == ('elements' in self.yaml2), "One YAML file has 'elements' block while the other does not." + ck2yaml_elements = sorted(self.yaml1.get('elements', []), key=lambda e: e['symbol']) # Put symbol into Titlecase to match ck2yaml's formatting - rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2['elements']] + rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2.get('elements', [])] # Sort by the 'symbol' key. rmg_elements = sorted(rmg_elements, key=lambda e: e['symbol']) # Compare symbols exactly, and atomic weights approximately diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index f85941cbe0..82e5b8fc5d 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -573,15 +573,14 @@ def test_get_elements_block_isotopes_and_surface_site(self): assert 'T' not in elements_list def test_generate_cantera_data_elements_block(self): - """generate_cantera_data emits a top-level 'elements' key whose custom entries - track elements_in_use: empty for plain gas, includes X when a surface site is present.""" + """generate_cantera_data emits a top-level 'elements' key only when + non-builtin elements (isotopes, X) are in use, matching ck2yaml.""" from rmgpy.molecule.element import H, X h2 = self._create_dummy_species("H2", "[H][H]", index=1) - # Gas-only H2: no isotopes, no X -> custom 'elements' list is empty. + # Gas-only H2: no isotopes, no X -> no top-level 'elements' block. data = generate_cantera_data([h2], [], elements_in_use={H}) - assert 'elements' in data - assert data['elements'] == [] + assert 'elements' not in data # Surface fixture: X is in use, so it appears as a custom element. x = self._create_surface_species("X", "1 X u0 p0", index=2) @@ -743,9 +742,10 @@ def testPhasesMatch(self): def testElementsMatch(self): """Test that the element definitions in both YAML files match.""" - ck2yaml_elements = sorted(self.yaml1['elements'], key=lambda e: e['symbol']) + assert ('elements' in self.yaml1) == ('elements' in self.yaml2), "One YAML file has an 'elements' block while the other does not." + ck2yaml_elements = sorted(self.yaml1.get('elements', []), key=lambda e: e['symbol']) # Put symbol into Titlecase to match ck2yaml's formatting - rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2['elements']] + rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2.get('elements', [])] rmg_elements = sorted(rmg_elements, key=lambda e: e['symbol']) # Compare symbols exactly, and atomic weights approximately assert [e['symbol'] for e in ck2yaml_elements] == [e['symbol'] for e in rmg_elements], \ From c0ef7d71140499974c0cc4bbdc95a666539cd67e Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 15 May 2026 23:39:17 -0400 Subject: [PATCH 18/55] Use => for irreversible reactions in Cantera YAML writer get_reaction_equation hard-coded <=> for every reaction, so irreversible RMG reactions came out reversible in the Cantera YAML output and diverged from the ck2yaml baseline. Honor reaction.reversible when picking the arrow. Co-Authored-By: Claude Opus 4.7 (1M context) --- rmgpy/yaml_cantera2.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 2b4fcdc131..d7b007ddae 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -652,7 +652,8 @@ def get_reaction_equation(reaction, species_list): else: suffix = " (+ M)" - return reactants_str + suffix + " <=> " + products_str + suffix + arrow = " <=> " if reaction.reversible else " => " + return reactants_str + suffix + arrow + products_str + suffix def get_label(obj: Union['Species', 'Molecule'], species_list: list['Species']): From 952d7063048ac3aed9918035143656b6f915aaab Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 15 May 2026 23:51:25 -0400 Subject: [PATCH 19/55] Distinguish three-body vs falloff equation notation in Cantera YAML 2 ThirdBody (real three-body) reactions and Lindemann/Troe (falloff) reactions were both being written with the falloff '(+ M)' notation. Cantera infers the reaction order from the equation, so writing a three-body reaction with '(+M)' caused Cantera to treat it as a bimolecular falloff and convert the A-factor to internal kmol-units with the wrong order; in compare_cantera_yaml this surfaced as a 1000x rate-constant discrepancy against ck2yaml output that consistently used '+ M' for three-body. Write ThirdBody as 'reactants + M = products + M' and Lindemann/Troe as 'reactants (+M) = products (+M)'. If a specific_collider is set, substitute its species label for 'M' on both sides. Co-Authored-By: Claude Opus 4.7 (1M context) --- rmgpy/yaml_cantera2.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index d7b007ddae..db051e2c02 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -646,11 +646,16 @@ def get_reaction_equation(reaction, species_list): suffix = "" kin = reaction.kinetics - if isinstance(kin, (ThirdBody, Lindemann, Troe)): - if hasattr(reaction, 'specific_collider') and reaction.specific_collider: - suffix = " + " + get_label(reaction.specific_collider, species_list) - else: - suffix = " (+ M)" + collider = getattr(reaction, 'specific_collider', None) + if isinstance(kin, ThirdBody): + # Real three-body reaction: M (or specific collider) participates as a + # reactant on both sides without parentheses. + m_label = get_label(collider, species_list) if collider else "M" + suffix = " + " + m_label + elif isinstance(kin, (Lindemann, Troe)): + # Pressure-dependent falloff: M acts as a chaperone, written in parens. + m_label = get_label(collider, species_list) if collider else "M" + suffix = " (+" + m_label + ")" arrow = " <=> " if reaction.reversible else " => " return reactants_str + suffix + arrow + products_str + suffix From 41d1115b15b05852a84b8bf59e3adaa3bf05f621 Mon Sep 17 00:00:00 2001 From: Richard West Date: Sat, 16 May 2026 00:05:04 -0400 Subject: [PATCH 20/55] Strip spurious efficiencies in yaml_cantera1 writer Commit 811a0fd0e switched reaction_to_dicts to build ct.Reaction from an equation string to dodge Cantera's spectator-species third-body misidentification. That dodge fails when there are three or more species on one side and a species also appears on the other side (e.g. COOH_X + vacantX <=> CO2 + HX + vacantX, where vacantX is repeated): Cantera still classifies the reaction as three-body-interface-Arrhenius and ct_reaction.input_data gains a spurious 'efficiencies' entry. The writer faithfully copied that into the YAML, producing a file Cantera then refused to load because the reaction is not declared three-body. Drop 'efficiencies' from reaction_data when the underlying RMG kinetics is not a real third-body type (ThirdBody / Lindemann / Troe). Add a regression test that mirrors the failing surface topology. Co-Authored-By: Claude Opus 4.7 (1M context) (then fixed a bit) --- rmgpy/yaml_cantera1.py | 10 +++++++++ test/rmgpy/yaml_cantera1Test.py | 38 +++++++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index ab94e2079b..bb30d467e8 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -47,6 +47,7 @@ MultiArrhenius, MultiPDepArrhenius, ) +from rmgpy.kinetics.model import PDepKineticsModel from rmgpy.util import make_output_subdirectory from datetime import datetime from rmgpy.chemkin import get_species_identifier @@ -359,6 +360,8 @@ def reaction_to_dicts(obj, spcs, verbose=False): else: list_of_cantera_reactions = [obj.to_cantera(use_chemkin_identifier=True)] + is_third_body = isinstance(obj.kinetics, PDepKineticsModel) + for reaction in list_of_cantera_reactions: reaction_data = reaction.input_data efficiencies = getattr(obj.kinetics, "efficiencies", {}) @@ -370,6 +373,13 @@ def reaction_to_dicts(obj, spcs, verbose=False): ) if val != 1 } + elif not is_third_body: + # Cantera's API misidentifies a species that appears on both sides + # of a reaction (e.g. vacantX) as a third-body collider + # when there are three or more species on one side, producing a + # spurious 'efficiencies' entry in input_data. + # see https://github.com/Cantera/cantera/issues/2115 + reaction_data.pop("efficiencies", None) # Convert any AnyMap objects to regular dicts before appending reaction_data = _convert_anymap_to_dict(reaction_data) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 50c056d823..caa8cb7846 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -339,6 +339,44 @@ def test_reaction_to_dicts_surface_spectator_species(self): f"Spectator stoichiometry should not be doubled in: {eq}" ) + def test_reaction_to_dicts_three_species_one_side_spectator(self): + """Spectator on both sides with 3+ stoichiometric items on a side must still drop efficiencies. + + Cantera's API misidentifies a species with net-zero stoichiometry as + a third-body collider whenever the reaction has three or more + stoichiometric items on one side. Routing ct.Reaction through an + equation string avoids this only for the 2-each-side case. For + wider reactions the writer must strip the resulting spurious + 'efficiencies' from input_data so the YAML round-trips through + ct.Solution. + """ + ox = _make_surface_species( + "O_X", + "1 O u0 p2 c0 {2,D}\n2 X u0 p0 c0 {1,D}", + index=6, + ) + # Recombinative H2 desorption with an adjacent O_X site as a chemically + # inert spectator: + # 2 H_X + O_X <=> H2 + O_X + 2 X (atom balance: 2 H + O + 3 X) + # O_X has stoichiometry 1 on each side (net zero), so Cantera flags it + # as a third-body collider even though the underlying kinetics is a + # plain SurfaceArrhenius. + kin = SurfaceArrhenius( + A=(3.73e19, "m^2/(mol*s)"), n=0.475, Ea=(33.6, "kJ/mol"), T0=(1, "K") + ) + rxn = Reaction( + reactants=[self.hx, self.hx, ox], + products=[self.h2, ox, self.x, self.x], + kinetics=kin, + ) + species_list = self.all_surface + [ox] + entries = reaction_to_dicts(rxn, species_list) + d = entries[0] + assert "efficiencies" not in d, ( + "Spurious 'efficiencies' must not appear for a SurfaceArrhenius " + f"reaction with a net-zero-stoichiometry spectator. Got: {d}" + ) + def test_get_elements_block_isotopes_and_surface_site(self): """get_elements_block emits isotope and X definitions only when requested.""" from rmgpy.molecule.element import H, C, D, T, X From d421b59579e63b27ba556a677eddef1dc15ba83a Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 10:30:54 -0400 Subject: [PATCH 21/55] Emit 'type: three-body' for ThirdBody reactions in cantera1 writer Cantera's input_data omits the 'type' field for plain ThirdBody reactions (it only adds 'type: falloff' for Lindemann/Troe). The ck2yaml-converted reference YAML does include 'type: three-body', so the cantera1 writer was producing a slightly different representation than the same mechanism going through Chemkin first. Insert 'type: three-body' explicitly when obj.kinetics is a ThirdBody (but not Lindemann/Troe, which are sibling classes that already get 'type: falloff' from Cantera). Strengthen the existing ThirdBody test to assert on the new field. --- rmgpy/yaml_cantera1.py | 10 ++++++++++ test/rmgpy/yaml_cantera1Test.py | 3 ++- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index bb30d467e8..2a83c9c4c1 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -47,6 +47,7 @@ MultiArrhenius, MultiPDepArrhenius, ) +from rmgpy.kinetics.falloff import ThirdBody from rmgpy.kinetics.model import PDepKineticsModel from rmgpy.util import make_output_subdirectory from datetime import datetime @@ -364,6 +365,15 @@ def reaction_to_dicts(obj, spcs, verbose=False): for reaction in list_of_cantera_reactions: reaction_data = reaction.input_data + # Cantera's input_data omits 'type: three-body' for plain ThirdBody + # reactions (only Lindemann/Troe falloff get a 'type' field). Add it + # explicitly so the YAML matches what ck2yaml emits for the same input. + if isinstance(obj.kinetics, ThirdBody) and "type" not in reaction_data: + new_data = {"equation": reaction_data["equation"], "type": "three-body"} + for k, v in reaction_data.items(): + if k != "equation": + new_data[k] = v + reaction_data = new_data efficiencies = getattr(obj.kinetics, "efficiencies", {}) if efficiencies: reaction_data["efficiencies"] = { diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index caa8cb7846..ba4152aee5 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -165,7 +165,7 @@ def test_reaction_to_dicts_arrhenius_equation_and_rate(self): assert np.isclose(d["rate-constant"]["Ea"], 10e6) # 10 kJ/mol → 1e7 J/kmol def test_reaction_to_dicts_thirdbody(self): - """ThirdBody: equation uses M, efficiencies map present.""" + """ThirdBody: type is three-body, equation uses M, efficiencies map present.""" kin = ThirdBody( arrheniusLow=Arrhenius( A=(1e18, "cm^6/(mol^2*s)"), n=-1, Ea=(0, "J/mol"), T0=(1, "K") @@ -177,6 +177,7 @@ def test_reaction_to_dicts_thirdbody(self): ) entries = reaction_to_dicts(rxn, self.all_gas) d = entries[0] + assert d["type"] == "three-body" assert "M" in d["equation"] assert "rate-constant" in d assert "efficiencies" in d From d1d6fee0a4fcc47783ee72d052ad8462eb261a11 Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 10:32:46 -0400 Subject: [PATCH 22/55] Preserve reactant ordering in cantera1 YAML equation strings Cantera builds the equation field of input_data by iterating its internal (sorted) reactant/product map, so a Troe reaction with RMG-side reactants in order [O2, H] came out as 'H + O2 (+M) <=> HO2 (+M)'. It also collapsed repeated species into stoichiometric coefficients ('2 OH(12)' instead of 'OH(12) + OH(12)'). Both diverged from the ck2yaml-converted reference YAML, which keeps the Chemkin order and writes duplicates as repeated terms. Build the equation locally from obj.reactants/obj.products and overwrite reaction_data['equation'] before yaml.dump. The helper inlines the same suffix conventions as CanteraWriter2 ('+ M' for ThirdBody, '(+M)'/specific-collider for falloff). Update the two_H-product Arrhenius test to expect the new (non-collapsed) form. --- rmgpy/yaml_cantera1.py | 37 ++++++++++++++++++++++++++++++++- test/rmgpy/yaml_cantera1Test.py | 2 +- 2 files changed, 37 insertions(+), 2 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 2a83c9c4c1..6206e407bc 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -47,7 +47,7 @@ MultiArrhenius, MultiPDepArrhenius, ) -from rmgpy.kinetics.falloff import ThirdBody +from rmgpy.kinetics.falloff import Lindemann, ThirdBody, Troe from rmgpy.kinetics.model import PDepKineticsModel from rmgpy.util import make_output_subdirectory from datetime import datetime @@ -345,6 +345,33 @@ def get_mech_dict_nonsurface(spcs, rxns, solvent="solvent", solvent_data=None, v return result_dict +def _build_equation_string(obj): + """ + Build the reaction equation string preserving the order of reactants and + products as stored on the RMG Reaction object. Cantera's input_data sorts + reactant/product maps internally, which loses the source ordering (e.g. + 'H + O2' instead of 'O2 + H' for HO2 formation). Match the equation + convention used by ck2yaml/CanteraWriter2: stoichiometry coefficients are + not collapsed, third-body M (or specific collider) is appended without + parentheses, and falloff colliders are written as '(+M)'. + """ + reactants = " + ".join(r.to_chemkin() for r in obj.reactants) + products = " + ".join(p.to_chemkin() for p in obj.products) + + suffix = "" + kin = obj.kinetics + collider = getattr(obj, "specific_collider", None) + if isinstance(kin, ThirdBody) and not isinstance(kin, (Lindemann, Troe)): + m_label = collider.to_chemkin() if collider else "M" + suffix = " + " + m_label + elif isinstance(kin, (Lindemann, Troe)): + m_label = collider.to_chemkin() if collider else "M" + suffix = " (+" + m_label + ")" + + arrow = " <=> " if obj.reversible else " => " + return reactants + suffix + arrow + products + suffix + + def reaction_to_dicts(obj, spcs, verbose=False): """ Takes an RMG reaction object (obj), returns a list of dictionaries @@ -363,8 +390,16 @@ def reaction_to_dicts(obj, spcs, verbose=False): is_third_body = isinstance(obj.kinetics, PDepKineticsModel) + rmg_equation = _build_equation_string(obj) + for reaction in list_of_cantera_reactions: reaction_data = reaction.input_data + # Cantera reorders reactant and product species (e.g. it writes + # 'H + O2' even when the RMG reaction has them in the order O2, H), + # and collapses repeated species into stoichiometric coefficients. + # Overwrite with an equation built from obj.reactants/products to + # preserve the source ordering and match ck2yaml's output style. + reaction_data["equation"] = rmg_equation # Cantera's input_data omits 'type: three-body' for plain ThirdBody # reactions (only Lindemann/Troe falloff get a 'type' field). Add it # explicitly so the YAML matches what ck2yaml emits for the same input. diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index ba4152aee5..467e5a008b 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -158,7 +158,7 @@ def test_reaction_to_dicts_arrhenius_equation_and_rate(self): entries = reaction_to_dicts(rxn, self.all_gas) assert len(entries) == 1 d = entries[0] - assert d["equation"] == "H2(1) <=> 2 H(2)" + assert d["equation"] == "H2(1) <=> H(2) + H(2)" assert "rate-constant" in d assert np.isclose(d["rate-constant"]["A"], 1e13) assert np.isclose(d["rate-constant"]["b"], 0.5) From b6315446bf53bccbd5a035ec7b5c24f8039e8c2b Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 14:57:34 -0400 Subject: [PATCH 23/55] Render multi-line Cantera YAML 'note' fields as '|' block scalars MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Both writers were joining note parts with ' | ' and dumping the result as a single line — including any multi-line kinetics.comment, whose newlines were replaced with '; '. PyYAML's default for strings that do contain newlines is the double-quoted '...' form with embedded '\n', which is hard to read in the chem_annotated.yaml output and diverges from the '|' literal block style emitted by ck2yaml. Register a Dumper subclass with a representer that picks the '|' literal block style for any string containing a newline. Build the note as a list of lines joined on '\n' (with a trailing newline so PyYAML picks '|' rather than '|-'), and preserve the original line structure of kinetics.comment instead of collapsing it onto one line. Right-strip each line — PyYAML falls back to '...' if any line has trailing whitespace, and the Chemkin writer leaves trailing spaces on some rate-rule lines. --- rmgpy/yaml_cantera1.py | 46 +++++++++++++++++++++++++++-------- rmgpy/yaml_cantera2.py | 54 ++++++++++++++++++++++++++++++------------ 2 files changed, 75 insertions(+), 25 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 6206e407bc..39d87b7e15 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -36,12 +36,30 @@ import os import shutil try: - from yaml import CDumper as Dumper + from yaml import CDumper as _BaseDumper except ImportError: - from yaml import Dumper + from yaml import Dumper as _BaseDumper import yaml import logging + +class Dumper(_BaseDumper): + """ + YAML Dumper that emits multi-line strings using the literal block style + ('|') instead of the default double-quoted form with embedded '\\n'. + Used to render the multi-line 'note' field on reactions in a way that + mirrors ck2yaml's output. + """ + + +def _multiline_str_representer(dumper, data): + if "\n" in data: + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") + return dumper.represent_scalar("tag:yaml.org,2002:str", data) + + +Dumper.add_representer(str, _multiline_str_representer) + from rmgpy.species import Species from rmgpy.kinetics.arrhenius import ( MultiArrhenius, @@ -429,19 +447,27 @@ def reaction_to_dicts(obj, spcs, verbose=False): reaction_data = _convert_anymap_to_dict(reaction_data) if verbose: - note_parts = [] + note_lines = [] if isinstance(obj, TemplateReaction): - note_parts.append(f"Template reaction: {obj.family}") + note_lines.append(f"Template reaction: {obj.family}") elif isinstance(obj, LibraryReaction): - note_parts.append(f"Library reaction: {obj.library}") + note_lines.append(f"Library reaction: {obj.library}") elif isinstance(obj, PDepReaction): - note_parts.append(f"PDep reaction: {obj.network}") + note_lines.append(f"PDep reaction: {obj.network}") if obj.specific_collider is not None: - note_parts.append(f"Specific collider: {obj.specific_collider.label}") + note_lines.append(f"Specific collider: {obj.specific_collider.label}") if obj.kinetics.comment: - note_parts.append(obj.kinetics.comment.replace('\n', '; ').strip()) - if note_parts: - reaction_data["note"] = " | ".join(note_parts) + # Preserve the original line structure of the kinetics + # comment (one line per source line) and right-strip each + # line: PyYAML refuses the '|' literal block style for any + # value whose lines have trailing whitespace. + for line in obj.kinetics.comment.strip("\n").split("\n"): + note_lines.append(line.rstrip()) + if note_lines: + # Trailing '\n' keeps PyYAML's literal block style ('|' + # rather than '|-') so the rendered note ends with a + # newline, matching ck2yaml's output. + reaction_data["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" reaction_list.append(reaction_data) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index db051e2c02..f7870e420c 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -35,11 +35,29 @@ import shutil import logging try: - from yaml import CDumper as Dumper + from yaml import CDumper as _BaseDumper except ImportError: - from yaml import Dumper + from yaml import Dumper as _BaseDumper import yaml + +class Dumper(_BaseDumper): + """ + YAML Dumper that emits multi-line strings using the literal block style + ('|') instead of the default double-quoted form with embedded '\\n'. + Used to render the multi-line 'note' field on reactions in a way that + mirrors ck2yaml's output. + """ + + +def _multiline_str_representer(dumper, data): + if "\n" in data: + return dumper.represent_scalar("tag:yaml.org,2002:str", data, style="|") + return dumper.represent_scalar("tag:yaml.org,2002:str", data) + + +Dumper.add_representer(str, _multiline_str_representer) + from rmgpy.data.kinetics.family import TemplateReaction from rmgpy.data.kinetics.library import LibraryReaction from rmgpy.kinetics import ( @@ -617,24 +635,30 @@ def reaction_to_dict_list(reaction, species_list=None, verbose=False): # --- Metadata / Notes (only when verbose) --- if verbose: - note_parts = list() + note_lines = list() if isinstance(reaction, TemplateReaction): - note_parts.append(f"Source: Template family {reaction.family}") + note_lines.append(f"Source: Template family {reaction.family}") elif isinstance(reaction, LibraryReaction): - note_parts.append(f"Source: Library {reaction.library}") + note_lines.append(f"Source: Library {reaction.library}") elif isinstance(reaction, PDepReaction): - note_parts.append(f"Source: PDep Network #{reaction.network.index}") - - if hasattr(kin, 'comment') and kin.comment: - clean_comment = kin.comment.replace('\n', '; ').strip() - if clean_comment: - note_parts.append(clean_comment) + note_lines.append(f"Source: PDep Network #{reaction.network.index}") if reaction.specific_collider: - note_parts.append(f"Specific collider: {reaction.specific_collider.label}") - - if note_parts: - entry['note'] = " | ".join(note_parts) + note_lines.append(f"Specific collider: {reaction.specific_collider.label}") + + if hasattr(kin, "comment") and kin.comment: + # Preserve the original line structure of the kinetics comment + # (one line per source line) and right-strip each line: PyYAML + # refuses the '|' literal block style for any value whose lines + # have trailing whitespace. + for line in kin.comment.strip("\n").split("\n"): + note_lines.append(line.rstrip()) + + if note_lines: + # Trailing '\n' keeps PyYAML's literal block style ('|' rather + # than '|-') so the rendered note ends with a newline, matching + # ck2yaml's output. + entry["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" return [entry] From f81b2e873cf77c202b2c87acafab657de79a70c0 Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 14:58:28 -0400 Subject: [PATCH 24/55] Add missing 'Flux pairs' / 'Specific third body collider' to Cantera notes The verbose reaction note had drifted from the annotation block that the Chemkin writer emits (and that ck2yaml round-trips into the reference YAML): the 'Flux pairs: A, B; C, D' line was missing entirely, the third-body-collider line used a shorter label than 'Specific third body collider:' that Chemkin writes, and cantera2 used 'Source: Library X' / 'Source: Template family X' / 'Source: PDep Network #N' instead of the 'Library reaction: X' / 'Template reaction: X' / 'PDep reaction: N' wording used everywhere else. Add the flux pairs line built from reaction.pairs (semicolon-joined 'A, B' pairs, mirroring the Chemkin format), normalise the collider-line label, and align cantera2's source-line wording with cantera1 and the Chemkin annotation. The 'Reaction index: Chemkin #N; RMG #M' prefix line and a Chemkin counter follow in a separate commit. --- rmgpy/yaml_cantera1.py | 8 +++++++- rmgpy/yaml_cantera2.py | 20 ++++++++++++++++---- 2 files changed, 23 insertions(+), 5 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 39d87b7e15..41577826a5 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -455,7 +455,13 @@ def reaction_to_dicts(obj, spcs, verbose=False): elif isinstance(obj, PDepReaction): note_lines.append(f"PDep reaction: {obj.network}") if obj.specific_collider is not None: - note_lines.append(f"Specific collider: {obj.specific_collider.label}") + note_lines.append(f"Specific third body collider: {obj.specific_collider.label}") + if getattr(obj, "pairs", None): + pair_str = "Flux pairs: " + "; ".join( + f"{get_species_identifier(p[0])}, {get_species_identifier(p[1])}" + for p in obj.pairs + ) + note_lines.append(pair_str) if obj.kinetics.comment: # Preserve the original line structure of the kinetics # comment (one line per source line) and right-strip each diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index f7870e420c..1921c486ac 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -636,15 +636,27 @@ def reaction_to_dict_list(reaction, species_list=None, verbose=False): # --- Metadata / Notes (only when verbose) --- if verbose: note_lines = list() + # Use the same wording as the Chemkin annotation block (and the + # ck2yaml-converted reference YAML) so the three outputs are + # mutually diffable: 'Library reaction: X' not 'Source: Library X'. if isinstance(reaction, TemplateReaction): - note_lines.append(f"Source: Template family {reaction.family}") + note_lines.append(f"Template reaction: {reaction.family}") elif isinstance(reaction, LibraryReaction): - note_lines.append(f"Source: Library {reaction.library}") + note_lines.append(f"Library reaction: {reaction.library}") elif isinstance(reaction, PDepReaction): - note_lines.append(f"Source: PDep Network #{reaction.network.index}") + note_lines.append(f"PDep reaction: {reaction.network}") if reaction.specific_collider: - note_lines.append(f"Specific collider: {reaction.specific_collider.label}") + note_lines.append( + f"Specific third body collider: {reaction.specific_collider.label}" + ) + + if getattr(reaction, "pairs", None): + pair_str = "Flux pairs: " + "; ".join( + f"{get_label(p[0], species_list)}, {get_label(p[1], species_list)}" + for p in reaction.pairs + ) + note_lines.append(pair_str) if hasattr(kin, "comment") and kin.comment: # Preserve the original line structure of the kinetics comment From 79cb9e697a288c024f2b2ce57d114807ce0bbc1e Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 14:59:54 -0400 Subject: [PATCH 25/55] Number reactions in Cantera YAML notes the same way Chemkin does The Chemkin annotation block opens each reaction with a 'Reaction index: Chemkin #N; RMG #M' line that gives a sequential 1-based Chemkin number plus the parent RMG reaction index. The Cantera YAML notes were missing this entirely, making it hard to cross-reference a row in the YAML against the same reaction in chem_annotated.inp. Add a small per-writer collector (_collect_reactions in cantera1, _collect_reaction_entries in cantera2) that walks the reaction list, increments a shared counter for each YAML entry produced (so MultiArrhenius/MultiPDepArrhenius sub-entries each get their own Chemkin number while sharing the parent RMG index), and prepends the 'Reaction index:' line to each note. The counter is shared across gas + site0/surface reaction blocks so the numbering stays continuous, matching the global counter in the Chemkin writer. --- rmgpy/yaml_cantera1.py | 47 +++++++++++++++++++++++++++++------------ rmgpy/yaml_cantera2.py | 48 +++++++++++++++++++++++++++++++----------- 2 files changed, 69 insertions(+), 26 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 41577826a5..25642b7a84 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -306,6 +306,34 @@ def get_phases_with_surface(spcs, surface_site_density, elements_line, has_cover return phases_block +def _collect_reactions(rxn_list, spcs, verbose, chemkin_counter): + """ + Convert a list of RMG reactions to a list of YAML reaction dicts, + prepending a 'Reaction index: Chemkin #N; RMG #M' line to the note of + each entry (in verbose mode). chemkin_counter is a single-element list + used as a mutable counter so calls across multiple reaction blocks + (e.g. gas + site0 in surface mechanisms) share a continuous Chemkin + numbering, matching the global counter in the Chemkin writer. For + MultiArrhenius/MultiPDepArrhenius reactions, which expand into several + YAML entries, each sub-entry gets its own Chemkin number but shares + the parent RMG index. + """ + entries = [] + for rmg_rxn in rxn_list: + rxn_entries = reaction_to_dicts(rmg_rxn, spcs, verbose=verbose) + for entry in rxn_entries: + chemkin_counter[0] += 1 + if verbose: + index_line = ( + f"Reaction index: Chemkin #{chemkin_counter[0]}; " + f"RMG #{rmg_rxn.index}" + ) + existing = entry.get("note", "") + entry["note"] = index_line + "\n" + existing if existing else index_line + "\n" + entries.extend(rxn_entries) + return entries + + def get_mech_dict_surface(spcs, rxns, solvent="solvent", solvent_data=None, verbose=False): """ For systems with surface species/reactions. @@ -328,16 +356,9 @@ def get_mech_dict_surface(spcs, rxns, solvent="solvent", solvent_data=None, verb result_dict["species"] = [species_to_dict(x, all_species=spcs, verbose=verbose) for x in spcs] # separate gas and surface reactions - - gas_reactions = [] - for rmg_rxn in gas_rxns: - gas_reactions.extend(reaction_to_dicts(rmg_rxn, spcs, verbose=verbose)) - result_dict["gas-reactions"] = gas_reactions - - surface_reactions = [] - for rmg_rxn in surface_rxns: - surface_reactions.extend(reaction_to_dicts(rmg_rxn, spcs, verbose=verbose)) - result_dict["site0-reactions"] = surface_reactions + chemkin_counter = [0] + result_dict["gas-reactions"] = _collect_reactions(gas_rxns, spcs, verbose, chemkin_counter) + result_dict["site0-reactions"] = _collect_reactions(surface_rxns, spcs, verbose, chemkin_counter) return result_dict @@ -355,10 +376,8 @@ def get_mech_dict_nonsurface(spcs, rxns, solvent="solvent", solvent_data=None, v result_dict = dict() result_dict["species"] = [species_to_dict(x, verbose=verbose) for x in spcs] - reactions = [] - for rmg_rxn in rxns: - reactions.extend(reaction_to_dicts(rmg_rxn, spcs, verbose=verbose)) - result_dict["reactions"] = reactions + chemkin_counter = [0] + result_dict["reactions"] = _collect_reactions(rxns, spcs, verbose, chemkin_counter) return result_dict diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 1921c486ac..0b6c30d77c 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -365,12 +365,14 @@ def generate_cantera_data(species_list, species_data.append(species_to_dict(sp, species_list, verbose=verbose)) data['species'] = species_data - # Build separate reaction lists for each phase if there are two phases - gas_reaction_data = list() - for rxn in gas_reactions: - entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) - if entries: - gas_reaction_data.extend(entries) + # Build separate reaction lists for each phase if there are two phases. + # chemkin_counter is a single-element list used as a mutable counter so + # the Chemkin reaction numbering in verbose notes continues unbroken + # across the gas and surface reaction blocks, matching the global + # counter in the Chemkin writer. + chemkin_counter = [0] + gas_reaction_data = _collect_reaction_entries(gas_reactions, species_list, + verbose, chemkin_counter) if surface_species: data['gas-reactions'] = gas_reaction_data @@ -378,16 +380,38 @@ def generate_cantera_data(species_list, data['reactions'] = gas_reaction_data if surface_reactions: - surface_reaction_data = list() - for rxn in surface_reactions: - entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) - if entries: - surface_reaction_data.extend(entries) - data['surface-reactions'] = surface_reaction_data + data['surface-reactions'] = _collect_reaction_entries( + surface_reactions, species_list, verbose, chemkin_counter) return data +def _collect_reaction_entries(rxns, species_list, verbose, chemkin_counter): + """ + Convert RMG reactions to YAML reaction dicts, prepending a 'Reaction + index: Chemkin #N; RMG #M' line to each note (in verbose mode). For + MultiArrhenius/MultiPDepArrhenius reactions, which expand into several + YAML entries, each sub-entry gets its own Chemkin number but shares + the parent RMG index. + """ + entries = [] + for rxn in rxns: + rxn_entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) + for entry in rxn_entries: + chemkin_counter[0] += 1 + if verbose: + index_line = ( + f"Reaction index: Chemkin #{chemkin_counter[0]}; " + f"RMG #{rxn.index}" + ) + existing = entry.get("note", "") + entry["note"] = ( + index_line + "\n" + existing if existing else index_line + "\n" + ) + entries.extend(rxn_entries) + return entries + + def species_to_dict(species, species_list, verbose=False): """Convert an RMG Species object to a Cantera YAML dictionary. If verbose=True, species notes (SMILES, thermo/transport comments) are included. From f24b002e87391a9b2ee11b0e486e8f8a84502c01 Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 15:18:11 -0400 Subject: [PATCH 26/55] Tweaking comments in cantera yaml writers Claude likes to put comments in about how it is changing things. Helpful for code review and for figuring out what it's done, but for long term, what's helpful is comments on the current state of the code, not how it has changed. --- rmgpy/yaml_cantera1.py | 15 ++++----------- rmgpy/yaml_cantera2.py | 13 +------------ 2 files changed, 5 insertions(+), 23 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 25642b7a84..ca11e62688 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -437,9 +437,9 @@ def reaction_to_dicts(obj, spcs, verbose=False): # Overwrite with an equation built from obj.reactants/products to # preserve the source ordering and match ck2yaml's output style. reaction_data["equation"] = rmg_equation - # Cantera's input_data omits 'type: three-body' for plain ThirdBody - # reactions (only Lindemann/Troe falloff get a 'type' field). Add it - # explicitly so the YAML matches what ck2yaml emits for the same input. + # Cantera's (v. 3.2) input_data omits 'type: three-body' for plain ThirdBody + # reactions (only Lindemann/Troe falloff get a 'type' field). + # Add it, immediately after the 'equation' field, to match the ck2yaml output. if isinstance(obj.kinetics, ThirdBody) and "type" not in reaction_data: new_data = {"equation": reaction_data["equation"], "type": "three-body"} for k, v in reaction_data.items(): @@ -456,7 +456,7 @@ def reaction_to_dicts(obj, spcs, verbose=False): if val != 1 } elif not is_third_body: - # Cantera's API misidentifies a species that appears on both sides + # Cantera's API (v. 3.2) misidentifies a species that appears on both sides # of a reaction (e.g. vacantX) as a third-body collider # when there are three or more species on one side, producing a # spurious 'efficiencies' entry in input_data. @@ -482,16 +482,9 @@ def reaction_to_dicts(obj, spcs, verbose=False): ) note_lines.append(pair_str) if obj.kinetics.comment: - # Preserve the original line structure of the kinetics - # comment (one line per source line) and right-strip each - # line: PyYAML refuses the '|' literal block style for any - # value whose lines have trailing whitespace. for line in obj.kinetics.comment.strip("\n").split("\n"): note_lines.append(line.rstrip()) if note_lines: - # Trailing '\n' keeps PyYAML's literal block style ('|' - # rather than '|-') so the rendered note ends with a - # newline, matching ck2yaml's output. reaction_data["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" reaction_list.append(reaction_data) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 0b6c30d77c..a0ad2a9d3f 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -660,9 +660,6 @@ def reaction_to_dict_list(reaction, species_list=None, verbose=False): # --- Metadata / Notes (only when verbose) --- if verbose: note_lines = list() - # Use the same wording as the Chemkin annotation block (and the - # ck2yaml-converted reference YAML) so the three outputs are - # mutually diffable: 'Library reaction: X' not 'Source: Library X'. if isinstance(reaction, TemplateReaction): note_lines.append(f"Template reaction: {reaction.family}") elif isinstance(reaction, LibraryReaction): @@ -683,17 +680,10 @@ def reaction_to_dict_list(reaction, species_list=None, verbose=False): note_lines.append(pair_str) if hasattr(kin, "comment") and kin.comment: - # Preserve the original line structure of the kinetics comment - # (one line per source line) and right-strip each line: PyYAML - # refuses the '|' literal block style for any value whose lines - # have trailing whitespace. for line in kin.comment.strip("\n").split("\n"): note_lines.append(line.rstrip()) if note_lines: - # Trailing '\n' keeps PyYAML's literal block style ('|' rather - # than '|-') so the rendered note ends with a newline, matching - # ck2yaml's output. entry["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" return [entry] @@ -708,8 +698,7 @@ def get_reaction_equation(reaction, species_list): kin = reaction.kinetics collider = getattr(reaction, 'specific_collider', None) if isinstance(kin, ThirdBody): - # Real three-body reaction: M (or specific collider) participates as a - # reactant on both sides without parentheses. + # Real three-body reaction: M (or specific collider) without parentheses. m_label = get_label(collider, species_list) if collider else "M" suffix = " + " + m_label elif isinstance(kin, (Lindemann, Troe)): From 6cd860609f224058247cfdaa4c061c6861de4fd4 Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 21:29:28 -0400 Subject: [PATCH 27/55] Fix verboseComments handling in Cantera YAML writers MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The per-writer verboseComments option on the Cantera writers gated whether the annotated YAML file was written at all and whether species/reaction note: fields were emitted. That conflated two different things: the global verboseComments option already controls how detailed each kinetics-estimate comment is, and the writer-level decision should just be "is there an annotated file?" — always yes, the same way Chemkin always writes both chem.inp and chem_annotated.inp. Changes: - yaml_cantera1.py / yaml_cantera2.py: drop the verbose parameter and every if verbose: branch. Species notes (SMILES, thermo/transport comments) and reaction notes (template family / library / pdep network, flux pairs, specific collider, kinetics comment, Chemkin/RMG numbering) are now always emitted. Per-iteration output is renamed: chem{NNNN}.yaml → chem_annotated{NNNN}.yaml chem.yaml → chem_annotated.yaml chem_edge*.yaml → chem_edge_annotated*.yaml Halves the number of yaml.dump calls per iteration since the writer no longer produces both an unannotated and an annotated copy. - WriterConfig (rmg/settings.py) and parse/serialize helpers (rmg/input.py): drop verbose_comments entirely. _parse_writer_config now validates dict keys and raises InputError for unknown keys so an old input file carrying {'verboseComments': True} fails fast with a clear message instead of being silently ignored. - chemkin.pyx: remove the dead read of config.verbose_comments in save_chemkin_files (the local was never used). - rmg/main.py: at end-of-run, factor the existing note-stripping regex into a small _strip_yaml_notes helper that handles block style, single-line flow, and multi-line wrapped flow note: fields. Use it to produce notes-stripped chem.yaml / chem_edge.yaml inside each enabled Cantera writer directory (mirroring Chemkin's chem.inp vs chem_annotated.inp split) and continue stripping cantera_from_ck/chem.yaml in place. Comparison report now points at the new chem.yaml files. - docs / examples / tests: remove every per-writer verboseComments reference from input.rst, output.rst, examples/rmg/commented/input.py, inputTest.py, yaml_cantera1Test.py, yaml_cantera2Test.py. Tests for the transport note are reworked to assert the note is always present. Co-Authored-By: Claude Opus 4.7 (1M context) --- documentation/source/users/rmg/input.rst | 12 +- documentation/source/users/rmg/output.rst | 28 ++-- examples/rmg/commented/input.py | 11 +- rmgpy/chemkin.pyx | 1 - rmgpy/rmg/input.py | 17 ++- rmgpy/rmg/main.py | 71 +++++++-- rmgpy/rmg/settings.py | 6 +- rmgpy/yaml_cantera1.py | 175 +++++++++------------- rmgpy/yaml_cantera2.py | 155 +++++++++---------- test/rmgpy/rmg/inputTest.py | 8 +- test/rmgpy/yaml_cantera1Test.py | 10 +- test/rmgpy/yaml_cantera2Test.py | 18 +-- 12 files changed, 252 insertions(+), 260 deletions(-) diff --git a/documentation/source/users/rmg/input.rst b/documentation/source/users/rmg/input.rst index ba0d5a9ca1..50c1c703ef 100644 --- a/documentation/source/users/rmg/input.rst +++ b/documentation/source/users/rmg/input.rst @@ -1105,7 +1105,7 @@ Setting ``generatePESDiagrams`` to ``True`` will generate potential energy surfa Setting ``saveSimulationProfiles`` to ``True`` will make RMG save csv files of the simulation in .csv files in the ``solver/`` folder. The filename will be ``simulation_1_26.csv`` where the first number corresponds to the reaciton system, and the second number corresponds to the total number of species at the point of the simulation. Therefore, the highest second number will indicate the latest simulation that RMG has complete while enlarging the core model. The information inside the csv file will provide the time, reactor volume in m^3, as well as mole fractions of the individual species. -Setting ``verboseComments`` to ``True`` will make RMG generate chemkin files with complete verbose commentary for the kinetic and thermo parameters. This will be helpful in debugging what values are being averaged for the kinetics. Note that this may produce very large files. This is a global fallback; individual writers can override it (see below). +Setting ``verboseComments`` to ``True`` will make RMG generate output files with complete verbose commentary for the kinetic and thermo parameters (i.e. listing every rate rule that was averaged). This is helpful for debugging what values are being averaged for the kinetics. Note that this may produce very large files. Setting ``saveEdgeSpecies`` to ``True`` will make RMG generate chemkin files of the edge reactions in addition to the core model in files such as ``chem_edge.inp`` and ``chem_edge_annotated.inp`` files located inside the ``chemkin`` folder. These files will be helpful in viewing RMG's estimate for edge reactions and seeing if certain reactions one expects are actually in the edge or not. This is a global fallback; individual writers can override it (see below). @@ -1124,21 +1124,19 @@ Each accepts ``True``, ``False``, or a Python dict with optional keys: * ``'saveInterval'`` *(int)* — positive N writes every N iterations (iteration numbering starts at 0); ``-1`` writes only at the very end of the run. Defaults to ``1`` (every iteration) for writers that are on by default. -* ``'verboseComments'`` *(bool, optional)* — overrides the global - ``verboseComments`` flag for this writer only. * ``'saveEdge'`` *(bool, optional)* — overrides the global ``saveEdgeSpecies`` flag for this writer only. Examples:: - # Chemkin: save only at the end, with verbose comments and edge species - generateChemkin={'saveInterval': -1, 'verboseComments': True, 'saveEdge': True} + # Chemkin: save only at the end, also writing edge species + generateChemkin={'saveInterval': -1, 'saveEdge': True} # RMS YAML: save every 5 iterations generateRMSYAML={'saveInterval': 5} - # Cantera YAML v2: save every iteration with verbose comments - generateCanteraYAML2={'saveInterval': 1, 'verboseComments': True, 'saveEdge': False} + # Cantera YAML v2: save every iteration, no edge species + generateCanteraYAML2={'saveInterval': 1, 'saveEdge': False} ``generateChemkin`` (default ``True``) Controls the Chemkin writer. Output is written to the ``chemkin/`` folder. diff --git a/documentation/source/users/rmg/output.rst b/documentation/source/users/rmg/output.rst index 632a7fca75..d1894510f8 100755 --- a/documentation/source/users/rmg/output.rst +++ b/documentation/source/users/rmg/output.rst @@ -77,13 +77,15 @@ This folder is created when ``generateCanteraYAML1=True`` is set in the ``option Files generated: -* ``chem{NNNN}.yaml`` — mechanism snapshot at the iteration when the core contained *NNNN* - species (e.g. ``chem0042.yaml``) -* ``chem.yaml`` — copy of the latest snapshot; always reflects the current model state -* ``chem_annotated.yaml`` — annotated version with SMILES, source, and kinetics comments - (written when ``verboseComments=True`` for this writer) -* ``chem_edge{NNNN}.yaml`` / ``chem_edge.yaml`` / ``chem_edge_annotated.yaml`` — edge-model - equivalents (written when ``saveEdge=True``) +* ``chem_annotated{NNNN}.yaml`` — annotated mechanism snapshot at the iteration when the + core contained *NNNN* species (e.g. ``chem_annotated0042.yaml``). Includes SMILES, + source, and kinetics comments. +* ``chem_annotated.yaml`` — copy of the latest annotated snapshot; always reflects the + current model state. +* ``chem.yaml`` — compact, comment-free copy of the final mechanism, written only at the + end of the run (mirrors Chemkin's ``chem.inp`` vs ``chem_annotated.inp`` split). +* ``chem_edge_annotated{NNNN}.yaml`` / ``chem_edge_annotated.yaml`` / ``chem_edge.yaml`` — + edge-model equivalents (written when ``saveEdge=True``). * ``comparison_report.txt`` — numerical comparison of ``chem.yaml`` against the ``cantera_from_ck`` translation (written at the end of the run if both writers are enabled; see below) @@ -104,12 +106,14 @@ schedule). Files generated: -* ``chem{NNNN}.yaml`` / ``chem.yaml`` — latest mechanism snapshot and its labelled history -* ``chem_annotated.yaml`` — annotated version (written when ``verboseComments=True``) -* ``chem_edge{NNNN}.yaml`` / ``chem_edge.yaml`` / ``chem_edge_annotated.yaml`` — edge-model - equivalents (written when ``saveEdge=True``) +* ``chem_annotated{NNNN}.yaml`` / ``chem_annotated.yaml`` — annotated mechanism snapshots + (per-iteration history and latest copy), including SMILES, source, and kinetics comments. +* ``chem.yaml`` — compact, comment-free copy of the final mechanism, written only at the + end of the run. +* ``chem_edge_annotated{NNNN}.yaml`` / ``chem_edge_annotated.yaml`` / ``chem_edge.yaml`` — + edge-model equivalents (written when ``saveEdge=True``). * ``comparison_report.txt`` — numerical comparison against the ``cantera_from_ck`` - translation (written at the end of the run if both writers are enabled) + translation (written at the end of the run if both writers are enabled). Comparison Reports ^^^^^^^^^^^^^^^^^^ diff --git a/examples/rmg/commented/input.py b/examples/rmg/commented/input.py index 95c2c8eecc..40649d2814 100644 --- a/examples/rmg/commented/input.py +++ b/examples/rmg/commented/input.py @@ -221,9 +221,9 @@ generatePESDiagrams=False, # saves mole fraction of species in 'solver/' to help you create plots saveSimulationProfiles=False, - # Global fallback for verbose comments (comments on where kinetics were obtained). + # Verbose comments (controls how detailed the kinetics/thermo source comments are, + # e.g. listing every rate rule that was averaged). # Useful for debugging kinetics but increases output file size. - # Individual writers can override this with their own verboseComments key. verboseComments=False, # Global fallback for saving edge-species files. Uses lots of memory in output. # Helpful for seeing why some reactions are not appearing in the core model. @@ -244,12 +244,11 @@ # --- Per-writer output configuration --- # Each writer accepts True/False or a dict with keys: # 'saveInterval': N (positive = every N iterations; -1 = end of run only) - # 'verboseComments': True/False (overrides the global verboseComments above) # 'saveEdge': True/False (overrides the global saveEdgeSpecies above) # # Chemkin writer: always on by default; saves every iteration. generateChemkin=True, - # generateChemkin={'saveInterval': -1, 'verboseComments': True, 'saveEdge': True}, + # generateChemkin={'saveInterval': -1, 'saveEdge': True}, # # RMS YAML writer: always on by default; saves every iteration. generateRMSYAML=True, @@ -257,11 +256,11 @@ # # Cantera YAML v1 writer: off by default. generateCanteraYAML1=False, - # generateCanteraYAML1={'saveInterval': -1, 'verboseComments': True, 'saveEdge': False}, + # generateCanteraYAML1={'saveInterval': -1, 'saveEdge': False}, # # Cantera YAML v2 writer: off by default. generateCanteraYAML2=False, - # generateCanteraYAML2={'saveInterval': 1, 'verboseComments': True, 'saveEdge': True}, + # generateCanteraYAML2={'saveInterval': 1, 'saveEdge': True}, ) # optional module allows for correction to unimolecular reaction rates at low pressures and/or temperatures. diff --git a/rmgpy/chemkin.pyx b/rmgpy/chemkin.pyx index de8a9d4e3e..deca2e37a7 100644 --- a/rmgpy/chemkin.pyx +++ b/rmgpy/chemkin.pyx @@ -2317,7 +2317,6 @@ def save_chemkin_files(rmg, config=None): """ Save the current reaction model to a set of Chemkin files. """ - verbose = config.verbose_comments if (config and config.verbose_comments is not None) else rmg.verbose_comments save_edge = config.save_edge if (config and config.save_edge is not None) else rmg.save_edge_species # todo: make this an attribute or method of reactionModel diff --git a/rmgpy/rmg/input.py b/rmgpy/rmg/input.py index 97399c0dd0..051a6d868a 100644 --- a/rmgpy/rmg/input.py +++ b/rmgpy/rmg/input.py @@ -1427,8 +1427,7 @@ def _parse_writer_config(value, default_save_interval=1): value : bool or dict ``False`` disables the writer. ``True`` enables it with *default_save_interval*. A dict may contain the keys - ``'saveInterval'`` (int), ``'verboseComments'`` (bool), and - ``'saveEdge'`` (bool). + ``'saveInterval'`` (int) and ``'saveEdge'`` (bool). default_save_interval : int Save interval to use when ``value`` is ``True``. @@ -1441,15 +1440,21 @@ def _parse_writer_config(value, default_save_interval=1): if value is True: return WriterConfig(save_interval=default_save_interval) if isinstance(value, dict): + allowed = {'saveInterval', 'saveEdge'} + unknown = set(value) - allowed + if unknown: + raise InputError( + f"Writer config has unknown key(s) {sorted(unknown)!r}. " + f"Allowed keys are: {sorted(allowed)!r}." + ) si = value.get('saveInterval', default_save_interval) return WriterConfig( save_interval=si, - verbose_comments=value.get('verboseComments', None), save_edge=value.get('saveEdge', None), ) raise InputError( f"Writer config must be True, False, or a dict with keys " - f"'saveInterval', 'verboseComments', 'saveEdge'; got {type(value).__name__!r}" + f"'saveInterval', 'saveEdge'; got {type(value).__name__!r}" ) @@ -1460,12 +1465,10 @@ def _writer_config_to_input(cfg): """ if cfg is None or not cfg.enabled: return False - has_overrides = (cfg.verbose_comments is not None or cfg.save_edge is not None) + has_overrides = (cfg.save_edge is not None) if cfg.save_interval == 1 and not has_overrides: return True parts = [f"'saveInterval': {cfg.save_interval}"] - if cfg.verbose_comments is not None: - parts.append(f"'verboseComments': {cfg.verbose_comments}") if cfg.save_edge is not None: parts.append(f"'saveEdge': {cfg.save_edge}") return '{' + ', '.join(parts) + '}' diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index 5e41cca631..9ea325bf5e 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -1305,7 +1305,11 @@ def execute(self, initialize=True, **kwargs): self.run_model_analysis() - # generate Cantera files chem.yaml & chem_annotated.yaml in designated Cantera output folders + # generate Cantera files in designated Cantera output folders. The direct + # writers (cantera1/, cantera2/) already wrote chem_annotated{NNNN}.yaml + + # chem_annotated.yaml each iteration. End-of-run we also produce the + # notes-stripped chem.yaml (and chem_edge.yaml when present), mirroring + # Chemkin's chem.inp / chem_annotated.inp split, and run the comparison. try: translated_cantera_file = None if self.chemkin_writer_config and self.chemkin_writer_config.enabled: @@ -1359,15 +1363,64 @@ def execute(self, initialize=True, **kwargs): if os.path.exists(annotated): self.generate_cantera_files_from_chemkin(annotated) - # Strip transport notes from the non-annotated ck2yaml file to match the non-verbose RMG writers + def _strip_yaml_notes(src, dst): + """Read a YAML file, strip ``note:`` fields, and write the + result to *dst*. Preserves formatting (block style, key + ordering, etc.) — important when the source is the carefully + crafted ck2yaml output. + + Three patterns are handled (notes are always the last key, by + how RMG / ck2yaml emit them): + 1. Block-style: `` note: ...`` on its own line, + possibly followed by deeper-indented continuation lines + (multi-line literal/folded scalars). + 2. Single-line flow: ``{..., note: foo}`` → ``{...}`` + 3. Wrapped flow: a flow mapping that wraps with the + trailing ``,`` at the end of one line and + `` note: foo}`` on the next → drop the comma and + replace with ``}`` on the prior line. + """ + if not os.path.exists(src): + return + with open(src) as f: + text = f.read() + # Wrapped flow style: a flow mapping that wraps after a + # trailing ``,``, with ``note: value`` on the next line + # (value may itself wrap across several more-indented lines) + # ending in ``}``. Replace the whole tail with ``}``. + text = re.sub( + r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', + '}', text) + # Single-line flow style: ``, note: value}`` → ``}``. + text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) + # Block style: `` note: ...\n`` plus deeper-indented + # continuation lines. + text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', text, flags=re.MULTILINE) + with open(dst, "w") as f: + f.write(text) + + # Strip transport notes from the ck2yaml file so it matches the + # notes-stripped variants below. ck_chem_yaml = os.path.join(self.output_directory, "cantera_from_ck", "chem.yaml") - if os.path.exists(ck_chem_yaml): - with open(ck_chem_yaml) as f: - ck_text = f.read() - # Remove 'note:' lines and their indented continuations (multi-line values are more-indented) - ck_text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', ck_text, flags=re.MULTILINE) - with open(ck_chem_yaml, "w") as f: - f.write(ck_text) + _strip_yaml_notes(ck_chem_yaml, ck_chem_yaml) + + # Produce notes-stripped chem.yaml / chem_edge.yaml end-of-run for + # each direct Cantera writer (mirrors Chemkin's chem.inp). + for writer_dir, writer_cfg in ( + ("cantera1", self.cantera1_writer_config), + ("cantera2", self.cantera2_writer_config), + ): + if not (writer_cfg and writer_cfg.enabled): + continue + writer_path = os.path.join(self.output_directory, writer_dir) + _strip_yaml_notes( + os.path.join(writer_path, "chem_annotated.yaml"), + os.path.join(writer_path, "chem.yaml"), + ) + _strip_yaml_notes( + os.path.join(writer_path, "chem_edge_annotated.yaml"), + os.path.join(writer_path, "chem_edge.yaml"), + ) # Compare translated Cantera files against directly generated Cantera files if translated_cantera_file and self.cantera1_writer_config and self.cantera1_writer_config.enabled: diff --git a/rmgpy/rmg/settings.py b/rmgpy/rmg/settings.py index efe4ca8625..20ed5a9e3f 100644 --- a/rmgpy/rmg/settings.py +++ b/rmgpy/rmg/settings.py @@ -151,17 +151,13 @@ class WriterConfig: How often to write output. Positive N = every N iterations (0-indexed iteration numbers, so iteration 0 is always included). -1 = end of run only. 0 = disabled entirely. - verbose_comments : bool or None - Per-writer override for verbose comments. None means fall back to the - global ``rmg.verbose_comments``. save_edge : bool or None Per-writer override for saving edge species. None means fall back to the global ``rmg.save_edge_species``. """ - def __init__(self, save_interval=1, verbose_comments=None, save_edge=None): + def __init__(self, save_interval=1, save_edge=None): self.save_interval = save_interval - self.verbose_comments = verbose_comments self.save_edge = save_edge self._last_write = -1 diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index ca11e62688..129bc3125e 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -117,12 +117,12 @@ def write_cantera( solvent=None, solvent_data=None, path="chem.yml", - verbose=False, ): """ Writes yaml file depending on the type of system (gas-phase, catalysis). Writes beginning lines of yaml file, then uses yaml.dump(result_dict) to write species/reactions info. - If verbose=True, species and reaction notes (SMILES, source, kinetics comment) are included. + Species and reaction notes (SMILES, source, kinetics comment) are always included; how detailed + each underlying kinetics/thermo comment is, is governed by the global ``verboseComments`` option. elements_in_use is a set of :class:`Element` singletons. Only those elements are listed in the YAML 'elements' block and 'phases.elements' lines. @@ -148,14 +148,14 @@ def write_cantera( for spc in spcs if spc.contains_surface_site() ) result_dict = get_mech_dict_surface( - spcs, rxns, solvent=solvent, solvent_data=solvent_data, verbose=verbose + spcs, rxns, solvent=solvent, solvent_data=solvent_data ) phases_block = get_phases_with_surface( spcs, surface_site_density, elements_line, has_coverage_dependence=has_coverage_dependence ) else: result_dict = get_mech_dict_nonsurface( - spcs, rxns, solvent=solvent, solvent_data=solvent_data, verbose=verbose + spcs, rxns, solvent=solvent, solvent_data=solvent_data ) phases_block = get_phases_gas_only(spcs, elements_line) @@ -306,35 +306,33 @@ def get_phases_with_surface(spcs, surface_site_density, elements_line, has_cover return phases_block -def _collect_reactions(rxn_list, spcs, verbose, chemkin_counter): +def _collect_reactions(rxn_list, spcs, chemkin_counter): """ Convert a list of RMG reactions to a list of YAML reaction dicts, prepending a 'Reaction index: Chemkin #N; RMG #M' line to the note of - each entry (in verbose mode). chemkin_counter is a single-element list - used as a mutable counter so calls across multiple reaction blocks - (e.g. gas + site0 in surface mechanisms) share a continuous Chemkin - numbering, matching the global counter in the Chemkin writer. For - MultiArrhenius/MultiPDepArrhenius reactions, which expand into several - YAML entries, each sub-entry gets its own Chemkin number but shares - the parent RMG index. + each entry. chemkin_counter is a single-element list used as a mutable + counter so calls across multiple reaction blocks (e.g. gas + site0 in + surface mechanisms) share a continuous Chemkin numbering, matching the + global counter in the Chemkin writer. For MultiArrhenius/MultiPDepArrhenius + reactions, which expand into several YAML entries, each sub-entry gets + its own Chemkin number but shares the parent RMG index. """ entries = [] for rmg_rxn in rxn_list: - rxn_entries = reaction_to_dicts(rmg_rxn, spcs, verbose=verbose) + rxn_entries = reaction_to_dicts(rmg_rxn, spcs) for entry in rxn_entries: chemkin_counter[0] += 1 - if verbose: - index_line = ( - f"Reaction index: Chemkin #{chemkin_counter[0]}; " - f"RMG #{rmg_rxn.index}" - ) - existing = entry.get("note", "") - entry["note"] = index_line + "\n" + existing if existing else index_line + "\n" + index_line = ( + f"Reaction index: Chemkin #{chemkin_counter[0]}; " + f"RMG #{rmg_rxn.index}" + ) + existing = entry.get("note", "") + entry["note"] = index_line + "\n" + existing if existing else index_line + "\n" entries.extend(rxn_entries) return entries -def get_mech_dict_surface(spcs, rxns, solvent="solvent", solvent_data=None, verbose=False): +def get_mech_dict_surface(spcs, rxns, solvent="solvent", solvent_data=None): """ For systems with surface species/reactions. Adds 'species', 'gas-reactions', and 'site0-reactions' to result_dict. @@ -353,17 +351,17 @@ def get_mech_dict_surface(spcs, rxns, solvent="solvent", solvent_data=None, verb names[i] += "-" + str(names.count(name)) result_dict = dict() - result_dict["species"] = [species_to_dict(x, all_species=spcs, verbose=verbose) for x in spcs] + result_dict["species"] = [species_to_dict(x, all_species=spcs) for x in spcs] # separate gas and surface reactions chemkin_counter = [0] - result_dict["gas-reactions"] = _collect_reactions(gas_rxns, spcs, verbose, chemkin_counter) - result_dict["site0-reactions"] = _collect_reactions(surface_rxns, spcs, verbose, chemkin_counter) + result_dict["gas-reactions"] = _collect_reactions(gas_rxns, spcs, chemkin_counter) + result_dict["site0-reactions"] = _collect_reactions(surface_rxns, spcs, chemkin_counter) return result_dict -def get_mech_dict_nonsurface(spcs, rxns, solvent="solvent", solvent_data=None, verbose=False): +def get_mech_dict_nonsurface(spcs, rxns, solvent="solvent", solvent_data=None): """ For gas-phase systems. Adds 'species' and 'reactions' to result_dict. @@ -374,10 +372,10 @@ def get_mech_dict_nonsurface(spcs, rxns, solvent="solvent", solvent_data=None, v names[i] += "-" + str(names.count(name)) result_dict = dict() - result_dict["species"] = [species_to_dict(x, verbose=verbose) for x in spcs] + result_dict["species"] = [species_to_dict(x) for x in spcs] chemkin_counter = [0] - result_dict["reactions"] = _collect_reactions(rxns, spcs, verbose, chemkin_counter) + result_dict["reactions"] = _collect_reactions(rxns, spcs, chemkin_counter) return result_dict @@ -409,12 +407,12 @@ def _build_equation_string(obj): return reactants + suffix + arrow + products + suffix -def reaction_to_dicts(obj, spcs, verbose=False): +def reaction_to_dicts(obj, spcs): """ Takes an RMG reaction object (obj), returns a list of dictionaries for YAML properties. For most reaction objects the list will be of length 1, but a MultiArrhenius or MultiPDepArrhenius will be longer. - If verbose=True, a 'note' field is added with source and kinetics comment. + A 'note' field is always added with source and kinetics comment. """ reaction_list = [] @@ -465,34 +463,33 @@ def reaction_to_dicts(obj, spcs, verbose=False): # Convert any AnyMap objects to regular dicts before appending reaction_data = _convert_anymap_to_dict(reaction_data) - if verbose: - note_lines = [] - if isinstance(obj, TemplateReaction): - note_lines.append(f"Template reaction: {obj.family}") - elif isinstance(obj, LibraryReaction): - note_lines.append(f"Library reaction: {obj.library}") - elif isinstance(obj, PDepReaction): - note_lines.append(f"PDep reaction: {obj.network}") - if obj.specific_collider is not None: - note_lines.append(f"Specific third body collider: {obj.specific_collider.label}") - if getattr(obj, "pairs", None): - pair_str = "Flux pairs: " + "; ".join( - f"{get_species_identifier(p[0])}, {get_species_identifier(p[1])}" - for p in obj.pairs - ) - note_lines.append(pair_str) - if obj.kinetics.comment: - for line in obj.kinetics.comment.strip("\n").split("\n"): - note_lines.append(line.rstrip()) - if note_lines: - reaction_data["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" + note_lines = [] + if isinstance(obj, TemplateReaction): + note_lines.append(f"Template reaction: {obj.family}") + elif isinstance(obj, LibraryReaction): + note_lines.append(f"Library reaction: {obj.library}") + elif isinstance(obj, PDepReaction): + note_lines.append(f"PDep reaction: {obj.network}") + if obj.specific_collider is not None: + note_lines.append(f"Specific third body collider: {obj.specific_collider.label}") + if getattr(obj, "pairs", None): + pair_str = "Flux pairs: " + "; ".join( + f"{get_species_identifier(p[0])}, {get_species_identifier(p[1])}" + for p in obj.pairs + ) + note_lines.append(pair_str) + if obj.kinetics.comment: + for line in obj.kinetics.comment.strip("\n").split("\n"): + note_lines.append(line.rstrip()) + if note_lines: + reaction_data["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" reaction_list.append(reaction_data) return reaction_list -def species_to_dict(species, all_species=None, verbose=False): +def species_to_dict(species, all_species=None): """ Takes an RMG species object, returns a dictionary of YAML properties. Also adds in the number of surface sites ('sites') to the dictionary. @@ -500,7 +497,7 @@ def species_to_dict(species, all_species=None, verbose=False): all_species: if provided, coverage-dependent thermo is resolved and attached to the Cantera species object before serialisation, so it appears in the returned dict automatically. - If verbose=True, species SMILES and thermo/transport comments are included. + Species SMILES and thermo/transport comments are always included. """ if not isinstance(species, Species): raise TypeError("species object must be an RMG Species") @@ -508,13 +505,12 @@ def species_to_dict(species, all_species=None, verbose=False): cantera_species = species.to_cantera(use_chemkin_identifier=True, all_species=all_species) species_data = cantera_species.input_data - if verbose: - try: - transport_comment = species.transport_data.comment - if transport_comment: - species_data["transport"]["note"] = transport_comment - except AttributeError: - pass + try: + transport_comment = species.transport_data.comment + if transport_comment: + species_data["transport"]["note"] = transport_comment + except AttributeError: + pass if "size" in species_data: sites = species_data["size"] @@ -524,18 +520,17 @@ def species_to_dict(species, all_species=None, verbose=False): # Convert any AnyMap objects to regular dicts before returning species_data = _convert_anymap_to_dict(species_data) - if verbose: - try: - smiles = species.to_smiles() - if smiles: - species_data["note"] = smiles - except Exception: - pass - if species.thermo and species.thermo.comment: - clean_comment = species.thermo.comment.replace('\n', '; ').strip() - if clean_comment: - if "thermo" in species_data and isinstance(species_data["thermo"], dict): - species_data["thermo"]["note"] = clean_comment + try: + smiles = species.to_smiles() + if smiles: + species_data["note"] = smiles + except Exception: + pass + if species.thermo and species.thermo.comment: + clean_comment = species.thermo.comment.replace('\n', '; ').strip() + if clean_comment: + if "thermo" in species_data and isinstance(species_data["thermo"], dict): + species_data["thermo"]["note"] = clean_comment # returns composition, name, thermo, and transport, and note return species_data @@ -575,13 +570,12 @@ def update(self, rmg): if self.config is not None and not self.config.should_write( rmg.reaction_model.iteration_num, rmg.is_final_save): return - verbose = self.config.verbose_comments if (self.config and self.config.verbose_comments is not None) else rmg.verbose_comments save_edge = self.config.save_edge if (self.config and self.config.save_edge is not None) else rmg.save_edge_species num_species = len(rmg.reaction_model.core.species) this_output_path = os.path.join(self.output_subdirectory, - f"chem{num_species:04d}.yaml") - latest_output_path = os.path.join(self.output_subdirectory, 'chem.yaml') + f"chem_annotated{num_species:04d}.yaml") + latest_output_path = os.path.join(self.output_subdirectory, 'chem_annotated.yaml') logging.info(f"Saving current model core to Cantera file: {this_output_path}") @@ -606,20 +600,6 @@ def update(self, rmg): ) shutil.copy2(this_output_path, latest_output_path) - if verbose: - annotated_path = os.path.join(self.output_subdirectory, 'chem_annotated.yaml') - logging.info(f"Saving annotated Cantera file: {annotated_path}") - write_cantera( - rmg.reaction_model.core.species, - rmg.reaction_model.core.reactions, - elements_in_use=core_elements, - surface_site_density=surface_site_density, - solvent=rmg.solvent, - solvent_data=solvent_data, - path=annotated_path, - verbose=True, - ) - if save_edge: from rmgpy.rmg.model import ReactionModel logging.info('Saving current model core and edge to Cantera file...') @@ -628,8 +608,8 @@ def update(self, rmg): edge_elements = ReactionModel(species=edge_species, reactions=edge_reactions).get_elements() this_edge_path = os.path.join(self.output_subdirectory, - f"chem_edge{num_species:04d}.yaml") - latest_edge_path = os.path.join(self.output_subdirectory, 'chem_edge.yaml') + f"chem_edge_annotated{num_species:04d}.yaml") + latest_edge_path = os.path.join(self.output_subdirectory, 'chem_edge_annotated.yaml') write_cantera( edge_species, @@ -641,18 +621,3 @@ def update(self, rmg): path=this_edge_path, ) shutil.copy2(this_edge_path, latest_edge_path) - - if verbose: - annotated_edge_path = os.path.join(self.output_subdirectory, - 'chem_edge_annotated.yaml') - logging.info(f"Saving annotated edge Cantera file: {annotated_edge_path}") - write_cantera( - edge_species, - edge_reactions, - elements_in_use=edge_elements, - surface_site_density=surface_site_density, - solvent=rmg.solvent, - solvent_data=solvent_data, - path=annotated_edge_path, - verbose=True, - ) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index a0ad2a9d3f..af8655714f 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -114,12 +114,14 @@ def save_cantera_files(rmg, config=None): """ Save the current reaction model to a set of Cantera YAML files. - Creates: - 1. chem{N}.yaml (where N is num species) - 2. chem.yaml (latest copy) - 3. chem_annotated.yaml (if verbose_comments is True) + Each iteration writes: + 1. chem_annotated{N}.yaml (snapshot for this iteration, where N = num core species) + 2. chem_annotated.yaml (latest copy) + 3. chem_edge_annotated{N}.yaml / chem_edge_annotated.yaml if saveEdge is set + + The notes-stripped variants (chem.yaml / chem_edge.yaml) are produced + once at end-of-run by rmgpy/rmg/main.py. """ - verbose = config.verbose_comments if (config and config.verbose_comments is not None) else rmg.verbose_comments save_edge = config.save_edge if (config and config.save_edge is not None) else rmg.save_edge_species # Ensure subdirectory exists @@ -139,27 +141,18 @@ def save_cantera_files(rmg, config=None): # Define paths this_cantera_path = os.path.join(cantera_dir, - 'chem{0:04d}.yaml'.format(num_species)) - latest_cantera_path = os.path.join(cantera_dir, 'chem.yaml') + 'chem_annotated{0:04d}.yaml'.format(num_species)) + latest_cantera_path = os.path.join(cantera_dir, 'chem_annotated.yaml') logging.info(f"Saving current model core to Cantera file: {this_cantera_path}") - # Write the YAML file (non-verbose) - save_cantera_model(rmg.reaction_model.core, this_cantera_path, site_density=site_density, - verbose=False) + save_cantera_model(rmg.reaction_model.core, this_cantera_path, site_density=site_density) - # Copy to 'chem.yaml' (The latest file) + # Copy to 'chem_annotated.yaml' (the latest file) if os.path.exists(latest_cantera_path): os.unlink(latest_cantera_path) shutil.copy2(this_cantera_path, latest_cantera_path) - # Write annotated file if verbose_comments is requested - if verbose: - annotated_path = os.path.join(cantera_dir, 'chem_annotated.yaml') - logging.info(f"Saving annotated Cantera file: {annotated_path}") - save_cantera_model(rmg.reaction_model.core, annotated_path, site_density=site_density, - verbose=True) - # ------------------------------------------------------------------------- # 2. Save Edge Model (Optional, matching ChemkinWriter logic) # ------------------------------------------------------------------------- @@ -168,34 +161,28 @@ def save_cantera_files(rmg, config=None): logging.info('Saving current model core and edge to Cantera file...') this_edge_path = os.path.join(cantera_dir, - 'chem_edge{0:04d}.yaml'.format(num_species)) - latest_edge_path = os.path.join(cantera_dir, 'chem_edge.yaml') + 'chem_edge_annotated{0:04d}.yaml'.format(num_species)) + latest_edge_path = os.path.join(cantera_dir, 'chem_edge_annotated.yaml') edge_model = ReactionModel( species=rmg.reaction_model.core.species + rmg.reaction_model.edge.species, reactions=rmg.reaction_model.core.reactions + rmg.reaction_model.edge.reactions, ) - save_cantera_model(edge_model, this_edge_path, site_density=site_density, verbose=False) + save_cantera_model(edge_model, this_edge_path, site_density=site_density) if os.path.exists(latest_edge_path): os.unlink(latest_edge_path) shutil.copy2(this_edge_path, latest_edge_path) - if verbose: - annotated_edge_path = os.path.join(cantera_dir, 'chem_edge_annotated.yaml') - logging.info(f"Saving annotated edge Cantera file: {annotated_edge_path}") - save_cantera_model(edge_model, annotated_edge_path, site_density=site_density, - verbose=True) - -def save_cantera_model(model_container, path, site_density=None, verbose=False): +def save_cantera_model(model_container, path, site_density=None): """ Internal helper to generate the dictionary and write the YAML file. model_container must be a :class:`rmgpy.rmg.model.ReactionModel` (or duck-typed equivalent with .species, .reactions, and .get_elements()). - If verbose=True, species/reaction notes (SMILES, source, kinetics - comments) are included in the output. + Species/reaction notes (SMILES, source, kinetics comments) are always + included in the output. """ species_list = model_container.species reaction_list = model_container.reactions @@ -211,7 +198,7 @@ def save_cantera_model(model_container, path, site_density=None, verbose=False): yaml_data = generate_cantera_data(species_list, reaction_list, elements_in_use=elements_in_use, is_plasma=is_plasma, - site_density=site_density, verbose=verbose) + site_density=site_density) # Write with open(path, 'w') as f: @@ -248,11 +235,10 @@ def generate_cantera_data(species_list, elements_in_use=None, is_plasma=False, site_density=None, - verbose=False, ): """ Converts RMG objects into a dictionary structure compatible with Cantera YAML. - If verbose=True, species/reaction notes are included (SMILES, source, kinetics comments). + Species/reaction notes (SMILES, source, kinetics comments) are always included. elements_in_use is a set of :class:`Element` singletons (typically from :meth:`rmgpy.rmg.model.ReactionModel.get_elements`) used to size the @@ -362,17 +348,17 @@ def generate_cantera_data(species_list, species_data = list() for sp in species_list: - species_data.append(species_to_dict(sp, species_list, verbose=verbose)) + species_data.append(species_to_dict(sp, species_list)) data['species'] = species_data # Build separate reaction lists for each phase if there are two phases. # chemkin_counter is a single-element list used as a mutable counter so - # the Chemkin reaction numbering in verbose notes continues unbroken + # the Chemkin reaction numbering in the reaction notes continues unbroken # across the gas and surface reaction blocks, matching the global # counter in the Chemkin writer. chemkin_counter = [0] gas_reaction_data = _collect_reaction_entries(gas_reactions, species_list, - verbose, chemkin_counter) + chemkin_counter) if surface_species: data['gas-reactions'] = gas_reaction_data @@ -381,48 +367,46 @@ def generate_cantera_data(species_list, if surface_reactions: data['surface-reactions'] = _collect_reaction_entries( - surface_reactions, species_list, verbose, chemkin_counter) + surface_reactions, species_list, chemkin_counter) return data -def _collect_reaction_entries(rxns, species_list, verbose, chemkin_counter): +def _collect_reaction_entries(rxns, species_list, chemkin_counter): """ Convert RMG reactions to YAML reaction dicts, prepending a 'Reaction - index: Chemkin #N; RMG #M' line to each note (in verbose mode). For + index: Chemkin #N; RMG #M' line to each note. For MultiArrhenius/MultiPDepArrhenius reactions, which expand into several YAML entries, each sub-entry gets its own Chemkin number but shares the parent RMG index. """ entries = [] for rxn in rxns: - rxn_entries = reaction_to_dict_list(rxn, species_list, verbose=verbose) + rxn_entries = reaction_to_dict_list(rxn, species_list) for entry in rxn_entries: chemkin_counter[0] += 1 - if verbose: - index_line = ( - f"Reaction index: Chemkin #{chemkin_counter[0]}; " - f"RMG #{rxn.index}" - ) - existing = entry.get("note", "") - entry["note"] = ( - index_line + "\n" + existing if existing else index_line + "\n" - ) + index_line = ( + f"Reaction index: Chemkin #{chemkin_counter[0]}; " + f"RMG #{rxn.index}" + ) + existing = entry.get("note", "") + entry["note"] = ( + index_line + "\n" + existing if existing else index_line + "\n" + ) entries.extend(rxn_entries) return entries -def species_to_dict(species, species_list, verbose=False): +def species_to_dict(species, species_list): """Convert an RMG Species object to a Cantera YAML dictionary. - If verbose=True, species notes (SMILES, thermo/transport comments) are included. + Species notes (SMILES, thermo/transport comments) are always included. """ notes = list() - if verbose: - try: - notes.append(species.to_smiles()) - except: - pass + try: + notes.append(species.to_smiles()) + except: + pass # Composition mol = species.molecule[0] @@ -485,11 +469,11 @@ def species_to_dict(species, species_list, verbose=False): transport_dict['polarizability'] = td.polarizability.value_si * 1e30 # Angstrom^3 if getattr(td, 'rotrelaxcollnum', None) and td.rotrelaxcollnum != 0.0: transport_dict['rotational-relaxation'] = td.rotrelaxcollnum - if verbose and td.comment: + if td.comment: transport_dict['note'] = td.comment.strip() species_entry['transport'] = transport_dict - if verbose and species.thermo and species.thermo.comment: + if species.thermo and species.thermo.comment: clean_comment = species.thermo.comment.replace('\n', '; ').strip() species_entry['thermo']['note'] = clean_comment @@ -520,10 +504,10 @@ def species_to_dict(species, species_list, verbose=False): return species_entry -def reaction_to_dict_list(reaction, species_list=None, verbose=False): +def reaction_to_dict_list(reaction, species_list=None): """ Convert an RMG Reaction object to a LIST of Cantera YAML dictionaries. - If verbose=True, a 'note' field is added with source and kinetics comment. + A 'note' field is always added with source and kinetics comment. """ # Check for MultiKinetics (duplicates grouped in one RMG object) if isinstance(reaction.kinetics, (MultiArrhenius, MultiPDepArrhenius)): @@ -538,7 +522,7 @@ def reaction_to_dict_list(reaction, species_list=None, verbose=False): kinetics=sub_kin, duplicate=True ) - sub_result = reaction_to_dict_list(sub_rxn, species_list, verbose=verbose) + sub_result = reaction_to_dict_list(sub_rxn, species_list) if sub_result: entries.extend(sub_result) return entries @@ -657,34 +641,33 @@ def reaction_to_dict_list(reaction, species_list=None, verbose=False): if cov_deps: entry['coverage-dependencies'] = cov_deps - # --- Metadata / Notes (only when verbose) --- - if verbose: - note_lines = list() - if isinstance(reaction, TemplateReaction): - note_lines.append(f"Template reaction: {reaction.family}") - elif isinstance(reaction, LibraryReaction): - note_lines.append(f"Library reaction: {reaction.library}") - elif isinstance(reaction, PDepReaction): - note_lines.append(f"PDep reaction: {reaction.network}") - - if reaction.specific_collider: - note_lines.append( - f"Specific third body collider: {reaction.specific_collider.label}" - ) + # --- Metadata / Notes --- + note_lines = list() + if isinstance(reaction, TemplateReaction): + note_lines.append(f"Template reaction: {reaction.family}") + elif isinstance(reaction, LibraryReaction): + note_lines.append(f"Library reaction: {reaction.library}") + elif isinstance(reaction, PDepReaction): + note_lines.append(f"PDep reaction: {reaction.network}") + + if reaction.specific_collider: + note_lines.append( + f"Specific third body collider: {reaction.specific_collider.label}" + ) - if getattr(reaction, "pairs", None): - pair_str = "Flux pairs: " + "; ".join( - f"{get_label(p[0], species_list)}, {get_label(p[1], species_list)}" - for p in reaction.pairs - ) - note_lines.append(pair_str) + if getattr(reaction, "pairs", None): + pair_str = "Flux pairs: " + "; ".join( + f"{get_label(p[0], species_list)}, {get_label(p[1], species_list)}" + for p in reaction.pairs + ) + note_lines.append(pair_str) - if hasattr(kin, "comment") and kin.comment: - for line in kin.comment.strip("\n").split("\n"): - note_lines.append(line.rstrip()) + if hasattr(kin, "comment") and kin.comment: + for line in kin.comment.strip("\n").split("\n"): + note_lines.append(line.rstrip()) - if note_lines: - entry["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" + if note_lines: + entry["note"] = "\n".join(line.rstrip() for line in note_lines) + "\n" return [entry] diff --git a/test/rmgpy/rmg/inputTest.py b/test/rmgpy/rmg/inputTest.py index b0fe108b67..1daf399cb2 100644 --- a/test/rmgpy/rmg/inputTest.py +++ b/test/rmgpy/rmg/inputTest.py @@ -554,7 +554,6 @@ def test_parse_true_enables_default_interval(self): cfg = _parse_writer_config(True) assert cfg.enabled assert cfg.save_interval == 1 - assert cfg.verbose_comments is None assert cfg.save_edge is None def test_parse_true_custom_default_interval(self): @@ -562,16 +561,14 @@ def test_parse_true_custom_default_interval(self): assert cfg.save_interval == 5 def test_parse_dict_full(self): - cfg = _parse_writer_config({'saveInterval': -1, 'verboseComments': True, 'saveEdge': False}) + cfg = _parse_writer_config({'saveInterval': -1, 'saveEdge': False}) assert cfg.enabled assert cfg.save_interval == -1 - assert cfg.verbose_comments is True assert cfg.save_edge is False def test_parse_dict_partial(self): cfg = _parse_writer_config({'saveInterval': 3}) assert cfg.save_interval == 3 - assert cfg.verbose_comments is None assert cfg.save_edge is None def test_parse_invalid_raises(self): @@ -624,10 +621,9 @@ def test_writer_config_to_input_true(self): assert _writer_config_to_input(cfg) is True def test_writer_config_to_input_dict(self): - cfg = WriterConfig(save_interval=-1, verbose_comments=True, save_edge=False) + cfg = WriterConfig(save_interval=-1, save_edge=False) result = _writer_config_to_input(cfg) assert "'saveInterval': -1" in result - assert "'verboseComments': True" in result assert "'saveEdge': False" in result def test_writer_config_to_input_none(self): diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 467e5a008b..5fc484a92f 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -471,13 +471,11 @@ def test_species_to_dict_gas_no_sites_field(self): d = species_to_dict(self.h2) assert 'sites' not in d - def test_species_to_dict_transport_note_gated_by_verbose(self): - """Transport 'note' is only written when verbose=True.""" + def test_species_to_dict_transport_note_always_present(self): + """Transport 'note' is always written when transport_data.comment is set.""" self.h2.transport_data.comment = "from GRI-Mech" - d = species_to_dict(self.h2, verbose=False) - assert 'note' not in d.get('transport', {}) - d_verbose = species_to_dict(self.h2, verbose=True) - assert d_verbose['transport']['note'] == "from GRI-Mech" + d = species_to_dict(self.h2) + assert d['transport']['note'] == "from GRI-Mech" class TestCanteraWriter1: diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index 82e5b8fc5d..6acd0a01c2 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -252,8 +252,8 @@ def __init__(self, out_dir): mock_rmg = MockRMG(self.tmp_dir) save_cantera_files(mock_rmg) - yaml_file = os.path.join(self.tmp_dir, "cantera2", "chem.yaml") - versioned_file = os.path.join(self.tmp_dir, "cantera2", "chem0005.yaml") + yaml_file = os.path.join(self.tmp_dir, "cantera2", "chem_annotated.yaml") + versioned_file = os.path.join(self.tmp_dir, "cantera2", "chem_annotated0005.yaml") assert os.path.exists(yaml_file) assert os.path.exists(versioned_file) @@ -361,8 +361,8 @@ def test_cantera_writer_class_listener(self): mock_rmg = self._create_dummy_model() writer.update(mock_rmg) - versioned_file = os.path.join(cantera_dir, 'chem0002.yaml') - latest_file = os.path.join(cantera_dir, 'chem.yaml') + versioned_file = os.path.join(cantera_dir, 'chem_annotated0002.yaml') + latest_file = os.path.join(cantera_dir, 'chem_annotated.yaml') assert os.path.exists(versioned_file) assert os.path.exists(latest_file) @@ -669,14 +669,12 @@ def test_species_to_dict_gas_no_sites_field(self): d = species_to_dict(h2, [h2]) assert 'sites' not in d - def test_species_to_dict_transport_note_gated_by_verbose(self): - """Transport 'note' is only written when verbose=True.""" + def test_species_to_dict_transport_note_always_present(self): + """Transport 'note' is always written when transport_data.comment is set.""" sp = self._create_dummy_species("H2", "[H][H]", index=1) sp.transport_data.comment = "from GRI-Mech" - d = species_to_dict(sp, [sp], verbose=False) - assert 'note' not in d['transport'] - d_verbose = species_to_dict(sp, [sp], verbose=True) - assert d_verbose['transport']['note'] == "from GRI-Mech" + d = species_to_dict(sp, [sp]) + assert d['transport']['note'] == "from GRI-Mech" class CanteraYamlFileComparer: From 184df12f635cdf757338e74698c575374a2df642 Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 22:16:14 -0400 Subject: [PATCH 28/55] Remove efficiencies dict from yaml if it's empty --- rmgpy/yaml_cantera2.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index af8655714f..2f5c9c9845 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -625,6 +625,10 @@ def reaction_to_dict_list(reaction, species_list=None): else: logging.warning(f"Skipping reaction {equation}: Unknown kinetics type {type(kin)}") return [] + + # Remove efficiencies dict if present but empty. + if 'efficiencies' in entry and not entry['efficiencies']: + del entry['efficiencies'] # --- Coverage Dependencies --- if hasattr(kin, 'coverage_dependence') and kin.coverage_dependence: From 96ef35d244fff1fc7bea01d5fe07adc669a18407 Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 22:17:28 -0400 Subject: [PATCH 29/55] Harden wrapped-flow note stripping in YAML cleanup MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Replace the wrapped-flow note removal regex in _strip_yaml_notes with a deterministic line-scanning helper to avoid backtracking-heavy matching behavior. Motivation: The previous pattern for wrapped flow mappings could trigger pathological regex runtime in Python’s backtracking engine. Even though these YAML files are generated by our own pipeline (so practical exploitability is low), removing algorithmic worst-case behavior improves robustness and prevents unexpected slowdowns from unusual generated content. What changed: Added _strip_wrapped_flow_notes(value), a single-pass parser that recognizes: a line ending with a trailing comma, followed by an indented note: line, followed by indented continuation lines up to a closing brace. Rewrites that wrapped tail to a single closing brace in the same way as the prior regex replacement. Replaced only the wrapped-flow regex call with the helper. Kept existing single-line flow and block-style note stripping logic unchanged. Why this is safe: Output semantics for intended wrapped-flow cases are preserved. The change is narrowly scoped to one transformation path. Runtime is linear in input size for this case, eliminating regex backtracking concerns while retaining formatting-preserving behavior. co-authored by: GPT-5.3-Codex should address concerns of the automated static analysis code scanning https://github.com/ReactionMechanismGenerator/RMG-Py/security/code-scanning/1097 --- rmgpy/rmg/main.py | 50 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index 9ea325bf5e..b7072d91b2 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -1384,13 +1384,57 @@ def _strip_yaml_notes(src, dst): return with open(src) as f: text = f.read() + + def _strip_wrapped_flow_notes(value): + """Remove wrapped flow ``note:`` tails without regex backtracking. + + Matches this shape in a single pass: + ``...,\n note: ...\n ...}`` + and rewrites it as ``...}``. + """ + lines = value.splitlines(keepends=True) + output = [] + i = 0 + + while i < len(lines): + line = lines[i] + stripped = line.rstrip("\r\n") + if not stripped.endswith(",") or i + 1 >= len(lines): + output.append(line) + i += 1 + continue + + next_line = lines[i + 1] + if not re.match(r'[ \t]+note:', next_line): + output.append(line) + i += 1 + continue + + j = i + 1 + found_closing_brace = False + while j < len(lines) and re.match(r'[ \t]+', lines[j]): + if '}' in lines[j]: + found_closing_brace = True + break + j += 1 + + if found_closing_brace: + closing_line = lines[j] + closing_suffix = closing_line[closing_line.find('}') + 1 :] + output.append(stripped[:-1] + '}' + closing_suffix) + i = j + 1 + continue + + output.append(line) + i += 1 + + return ''.join(output) + # Wrapped flow style: a flow mapping that wraps after a # trailing ``,``, with ``note: value`` on the next line # (value may itself wrap across several more-indented lines) # ending in ``}``. Replace the whole tail with ``}``. - text = re.sub( - r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', - '}', text) + text = _strip_wrapped_flow_notes(text) # Single-line flow style: ``, note: value}`` → ``}``. text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) # Block style: `` note: ...\n`` plus deeper-indented From b87052d43189128ad1356a781b01f3014eb151ff Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 22:22:47 -0400 Subject: [PATCH 30/55] Revert "Harden wrapped-flow note stripping in YAML cleanup" This reverts commit d09c8d9df1a4ff336b2516198ce748db0df0b5b4. On review, the regex CodeQL flagged (alert #1097) is not actually exposed to catastrophic backtracking: - [^\n}]* and \n[ \t]+ consume disjoint characters, so alternative match paths don't overlap. - Each iteration of (?:\n[ \t]+[^\n}]*)* consumes at least two characters, capping iterations at N/2. - Worst-case runtime is O(N^2), not exponential, and the inputs are YAML files generated by our own writer pipeline (a few MB at most). The replacement helper traded one line of regex for ~40 lines of imperative, triple-nested code, and introduced subtle behavioral drift (stricter handling of trailing whitespace before the newline, looser handling of '}' inside continuation values). Not worth it for a static-analysis false positive on RMG-generated input. The next commit restores the regex and suppresses the CodeQL alert with a comment explaining why the pattern is safe in this context. Co-Authored-By: Claude Opus 4.7 (1M context) who doesn't like what GPT-5.3-Codex did :-D --- rmgpy/rmg/main.py | 50 +++-------------------------------------------- 1 file changed, 3 insertions(+), 47 deletions(-) diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index b7072d91b2..9ea325bf5e 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -1384,57 +1384,13 @@ def _strip_yaml_notes(src, dst): return with open(src) as f: text = f.read() - - def _strip_wrapped_flow_notes(value): - """Remove wrapped flow ``note:`` tails without regex backtracking. - - Matches this shape in a single pass: - ``...,\n note: ...\n ...}`` - and rewrites it as ``...}``. - """ - lines = value.splitlines(keepends=True) - output = [] - i = 0 - - while i < len(lines): - line = lines[i] - stripped = line.rstrip("\r\n") - if not stripped.endswith(",") or i + 1 >= len(lines): - output.append(line) - i += 1 - continue - - next_line = lines[i + 1] - if not re.match(r'[ \t]+note:', next_line): - output.append(line) - i += 1 - continue - - j = i + 1 - found_closing_brace = False - while j < len(lines) and re.match(r'[ \t]+', lines[j]): - if '}' in lines[j]: - found_closing_brace = True - break - j += 1 - - if found_closing_brace: - closing_line = lines[j] - closing_suffix = closing_line[closing_line.find('}') + 1 :] - output.append(stripped[:-1] + '}' + closing_suffix) - i = j + 1 - continue - - output.append(line) - i += 1 - - return ''.join(output) - # Wrapped flow style: a flow mapping that wraps after a # trailing ``,``, with ``note: value`` on the next line # (value may itself wrap across several more-indented lines) # ending in ``}``. Replace the whole tail with ``}``. - text = _strip_wrapped_flow_notes(text) + text = re.sub( + r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', + '}', text) # Single-line flow style: ``, note: value}`` → ``}``. text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) # Block style: `` note: ...\n`` plus deeper-indented From b93551638ef4f8937406b98b2c64fc487b7cf0db Mon Sep 17 00:00:00 2001 From: Richard West Date: Mon, 18 May 2026 22:29:07 -0400 Subject: [PATCH 31/55] Suppress CodeQL ReDoS alert on wrapped-flow note regex Add an inline lgtm suppression and a comment explaining why the py/polynomial-redos finding (#1097) is safe in this context: the regex's worst case is O(N^2), inputs are RMG-generated YAML, and the prior attempt to rewrite it as a hand-rolled scanner (commit d09c8d9df, reverted in 651e50225) wasn't worth the added complexity. --- rmgpy/rmg/main.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index 9ea325bf5e..d1ba4146ba 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -1388,9 +1388,15 @@ def _strip_yaml_notes(src, dst): # trailing ``,``, with ``note: value`` on the next line # (value may itself wrap across several more-indented lines) # ending in ``}``. Replace the whole tail with ``}``. + # CodeQL flags this as polynomial ReDoS (py/polynomial-redos); + # safe here because [^\n}]* and \n[ \t]+ consume disjoint + # characters (no alternative-path overlap) and the inner * + # consumes >=2 chars per iteration, so worst-case is O(N^2) + # rather than exponential. Inputs are RMG-generated YAML, + # not adversarial. text = re.sub( r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', - '}', text) + '}', text) # lgtm[py/polynomial-redos] # Single-line flow style: ``, note: value}`` → ``}``. text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) # Block style: `` note: ...\n`` plus deeper-indented From 6d78620b2da57be6d0ecb01205b5cc5beefa79d0 Mon Sep 17 00:00:00 2001 From: Richard West Date: Tue, 19 May 2026 22:53:54 -0400 Subject: [PATCH 32/55] Small things from code review, in yaml_cantera writers cantera1 Avoid misleading name is_third_body cantera1 Avoid hard-coded whitelist of elements (which was missing some) cantera2 Cope if elements_in_use is not provided by caller. cantera2 Cope if there are surface species but no surface reactions cantera2 Avoid hard-coded whitelist of elements (which was missing some) --- rmgpy/yaml_cantera1.py | 11 +++++------ rmgpy/yaml_cantera2.py | 16 ++++++++++------ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 129bc3125e..7ad140c66a 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -189,10 +189,9 @@ def get_elements_block(elements_in_use): in the set are emitted; isotopes (D, T, CI, OI) and the surface site X are written to the elements block only when actually used. """ - from rmgpy.molecule.element import H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, C13, O18, X - builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), - (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] - elements_list = [symbol for element, symbol in builtin_elements if element in elements_in_use] + from rmgpy.molecule.element import D, T, C13, O18, X + custom_singletons = {D, T, C13, O18, X} + elements_list = sorted(element.symbol for element in elements_in_use if element not in custom_singletons) custom_elements = [] for isotope in (D, T, C13, O18): if isotope in elements_in_use: @@ -423,7 +422,6 @@ def reaction_to_dicts(obj, spcs): else: list_of_cantera_reactions = [obj.to_cantera(use_chemkin_identifier=True)] - is_third_body = isinstance(obj.kinetics, PDepKineticsModel) rmg_equation = _build_equation_string(obj) @@ -446,6 +444,7 @@ def reaction_to_dicts(obj, spcs): reaction_data = new_data efficiencies = getattr(obj.kinetics, "efficiencies", {}) if efficiencies: + # RMG oject has efficiencies, so add them to Cantera. reaction_data["efficiencies"] = { spcs[i].to_chemkin(): float(val) for i, val in enumerate( @@ -453,7 +452,7 @@ def reaction_to_dicts(obj, spcs): ) if val != 1 } - elif not is_third_body: + elif not isinstance(obj.kinetics, PDepKineticsModel): # Cantera's API (v. 3.2) misidentifies a species that appears on both sides # of a reaction (e.g. vacantX) as a third-body collider # when there are three or more species on one side, producing a diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 2f5c9c9845..2eb7acd80e 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -215,11 +215,10 @@ def get_elements_lists(elements_in_use): the set. The plasma pseudo-element 'E' is added separately by the caller when ``is_plasma`` is true. """ - from rmgpy.molecule.element import H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, C13, O18, X - builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), - (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] - elements_list = [symbol for element, symbol in builtin_elements if element in elements_in_use] + from rmgpy.molecule.element import D, T, C13, O18, X + custom_singletons = {D, T, C13, O18, X} custom_elements = [] + elements_list = sorted(element.symbol for element in elements_in_use if element not in custom_singletons) for isotope in (D, T, C13, O18): if isotope in elements_in_use: mass = 1000 * isotope.mass @@ -245,8 +244,7 @@ def generate_cantera_data(species_list, 'elements' block and the per-phase elements lists. Defaults to an empty set if None. """ - if elements_in_use is None: - elements_in_use = set() + # --- 1. Header & Units --- # We output everything in SI units. try: @@ -287,6 +285,11 @@ def generate_cantera_data(species_list, gas_reactions.append(rxn) # --- 3. Phase Definitions --- + if elements_in_use is None: + # more efficient to calculate it earlier, but do so here if not provided + from rmgpy.rmg.model import ReactionModel + elements_in_use = ReactionModel(species=species_list).get_elements() + custom_elements, all_elements = get_elements_lists(elements_in_use) if custom_elements: @@ -362,6 +365,7 @@ def generate_cantera_data(species_list, if surface_species: data['gas-reactions'] = gas_reaction_data + data['surface-reactions'] = [] else: data['reactions'] = gas_reaction_data From 4c24ccec04a1706190cbd55c7258c6941dfaf5e4 Mon Sep 17 00:00:00 2001 From: Richard West Date: Tue, 19 May 2026 23:19:44 -0400 Subject: [PATCH 33/55] New tests for Chemkin writing with dynamic ELEMENTS block. --- test/rmgpy/chemkinTest.py | 74 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) diff --git a/test/rmgpy/chemkinTest.py b/test/rmgpy/chemkinTest.py index 138943899b..105e94d5b5 100644 --- a/test/rmgpy/chemkinTest.py +++ b/test/rmgpy/chemkinTest.py @@ -46,6 +46,7 @@ save_chemkin_surface_file, save_species_dictionary, save_transport_file, + write_elements_section, write_kinetics_entry, write_thermo_entry, ) @@ -63,6 +64,14 @@ import pytest +def get_elements_section_lines(chemkin_text): + """Return the ELEMENTS block from a Chemkin file as stripped lines.""" + lines = chemkin_text.splitlines() + start = lines.index("ELEMENTS") + end = lines.index("END", start) + return lines[start : end + 1] + + class ChemkinTest: @mock.patch("rmgpy.chemkin.logging") def test_read_thermo_entry_bad_element_count(self, mock_logging): @@ -724,6 +733,41 @@ def test_write_kinetics_entry_with_coverage_dependence(self): assert "OX" in cov_line assert "-17.500" in cov_line + def test_write_elements_section_omits_unused_isotopes_and_surface_site(self): + """Only elements in use should be written to the ELEMENTS section.""" + from rmgpy.molecule.element import C, H, O + + stream = io.StringIO() + write_elements_section(stream, {C, H, O}) + + assert stream.getvalue().splitlines() == [ + "ELEMENTS", + "\tH", + "\tC", + "\tO", + "END", + "", + ] + + def test_write_elements_section_includes_used_isotopes_and_surface_site(self): + """Isotopes and X should be written when they are explicitly in use.""" + from rmgpy.molecule.element import C13, D, H, O18, T, X + + stream = io.StringIO() + write_elements_section(stream, {C13, D, H, O18, T, X}) + + assert stream.getvalue().splitlines() == [ + "ELEMENTS", + "\tH", + "\tD /2.014/", + "\tT /3.016/", + "\tCI /13.003/", + "\tOI /17.999/", + "\tX /195.083/", + "END", + "", + ] + class TestThermoReadWrite: def setup_class(self): @@ -814,6 +858,36 @@ def test_write_thermo_block_for_isotope_uses_chemkin_name(self): assert "D 1" in first_line assert "H 1" in first_line + def test_save_chemkin_file_writes_dynamic_elements_section(self, tmp_path): + """save_chemkin_file should discover isotopes and not add unused X.""" + h2 = Species().from_smiles("[H][H]") + h2.label = "H2" + h2.index = 1 + h2.thermo = self.nasa + + d = Species().from_adjacency_list("1 H u1 p0 c0 i2") + d.label = "D" + d.index = 2 + d.thermo = self.nasa + + chemkin_path = tmp_path / "chem.inp" + save_chemkin_file( + chemkin_path, + [h2, d], + [], + verbose=False, + check_for_duplicates=False, + ) + + elements_lines = get_elements_section_lines(chemkin_path.read_text()) + assert elements_lines == [ + "ELEMENTS", + "\tH", + "\tD /2.014/", + "END", + ] + assert all("X" not in line for line in elements_lines) + def test_write_thermo_block_5_elem(self): """Test that we can write a thermo block for a species with 5 elements""" species = Species().from_adjacency_list( From 28991b489de8eeb90c6292f5926cf212e90a20f5 Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 20 May 2026 15:01:06 -0400 Subject: [PATCH 34/55] [yaml_cantera2] handle negative A values in kinetics. --- rmgpy/yaml_cantera2.py | 10 +++++++ test/rmgpy/yaml_cantera2Test.py | 46 ++++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 2eb7acd80e..3bd1a019c5 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -634,6 +634,16 @@ def reaction_to_dict_list(reaction, species_list=None): if 'efficiencies' in entry and not entry['efficiencies']: del entry['efficiencies'] + for rate_key in ( + 'rate-constant', + 'high-P-rate-constant', + 'low-P-rate-constant', + 'sticking-coefficient', + ): + if entry.get(rate_key, {}).get('A', 0) < 0: + entry['negative-A'] = True + break + # --- Coverage Dependencies --- if hasattr(kin, 'coverage_dependence') and kin.coverage_dependence: cov_deps = {} diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index 6acd0a01c2..742405cfa4 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -145,6 +145,17 @@ def test_reaction_to_dict_arrhenius(self): assert np.isclose(data['rate-constant']['b'], 0.5) assert np.isclose(data['rate-constant']['Ea'], 10000.0) + def test_reaction_to_dict_negative_a_arrhenius(self): + """Negative Arrhenius A factors are marked for Cantera.""" + r = self._create_dummy_species("R", "[CH2]O", index=1) + p = self._create_dummy_species("P", "C[O]", index=2) + rxn = Reaction( + reactants=[r], products=[p], + kinetics=Arrhenius(A=(-1e10, "s^-1"), n=0.5, Ea=(10, "kJ/mol"), T0=(1, "K")) + ) + entries = reaction_to_dict_list(rxn, species_list=[r, p]) + assert entries[0]['negative-A'] is True + def test_reaction_to_dict_duplicates(self): """Test that MultiKinetics objects result in multiple YAML entries.""" r = self._create_dummy_species("R", "[H]", index=1) @@ -348,6 +359,21 @@ def test_reaction_to_dict_lindemann(self): assert data['efficiencies'] == {"M": 5.0} assert 'Troe' not in data + def test_reaction_to_dict_negative_a_falloff(self): + """Negative high- or low-pressure A factors are marked for Cantera.""" + r = self._create_dummy_species("R", "[H]", index=1) + M = self._create_dummy_species("M", "[Ar]", index=-1) + k_high = Arrhenius(A=(1e14, "s^-1"), n=0, Ea=(10, "kJ/mol"), T0=(1, "K")) + k_low = Arrhenius(A=(-1e21, "cm^3/(mol*s)"), n=0, Ea=(10, "kJ/mol"), T0=(1, "K")) + lind = Lindemann( + arrheniusHigh=k_high, + arrheniusLow=k_low, + efficiencies={M.molecule[0]: 5.0}, + ) + rxn = Reaction(reactants=[r], products=[r], kinetics=lind) + entries = reaction_to_dict_list(rxn, species_list=[r, M]) + assert entries[0]['negative-A'] is True + def test_cantera_writer_class_listener(self): """ Test the CanteraWriter2 class directly to ensure it correctly initializes @@ -496,6 +522,24 @@ def test_reaction_to_dict_sticking_coefficient(self): assert np.isclose(d["sticking-coefficient"]["A"], 0.1) assert np.isclose(d["sticking-coefficient"]["Ea"], 0.0) + def test_reaction_to_dict_negative_a_sticking_coefficient(self): + """Negative sticking-coefficient A factors are marked for Cantera.""" + h2 = self._create_dummy_species("H2", "[H][H]", index=1) + x = self._create_surface_species("X", "1 X u0 p0", index=2) + hx = self._create_surface_species( + "H_X", "1 H u0 p0 {2,S}\n2 X u0 p0 {1,S}", index=3 + ) + kin = StickingCoefficient( + A=(-0.1, ""), n=0, Ea=(0, "kJ/mol"), T0=(1, "K") + ) + rxn = Reaction( + reactants=[h2, x, x], products=[hx, hx], kinetics=kin + ) + + entries = reaction_to_dict_list(rxn, species_list=[h2, x, hx]) + + assert entries[0]["negative-A"] is True + def test_reaction_to_dict_coverage_dependence(self): """Coverage-dependent kinetics: coverage-dependencies block written correctly. @@ -846,4 +890,4 @@ def find_recent_files(self, request): pytest.skip("from_main_test.yaml files not found. Run mainTest first.") request.cls.yaml_path_1 = chemkin_file - request.cls.yaml_path_2 = cantera_file \ No newline at end of file + request.cls.yaml_path_2 = cantera_file From 69061e0b400e3ac05d2125421bb1cd2992a03496 Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 20 May 2026 16:00:38 -0400 Subject: [PATCH 35/55] [yaml_cantera1] handle negative A factors (also fixes to_cantera) We add handlers to the to_cantera methods to set the allow_negative_pre_exponential_factor property of the Cantera object, which Cantera then correctly passes to the input_data dictionary. We also have a safety-net in the yaml writing stage, but maybe this is unnecessary and slows us a bit. It doesn't seem to get triggered by the unit tests. --- rmgpy/kinetics/arrhenius.pyx | 10 +++++++-- rmgpy/kinetics/falloff.pyx | 15 +++++++++++-- rmgpy/kinetics/surface.pyx | 10 +++++++-- rmgpy/yaml_cantera1.py | 24 ++++++++++++++++++++ test/rmgpy/yaml_cantera1Test.py | 39 +++++++++++++++++++++++++++++++++ 5 files changed, 92 insertions(+), 6 deletions(-) diff --git a/rmgpy/kinetics/arrhenius.pyx b/rmgpy/kinetics/arrhenius.pyx index 69a49bde30..dff4c7133c 100644 --- a/rmgpy/kinetics/arrhenius.pyx +++ b/rmgpy/kinetics/arrhenius.pyx @@ -272,7 +272,10 @@ cdef class Arrhenius(KineticsModel): if arrhenius_class: return ct.Arrhenius(A, b, E) else: - return ct.ArrheniusRate(A, b, E) + rate = ct.ArrheniusRate(A, b, E) + if A < 0: + rate.allow_negative_pre_exponential_factor = True + return rate def set_cantera_kinetics(self, ct_reaction, species_list): """ @@ -784,7 +787,10 @@ cdef class ArrheniusBM(KineticsModel): Ea = self._E0.value_si * 1000 # convert from J/mol to J/kmol w = self._w0.value_si * 1000 # convert from J/mol to J/kmol - return ct.BlowersMaselRate(A, b, Ea, w) + rate = ct.BlowersMaselRate(A, b, Ea, w) + if A < 0: + rate.allow_negative_pre_exponential_factor = True + return rate def set_cantera_kinetics(self, ct_reaction, species_list): """ diff --git a/rmgpy/kinetics/falloff.pyx b/rmgpy/kinetics/falloff.pyx index bc7de3650f..49ba56dae5 100644 --- a/rmgpy/kinetics/falloff.pyx +++ b/rmgpy/kinetics/falloff.pyx @@ -236,7 +236,12 @@ cdef class Lindemann(PDepKineticsModel): high_rate = self.arrheniusHigh.to_cantera_kinetics(arrhenius_class=True) low_rate = self.arrheniusLow.to_cantera_kinetics(arrhenius_class=True) - return ct.LindemannRate(low=low_rate, high=high_rate) + rate = ct.LindemannRate() + if high_rate.pre_exponential_factor < 0 or low_rate.pre_exponential_factor < 0: + rate.allow_negative_pre_exponential_factor = True + rate.high_rate = high_rate + rate.low_rate = low_rate + return rate ################################################################################ @@ -415,4 +420,10 @@ cdef class Troe(PDepKineticsModel): high = self.arrheniusHigh.to_cantera_kinetics(arrhenius_class=True) low = self.arrheniusLow.to_cantera_kinetics(arrhenius_class=True) - return ct.TroeRate(high=high, low=low, falloff_coeffs=falloff) + rate = ct.TroeRate() + if high.pre_exponential_factor < 0 or low.pre_exponential_factor < 0: + rate.allow_negative_pre_exponential_factor = True + rate.high_rate = high + rate.low_rate = low + rate.falloff_coeffs = falloff + return rate diff --git a/rmgpy/kinetics/surface.pyx b/rmgpy/kinetics/surface.pyx index 7787a82e47..100faa5dda 100644 --- a/rmgpy/kinetics/surface.pyx +++ b/rmgpy/kinetics/surface.pyx @@ -299,7 +299,10 @@ cdef class StickingCoefficient(KineticsModel): b = self._n.value_si E = self._Ea.value_si * 1000 # convert from J/mol to J/kmol - return ct.StickingArrheniusRate(A, b, E) + rate = ct.StickingArrheniusRate(A, b, E) + if A < 0: + rate.allow_negative_pre_exponential_factor = True + return rate def set_cantera_kinetics(self, ct_reaction, species_list): @@ -654,7 +657,10 @@ cdef class SurfaceArrhenius(Arrhenius): b = self._n.value_si E = self._Ea.value_si * 1000 # convert from J/mol to J/kmol - return ct.InterfaceArrheniusRate(A, b, E) + rate = ct.InterfaceArrheniusRate(A, b, E) + if A < 0: + rate.allow_negative_pre_exponential_factor = True + return rate def set_cantera_kinetics(self, ct_reaction, species_list): """ diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index 7ad140c66a..d0c18a2026 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -459,6 +459,30 @@ def reaction_to_dicts(obj, spcs): # spurious 'efficiencies' entry in input_data. # see https://github.com/Cantera/cantera/issues/2115 reaction_data.pop("efficiencies", None) + + # This next block is hopefully unnecessary, and probably slows us a little + # so maybe should be removed. For now it is here for safety. + for rate_key in ( + "rate-constant", + "high-P-rate-constant", + "low-P-rate-constant", + "sticking-coefficient", + ): + if reaction_data.get(rate_key, {}).get("A", 0) < 0: + if not reaction_data.get("negative-A", False): + logging.warning( + "%s\n%s", + "Reaction did not have the negative-A flag set to True.", + yaml.dump( + reaction_data, + Dumper=Dumper, + default_flow_style=False, + sort_keys=False, + ).rstrip(), + ) + reaction_data["negative-A"] = True + break + # Convert any AnyMap objects to regular dicts before appending reaction_data = _convert_anymap_to_dict(reaction_data) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 5fc484a92f..0500c1444d 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -43,6 +43,7 @@ from rmgpy.transport import TransportData from rmgpy.kinetics import ( Arrhenius, + Lindemann, PDepArrhenius, Troe, ThirdBody, @@ -164,6 +165,13 @@ def test_reaction_to_dicts_arrhenius_equation_and_rate(self): assert np.isclose(d["rate-constant"]["b"], 0.5) assert np.isclose(d["rate-constant"]["Ea"], 10e6) # 10 kJ/mol → 1e7 J/kmol + def test_reaction_to_dicts_negative_a_arrhenius(self): + """Negative Arrhenius A factors are marked for Cantera.""" + kin = Arrhenius(A=(-1e13, "s^-1"), n=0.5, Ea=(10, "kJ/mol"), T0=(1, "K")) + rxn = Reaction(reactants=[self.h2], products=[self.h, self.h], kinetics=kin) + entries = reaction_to_dicts(rxn, self.all_gas) + assert entries[0]["negative-A"] is True + def test_reaction_to_dicts_thirdbody(self): """ThirdBody: type is three-body, equation uses M, efficiencies map present.""" kin = ThirdBody( @@ -234,6 +242,24 @@ def test_reaction_to_dicts_troe(self): assert "efficiencies" in d assert np.isclose(d["efficiencies"]["Ar(3)"], 2.0) + def test_reaction_to_dicts_negative_a_falloff(self): + """Falloff rates with negative high- and low-pressure A factors are marked for Cantera.""" + kin = Lindemann( + arrheniusHigh=Arrhenius( + A=(-1e14, "s^-1"), n=0, Ea=(10, "kJ/mol"), T0=(1, "K") + ), + arrheniusLow=Arrhenius( + A=(-1e20, "cm^3/(mol*s)"), n=0, Ea=(10, "kJ/mol"), T0=(1, "K") + ), + efficiencies={self.ar.molecule[0]: 2.0}, + ) + rxn = Reaction(reactants=[self.h], products=[self.h], kinetics=kin) + entries = reaction_to_dicts(rxn, self.all_gas) + d = entries[0] + assert d["negative-A"] is True + assert d["low-P-rate-constant"]["A"] < 0 + assert np.isclose(d["efficiencies"]["Ar(3)"], 2.0) + # ------------------------------------------------------------------ # reaction_to_dicts — surface kinetics # ------------------------------------------------------------------ @@ -271,6 +297,19 @@ def test_reaction_to_dicts_sticking_coefficient(self): assert np.isclose(d["sticking-coefficient"]["A"], 0.1) assert np.isclose(d["sticking-coefficient"]["Ea"], 0.0) + def test_reaction_to_dicts_negative_a_sticking_coefficient(self): + """Negative sticking-coefficient A factors are marked for Cantera.""" + kin = StickingCoefficient( + A=(-0.1, ""), n=0, Ea=(0, "kJ/mol"), T0=(1, "K") + ) + rxn = Reaction( + reactants=[self.h2, self.x, self.x], + products=[self.hx, self.hx], + kinetics=kin, + ) + entries = reaction_to_dicts(rxn, self.all_surface) + assert entries[0]["negative-A"] is True + def test_reaction_to_dicts_coverage_dependence(self): """Coverage-dependent kinetics: coverage-dependencies block present with correct units. From b47e2828dfcbad4f7b69197f455611fff243387c Mon Sep 17 00:00:00 2001 From: Richard West Date: Wed, 20 May 2026 17:03:36 -0400 Subject: [PATCH 36/55] chemkin: print all used elements. The previous method was trying to preserve the (somewhat arbitrary) order that we previously used. But was overly complicated and fragile. eg. Phosphorous and Lithium would both have been silently forgotten. Now we just sort alphabetically, but it's simpler and won't forget things. Also, fixed so element.chemkin_name is actually the chemkin-compatible string (which must be 1 or 2 characters) like the docstring says. --- rmgpy/chemkin.pyx | 12 +++++------- test/rmgpy/chemkinTest.py | 2 +- 2 files changed, 6 insertions(+), 8 deletions(-) diff --git a/rmgpy/chemkin.pyx b/rmgpy/chemkin.pyx index deca2e37a7..8c7e235549 100644 --- a/rmgpy/chemkin.pyx +++ b/rmgpy/chemkin.pyx @@ -2386,14 +2386,12 @@ def write_elements_section(f, elements_in_use): ``elements_in_use`` (a set of :class:`Element` singletons) are emitted. Isotopes (D, T, CI, OI) and the surface site X are written only when actually used. """ - from rmgpy.molecule.element import H, C, O, N, Ne, Ar, He, Si, S, F, Cl, Br, I, D, T, C13, O18, X - + from rmgpy.molecule.element import D, T, C13, O18, X s = 'ELEMENTS\n' - builtin_elements = [(H, 'H'), (C, 'C'), (O, 'O'), (N, 'N'), (Ne, 'Ne'), (Ar, 'Ar'), - (He, 'He'), (Si, 'Si'), (S, 'S'), (F, 'F'), (Cl, 'Cl'), (Br, 'Br'), (I, 'I')] - for element, symbol in builtin_elements: - if element in elements_in_use: - s += f'\t{symbol}\n' + custom_singletons = {D, T, C13, O18, X} + elements_list = sorted(e.chemkin_name for e in elements_in_use if e not in custom_singletons) + for element in elements_list: + s += f'\t{element}\n' for isotope in (D, T, C13, O18): if isotope in elements_in_use: mass = 1000 * isotope.mass diff --git a/test/rmgpy/chemkinTest.py b/test/rmgpy/chemkinTest.py index 105e94d5b5..d2fcf77665 100644 --- a/test/rmgpy/chemkinTest.py +++ b/test/rmgpy/chemkinTest.py @@ -742,8 +742,8 @@ def test_write_elements_section_omits_unused_isotopes_and_surface_site(self): assert stream.getvalue().splitlines() == [ "ELEMENTS", - "\tH", "\tC", + "\tH", "\tO", "END", "", From 07c9403a54b9f78b4a31de2cf6401987a5733053 Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 08:46:52 -0400 Subject: [PATCH 37/55] Move YAML note stripping helper to util --- rmgpy/rmg/main.py | 48 +++-------------------------------------------- rmgpy/util.py | 44 +++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 insertions(+), 45 deletions(-) diff --git a/rmgpy/rmg/main.py b/rmgpy/rmg/main.py index d1ba4146ba..3d70b70876 100644 --- a/rmgpy/rmg/main.py +++ b/rmgpy/rmg/main.py @@ -1363,52 +1363,10 @@ def execute(self, initialize=True, **kwargs): if os.path.exists(annotated): self.generate_cantera_files_from_chemkin(annotated) - def _strip_yaml_notes(src, dst): - """Read a YAML file, strip ``note:`` fields, and write the - result to *dst*. Preserves formatting (block style, key - ordering, etc.) — important when the source is the carefully - crafted ck2yaml output. - - Three patterns are handled (notes are always the last key, by - how RMG / ck2yaml emit them): - 1. Block-style: `` note: ...`` on its own line, - possibly followed by deeper-indented continuation lines - (multi-line literal/folded scalars). - 2. Single-line flow: ``{..., note: foo}`` → ``{...}`` - 3. Wrapped flow: a flow mapping that wraps with the - trailing ``,`` at the end of one line and - `` note: foo}`` on the next → drop the comma and - replace with ``}`` on the prior line. - """ - if not os.path.exists(src): - return - with open(src) as f: - text = f.read() - # Wrapped flow style: a flow mapping that wraps after a - # trailing ``,``, with ``note: value`` on the next line - # (value may itself wrap across several more-indented lines) - # ending in ``}``. Replace the whole tail with ``}``. - # CodeQL flags this as polynomial ReDoS (py/polynomial-redos); - # safe here because [^\n}]* and \n[ \t]+ consume disjoint - # characters (no alternative-path overlap) and the inner * - # consumes >=2 chars per iteration, so worst-case is O(N^2) - # rather than exponential. Inputs are RMG-generated YAML, - # not adversarial. - text = re.sub( - r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', - '}', text) # lgtm[py/polynomial-redos] - # Single-line flow style: ``, note: value}`` → ``}``. - text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) - # Block style: `` note: ...\n`` plus deeper-indented - # continuation lines. - text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', text, flags=re.MULTILINE) - with open(dst, "w") as f: - f.write(text) - # Strip transport notes from the ck2yaml file so it matches the # notes-stripped variants below. ck_chem_yaml = os.path.join(self.output_directory, "cantera_from_ck", "chem.yaml") - _strip_yaml_notes(ck_chem_yaml, ck_chem_yaml) + util.strip_yaml_notes(ck_chem_yaml, ck_chem_yaml) # Produce notes-stripped chem.yaml / chem_edge.yaml end-of-run for # each direct Cantera writer (mirrors Chemkin's chem.inp). @@ -1419,11 +1377,11 @@ def _strip_yaml_notes(src, dst): if not (writer_cfg and writer_cfg.enabled): continue writer_path = os.path.join(self.output_directory, writer_dir) - _strip_yaml_notes( + util.strip_yaml_notes( os.path.join(writer_path, "chem_annotated.yaml"), os.path.join(writer_path, "chem.yaml"), ) - _strip_yaml_notes( + util.strip_yaml_notes( os.path.join(writer_path, "chem_edge_annotated.yaml"), os.path.join(writer_path, "chem_edge.yaml"), ) diff --git a/rmgpy/util.py b/rmgpy/util.py index 8be80d5f88..7862b0d6f1 100644 --- a/rmgpy/util.py +++ b/rmgpy/util.py @@ -30,6 +30,7 @@ import argparse import logging import os.path +import re import shutil import time from functools import wraps @@ -125,6 +126,49 @@ def make_output_subdirectory(output_directory, folder): os.mkdir(dirname) +def strip_yaml_notes(src, dst): + """Read a YAML file, strip ``note:`` fields, and write the + result to *dst*. Preserves formatting (block style, key + ordering, etc.) - important when the source is the carefully + crafted ck2yaml output. + + Three patterns are handled (notes are always the last key, by + how RMG / ck2yaml emit them): + 1. Block-style: `` note: ...`` on its own line, + possibly followed by deeper-indented continuation lines + (multi-line literal/folded scalars). + 2. Single-line flow: ``{..., note: foo}`` -> ``{...}`` + 3. Wrapped flow: a flow mapping that wraps with the + trailing ``,`` at the end of one line and + `` note: foo}`` on the next -> drop the comma and + replace with ``}`` on the prior line. + """ + if not os.path.exists(src): + return + with open(src) as f: + text = f.read() + # Wrapped flow style: a flow mapping that wraps after a + # trailing ``,``, with ``note: value`` on the next line + # (value may itself wrap across several more-indented lines) + # ending in ``}``. Replace the whole tail with ``}``. + # CodeQL flags this as polynomial ReDoS (py/polynomial-redos); + # safe here because [^\n}]* and \n[ \t]+ consume disjoint + # characters (no alternative-path overlap) and the inner * + # consumes >=2 chars per iteration, so worst-case is O(N^2) + # rather than exponential. Inputs are RMG-generated YAML, + # not adversarial. + text = re.sub( + r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', + '}', text) # lgtm[py/polynomial-redos] + # Single-line flow style: ``, note: value}`` -> ``}``. + text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) + # Block style: `` note: ...\n`` plus deeper-indented + # continuation lines. + text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', text, flags=re.MULTILINE) + with open(dst, "w") as f: + f.write(text) + + def timefn(fn): @wraps(fn) def measure_time(*args, **kwargs): From 2bae0a5be63613a2c8dfe5972996c2368376adec Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 08:55:29 -0400 Subject: [PATCH 38/55] Added new utilTest.py file, to test the yaml note extractor. --- test/rmgpy/utilTest.py | 120 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 test/rmgpy/utilTest.py diff --git a/test/rmgpy/utilTest.py b/test/rmgpy/utilTest.py new file mode 100644 index 0000000000..c601cc8c68 --- /dev/null +++ b/test/rmgpy/utilTest.py @@ -0,0 +1,120 @@ +#!/usr/bin/env python3 + +############################################################################### +# # +# RMG - Reaction Mechanism Generator # +# # +# Copyright (c) 2002-2026 Prof. William H. Green (whgreen@mit.edu), # +# Prof. Richard H. West (r.west@neu.edu) and the RMG Team (rmg_dev@mit.edu) # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the 'Software'), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, sublicense, # +# and/or sell copies of the Software, and to permit persons to whom the # +# Software is furnished to do so, subject to the following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +############################################################################### + +from rmgpy.util import strip_yaml_notes + + +class UtilTest: + def strip_yaml_notes(self, tmp_path, source_text): + source_path = tmp_path / "chem_annotated.yaml" + destination_path = tmp_path / "chem.yaml" + source_path.write_text(source_text) + + strip_yaml_notes(source_path, destination_path) + + return destination_path.read_text() + + def test_strip_yaml_notes_removes_block_style_note(self, tmp_path): + source = """species: +- name: CH4 + composition: {C: 1, H: 4} + note: RMG-generated species note +- name: O2 + composition: {O: 2} +""" + expected = """species: +- name: CH4 + composition: {C: 1, H: 4} +- name: O2 + composition: {O: 2} +""" + + assert self.strip_yaml_notes(tmp_path, source) == expected + + def test_strip_yaml_notes_removes_block_style_multiline_note(self, tmp_path): + source = """reactions: +- equation: CH4 + O2 <=> CH3 + HO2 + rate-constant: {A: 1.0e+06, b: 0.0, Ea: 10000.0} + note: | + Estimated by RMG. + Includes database comments. +- equation: H + O2 <=> O + OH + rate-constant: {A: 1.0e+14, b: 0.0, Ea: 15000.0} +""" + expected = """reactions: +- equation: CH4 + O2 <=> CH3 + HO2 + rate-constant: {A: 1.0e+06, b: 0.0, Ea: 10000.0} +- equation: H + O2 <=> O + OH + rate-constant: {A: 1.0e+14, b: 0.0, Ea: 15000.0} +""" + + assert self.strip_yaml_notes(tmp_path, source) == expected + + def test_strip_yaml_notes_removes_single_line_flow_note(self, tmp_path): + source = """species: +- name: Ar + transport: {model: gas, geometry: atom, diameter: 3.33, well-depth: 136.5, note: RMG transport} +""" + expected = """species: +- name: Ar + transport: {model: gas, geometry: atom, diameter: 3.33, well-depth: 136.5} +""" + + assert self.strip_yaml_notes(tmp_path, source) == expected + + def test_strip_yaml_notes_removes_wrapped_flow_note(self, tmp_path): + source = """species: +- name: CH4 + transport: {model: gas, geometry: nonlinear, diameter: 3.746, + well-depth: 141.4, + note: RMG transport note} +""" + expected = """species: +- name: CH4 + transport: {model: gas, geometry: nonlinear, diameter: 3.746, + well-depth: 141.4} +""" + + assert self.strip_yaml_notes(tmp_path, source) == expected + + def test_strip_yaml_notes_removes_wrapped_flow_multiline_note(self, tmp_path): + source = """species: +- name: CH4 + transport: {model: gas, geometry: nonlinear, diameter: 3.746, + well-depth: 141.4, + note: RMG transport note + with wrapped detail} +""" + expected = """species: +- name: CH4 + transport: {model: gas, geometry: nonlinear, diameter: 3.746, + well-depth: 141.4} +""" + + assert self.strip_yaml_notes(tmp_path, source) == expected From 0b3be6f24cd397b80cd841180e18be2aabb4d05b Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 09:23:34 -0400 Subject: [PATCH 39/55] Rename rmgUtilTest so it doesn't clash with rmgpy/molecule/utilTest.py Prevents pytest errors when collecting all the tests at once. --- test/rmgpy/{utilTest.py => rmgUtilTest.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename test/rmgpy/{utilTest.py => rmgUtilTest.py} (100%) diff --git a/test/rmgpy/utilTest.py b/test/rmgpy/rmgUtilTest.py similarity index 100% rename from test/rmgpy/utilTest.py rename to test/rmgpy/rmgUtilTest.py From c1c53c31f3923612ee8ce7b2d17f7797c0d5e3b3 Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 10:07:49 -0400 Subject: [PATCH 40/55] Fixes to tools/compare_cantera_yaml Reduce tolerance on some parameters to avoid false failures. eg. when an activation energy is rounded to 0.001 kcal/mol that is 4185 J/kmol (the Cantera units). Also some fixing of latent bugs. --- rmgpy/tools/compare_cantera_yaml.py | 38 ++++++++++++++++------------- 1 file changed, 21 insertions(+), 17 deletions(-) diff --git a/rmgpy/tools/compare_cantera_yaml.py b/rmgpy/tools/compare_cantera_yaml.py index 0032ccd25c..78ab0b0bd7 100755 --- a/rmgpy/tools/compare_cantera_yaml.py +++ b/rmgpy/tools/compare_cantera_yaml.py @@ -18,7 +18,6 @@ import logging from pathlib import Path from typing import Any, List, Tuple, Dict -from itertools import chain import yaml import numpy as np @@ -175,21 +174,29 @@ def compare_values(val1: Any, val2: Any, path: str, atol: float = 1e-12, ### SPECIAL CASES # Special handling for 'elements' path - normalize to title case and sort - if path.split('.')[-1] == 'elements': + if path.endswith('elements') and val1 and val2: if isinstance(val1[0], str) and isinstance(val2[0], str): + # the elements list in a phase, eg. elements: [H, C, O, N, Ne, X] val1_normalized = sorted([v.title() for v in val1]) val2_normalized = sorted([v.title() for v in val2]) if val1_normalized != val2_normalized: differences.append(f"Elements list mismatch at {path}: {val1_normalized} vs {val2_normalized}") return differences if isinstance(val1[0], dict) and isinstance(val2[0], dict): - for d in chain(val1, val2): - d['symbol'] = d['symbol'].title() + # The top level elements list like elements:[{symbol: D, atomic-weight: 2.014102}] + val1 = [dict(d, symbol=d['symbol'].title()) for d in val1] + val2 = [dict(d, symbol=d['symbol'].title()) for d in val2] val1 = sorted([d for d in val1], key=lambda x: x['symbol']) val2 = sorted([d for d in val2], key=lambda x: x['symbol']) if path.endswith('Troe.T1') or path.endswith('Troe.T2') or path.endswith('Troe.T3'): - rtol = 5e-3 # Relax tolerance due to rounding. + rtol = 0.005 # Relax tolerance due to rounding. + + if path.endswith('rate-constant.b'): + atol = 0.0005 # ck rounds to 0.001 + + if path.endswith('rate-constant.Ea'): + atol = 4185/2 # ck rounds to 0.001 kcal/mol which is 4184 J/kmol ### END OF SPECIAL CASES @@ -226,13 +233,13 @@ def compare_values(val1: Any, val2: Any, path: str, atol: float = 1e-12, # Handle numeric values with tolerance elif is_numeric(val1) and is_numeric(val2): - # Use numpy.allclose for comparison + # Use numpy.isclose for comparison if not np.isclose(val1, val2, atol=atol, rtol=rtol): # Compute the difference for reporting - abs_diff = abs(val1 - val2) - rel_diff = abs(abs_diff / val2) if val2 != 0 else float('inf') + diff = (val2 - val1) + ratio = (val2 / val1) if val1 != 0 else float('inf') differences.append(f"Numerical difference at {path}: {val1} vs {val2} " - f"(abs_diff={abs_diff:.2e}, rel_diff={rel_diff:.2e})") + f"(difference={diff:.2g}, ratio={ratio:.2g})") # Handle strings and other comparable types elif val1 != val2: @@ -500,9 +507,9 @@ def main(): parser.add_argument("file1", help="First Cantera YAML file") parser.add_argument("file2", help="Second Cantera YAML file") parser.add_argument("--abs-tol", type=float, default=1e-11, - help="Absolute tolerance for numerical comparisons (default: 1e-9)") + help="Absolute tolerance for numerical comparisons (default: 1e-11)") parser.add_argument("--rel-tol", type=float, default=1e-3, - help="Relative tolerance for numerical comparisons (default: 1e-9)") + help="Relative tolerance for numerical comparisons (default: 1e-3)") args = parser.parse_args() @@ -535,14 +542,11 @@ def main(): logging.basicConfig(level=logging.INFO, format="%(levelname)s: %(message)s") if len(sys.argv) == 1: logging.info("No arguments provided. Using default test files for demonstration.") - # sys.argv.extend([ - # "test/rmgpy/test_data/yaml_writer_data/chemkin/from_main_test.yaml", - # "test/rmgpy/test_data/yaml_writer_data/cantera/from_main_test.yaml" - # ]) + rmg_root = Path(__file__).resolve().parents[2] sys.argv.extend([ - "/Users/rwest/Code/RMG-Py/testing/eg0/cantera_from_ck/chem.yaml", - "/Users/rwest/Code/RMG-Py/testing/eg0/cantera2/chem.yaml" + str(rmg_root / "testing/eg0/cantera_from_ck/chem.yaml"), + str(rmg_root / "testing/eg0/cantera1/chem.yaml") ]) main() From 937210f9b935818bea79417291acde80352344a3 Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 10:25:10 -0400 Subject: [PATCH 41/55] Tweaking the yaml note stripper CodeQL was complaining about a recursive regular expression that could be a problem. Probably wasn't but this might be more robust anyway. I'll be honest, I haven't gone through carefully to understand all the regular expressions that Codex (GPT 5.5) has come up with here, but am adding unit tests to reassure myself that it works. --- rmgpy/util.py | 66 +++++++++++++++++++++++++++------------ test/rmgpy/rmgUtilTest.py | 10 +++--- 2 files changed, 51 insertions(+), 25 deletions(-) diff --git a/rmgpy/util.py b/rmgpy/util.py index 7862b0d6f1..2b7fd23d3b 100644 --- a/rmgpy/util.py +++ b/rmgpy/util.py @@ -114,6 +114,42 @@ def notify(self, modifier=None): observer.update(self) +def _strip_wrapped_flow_yaml_notes(text): + """Strip wrapped flow-style YAML notes without a nested regex.""" + lines = text.splitlines(keepends=True) + stripped_lines = [] + i = 0 + while i < len(lines): + line = lines[i] + if ( + stripped_lines + and stripped_lines[-1].rstrip().endswith(",") + and line.lstrip(" \t").startswith("note:") + ): + end_index = i + while end_index < len(lines): + if "}" in lines[end_index]: + comma_index = stripped_lines[-1].rfind(",") + brace_index = lines[end_index].find("}") + stripped_lines[-1] = stripped_lines[-1][:comma_index] + lines[end_index][brace_index:] + i = end_index + 1 + break + if lines[end_index].rstrip().endswith(","): + i = end_index + 1 + break + end_index += 1 + else: + stripped_lines.append(line) + i += 1 + continue + continue + + stripped_lines.append(line) + i += 1 + + return "".join(stripped_lines) + + def make_output_subdirectory(output_directory, folder): """ Create a subdirectory `folder` in the output directory. If the folder @@ -132,36 +168,26 @@ def strip_yaml_notes(src, dst): ordering, etc.) - important when the source is the carefully crafted ck2yaml output. - Three patterns are handled (notes are always the last key, by - how RMG / ck2yaml emit them): + Three patterns are handled: 1. Block-style: `` note: ...`` on its own line, possibly followed by deeper-indented continuation lines (multi-line literal/folded scalars). - 2. Single-line flow: ``{..., note: foo}`` -> ``{...}`` + 2. Single-line flow: ``{..., note: foo, ...}`` -> ``{..., ...}`` 3. Wrapped flow: a flow mapping that wraps with the trailing ``,`` at the end of one line and - `` note: foo}`` on the next -> drop the comma and - replace with ``}`` on the prior line. + `` note: foo`` on the next -> drop the note field. """ if not os.path.exists(src): return with open(src) as f: text = f.read() - # Wrapped flow style: a flow mapping that wraps after a - # trailing ``,``, with ``note: value`` on the next line - # (value may itself wrap across several more-indented lines) - # ending in ``}``. Replace the whole tail with ``}``. - # CodeQL flags this as polynomial ReDoS (py/polynomial-redos); - # safe here because [^\n}]* and \n[ \t]+ consume disjoint - # characters (no alternative-path overlap) and the inner * - # consumes >=2 chars per iteration, so worst-case is O(N^2) - # rather than exponential. Inputs are RMG-generated YAML, - # not adversarial. - text = re.sub( - r',[ \t]*\n[ \t]+note:[^\n}]*(?:\n[ \t]+[^\n}]*)*\}', - '}', text) # lgtm[py/polynomial-redos] - # Single-line flow style: ``, note: value}`` -> ``}``. - text = re.sub(r',[ \t]*note:[^,}]*\}', '}', text) + # Wrapped flow style: a flow mapping that wraps after a trailing comma, + # with ``note: value`` on the next line. + text = _strip_wrapped_flow_yaml_notes(text) + # Single-line flow style. + text = re.sub(r',[ \t]*note:[^,}\n]*', '', text) + text = re.sub(r'(\{)[ \t]*note:[^,}\n]*,[ \t]*', r'\1', text) + text = re.sub(r'\{[ \t]*note:[^,}\n]*\}', '{}', text) # Block style: `` note: ...\n`` plus deeper-indented # continuation lines. text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', text, flags=re.MULTILINE) diff --git a/test/rmgpy/rmgUtilTest.py b/test/rmgpy/rmgUtilTest.py index c601cc8c68..db0f764042 100644 --- a/test/rmgpy/rmgUtilTest.py +++ b/test/rmgpy/rmgUtilTest.py @@ -79,7 +79,7 @@ def test_strip_yaml_notes_removes_block_style_multiline_note(self, tmp_path): def test_strip_yaml_notes_removes_single_line_flow_note(self, tmp_path): source = """species: - name: Ar - transport: {model: gas, geometry: atom, diameter: 3.33, well-depth: 136.5, note: RMG transport} + transport: {model: gas, note: RMG transport, geometry: atom, diameter: 3.33, well-depth: 136.5} """ expected = """species: - name: Ar @@ -92,8 +92,8 @@ def test_strip_yaml_notes_removes_wrapped_flow_note(self, tmp_path): source = """species: - name: CH4 transport: {model: gas, geometry: nonlinear, diameter: 3.746, - well-depth: 141.4, - note: RMG transport note} + note: RMG transport note, + well-depth: 141.4} """ expected = """species: - name: CH4 @@ -107,9 +107,9 @@ def test_strip_yaml_notes_removes_wrapped_flow_multiline_note(self, tmp_path): source = """species: - name: CH4 transport: {model: gas, geometry: nonlinear, diameter: 3.746, - well-depth: 141.4, note: RMG transport note - with wrapped detail} + with wrapped detail, + well-depth: 141.4} """ expected = """species: - name: CH4 From 36ec8e0d777ffcec6b7c9471eb487153685b3c66 Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 10:25:48 -0400 Subject: [PATCH 42/55] Another weird case in the yaml note-stripper. This is such a pain, to think of all the weird edge cases. Is it worth it? --- rmgpy/util.py | 58 ++++++++++++++++++++++++++++++++++++--- test/rmgpy/rmgUtilTest.py | 12 ++++++++ 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/rmgpy/util.py b/rmgpy/util.py index 2b7fd23d3b..0999fd0179 100644 --- a/rmgpy/util.py +++ b/rmgpy/util.py @@ -150,6 +150,59 @@ def _strip_wrapped_flow_yaml_notes(text): return "".join(stripped_lines) +def _find_flow_yaml_delimiter(text, start): + """Find the next comma or closing brace outside quoted text.""" + quote = None + i = start + while i < len(text): + char = text[i] + if quote: + if char == quote: + if quote == "'" and i + 1 < len(text) and text[i + 1] == "'": + i += 2 + continue + quote = None + elif quote == '"' and char == "\\": + i += 2 + continue + elif char in ("'", '"'): + quote = char + elif char in ",}": + return i + i += 1 + return -1 + + +def _strip_single_line_flow_yaml_notes(text): + """Strip single-line flow-style YAML notes without splitting quoted commas.""" + lines = text.splitlines(keepends=True) + stripped_lines = [] + note_pattern = re.compile(r'([,{])[ \t]*note:') + for line in lines: + search_start = 0 + while True: + match = note_pattern.search(line, search_start) + if not match: + break + value_start = match.end() + value_end = _find_flow_yaml_delimiter(line, value_start) + if value_end == -1: + break + delimiter = line[value_end] + if delimiter == ",": + line = line[:match.start()] + line[value_end:] + search_start = match.start() + elif match.group(1) == ",": + line = line[:match.start()] + line[value_end:] + search_start = match.start() + else: + line = line[:match.start() + 1] + line[value_end:] + search_start = match.start() + 1 + stripped_lines.append(line) + + return "".join(stripped_lines) + + def make_output_subdirectory(output_directory, folder): """ Create a subdirectory `folder` in the output directory. If the folder @@ -184,10 +237,7 @@ def strip_yaml_notes(src, dst): # Wrapped flow style: a flow mapping that wraps after a trailing comma, # with ``note: value`` on the next line. text = _strip_wrapped_flow_yaml_notes(text) - # Single-line flow style. - text = re.sub(r',[ \t]*note:[^,}\n]*', '', text) - text = re.sub(r'(\{)[ \t]*note:[^,}\n]*,[ \t]*', r'\1', text) - text = re.sub(r'\{[ \t]*note:[^,}\n]*\}', '{}', text) + text = _strip_single_line_flow_yaml_notes(text) # Block style: `` note: ...\n`` plus deeper-indented # continuation lines. text = re.sub(r'^( +)note:.*\n(?:\1 +[^\n]*\n)*', '', text, flags=re.MULTILINE) diff --git a/test/rmgpy/rmgUtilTest.py b/test/rmgpy/rmgUtilTest.py index db0f764042..5599f7a3d9 100644 --- a/test/rmgpy/rmgUtilTest.py +++ b/test/rmgpy/rmgUtilTest.py @@ -88,6 +88,18 @@ def test_strip_yaml_notes_removes_single_line_flow_note(self, tmp_path): assert self.strip_yaml_notes(tmp_path, source) == expected + def test_strip_yaml_notes_removes_single_line_flow_note_with_quoted_comma(self, tmp_path): + source = """species: +- name: Ar + transport: {model: gas, note: 'comma here, danger!', geometry: atom, diameter: 3.33, well-depth: 136.5} +""" + expected = """species: +- name: Ar + transport: {model: gas, geometry: atom, diameter: 3.33, well-depth: 136.5} +""" + + assert self.strip_yaml_notes(tmp_path, source) == expected + def test_strip_yaml_notes_removes_wrapped_flow_note(self, tmp_path): source = """species: - name: CH4 From 9f039672d4047087efcefcbe927f8d621f231b2b Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 10:31:44 -0400 Subject: [PATCH 43/55] Ensure the test yaml snippets are valid. --- test/rmgpy/rmgUtilTest.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/rmgpy/rmgUtilTest.py b/test/rmgpy/rmgUtilTest.py index 5599f7a3d9..b95bef0ddd 100644 --- a/test/rmgpy/rmgUtilTest.py +++ b/test/rmgpy/rmgUtilTest.py @@ -27,6 +27,8 @@ # # ############################################################################### +import yaml + from rmgpy.util import strip_yaml_notes @@ -34,11 +36,14 @@ class UtilTest: def strip_yaml_notes(self, tmp_path, source_text): source_path = tmp_path / "chem_annotated.yaml" destination_path = tmp_path / "chem.yaml" + yaml.safe_load(source_text) source_path.write_text(source_text) strip_yaml_notes(source_path, destination_path) - return destination_path.read_text() + result = destination_path.read_text() + yaml.safe_load(result) + return result def test_strip_yaml_notes_removes_block_style_note(self, tmp_path): source = """species: From ac0d972d3ad103ff93fa0aa4bcaac582c64475b7 Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 13:37:10 -0400 Subject: [PATCH 44/55] Fixes to element handling for electrons, in Chemkin and Cantera. This was pretty broken. Not sure anyone has tried it via chemkin, ever. And not sure the cantera stuff has been tested for electrochemistry. The get_elements method on a ReactionModel now includes an electron if there are any changed species. The electron now has a chemkin_name of "E" which is what both Chemkin and Cantera expect (It's a shame that we internally are using "e" as the symbol..). I did this with the help (and/or hindrance) of Codex with GPT 5.5. I spent so long correcting the way it first chose to fix stuff, and then removing patches that were no longer needed, that I'm not sure how much it helped in the end. Probably a bit. But you do have to stop these LLMs from implementing solutions that add dozens of lines of code. --- rmgpy/chemkin.pyx | 12 ++++--- rmgpy/molecule/element.py | 2 +- rmgpy/rmg/model.py | 11 +++++-- rmgpy/species.py | 5 ++- rmgpy/yaml_cantera1.py | 2 +- rmgpy/yaml_cantera2.py | 15 ++++++--- test/rmgpy/chemkinTest.py | 51 ++++++++++++++++++++++++++++++ test/rmgpy/molecule/elementTest.py | 3 ++ test/rmgpy/yaml_cantera1Test.py | 28 +++++++++++++++- test/rmgpy/yaml_cantera2Test.py | 20 ++++++++++-- 10 files changed, 130 insertions(+), 19 deletions(-) diff --git a/rmgpy/chemkin.pyx b/rmgpy/chemkin.pyx index 8c7e235549..0ea8c0d1dd 100644 --- a/rmgpy/chemkin.pyx +++ b/rmgpy/chemkin.pyx @@ -46,7 +46,6 @@ from rmgpy.data.kinetics.family import TemplateReaction from rmgpy.data.kinetics.library import LibraryReaction from rmgpy.exceptions import ChemkinError from rmgpy.molecule.element import get_element -from rmgpy.molecule.util import get_element_count from rmgpy.quantity import Quantity, QuantityError from rmgpy.reaction import Reaction from rmgpy.rmg.pdep import PDepNetwork, PDepReaction @@ -1580,7 +1579,7 @@ def write_thermo_entry(species, element_counts=None, bint verbose=True): cdef dict counts cdef list sorted_elements, elements, short_lines cdef bint extended_syntax - cdef int count, isotope + cdef int count, isotope, charge cdef str string, line, short_line, chemkin_name, symbol, elem_1, elem_2 cdef object thermo_data @@ -1608,7 +1607,12 @@ def write_thermo_entry(species, element_counts=None, bint verbose=True): chemkin_name = atom.element.chemkin_name counts[chemkin_name] = counts.get(chemkin_name, 0) + 1 else: - counts = element_counts + counts = dict(element_counts) + if 'e' in counts: + counts['E'] = counts.pop('e') + charge = species.molecule[0].get_net_charge() + if charge != 0 and 'E' not in counts: + counts['E'] = -charge # Sort the element_counts dictionary so that it's C, H, Al, B, Cl, D, etc. # if there's any C, else Al, B, Cl, D, H, if not. This is the "Hill" system @@ -2389,7 +2393,7 @@ def write_elements_section(f, elements_in_use): from rmgpy.molecule.element import D, T, C13, O18, X s = 'ELEMENTS\n' custom_singletons = {D, T, C13, O18, X} - elements_list = sorted(e.chemkin_name for e in elements_in_use if e not in custom_singletons) + elements_list = sorted(element.chemkin_name for element in elements_in_use if element not in custom_singletons) for element in elements_list: s += f'\t{element}\n' for isotope in (D, T, C13, O18): diff --git a/rmgpy/molecule/element.py b/rmgpy/molecule/element.py index 4f0a6a5704..d3a8e75411 100644 --- a/rmgpy/molecule/element.py +++ b/rmgpy/molecule/element.py @@ -175,7 +175,7 @@ def get_element(value, isotope=-1): # 'caesium') # electron -e = Element(-1, 'e', 'electron' , 5.486e-7) +e = Element(-1, 'e', 'electron' , 5.486e-7, chemkin_name='E') # Surface site X = Element(0, 'X', 'surface_site' , 0.0) diff --git a/rmgpy/rmg/model.py b/rmgpy/rmg/model.py index 9457d2f525..e54c3e0805 100644 --- a/rmgpy/rmg/model.py +++ b/rmgpy/rmg/model.py @@ -166,15 +166,20 @@ def get_elements(self): """ Return the set of :class:`Element` singletons used by atoms of species in this :class:`ReactionModel`. Iterates each species' first resonance - structure (``sp.molecule[0]``) and collects ``atom.element``. Species - with empty ``molecule`` are skipped. + structure (``sp.molecule[0]``) and collects ``atom.element``. The + electron singleton is included when a species has nonzero net charge, + since Chemkin and Cantera use it for charge bookkeeping. """ + from rmgpy.molecule.element import e elements = set() for sp in self.species: if not sp.molecule: continue - for atom in sp.molecule[0].atoms: + mol = sp.molecule[0] + for atom in mol.atoms: elements.add(atom.element) + if mol.get_net_charge() != 0: + elements.add(e) return elements diff --git a/rmgpy/species.py b/rmgpy/species.py index 92bb4e805e..f499021b13 100644 --- a/rmgpy/species.py +++ b/rmgpy/species.py @@ -448,13 +448,16 @@ def to_cantera(self, use_chemkin_identifier=False, all_species=None): for vertex in self.molecule[0].vertices: # The atom itself if not isinstance(vertex, CuttingLabel): - symbol = vertex.element.symbol + symbol = vertex.element.chemkin_name else: # that means this vertex is CuttingLabel continue if symbol not in element_dict: element_dict[symbol] = 1 else: element_dict[symbol] += 1 + charge = self.molecule[0].get_net_charge() + if charge != 0 and 'E' not in element_dict: + element_dict['E'] = -charge if use_chemkin_identifier: label = self.to_chemkin() else: diff --git a/rmgpy/yaml_cantera1.py b/rmgpy/yaml_cantera1.py index d0c18a2026..374da2cb72 100644 --- a/rmgpy/yaml_cantera1.py +++ b/rmgpy/yaml_cantera1.py @@ -191,7 +191,7 @@ def get_elements_block(elements_in_use): """ from rmgpy.molecule.element import D, T, C13, O18, X custom_singletons = {D, T, C13, O18, X} - elements_list = sorted(element.symbol for element in elements_in_use if element not in custom_singletons) + elements_list = sorted(element.chemkin_name for element in elements_in_use if element not in custom_singletons) custom_elements = [] for isotope in (D, T, C13, O18): if isotope in elements_in_use: diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 3bd1a019c5..54000c6d7a 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -87,6 +87,7 @@ def _multiline_str_representer(dumper, data): 101: 'Md', 102: 'No', 103: 'Lr', 104: 'Rf', 105: 'Db', 106: 'Sg', 107: 'Bh', 108: 'Hs', 109: 'Mt', 110: 'Ds', 111: 'Rg', 112: 'Cn', 113: 'Nh', 114: 'Fl', 115: 'Mc', 116: 'Lv', 117: 'Ts', 118: 'Og'} NUMBER_BY_SYMBOL = {value: key for key, value in SYMBOL_BY_NUMBER.items()} +NUMBER_BY_SYMBOL['E'] = 0 class CanteraWriter2(object): @@ -212,13 +213,12 @@ def get_elements_lists(elements_in_use): elements_in_use is a set of :class:`Element` singletons (typically from :meth:`rmgpy.rmg.model.ReactionModel.get_elements`). Only those elements are emitted; isotopes (D, T, CI, OI) and X are added only when present in - the set. The plasma pseudo-element 'E' is added separately by the caller - when ``is_plasma`` is true. + the set. """ from rmgpy.molecule.element import D, T, C13, O18, X custom_singletons = {D, T, C13, O18, X} custom_elements = [] - elements_list = sorted(element.symbol for element in elements_in_use if element not in custom_singletons) + elements_list = sorted(element.chemkin_name for element in elements_in_use if element not in custom_singletons) for isotope in (D, T, C13, O18): if isotope in elements_in_use: mass = 1000 * isotope.mass @@ -229,6 +229,7 @@ def get_elements_lists(elements_in_use): custom_elements.append({'symbol': 'X', 'atomic-weight': 195.083}) return custom_elements, elements_list + def generate_cantera_data(species_list, reaction_list, elements_in_use=None, @@ -295,7 +296,8 @@ def generate_cantera_data(species_list, if custom_elements: data['elements'] = custom_elements elements_set = set(all_elements) - if is_plasma: + from rmgpy.molecule.element import e + if is_plasma or e in elements_in_use: elements_set.add('E') phases = list() @@ -414,7 +416,10 @@ def species_to_dict(species, species_list): # Composition mol = species.molecule[0] - atom_dict = dict(mol.get_element_count()) + atom_dict = {} + for atom in mol.atoms: + symbol = atom.element.chemkin_name + atom_dict[symbol] = atom_dict.get(symbol, 0) + 1 # Number of electrons 'E' # The special pseudo-element E is used in representing charged species, where it specifies diff --git a/test/rmgpy/chemkinTest.py b/test/rmgpy/chemkinTest.py index d2fcf77665..c610679f33 100644 --- a/test/rmgpy/chemkinTest.py +++ b/test/rmgpy/chemkinTest.py @@ -768,6 +768,21 @@ def test_write_elements_section_includes_used_isotopes_and_surface_site(self): "", ] + def test_write_elements_section_maps_electron_to_pseudo_element(self): + """The RMG electron singleton should be written as Chemkin/Cantera E, not e.""" + from rmgpy.molecule.element import H, e + + stream = io.StringIO() + write_elements_section(stream, {H, e}) + + assert stream.getvalue().splitlines() == [ + "ELEMENTS", + "\tE", + "\tH", + "END", + "", + ] + class TestThermoReadWrite: def setup_class(self): @@ -888,6 +903,42 @@ def test_save_chemkin_file_writes_dynamic_elements_section(self, tmp_path): ] assert all("X" not in line for line in elements_lines) + def test_save_chemkin_file_adds_electron_element_for_charged_species(self, tmp_path): + """Charged species require E in the ELEMENTS section even without an electron atom.""" + from rmgpy.molecule.element import Li, e + from rmgpy.rmg.model import ReactionModel + + lithium_ion = Species().from_adjacency_list("1 Li u0 p0 c+1") + lithium_ion.label = "Li+" + lithium_ion.index = 1 + lithium_ion.thermo = self.nasa + + assert ReactionModel(species=[lithium_ion]).get_elements() == {Li, e} + + chemkin_path = tmp_path / "chem.inp" + save_chemkin_file( + chemkin_path, + [lithium_ion], + [], + verbose=False, + check_for_duplicates=False, + ) + + elements_lines = get_elements_section_lines(chemkin_path.read_text()) + assert "\tE" in elements_lines + assert "\tLi" in elements_lines + + def test_write_thermo_block_for_charged_species_includes_electron_count(self): + """Charged species thermo composition should include E: -charge.""" + lithium_ion = Species().from_adjacency_list("1 Li u0 p0 c+1") + lithium_ion.thermo = self.nasa + + result = write_thermo_entry(lithium_ion, verbose=False) + + first_line = result.splitlines()[0] + assert "E -1" in first_line + assert "Li 1" in first_line + def test_write_thermo_block_5_elem(self): """Test that we can write a thermo block for a species with 5 elements""" species = Species().from_adjacency_list( diff --git a/test/rmgpy/molecule/elementTest.py b/test/rmgpy/molecule/elementTest.py index 51c5bd3675..49944cfb2f 100644 --- a/test/rmgpy/molecule/elementTest.py +++ b/test/rmgpy/molecule/elementTest.py @@ -100,3 +100,6 @@ def test_chemkin_name(self): o18 = rmgpy.molecule.element.get_element("O", isotope=18) assert o18.chemkin_name == "OI" + + electron = rmgpy.molecule.element.get_element("e") + assert electron.chemkin_name == "E" diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 0500c1444d..8b3288e5ab 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -134,6 +134,26 @@ def test_species_to_dict_gas_transport(self): assert np.isclose(d["transport"]["diameter"], 3.0) assert np.isclose(d["transport"]["well-depth"], 100.0) + def test_species_to_dict_charged_species_uses_electron_pseudo_element(self): + """Charged species composition uses Cantera's E pseudo-element.""" + lithium_ion = Species(label="Li+", index=10) + lithium_ion.from_adjacency_list("1 Li u0 p0 c+1") + lithium_ion.thermo = _make_nasa_thermo() + + d = species_to_dict(lithium_ion) + + assert d["composition"] == {"E": -1.0, "Li": 1.0} + + def test_species_to_dict_electron_uses_electron_pseudo_element(self): + """The electron species exports composition as E, not internal e.""" + electron = Species(label="e", index=11) + electron.from_adjacency_list("1 e u1 p0 c-1") + electron.thermo = _make_nasa_thermo() + + d = species_to_dict(electron) + + assert d["composition"] == {"E": 1.0} + def test_species_to_dict_surface_composition(self): """Surface species has X in composition and no transport block.""" d = species_to_dict(self.hx) @@ -419,7 +439,7 @@ def test_reaction_to_dicts_three_species_one_side_spectator(self): def test_get_elements_block_isotopes_and_surface_site(self): """get_elements_block emits isotope and X definitions only when requested.""" - from rmgpy.molecule.element import H, C, D, T, X + from rmgpy.molecule.element import H, C, D, T, X, e # With D, T, X in use, the block names them with the right masses elements_block, elements_line = get_elements_block({H, C, D, T, X}) @@ -437,6 +457,12 @@ def test_get_elements_block_isotopes_and_surface_site(self): assert 'T' not in elements_block assert 'X' not in elements_block + # The RMG electron singleton is lowercase e internally, but Cantera + # expects the uppercase pseudo-element E in phase element lists. + elements_block, elements_line = get_elements_block({H, e}) + assert elements_block == '' + assert elements_line == 'elements: [E, H]' + def test_get_phases_gas_only_has_state(self): """Gas-only phases block includes state with T and P.""" phases_block = get_phases_gas_only([self.h2, self.h], 'elements: [H]') diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index 742405cfa4..0748881348 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -593,7 +593,7 @@ def test_reaction_to_dict_thirdbody_unit(self): def test_get_elements_block_isotopes_and_surface_site(self): """get_elements_lists emits isotope and X definitions only when in use.""" - from rmgpy.molecule.element import H, C, D, T, X + from rmgpy.molecule.element import H, C, D, T, X, e # With D, T, X in use: isotope and X entries appear custom_elements, elements_list = get_elements_lists({H, C, D, T, X}) @@ -616,10 +616,16 @@ def test_get_elements_block_isotopes_and_surface_site(self): assert 'D' not in elements_list assert 'T' not in elements_list + # The RMG electron singleton is lowercase e internally, but exports as + # Cantera's uppercase pseudo-element E. + custom_elements, elements_list = get_elements_lists({H, e}) + assert custom_elements == [] + assert elements_list == ['E', 'H'] + def test_generate_cantera_data_elements_block(self): """generate_cantera_data emits a top-level 'elements' key only when non-builtin elements (isotopes, X) are in use, matching ck2yaml.""" - from rmgpy.molecule.element import H, X + from rmgpy.molecule.element import H, X, e h2 = self._create_dummy_species("H2", "[H][H]", index=1) # Gas-only H2: no isotopes, no X -> no top-level 'elements' block. @@ -629,9 +635,17 @@ def test_generate_cantera_data_elements_block(self): # Surface fixture: X is in use, so it appears as a custom element. x = self._create_surface_species("X", "1 X u0 p0", index=2) data = generate_cantera_data([h2, x], [], elements_in_use={H, X}) - symbols = [e['symbol'] for e in data['elements']] + symbols = [entry['symbol'] for entry in data['elements']] assert 'X' in symbols + electron = Species(label="e", index=2) + electron.from_adjacency_list("1 e u1 p0 c-1") + electron.thermo = h2.thermo + data = generate_cantera_data([h2, electron], [], elements_in_use={H, e}, is_plasma=True) + assert data['phases'][0]['elements'] == ['E', 'H'] + electron_entry = next(sp for sp in data['species'] if sp['name'] == 'e(2)') + assert electron_entry['composition'] == {'E': 1} + def test_generate_cantera_data_gas_phase_state(self): """Gas phase definition includes a 'state' block with T and P.""" from rmgpy.molecule.element import H From 7986259e40cbf7cdf3b8bbe477f6b09c12b09abb Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 22:58:55 -0400 Subject: [PATCH 45/55] Move yaml_writer_data .gitignore rule into root .gitignore, and fixup Added some other entries while I was at it. --- .gitignore | 7 ++++++- test/rmgpy/test_data/yaml_writer_data/.gitignore | 1 - 2 files changed, 6 insertions(+), 2 deletions(-) delete mode 100644 test/rmgpy/test_data/yaml_writer_data/.gitignore diff --git a/.gitignore b/.gitignore index 8f6b512743..4a3a9a662e 100644 --- a/.gitignore +++ b/.gitignore @@ -16,6 +16,7 @@ reactionmechanismgenerator.egg-info/ *.pyd # and intermediate source files *.c +rmgpy/**/*.html # Image files generated by RMG *.png @@ -24,6 +25,7 @@ reactionmechanismgenerator.egg-info/ # Temporary build files build/* +.installed # Compiled documentation documentation/build/* @@ -105,7 +107,8 @@ test/arkane/data/two_parameter_arrhenius_fit/arkane.log test/arkane/data/two_parameter_arrhenius_fit/output.py test/arkane/data/two_parameter_arrhenius_fit/chem.inp test/rmgpy/test_data/temp_dir_for_testing/cantera/chem001.yaml -rmgpy/test_data/copied_kinetic_lib/ +test/rmgpy/test_data/yaml_writer_data/*/from_main_test.yaml +test/rmgpy/test_data/copied_kinetic_lib/ testing/qm/* test_log.txt rmgpy/tools/data/flux/flux/1/*.dot @@ -126,6 +129,8 @@ examples/**/plots examples/**/chemkin/*.inp examples/**/chemkin/tran.dat examples/**/chemkin/*dictionary.txt +examples/**/cantera1/ +examples/**/cantera2/ examples/**/chem*.yaml examples/**/rms/*.rms examples/**/output*.html diff --git a/test/rmgpy/test_data/yaml_writer_data/.gitignore b/test/rmgpy/test_data/yaml_writer_data/.gitignore deleted file mode 100644 index 7acff224a2..0000000000 --- a/test/rmgpy/test_data/yaml_writer_data/.gitignore +++ /dev/null @@ -1 +0,0 @@ -from_main_test.yaml From 2d70fbd9910789f61f686be84b290d06141c7ea1 Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 23:14:37 -0400 Subject: [PATCH 46/55] Rename strip_yaml_notes helper function in rmgUtilTest Was confusing having two things with the same name do different things --- test/rmgpy/rmgUtilTest.py | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/test/rmgpy/rmgUtilTest.py b/test/rmgpy/rmgUtilTest.py index b95bef0ddd..6b9df579a1 100644 --- a/test/rmgpy/rmgUtilTest.py +++ b/test/rmgpy/rmgUtilTest.py @@ -33,16 +33,16 @@ class UtilTest: - def strip_yaml_notes(self, tmp_path, source_text): + def run_strip(self, tmp_path, source_text): source_path = tmp_path / "chem_annotated.yaml" destination_path = tmp_path / "chem.yaml" - yaml.safe_load(source_text) + yaml.safe_load(source_text) # just to check it's valid YAML source_path.write_text(source_text) - + yaml.safe_load(source_path.read_text()) strip_yaml_notes(source_path, destination_path) result = destination_path.read_text() - yaml.safe_load(result) + yaml.safe_load(result) # just to check it's valid YAML return result def test_strip_yaml_notes_removes_block_style_note(self, tmp_path): @@ -60,7 +60,7 @@ def test_strip_yaml_notes_removes_block_style_note(self, tmp_path): composition: {O: 2} """ - assert self.strip_yaml_notes(tmp_path, source) == expected + assert self.run_strip(tmp_path, source) == expected def test_strip_yaml_notes_removes_block_style_multiline_note(self, tmp_path): source = """reactions: @@ -79,7 +79,7 @@ def test_strip_yaml_notes_removes_block_style_multiline_note(self, tmp_path): rate-constant: {A: 1.0e+14, b: 0.0, Ea: 15000.0} """ - assert self.strip_yaml_notes(tmp_path, source) == expected + assert self.run_strip(tmp_path, source) == expected def test_strip_yaml_notes_removes_single_line_flow_note(self, tmp_path): source = """species: @@ -91,7 +91,7 @@ def test_strip_yaml_notes_removes_single_line_flow_note(self, tmp_path): transport: {model: gas, geometry: atom, diameter: 3.33, well-depth: 136.5} """ - assert self.strip_yaml_notes(tmp_path, source) == expected + assert self.run_strip(tmp_path, source) == expected def test_strip_yaml_notes_removes_single_line_flow_note_with_quoted_comma(self, tmp_path): source = """species: @@ -103,7 +103,7 @@ def test_strip_yaml_notes_removes_single_line_flow_note_with_quoted_comma(self, transport: {model: gas, geometry: atom, diameter: 3.33, well-depth: 136.5} """ - assert self.strip_yaml_notes(tmp_path, source) == expected + assert self.run_strip(tmp_path, source) == expected def test_strip_yaml_notes_removes_wrapped_flow_note(self, tmp_path): source = """species: @@ -118,7 +118,7 @@ def test_strip_yaml_notes_removes_wrapped_flow_note(self, tmp_path): well-depth: 141.4} """ - assert self.strip_yaml_notes(tmp_path, source) == expected + assert self.run_strip(tmp_path, source) == expected def test_strip_yaml_notes_removes_wrapped_flow_multiline_note(self, tmp_path): source = """species: @@ -134,4 +134,4 @@ def test_strip_yaml_notes_removes_wrapped_flow_multiline_note(self, tmp_path): well-depth: 141.4} """ - assert self.strip_yaml_notes(tmp_path, source) == expected + assert self.run_strip(tmp_path, source) == expected From be5acdb3e2fa692d93ceb1354bec93e53022346b Mon Sep 17 00:00:00 2001 From: Richard West Date: Thu, 21 May 2026 23:44:48 -0400 Subject: [PATCH 47/55] Add details to a comment in a unit test. --- test/rmgpy/yaml_cantera1Test.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 8b3288e5ab..a066fcb925 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -402,13 +402,14 @@ def test_reaction_to_dicts_surface_spectator_species(self): def test_reaction_to_dicts_three_species_one_side_spectator(self): """Spectator on both sides with 3+ stoichiometric items on a side must still drop efficiencies. - Cantera's API misidentifies a species with net-zero stoichiometry as + Cantera's API (v. 3.1 and 3.2) misidentifies a species with net-zero stoichiometry as a third-body collider whenever the reaction has three or more stoichiometric items on one side. Routing ct.Reaction through an equation string avoids this only for the 2-each-side case. For wider reactions the writer must strip the resulting spurious 'efficiencies' from input_data so the YAML round-trips through ct.Solution. + See https://github.com/Cantera/cantera/issues/2115#issuecomment-4465564540 """ ox = _make_surface_species( "O_X", From 7b8cddd7d38f2541fb0b12a8fc0f52d315701ce5 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 00:04:08 -0400 Subject: [PATCH 48/55] Defenses in chemkin writing for electrons, and cythonization. Started as adding warnings when the number of electrons in a molecule and the specified negative charge differ (because we have to choose one for writing the chemkin file). Then I found myself adding cython declarations. And removed the entirely unused path whereby you pass an tuple to get isotopes. This is fixed in a separate branch. (Merging/rebasing will now be a pain. Ugh) --- rmgpy/chemkin.pyx | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/rmgpy/chemkin.pyx b/rmgpy/chemkin.pyx index 0ea8c0d1dd..5b836c44d0 100644 --- a/rmgpy/chemkin.pyx +++ b/rmgpy/chemkin.pyx @@ -1579,7 +1579,7 @@ def write_thermo_entry(species, element_counts=None, bint verbose=True): cdef dict counts cdef list sorted_elements, elements, short_lines cdef bint extended_syntax - cdef int count, isotope, charge + cdef int count, isotope, charge, electrons cdef str string, line, short_line, chemkin_name, symbol, elem_1, elem_2 cdef object thermo_data @@ -1608,10 +1608,19 @@ def write_thermo_entry(species, element_counts=None, bint verbose=True): counts[chemkin_name] = counts.get(chemkin_name, 0) + 1 else: counts = dict(element_counts) + # Some callers pass element_counts keyed by element symbol 'e' rather than chemkin name 'E' if 'e' in counts: counts['E'] = counts.pop('e') charge = species.molecule[0].get_net_charge() - if charge != 0 and 'E' not in counts: + if 'E' in counts: + electrons = counts['E'] + if charge == 0 and electrons != 0: + logging.warning(f"Species {species} has {electrons} electrons but charge 0. " + f"Reporting {electrons} electrons in the Chemkin composition.") + elif charge != 0 and electrons != -charge: + logging.warning(f"Species {species} has {electrons} electrons but charge {charge}. " + f"Reporting {-charge} electrons in the Chemkin composition.") + if charge != 0: counts['E'] = -charge # Sort the element_counts dictionary so that it's C, H, Al, B, Cl, D, etc. @@ -1638,12 +1647,7 @@ def write_thermo_entry(species, element_counts=None, bint verbose=True): # Compile element count string extended_syntax = len(counts) > 4 # If there are more than 4 elements, use extended syntax elements = [] - for key, count in counts.items(): - if isinstance(key, tuple): - symbol, isotope = key - chemkin_name = get_element(symbol, isotope=isotope).chemkin_name - else: - chemkin_name = key + for chemkin_name, count in counts.items(): if extended_syntax: # Create a list of alternating elements and counts elements.extend([chemkin_name, str(count)]) From cefbc1308617a30b41444ad38d30dc2198c2afa9 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 00:35:39 -0400 Subject: [PATCH 49/55] Unit test for the new/safer to_cantera method for reactions with spectator species. The commit that started this whole pull request, titled "Fix to_cantera() to use equation string, avoiding Cantera third-body misidentification" (the hash will probably change on rebasing before this is merged) patched a bug in the Cantera API. It was indirectly tested via the yaml writer, but this explicitly tests the to_cantera method. (And the test fails if you revert that patch). --- test/rmgpy/reactionTest.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test/rmgpy/reactionTest.py b/test/rmgpy/reactionTest.py index a11d773f11..458de09f6a 100644 --- a/test/rmgpy/reactionTest.py +++ b/test/rmgpy/reactionTest.py @@ -2921,6 +2921,25 @@ def test_arrhenius(self): assert np.isclose(converted_obj.rate.input_data['rate-constant']['b'], ct_obj.rate.input_data['rate-constant']['b']) assert np.isclose(converted_obj.rate.input_data['rate-constant']['Ea'], ct_obj.rate.input_data['rate-constant']['Ea']) + def test_to_cantera_with_spectator_species(self): + """ + Tests that species present on both sides are not duplicated. + """ + species_by_label = {species.label: species for species in self.species_list} + h = species_by_label["H"] + h2 = species_by_label["H2"] + ch4 = species_by_label["CH4"] + rxn = Reaction( + reactants=[h, h, ch4], + products=[h2, ch4], + kinetics=Arrhenius(A=(1e6, "cm^6/(mol^2*s)"), n=0, Ea=(0, "kcal/mol"), T0=(1, "K")), + ) + + ct_rxn = rxn.to_cantera(self.species_list, use_chemkin_identifier=True) + + assert ct_rxn.input_data["equation"] == "2 H(3) + CH4(15) <=> H2(2) + CH4(15)" + assert ct_rxn.input_data["equation"].count("CH4(15)") == 2 + def test_multi_arrhenius(self): """ Tests formation of cantera reactions with MultiArrhenius kinetics. From 0b2eaf3f3770878e5ae09d22247f292bfb06d164 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 00:46:40 -0400 Subject: [PATCH 50/55] Log warnings in Species.to_cantera when charge and # electrons disagree Much like is added recently to the chemkin writer. --- rmgpy/species.py | 10 +++++++++- test/rmgpy/speciesTest.py | 34 +++++++++++++++++++++++++++++++++- 2 files changed, 42 insertions(+), 2 deletions(-) diff --git a/rmgpy/species.py b/rmgpy/species.py index f499021b13..a75dc94e8f 100644 --- a/rmgpy/species.py +++ b/rmgpy/species.py @@ -456,7 +456,15 @@ def to_cantera(self, use_chemkin_identifier=False, all_species=None): else: element_dict[symbol] += 1 charge = self.molecule[0].get_net_charge() - if charge != 0 and 'E' not in element_dict: + if 'E' in element_dict: + electrons = element_dict['E'] + if charge == 0 and electrons != 0: + logging.warning(f"Species {self} has {electrons} electrons but charge 0. " + f"Reporting {electrons} electrons in the Cantera composition.") + elif electrons != -charge: + logging.warning(f"Species {self} has {electrons} electrons but charge {charge}. " + f"Reporting {-charge} electrons in the Cantera composition.") + if charge != 0: element_dict['E'] = -charge if use_chemkin_identifier: label = self.to_chemkin() diff --git a/test/rmgpy/speciesTest.py b/test/rmgpy/speciesTest.py index ec97de5b9d..0971722a71 100644 --- a/test/rmgpy/speciesTest.py +++ b/test/rmgpy/speciesTest.py @@ -34,7 +34,7 @@ from rmgpy.species import Species from rmgpy.transport import TransportData -from rmgpy.molecule import Molecule +from rmgpy.molecule import Atom, Molecule, get_element from rmgpy.thermo import ThermoData from rmgpy.statmech import ( Conformer, @@ -485,6 +485,38 @@ def test_cantera(self): assert type(rmg_ct_species.thermo) == type(ct_species.thermo) assert type(rmg_ct_species.transport) == type(ct_species.transport) + def test_to_cantera_warns_and_uses_charge_for_explicit_electron_mismatch(self, caplog): + """ + Test that a charged Cantera species composition uses the net charge when + explicit electrons disagree. + """ + mol = Molecule(atoms=[ + Atom(element=get_element("H"), charge=-1, radical_electrons=0, lone_pairs=0), + Atom(element=get_element("e"), charge=-1, radical_electrons=0, lone_pairs=0), + ]) + species = Species(label="H2minus_with_one_electron", molecule=[mol]) + + ct_species = species.to_cantera() + + assert ct_species.composition["E"] == 2 + assert "has 1 electrons but charge -2" in caplog.text + assert "Reporting 2 electrons in the Cantera composition." in caplog.text + + def test_to_cantera_uses_charge_when_electrons_unspecified(self, caplog): + """ + Test that a charged Cantera species composition uses the net charge + without a warning when no explicit electrons are present. + """ + mol = Molecule(atoms=[ + Atom(element=get_element("H"), charge=-1, radical_electrons=0, lone_pairs=0), + ]) + species = Species(label="Hminus", molecule=[mol]) + + ct_species = species.to_cantera() + + assert ct_species.composition["E"] == 1 + assert "electrons but charge" not in caplog.text + def test_get_transport_data(self): """ Test that transport data can be retrieved correctly via the get_transport_data method. From 6d1c738e50feecd8c8b82a6331944a4c57f55ea5 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 00:54:07 -0400 Subject: [PATCH 51/55] The CanteraWriter2 now also warns if # electrons differs from -charge. --- rmgpy/yaml_cantera2.py | 10 +++++++++- test/rmgpy/yaml_cantera2Test.py | 35 +++++++++++++++++++++++++++++++++ 2 files changed, 44 insertions(+), 1 deletion(-) diff --git a/rmgpy/yaml_cantera2.py b/rmgpy/yaml_cantera2.py index 54000c6d7a..916d6c93f9 100644 --- a/rmgpy/yaml_cantera2.py +++ b/rmgpy/yaml_cantera2.py @@ -427,7 +427,15 @@ def species_to_dict(species, species_list): # That is, negatively charged ions will have E > 0, while positively charged ions will have E < 0. # https://cantera.org/3.1/userguide/creating-mechanisms.html#elemental-composition charge = mol.get_net_charge() - if 'E' not in atom_dict and charge != 0: + if 'E' in atom_dict: + electrons = atom_dict['E'] + if charge == 0 and electrons != 0: + logging.warning(f"Species {species} has {electrons} electrons but charge 0. " + f"Reporting {electrons} electrons in the Cantera YAML composition.") + elif electrons != -charge: + logging.warning(f"Species {species} has {electrons} electrons but charge {charge}. " + f"Reporting {-charge} electrons in the Cantera YAML composition.") + if charge != 0: atom_dict['E'] = -charge # Sort composition by atomic number diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index 0748881348..db62040e53 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -36,6 +36,7 @@ import pytest import yaml +from rmgpy.molecule import Atom, Molecule, get_element from rmgpy.species import Species from rmgpy.reaction import Reaction from rmgpy.kinetics import ( @@ -126,6 +127,40 @@ def test_species_to_dict_standard(self): assert np.isclose(d['transport']['well-depth'], 100.0) # Kelvin assert np.isclose(d['transport']['rotational-relaxation'], 1.0) + def test_species_to_dict_warns_and_uses_charge_for_explicit_electron_mismatch(self, caplog): + """ + Test that YAML species composition uses the net charge when explicit + electrons disagree. + """ + sp = self._create_dummy_species("H2", "[H][H]", index=1) + sp.label = "H2minus_with_one_electron" + sp.molecule = [Molecule(atoms=[ + Atom(element=get_element("H"), charge=-2, radical_electrons=0, lone_pairs=0), + Atom(element=get_element("e"), charge=0, radical_electrons=0, lone_pairs=0), + ])] + + d = species_to_dict(sp, [sp]) + + assert d["composition"]["E"] == 2 + assert "has 1 electrons but charge -2" in caplog.text + assert "Reporting 2 electrons in the Cantera YAML composition." in caplog.text + + def test_species_to_dict_uses_charge_when_electrons_unspecified(self, caplog): + """ + Test that YAML species composition uses the net charge without a warning + when no explicit electrons are present. + """ + sp = self._create_dummy_species("H2", "[H][H]", index=1) + sp.label = "Hminus" + sp.molecule = [Molecule(atoms=[ + Atom(element=get_element("H"), charge=-1, radical_electrons=0, lone_pairs=0), + ])] + + d = species_to_dict(sp, [sp]) + + assert d["composition"]["E"] == 1 + assert "electrons but charge" not in caplog.text + def test_reaction_to_dict_arrhenius(self): """Test standard Arrhenius kinetics.""" r = self._create_dummy_species("R", "[CH2]O", index=1) From 49eaab853ad17538fce464283121f144302861ef Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 09:44:16 -0400 Subject: [PATCH 52/55] Deduplicate CanteraYamlFileComparer into a shared test helper. yaml_cantera1Test.py and yaml_cantera2Test.py each carried a ~145-line copy of CanteraYamlFileComparer, a pytest fixture-based base class that asserts equivalence between two Cantera YAML files (generator, phases, elements, species composition/thermo/transport). Move the class into a new sibling helper module test/rmgpy/cantera_yaml_comparer.py and import it from both test files. Co-Authored-By: Claude Opus 4.7 (1M context) --- test/rmgpy/cantera_yaml_comparer.py | 189 ++++++++++++++++++++++++++++ test/rmgpy/yaml_cantera1Test.py | 152 +--------------------- test/rmgpy/yaml_cantera2Test.py | 149 +--------------------- 3 files changed, 191 insertions(+), 299 deletions(-) create mode 100644 test/rmgpy/cantera_yaml_comparer.py diff --git a/test/rmgpy/cantera_yaml_comparer.py b/test/rmgpy/cantera_yaml_comparer.py new file mode 100644 index 0000000000..7e73fcae92 --- /dev/null +++ b/test/rmgpy/cantera_yaml_comparer.py @@ -0,0 +1,189 @@ +#!/usr/bin/env python3 + +############################################################################### +# # +# RMG - Reaction Mechanism Generator # +# # +# Copyright (c) 2002-2026 Prof. William H. Green (whgreen@mit.edu), # +# Prof. Richard H. West (r.west@neu.edu) and the RMG Team (rmg_dev@mit.edu) # +# # +# Permission is hereby granted, free of charge, to any person obtaining a # +# copy of this software and associated documentation files (the 'Software'), # +# to deal in the Software without restriction, including without limitation # +# the rights to use, copy, modify, merge, publish, distribute, sublicense, # +# and/or sell copies of the Software, and to permit persons to whom the # +# Software is furnished to do so, subject to the following conditions: # +# # +# The above copyright notice and this permission notice shall be included in # +# all copies or substantial portions of the Software. # +# # +# THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING # +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER # +# DEALINGS IN THE SOFTWARE. # +# # +############################################################################### + +""" +Shared pytest base class for comparing two Cantera YAML files. + +Used by both yaml_cantera1Test.py and yaml_cantera2Test.py so that +comparison rules stay in lockstep across the two RMG Cantera writers. +""" + +import copy + +import pytest +import yaml + + +class CanteraYamlFileComparer: + """ + For comparing two Cantera YAML files. + This class provides methods to compare species and reactions between the two files. + + Args: + yaml_path_1: Path to the first YAML file, converted from Chemkin by ck2yaml. + yaml_path_2: Path to the second YAML file, written directly by RMG. + """ + yaml_path_1 = None + yaml_path_2 = None + + @pytest.fixture(autouse=True, scope="class") # loaded once per Class + def load_yaml_files(self, request): + """Load the two YAML files to be compared.""" + with open(request.cls.yaml_path_1, 'r') as file: + request.cls.yaml1 = yaml.safe_load(file) + with open(request.cls.yaml_path_2, 'r') as file: + request.cls.yaml2 = yaml.safe_load(file) + + @pytest.fixture(autouse=True) # runs before each test method + def copy_yaml_dicts(self): + """Make deep copies so tests can modify without affecting other tests.""" + self.yaml1 = copy.deepcopy(self.__class__.yaml1) + self.yaml2 = copy.deepcopy(self.__class__.yaml2) + + def testGeneratorsAsExpected(self): + "Check the two yaml files were generated by the expected tools (ck2yaml vs RMG)." + assert self.yaml1['generator'] == 'ck2yaml', "First YAML file should be generated by ck2yaml." + assert 'RMG' in self.yaml2['generator'], "Second YAML file should be generated by RMG." + + def testKeysMatch(self): + """Test that the top-level keys in both YAML files match, except those expected not to.""" + # Remove keys unique to each generator. dict.pop(key, None) is a no-op + # when the key is absent, so it is safe to pop the union across both writers. + self.yaml1.pop('input-files', None) + self.yaml1.pop('cantera-version', None) + self.yaml1.pop('date', None) + self.yaml2.pop('cantera-version', None) + self.yaml2.pop('description', None) + for model in [self.yaml1, self.yaml2]: + for phase in model['phases']: + for reactions_block in phase.get('reactions', []): # for multi-phase mechanisms, reactions are under each phase + assert reactions_block in model, f"Expected reactions block '{reactions_block}' not found in YAML file." + model.pop(reactions_block, None) # Remove reactions block to allow keys to match + assert self.yaml1.keys() == self.yaml2.keys(), "YAML files have different top-level keys." + + def testPhasesMatch(self): + """Test that the phase definitions in both YAML files match.""" + assert len(self.yaml1['phases']) == len(self.yaml2['phases']), "YAML files have different numbers of phases" + + for phase1, phase2 in zip(self.yaml1['phases'], self.yaml2['phases']): + assert phase1['name'] == phase2['name'], f"Phase names do not match: {phase1['name']} vs {phase2['name']}." + assert phase1['thermo'] == phase2['thermo'], f"Thermo definitions for phase {phase1['name']} do not match." + assert phase1.get('transport', '') == phase2.get('transport', ''), f"Transport definitions for phase {phase1['name']} do not match." + assert phase1.get('adjacent-phases', []) == phase2.get('adjacent-phases', []), f"Adjacent phases for phase {phase1['name']} do not match." + assert phase1.get('species', []) == phase2.get('species', []), f"Species lists for phase {phase1['name']} do not match." + assert phase1.get('reactions', []) == phase2.get('reactions', []), f"Reactions blocks for phase {phase1['name']} do not match." + # the ck2yaml has all elements in Titlecase, while RMG lets some isotopes be CI and OI (not Ci and Oi). + assert sorted(phase1.get('elements', [])) == sorted(e.title() for e in phase2.get('elements', [])), f"Element lists for phase {phase1['name']} do not match." + assert phase1.get('state', {}) == phase2.get('state', {}), f"State definitions for phase {phase1['name']} do not match." + + def testElementsMatch(self): + """Test that the element definitions in both YAML files match.""" + assert ('elements' in self.yaml1) == ('elements' in self.yaml2), "One YAML file has an 'elements' block while the other does not." + ck2yaml_elements = sorted(self.yaml1.get('elements', []), key=lambda e: e['symbol']) + # Put symbol into Titlecase to match ck2yaml's formatting + rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2.get('elements', [])] + rmg_elements = sorted(rmg_elements, key=lambda e: e['symbol']) + # Compare symbols exactly, and atomic weights approximately + assert [e['symbol'] for e in ck2yaml_elements] == [e['symbol'] for e in rmg_elements], \ + "YAML files have different element symbols." + assert [e['atomic-weight'] for e in ck2yaml_elements] == pytest.approx( + [e['atomic-weight'] for e in rmg_elements], abs=1e-3 + ), "YAML files have different element atomic weights." + + def testSpeciesMatch(self): + """Test that species definitions match between the two YAML files.""" + species1 = {s['name']: s for s in self.yaml1['species']} + species2 = {s['name']: s for s in self.yaml2['species']} + assert species1.keys() == species2.keys(), "Species names do not match." + + for name in species1: + s1 = species1[name] + s2 = species2[name] + + # Composition: ck2yaml uses int values, RMG uses float + assert {k: int(v) for k, v in s2['composition'].items()} == s1['composition'], \ + f"Composition mismatch for {name}." + + # Thermo model + assert s1['thermo']['model'] == s2['thermo']['model'], \ + f"Thermo model mismatch for {name}." + + # Temperature ranges and polynomial data + # ck2yaml may collapse single-polynomial NASA7 (e.g. Ar) into one range + # while RMG always writes two polynomials with a midpoint temperature. + t_ranges1 = s1['thermo'].get('temperature-ranges', []) + t_ranges2 = s2['thermo'].get('temperature-ranges', []) + data1 = s1['thermo'].get('data', []) + data2 = s2['thermo'].get('data', []) + + if len(t_ranges1) == 2 and len(t_ranges2) == 3: + # ck2yaml collapsed to single polynomial; RMG has two identical ones + assert t_ranges1[0] == pytest.approx(t_ranges2[0], rel=1e-4), \ + f"Temperature range lower bound mismatch for {name}." + assert t_ranges1[1] == pytest.approx(t_ranges2[2], rel=1e-4), \ + f"Temperature range upper bound mismatch for {name}." + assert len(data1) == 1 and len(data2) == 2, \ + f"Expected 1 vs 2 polynomials for collapsed species {name}." + assert data1[0] == pytest.approx(data2[0], rel=1e-4), \ + f"Thermo polynomial mismatch for {name} (low range)." + assert data1[0] == pytest.approx(data2[1], rel=1e-4), \ + f"Thermo polynomial mismatch for {name} (high range should match low)." + else: + assert t_ranges1 == pytest.approx(t_ranges2, rel=1e-4), \ + f"Temperature ranges mismatch for {name}." + assert len(data1) == len(data2), \ + f"Number of thermo polynomial ranges differs for {name}." + for i, (poly1, poly2) in enumerate(zip(data1, data2)): + assert poly1 == pytest.approx(poly2, rel=1e-4), \ + f"Thermo polynomial {i} mismatch for {name}." + + # Transport data + assert ('transport' in s1) == ('transport' in s2), f"Transport data presence mismatch for {name}." + if 'transport' in s1 and 'transport' in s2: + t1 = s1['transport'] + t2 = s2['transport'] + assert t1['model'] == t2['model'], f"Transport model mismatch for {name}." + assert t1['geometry'] == t2['geometry'], f"Transport geometry mismatch for {name}." + assert t1.get('well-depth', 0) == pytest.approx( + t2.get('well-depth', 0), rel=1e-3 + ), f"Transport well-depth mismatch for {name}." + assert t1.get('diameter', 0) == pytest.approx( + t2.get('diameter', 0), rel=1e-3 + ), f"Transport diameter mismatch for {name}." + assert t1.get('polarizability', 0) == pytest.approx( + t2.get('polarizability', 0), rel=1e-3 + ), f"Transport polarizability mismatch for {name}." + assert t1.get('dipole', 0) == pytest.approx( + t2.get('dipole', 0), rel=1e-3 + ), f"Transport dipole mismatch for {name}." + assert t1.get('rotational-relaxation', 0) == pytest.approx( + t2.get('rotational-relaxation', 0), rel=1e-3 + ), f"Transport rotational-relaxation mismatch for {name}." + assert t1.get('note', '') == t2.get('note', ''), \ + f"Transport note mismatch for {name}." diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index a066fcb925..604f3e886a 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -31,12 +31,11 @@ Tests for rmgpy.yaml_cantera1 module. """ -import copy import os import pytest import numpy as np -import yaml +from cantera_yaml_comparer import CanteraYamlFileComparer from rmgpy.species import Species from rmgpy.reaction import Reaction from rmgpy.thermo import NASA, NASAPolynomial @@ -552,155 +551,6 @@ def test_can_instantiate(self): writer = CanteraWriter1() assert writer is not None -class CanteraYamlFileComparer: - """ - For comparing two Cantera YAML files. - This class provides methods to compare species and reactions between the two files. - - Args: - yaml_path_1: Path to the first YAML file, converted from Chemkin by ck2yaml. - yaml_path_2: Path to the second YAML file, written directly by RMG. - """ - yaml_path_1 = None - yaml_path_2 = None - - @pytest.fixture(autouse=True, scope="class") # loaded once per Class - def load_yaml_files(self, request): - """Load the two YAML files to be compared.""" - with open(request.cls.yaml_path_1, 'r') as file: - request.cls.yaml1 = yaml.safe_load(file) - with open(request.cls.yaml_path_2, 'r') as file: - request.cls.yaml2 = yaml.safe_load(file) - - @pytest.fixture(autouse=True) # runs before each test method - def copy_yaml_dicts(self): - """Make deep copies so tests can modify without affecting other tests.""" - self.yaml1 = copy.deepcopy(self.__class__.yaml1) - self.yaml2 = copy.deepcopy(self.__class__.yaml2) - - def testGeneratorsAsExpected(self): - "Check the two yaml files were generated by the expected tools (ck2yaml vs RMG)." - assert self.yaml1['generator'] == 'ck2yaml', "First YAML file should be generated by ck2yaml." - assert 'RMG' in self.yaml2['generator'], "Second YAML file should be generated by RMG." - - def testKeysMatch(self): - """Test that the top-level keys in both YAML files match, except those expected not to.""" - # Remove keys from ck2yaml output that are not present in RMG output - self.yaml1.pop('input-files', None) - self.yaml1.pop('cantera-version', None) - for model in [self.yaml1, self.yaml2]: - for phase in model['phases']: - for reactions_block in phase.get('reactions', []): # for multi-phase mechanisms, reactions are under each phase - assert reactions_block in model, f"Expected reactions block '{reactions_block}' not found in YAML file." - model.pop(reactions_block, None) # Remove reactions block to allow keys to match - assert self.yaml1.keys() == self.yaml2.keys(), "YAML files have different top-level keys." - - def testPhasesMatch(self): - """Test that the phase definitions in both YAML files match.""" - assert len(self.yaml1['phases']) == len(self.yaml2['phases']), "YAML files have different numbers of phases" - - for phase1, phase2 in zip(self.yaml1['phases'], self.yaml2['phases']): - assert phase1['name'] == phase2['name'], f"Phase names do not match: {phase1['name']} vs {phase2['name']}." - assert phase1['thermo'] == phase2['thermo'], f"Thermo definitions for phase {phase1['name']} do not match." - assert phase1.get('transport', '') == phase2.get('transport', ''), f"Transport definitions for phase {phase1['name']} do not match." - assert phase1.get('adjacent-phases', []) == phase2.get('adjacent-phases', []), f"Adjacent phases for phase {phase1['name']} do not match." - assert phase1.get('species', []) == phase2.get('species', []), f"Species lists for phase {phase1['name']} do not match." - assert phase1.get('reactions', []) == phase2.get('reactions', []), f"Reactions blocks for phase {phase1['name']} do not match." - # the ck2yaml has all elements in Titlecase, while RMG lets some isotopes be CI and OI (not Ci and Oi). - assert sorted(phase1.get('elements', [])) == sorted(e.title() for e in phase2.get('elements', [])), f"Element lists for phase {phase1['name']} do not match." - assert phase1.get('state', {}) == phase2.get('state', {}), f"State definitions for phase {phase1['name']} do not match." - - def testElementsMatch(self): - """Test that the element definitions in both YAML files match.""" - assert ('elements' in self.yaml1) == ('elements' in self.yaml2), "One YAML file has 'elements' block while the other does not." - ck2yaml_elements = sorted(self.yaml1.get('elements', []), key=lambda e: e['symbol']) - # Put symbol into Titlecase to match ck2yaml's formatting - rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2.get('elements', [])] - # Sort by the 'symbol' key. - rmg_elements = sorted(rmg_elements, key=lambda e: e['symbol']) - # Compare symbols exactly, and atomic weights approximately - assert [e['symbol'] for e in ck2yaml_elements] == [e['symbol'] for e in rmg_elements], \ - "YAML files have different element symbols." - assert [e['atomic-weight'] for e in ck2yaml_elements] == pytest.approx( - [e['atomic-weight'] for e in rmg_elements], abs=1e-3 - ), "YAML files have different element atomic weights." - - def testSpeciesMatch(self): - """Test that species definitions match between the two YAML files.""" - species1 = {s['name']: s for s in self.yaml1['species']} - species2 = {s['name']: s for s in self.yaml2['species']} - assert species1.keys() == species2.keys(), "Species names do not match." - - for name in species1: - s1 = species1[name] - s2 = species2[name] - - # Composition: ck2yaml uses int values, RMG uses float - assert {k: int(v) for k, v in s2['composition'].items()} == s1['composition'], \ - f"Composition mismatch for {name}." - - # Thermo model - assert s1['thermo']['model'] == s2['thermo']['model'], \ - f"Thermo model mismatch for {name}." - - # Temperature ranges and polynomial data - # ck2yaml may collapse single-polynomial NASA7 (e.g. Ar) into one range - # while RMG always writes two polynomials with a midpoint temperature. - t_ranges1 = s1['thermo'].get('temperature-ranges', []) - t_ranges2 = s2['thermo'].get('temperature-ranges', []) - data1 = s1['thermo'].get('data', []) - data2 = s2['thermo'].get('data', []) - - if len(t_ranges1) == 2 and len(t_ranges2) == 3: - # ck2yaml collapsed to single polynomial; RMG has two identical ones - assert t_ranges1[0] == pytest.approx(t_ranges2[0], rel=1e-4), \ - f"Temperature range lower bound mismatch for {name}." - assert t_ranges1[1] == pytest.approx(t_ranges2[2], rel=1e-4), \ - f"Temperature range upper bound mismatch for {name}." - assert len(data1) == 1 and len(data2) == 2, \ - f"Expected 1 vs 2 polynomials for collapsed species {name}." - assert data1[0] == pytest.approx(data2[0], rel=1e-4), \ - f"Thermo polynomial mismatch for {name} (low range)." - assert data1[0] == pytest.approx(data2[1], rel=1e-4), \ - f"Thermo polynomial mismatch for {name} (high range should match low)." - else: - assert t_ranges1 == pytest.approx(t_ranges2, rel=1e-4), \ - f"Temperature ranges mismatch for {name}." - assert len(data1) == len(data2), \ - f"Number of thermo polynomial ranges differs for {name}." - for i, (poly1, poly2) in enumerate(zip(data1, data2)): - assert poly1 == pytest.approx(poly2, rel=1e-4), \ - f"Thermo polynomial {i} mismatch for {name}." - # Ideally thermo data would have notes. - - # RMG includes reference-pressure but ck2yaml does not (when it's non-default) - # (no assertion needed, just noting the known difference) - - # Transport data - assert ('transport' in s1) == ('transport' in s2), f"Transport data presence mismatch for {name}." - if 'transport' in s1 and 'transport' in s2: - t1 = s1['transport'] - t2 = s2['transport'] - assert t1['model'] == t2['model'], f"Transport model mismatch for {name}." - assert t1['geometry'] == t2['geometry'], f"Transport geometry mismatch for {name}." - assert t1.get('well-depth', 0) == pytest.approx( - t2.get('well-depth', 0), rel=1e-3 - ), f"Transport well-depth mismatch for {name}." - assert t1.get('diameter', 0) == pytest.approx( - t2.get('diameter', 0), rel=1e-3 - ), f"Transport diameter mismatch for {name}." - assert t1.get('polarizability', 0) == pytest.approx( - t2.get('polarizability', 0), rel=1e-3 - ), f"Transport polarizability mismatch for {name}." - assert t1.get('dipole', 0) == pytest.approx( - t2.get('dipole', 0), rel=1e-3 - ), f"Transport dipole mismatch for {name}." - assert t1.get('rotational-relaxation', 0) == pytest.approx( - t2.get('rotational-relaxation', 0), rel=1e-3 - ), f"Transport rotational-relaxation mismatch for {name}." - assert t1.get('note', '') == t2.get('note', ''), \ - f"Transport note mismatch for {name}." - @pytest.mark.skip(reason="These files are out of date and have been removed.") class TestPreviouslyWrittenCanteraYamlGasOnly(CanteraYamlFileComparer): """Tests for comparing previously written Cantera YAML files, gas-only mechanism. diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index db62040e53..301c550a94 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -29,13 +29,12 @@ import cantera as ct -import copy import os import shutil import numpy as np import pytest -import yaml +from cantera_yaml_comparer import CanteraYamlFileComparer from rmgpy.molecule import Atom, Molecule, get_element from rmgpy.species import Species from rmgpy.reaction import Reaction @@ -770,152 +769,6 @@ def test_species_to_dict_transport_note_always_present(self): assert d['transport']['note'] == "from GRI-Mech" -class CanteraYamlFileComparer: - """ - For comparing two Cantera YAML files. - This class provides methods to compare species and reactions between the two files. - - Args: - yaml_path_1: Path to the first YAML file, converted from Chemkin by ck2yaml. - yaml_path_2: Path to the second YAML file, written directly by RMG. - """ - yaml_path_1 = None - yaml_path_2 = None - - @pytest.fixture(autouse=True, scope="class") # loaded once per Class - def load_yaml_files(self, request): - """Load the two YAML files to be compared.""" - with open(request.cls.yaml_path_1, 'r') as file: - request.cls.yaml1 = yaml.safe_load(file) - with open(request.cls.yaml_path_2, 'r') as file: - request.cls.yaml2 = yaml.safe_load(file) - - @pytest.fixture(autouse=True) # runs before each test method - def copy_yaml_dicts(self): - """Make deep copies so tests can modify without affecting other tests.""" - self.yaml1 = copy.deepcopy(self.__class__.yaml1) - self.yaml2 = copy.deepcopy(self.__class__.yaml2) - - def testGeneratorsAsExpected(self): - "Check the two yaml files were generated by the expected tools (ck2yaml vs RMG)." - assert self.yaml1['generator'] == 'ck2yaml', "First YAML file should be generated by ck2yaml." - assert 'RMG' in self.yaml2['generator'], "Second YAML file should be generated by RMG." - - def testKeysMatch(self): - """Test that the top-level keys in both YAML files match, except those expected not to.""" - # Remove keys unique to each generator - self.yaml1.pop('input-files', None) - self.yaml1.pop('cantera-version', None) - self.yaml1.pop('date', None) - self.yaml2.pop('cantera-version', None) - self.yaml2.pop('description', None) - for model in [self.yaml1, self.yaml2]: - for phase in model['phases']: - for reactions_block in phase.get('reactions', []): - assert reactions_block in model, f"Expected reactions block '{reactions_block}' not found in YAML file." - model.pop(reactions_block, None) - assert self.yaml1.keys() == self.yaml2.keys(), "YAML files have different top-level keys." - - def testPhasesMatch(self): - """Test that the phase definitions in both YAML files match.""" - assert len(self.yaml1['phases']) == len(self.yaml2['phases']), "YAML files have different numbers of phases" - - for phase1, phase2 in zip(self.yaml1['phases'], self.yaml2['phases']): - assert phase1['name'] == phase2['name'], f"Phase names do not match: {phase1['name']} vs {phase2['name']}." - assert phase1['thermo'] == phase2['thermo'], f"Thermo definitions for phase {phase1['name']} do not match." - assert phase1.get('transport', '') == phase2.get('transport', ''), f"Transport definitions for phase {phase1['name']} do not match." - assert phase1.get('adjacent-phases', []) == phase2.get('adjacent-phases', []), f"Adjacent phases for phase {phase1['name']} do not match." - assert phase1.get('species', []) == phase2.get('species', []), f"Species lists for phase {phase1['name']} do not match." - assert phase1.get('reactions', []) == phase2.get('reactions', []), f"Reactions blocks for phase {phase1['name']} do not match." - # the ck2yaml has all elements in Titlecase, while RMG lets some isotopes be CI and OI (not Ci and Oi). - assert sorted(phase1.get('elements', [])) == sorted(e.title() for e in phase2.get('elements', [])), f"Element lists for phase {phase1['name']} do not match." - assert phase1.get('state', {}) == phase2.get('state', {}), f"State definitions for phase {phase1['name']} do not match." - - def testElementsMatch(self): - """Test that the element definitions in both YAML files match.""" - assert ('elements' in self.yaml1) == ('elements' in self.yaml2), "One YAML file has an 'elements' block while the other does not." - ck2yaml_elements = sorted(self.yaml1.get('elements', []), key=lambda e: e['symbol']) - # Put symbol into Titlecase to match ck2yaml's formatting - rmg_elements = [{'symbol': e['symbol'].title(), 'atomic-weight': e['atomic-weight']} for e in self.yaml2.get('elements', [])] - rmg_elements = sorted(rmg_elements, key=lambda e: e['symbol']) - # Compare symbols exactly, and atomic weights approximately - assert [e['symbol'] for e in ck2yaml_elements] == [e['symbol'] for e in rmg_elements], \ - "YAML files have different element symbols." - assert [e['atomic-weight'] for e in ck2yaml_elements] == pytest.approx( - [e['atomic-weight'] for e in rmg_elements], abs=1e-3 - ), "YAML files have different element atomic weights." - - def testSpeciesMatch(self): - """Test that species definitions match between the two YAML files.""" - species1 = {s['name']: s for s in self.yaml1['species']} - species2 = {s['name']: s for s in self.yaml2['species']} - assert species1.keys() == species2.keys(), "Species names do not match." - - for name in species1: - s1 = species1[name] - s2 = species2[name] - - # Composition: ck2yaml uses int values, RMG uses float - assert {k: int(v) for k, v in s2['composition'].items()} == s1['composition'], \ - f"Composition mismatch for {name}." - - # Thermo model - assert s1['thermo']['model'] == s2['thermo']['model'], \ - f"Thermo model mismatch for {name}." - - # Temperature ranges and polynomial data - t_ranges1 = s1['thermo'].get('temperature-ranges', []) - t_ranges2 = s2['thermo'].get('temperature-ranges', []) - data1 = s1['thermo'].get('data', []) - data2 = s2['thermo'].get('data', []) - - if len(t_ranges1) == 2 and len(t_ranges2) == 3: - # ck2yaml collapsed to single polynomial; RMG has two identical ones - assert t_ranges1[0] == pytest.approx(t_ranges2[0], rel=1e-4), \ - f"Temperature range lower bound mismatch for {name}." - assert t_ranges1[1] == pytest.approx(t_ranges2[2], rel=1e-4), \ - f"Temperature range upper bound mismatch for {name}." - assert len(data1) == 1 and len(data2) == 2, \ - f"Expected 1 vs 2 polynomials for collapsed species {name}." - assert data1[0] == pytest.approx(data2[0], rel=1e-4), \ - f"Thermo polynomial mismatch for {name} (low range)." - assert data1[0] == pytest.approx(data2[1], rel=1e-4), \ - f"Thermo polynomial mismatch for {name} (high range should match low)." - else: - assert t_ranges1 == pytest.approx(t_ranges2, rel=1e-4), \ - f"Temperature ranges mismatch for {name}." - assert len(data1) == len(data2), \ - f"Number of thermo polynomial ranges differs for {name}." - for i, (poly1, poly2) in enumerate(zip(data1, data2)): - assert poly1 == pytest.approx(poly2, rel=1e-4), \ - f"Thermo polynomial {i} mismatch for {name}." - - # Transport data - assert ('transport' in s1) == ('transport' in s2), f"Transport data presence mismatch for {name}." - if 'transport' in s1 and 'transport' in s2: - t1 = s1['transport'] - t2 = s2['transport'] - assert t1['model'] == t2['model'], f"Transport model mismatch for {name}." - assert t1['geometry'] == t2['geometry'], f"Transport geometry mismatch for {name}." - assert t1.get('well-depth', 0) == pytest.approx( - t2.get('well-depth', 0), rel=1e-3 - ), f"Transport well-depth mismatch for {name}." - assert t1.get('diameter', 0) == pytest.approx( - t2.get('diameter', 0), rel=1e-3 - ), f"Transport diameter mismatch for {name}." - assert t1.get('polarizability', 0) == pytest.approx( - t2.get('polarizability', 0), rel=1e-3 - ), f"Transport polarizability mismatch for {name}." - assert t1.get('dipole', 0) == pytest.approx( - t2.get('dipole', 0), rel=1e-3 - ), f"Transport dipole mismatch for {name}." - assert t1.get('rotational-relaxation', 0) == pytest.approx( - t2.get('rotational-relaxation', 0), rel=1e-3 - ), f"Transport rotational-relaxation mismatch for {name}." - assert t1.get('note', '') == t2.get('note', ''), \ - f"Transport note mismatch for {name}." - - class TestRecentlyGeneratedCanteraYaml2GasOnly(CanteraYamlFileComparer): """Tests for comparing recently generated Cantera YAML files from cantera2, gas-only mechanism. From 463a09be26c5e991185e7be7e5aca4d69f5f0e96 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 10:14:17 -0400 Subject: [PATCH 53/55] Harden the TestRecentlyGeneratedCanteraYaml*GasOnly tests. If we can't find the test files: 1. if the functional test that should have made them has been collected, e.g. you're running `make test-all` or in the CI runner, then this counts as a failure. 2. if the test that should have made them has not been collected, e.g. you're just running this test on its own, or with `make test` then just mark the test as a "skip" and don't fail. --- test/rmgpy/yaml_cantera1Test.py | 38 +++++++++++++++++++++------------ test/rmgpy/yaml_cantera2Test.py | 33 ++++++++++++++++++---------- 2 files changed, 46 insertions(+), 25 deletions(-) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 604f3e886a..5f76e0b34f 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -562,7 +562,7 @@ class TestPreviouslyWrittenCanteraYamlGasOnly(CanteraYamlFileComparer): yaml_path_1 = os.path.join(test_data_folder, 'chemkin/chem37.yaml') yaml_path_2 = os.path.join(test_data_folder, 'cantera1/chem37.yaml') -class TestRecentlyGeneratedCanteraYamlGasOnly(CanteraYamlFileComparer): +class TestRecentlyGeneratedCanteraYaml1GasOnly(CanteraYamlFileComparer): """Tests for comparing recently generated Cantera YAML files, gas-only mechanism. These are generated on the fly in the mainTest.py functional test and stored in the testing data directory. @@ -571,20 +571,30 @@ class TestRecentlyGeneratedCanteraYamlGasOnly(CanteraYamlFileComparer): @pytest.fixture(autouse=True, scope="class") def find_recent_files(self, request): - """Find the YAML files generated by mainTest.""" - cantera_dir = os.path.join(self.test_data_folder, 'cantera1') - chemkin_dir = os.path.join(self.test_data_folder, 'ck2yaml') - - if not os.path.exists(cantera_dir) or not os.path.exists(chemkin_dir): - pytest.skip("YAML test data directories not found. Run mainTest first.") - - # Look for specifically named files from mainTest - cantera_file = os.path.join(cantera_dir, 'from_main_test.yaml') - chemkin_file = os.path.join(chemkin_dir, 'from_main_test.yaml') - - if not os.path.exists(cantera_file) or not os.path.exists(chemkin_file): + """ + Find the YAML files generated by mainTest. + """ + cantera_file = os.path.join(self.test_data_folder, 'cantera1', 'from_main_test.yaml') + chemkin_file = os.path.join(self.test_data_folder, 'ck2yaml', 'from_main_test.yaml') + + if not (os.path.exists(cantera_file) and os.path.exists(chemkin_file)): + # If mainTest's copy step was collected for this pytest session but the + # files are still missing, treat that as a failure rather than a skip — + # it means mainTest ran but didn't produce the expected output. + # (if using pytest-randomly or pytest-ordering to reorder them this will need altering). + main_test_collected = any( + item.name == "test_cantera_input_files_match_chemkin_later" + for item in request.session.items + ) + if main_test_collected: + pytest.fail( + "from_main_test.yaml files missing even though mainTest's " + "copy step was collected — it likely failed before copying." + ) + # If mainTest wasn't collected, it's likely that we're running this test + # in isolation, so skip without failing. pytest.skip("from_main_test.yaml files not found. Run mainTest first.") - + request.cls.yaml_path_1 = chemkin_file request.cls.yaml_path_2 = cantera_file diff --git a/test/rmgpy/yaml_cantera2Test.py b/test/rmgpy/yaml_cantera2Test.py index 301c550a94..73c673bc8e 100644 --- a/test/rmgpy/yaml_cantera2Test.py +++ b/test/rmgpy/yaml_cantera2Test.py @@ -778,17 +778,28 @@ class TestRecentlyGeneratedCanteraYaml2GasOnly(CanteraYamlFileComparer): @pytest.fixture(autouse=True, scope="class") def find_recent_files(self, request): - """Find the YAML files generated by mainTest.""" - cantera_dir = os.path.join(self.test_data_folder, 'cantera2') - chemkin_dir = os.path.join(self.test_data_folder, 'ck2yaml') - - if not os.path.exists(cantera_dir) or not os.path.exists(chemkin_dir): - pytest.skip("YAML test data directories not found. Run mainTest first.") - - cantera_file = os.path.join(cantera_dir, 'from_main_test.yaml') - chemkin_file = os.path.join(chemkin_dir, 'from_main_test.yaml') - - if not os.path.exists(cantera_file) or not os.path.exists(chemkin_file): + """ + Find the YAML files generated by mainTest. + """ + cantera_file = os.path.join(self.test_data_folder, 'cantera2', 'from_main_test.yaml') + chemkin_file = os.path.join(self.test_data_folder, 'ck2yaml', 'from_main_test.yaml') + + if not (os.path.exists(cantera_file) and os.path.exists(chemkin_file)): + # If mainTest's copy step was collected for this pytest session but the + # files are still missing, treat that as a failure rather than a skip — + # it means mainTest ran but didn't produce the expected output. + # (if using pytest-randomly or pytest-ordering to reorder them this will need altering). + main_test_collected = any( + item.name == "test_cantera_input_files_match_chemkin_later" + for item in request.session.items + ) + if main_test_collected: + pytest.fail( + "from_main_test.yaml files missing even though mainTest's " + "copy step was collected — it likely failed before copying." + ) + # If mainTest wasn't collected, it's likely that we're running this test + # in isolation, so skip without failing. pytest.skip("from_main_test.yaml files not found. Run mainTest first.") request.cls.yaml_path_1 = chemkin_file From 99d0766367eef0c3fdab3b47cb168b76a0616cd5 Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 10:17:11 -0400 Subject: [PATCH 54/55] Remove some defunct outdated tests. --- test/rmgpy/yaml_cantera1Test.py | 33 +++++++++++++-------------------- 1 file changed, 13 insertions(+), 20 deletions(-) diff --git a/test/rmgpy/yaml_cantera1Test.py b/test/rmgpy/yaml_cantera1Test.py index 5f76e0b34f..f5c6e761f8 100644 --- a/test/rmgpy/yaml_cantera1Test.py +++ b/test/rmgpy/yaml_cantera1Test.py @@ -551,16 +551,6 @@ def test_can_instantiate(self): writer = CanteraWriter1() assert writer is not None -@pytest.mark.skip(reason="These files are out of date and have been removed.") -class TestPreviouslyWrittenCanteraYamlGasOnly(CanteraYamlFileComparer): - """Tests for comparing previously written Cantera YAML files, gas-only mechanism. - - These are stored in the testing data directory. - """ - test_data_folder='test/rmgpy/test_data/yaml_writer_data/' - # generated on the fly in recent functional test - yaml_path_1 = os.path.join(test_data_folder, 'chemkin/chem37.yaml') - yaml_path_2 = os.path.join(test_data_folder, 'cantera1/chem37.yaml') class TestRecentlyGeneratedCanteraYaml1GasOnly(CanteraYamlFileComparer): """Tests for comparing recently generated Cantera YAML files, gas-only mechanism. @@ -598,13 +588,16 @@ def find_recent_files(self, request): request.cls.yaml_path_1 = chemkin_file request.cls.yaml_path_2 = cantera_file -@pytest.mark.skip(reason="These files are out of date and have been removed.") -class TestPreviouslyWrittenCanteraYamlWithSurface(CanteraYamlFileComparer): - """Tests for comparing previously written Cantera YAML files, with surface mechanism. - - These are stored in the testing data directory. - """ - test_data_folder='test/rmgpy/test_data/yaml_writer_data/' - # saved by Prosper in earlier commit - yaml_path_1 = os.path.join(test_data_folder, 'chemkin/chem0047-gas.yaml') - yaml_path_2 = os.path.join(test_data_folder, 'cantera1/chem47.yaml') +# This is kept here as an example of how to write a test comparing previously generated YAML files, +# but the files themselves are now out of date and have been removed, +# so the test is skipped and the class is commented out to avoid confusion. +# @pytest.mark.skip(reason="These files are out of date and have been removed.") +# class TestPreviouslyWrittenCanteraYamlWithSurface(CanteraYamlFileComparer): +# """Tests for comparing previously written Cantera YAML files. + +# These are stored in the testing data directory. +# """ +# test_data_folder='test/rmgpy/test_data/yaml_writer_data/' +# # saved by Prosper in earlier commit +# yaml_path_1 = os.path.join(test_data_folder, 'chemkin/chem1.yaml') +# yaml_path_2 = os.path.join(test_data_folder, 'cantera1/chem1.yaml') From 41e864833789868765069d7b7a5046524594a1ca Mon Sep 17 00:00:00 2001 From: Richard West Date: Fri, 22 May 2026 13:34:18 -0400 Subject: [PATCH 55/55] Fix testKeysMatch: pop header metadata from both yamls, not just yaml1. The previous union-of-pops version stripped 'date' only from ck2yaml output. Writer 1 also emits a 'date' header line so writer 1's date survived on yaml2, producing a spurious key mismatch. Switch to popping every known header field from both yamls in one loop. Also expand the assertion message to print the symmetric-difference key sets, so any future mismatch is self-diagnosing. Co-Authored-By: Claude Opus 4.7 (1M context) --- test/rmgpy/cantera_yaml_comparer.py | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/test/rmgpy/cantera_yaml_comparer.py b/test/rmgpy/cantera_yaml_comparer.py index 7e73fcae92..4a4a438cd4 100644 --- a/test/rmgpy/cantera_yaml_comparer.py +++ b/test/rmgpy/cantera_yaml_comparer.py @@ -73,19 +73,26 @@ def testGeneratorsAsExpected(self): def testKeysMatch(self): """Test that the top-level keys in both YAML files match, except those expected not to.""" - # Remove keys unique to each generator. dict.pop(key, None) is a no-op - # when the key is absent, so it is safe to pop the union across both writers. - self.yaml1.pop('input-files', None) - self.yaml1.pop('cantera-version', None) - self.yaml1.pop('date', None) - self.yaml2.pop('cantera-version', None) - self.yaml2.pop('description', None) + # Strip header metadata that any of {ck2yaml, writer 1, writer 2} emits but + # the others don't. Popping from both yamls (dict.pop(key, None) is a no-op + # when absent) avoids per-writer special-casing and stays correct if a + # writer later adds or drops one of these fields. + metadata_keys = ('input-files', 'cantera-version', 'date', 'description') + for key in metadata_keys: + self.yaml1.pop(key, None) + self.yaml2.pop(key, None) for model in [self.yaml1, self.yaml2]: for phase in model['phases']: for reactions_block in phase.get('reactions', []): # for multi-phase mechanisms, reactions are under each phase assert reactions_block in model, f"Expected reactions block '{reactions_block}' not found in YAML file." model.pop(reactions_block, None) # Remove reactions block to allow keys to match - assert self.yaml1.keys() == self.yaml2.keys(), "YAML files have different top-level keys." + only_in_yaml1 = set(self.yaml1) - set(self.yaml2) + only_in_yaml2 = set(self.yaml2) - set(self.yaml1) + assert not (only_in_yaml1 or only_in_yaml2), ( + f"YAML files have different top-level keys. " + f"Only in yaml1 (ck2yaml): {sorted(only_in_yaml1)}; " + f"only in yaml2 (RMG): {sorted(only_in_yaml2)}." + ) def testPhasesMatch(self): """Test that the phase definitions in both YAML files match."""