diff --git a/interfaces/cython/cantera/ck2cti.py b/interfaces/cython/cantera/ck2cti.py index 4aa289320e..056a8439b8 100644 --- a/interfaces/cython/cantera/ck2cti.py +++ b/interfaces/cython/cantera/ck2cti.py @@ -888,6 +888,7 @@ def __init__(self): self.warning_as_error = True self.elements = [] + self.element_weights = {} # for custom elements only self.speciesList = [] self.speciesDict = {} self.reactions = [] @@ -939,6 +940,16 @@ def getRateConstantUnits(self, length_dims, length_units, quantity_dims, 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 @@ def readline(): 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 @@ def writeCTI(self, header=None, name='gas', transportModel='Mix', 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 ecc6961374..b9c409bd83 100644 --- a/interfaces/cython/cantera/test/test_convert.py +++ b/interfaces/cython/cantera/test/test_convert.py @@ -357,6 +357,15 @@ def test_reaction_comments2(self): 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 0000000000..fcc0ed6ef7 --- /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