mirror of
https://github.com/Cantera/cantera.git
synced 2025-02-25 18:55:29 -06:00
[ck2cti] Allow elements/isotopes with custom atomic weights
Resolves #344
This commit is contained in:
@@ -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')
|
||||
|
||||
@@ -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):
|
||||
|
||||
19
test/data/custom-elements.inp
Normal file
19
test/data/custom-elements.inp
Normal file
@@ -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
|
||||
Reference in New Issue
Block a user