From 7d18120c4d4fb5d669611e69fa2c30be5c4cb9b2 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Wed, 22 Jun 2016 20:22:58 -0400 Subject: [PATCH] [ck2cti] Allow elements/isotopes with custom atomic weights Resolves #344 --- interfaces/cython/cantera/ck2cti.py | 24 ++++++++++++++++++- .../cython/cantera/test/test_convert.py | 9 +++++++ test/data/custom-elements.inp | 19 +++++++++++++++ 3 files changed, 51 insertions(+), 1 deletion(-) create mode 100644 test/data/custom-elements.inp diff --git a/interfaces/cython/cantera/ck2cti.py b/interfaces/cython/cantera/ck2cti.py index 4aa289320..056a8439b 100644 --- a/interfaces/cython/cantera/ck2cti.py +++ b/interfaces/cython/cantera/ck2cti.py @@ -888,6 +888,7 @@ class Parser(object): self.warning_as_error = True self.elements = [] + self.element_weights = {} # for custom elements only self.speciesList = [] self.speciesDict = {} self.reactions = [] @@ -939,6 +940,16 @@ class Parser(object): units = '1' + units return units + def addElement(self, element_string): + if '/' in element_string: + name, weight, _ = element_string.split('/') + weight = fortFloat(weight) + name = name.capitalize() + self.elements.append(name) + self.element_weights[name] = weight + else: + self.elements.append(element_string.capitalize()) + def readThermoEntry(self, lines, TintDefault): """ Read a thermodynamics entry for one species in a Chemkin-format file @@ -1469,12 +1480,14 @@ class Parser(object): break line, comment = readline() + # Normalize custom atomic weights + line = re.sub(r'\s*/\s*([0-9\.EeDd+-]+)\s*/', r'/\1/ ', line) tokens.extend(line.split()) for token in tokens: if token.upper() == 'END': break - self.elements.append(token.capitalize()) + self.addElement(token) elif tokens[0].upper().startswith('SPEC'): # List of species identifiers @@ -1875,6 +1888,15 @@ class Parser(object): lines.append(' initial_state=state(temperature=300.0, pressure=OneAtm))') lines.append('') + # Write data on custom elements + if self.element_weights: + lines.append(delimiterLine) + lines.append('# Element data') + lines.append(delimiterLine) + lines.append('') + for name,weight in self.element_weights.items(): + lines.append('element(symbol={0!r}, atomic_mass={1})'.format(name, weight)) + # Write the individual species data lines.append(delimiterLine) lines.append('# Species data') diff --git a/interfaces/cython/cantera/test/test_convert.py b/interfaces/cython/cantera/test/test_convert.py index ecc696137..b9c409bd8 100644 --- a/interfaces/cython/cantera/test/test_convert.py +++ b/interfaces/cython/cantera/test/test_convert.py @@ -357,6 +357,15 @@ class chemkinConverterTest(utilities.CanteraTest): self.assertIn('An end of line comment', text) self.assertIn('A comment after the last reaction', text) + def test_custom_element(self): + convertMech('../data/custom-elements.inp', + outName='custom-elements.cti', quiet=True) + gas = ct.Solution('custom-elements.cti') + self.assertEqual(gas.n_elements, 4) + self.assertNear(gas.atomic_weight(2), 13.003) + self.assertEqual(gas.n_atoms('ethane', 'C'), 2) + self.assertEqual(gas.n_atoms('CC', 'C'), 1) + self.assertEqual(gas.n_atoms('CC', 'Ci'), 1) class CtmlConverterTest(utilities.CanteraTest): def test_sofc(self): diff --git a/test/data/custom-elements.inp b/test/data/custom-elements.inp new file mode 100644 index 000000000..fcc0ed6ef --- /dev/null +++ b/test/data/custom-elements.inp @@ -0,0 +1,19 @@ +ELEMENTS + H C CI / 13.003 /AR +END + +SPECIES + ethane CC +END + +THERM ALL + 300.000 1000.000 5000.000 +ethane H 6 C 2 G100.000 5000.000 954.51 1 + 4.58979653E+00 1.41508345E-02-4.75965676E-06 8.60302658E-10-6.21723639E-14 2 +-1.27217512E+04-3.61719603E+00 3.78034545E+00-3.24275729E-03 5.52385248E-05 3 +-6.38587529E-08 2.28639901E-11-1.16203413E+04 5.21029844E+00 4 +CC H 6 C 1 CI1 G100.000 5000.000 954.51 1 + 4.58979542E+00 1.41508364E-02-4.75965787E-06 8.60302924E-10-6.21723861E-14 2 +-1.27217507E+04-2.92404261E+00 3.78034578E+00-3.24276131E-03 5.52385395E-05 3 +-6.38587729E-08 2.28639990E-11-1.16203414E+04 5.90344446E+00 4 +END