[Python] Add access to input data for Solution objects

This commit is contained in:
Ray Speth
2020-01-21 17:51:54 -05:00
committed by Ingmar Schoegl
parent 17497d0528
commit b01c8b4e3f
3 changed files with 52 additions and 0 deletions

View File

@@ -163,6 +163,8 @@ cdef extern from "cantera/thermo/ThermoPhase.h" namespace "Cantera":
# miscellaneous
string type()
string phaseOfMatter() except +translate_exception
CxxAnyMap& input()
void getParameters(CxxAnyMap&) except +translate_exception
string report(cbool, double) except +translate_exception
cbool hasPhaseTransition()
cbool isPure()
@@ -470,6 +472,7 @@ cdef extern from "cantera/kinetics/Kinetics.h" namespace "Cantera":
void addReaction(shared_ptr[CxxReaction]) except +translate_exception
void modifyReaction(int, shared_ptr[CxxReaction]) except +translate_exception
void invalidateCache() except +translate_exception
void getParameters(CxxAnyMap&) except +translate_exception
shared_ptr[CxxReaction] reaction(size_t) except +translate_exception
cbool isReversible(int) except +translate_exception
@@ -495,6 +498,7 @@ cdef extern from "cantera/transport/TransportBase.h" namespace "Cantera":
cdef cppclass CxxTransport "Cantera::Transport":
CxxTransport(CxxThermoPhase*)
string transportType()
void getParameters(CxxAnyMap&) except +translate_exception
double viscosity() except +translate_exception
double thermalConductivity() except +translate_exception
double electricalConductivity() except +translate_exception

View File

@@ -223,6 +223,17 @@ cdef class _SolutionBase:
for reaction in reactions:
self.kinetics.addReaction(reaction._reaction)
property input_data:
def __get__(self):
cdef CxxAnyMap params
if self.thermo:
self.thermo.getParameters(params)
if self.kinetics:
self.kinetics.getParameters(params)
if self.transport:
self.transport.getParameters(params)
return mergeAnyMap(params, self.thermo.input())
def __getitem__(self, selection):
copy = self.__class__(origin=self)
if isinstance(selection, slice):

View File

@@ -422,3 +422,40 @@ class TestRestorePureFluid(utilities.CanteraTest):
b = ct.SolutionArray(self.water)
b.restore_data(data)
check(a, b)
class TestSolutionSerialization(utilities.CanteraTest):
def test_input_data_simple(self):
gas = ct.Solution('h2o2.yaml')
data = gas.input_data
self.assertEqual(data['name'], 'ohmech')
self.assertEqual(data['thermo'], 'ideal-gas')
self.assertEqual(data['kinetics'], 'gas')
self.assertEqual(data['transport'], 'mixture-averaged')
def test_input_data_state(self):
gas = ct.Solution('h2o2.yaml')
data = gas.input_data
self.assertEqual(gas.T, data['state']['T'])
self.assertEqual(gas.density, data['state']['density'])
gas.TP = 500, 3.14e5
data = gas.input_data
self.assertEqual(gas.T, data['state']['T'])
self.assertEqual(gas.density, data['state']['density'])
def test_input_data_custom(self):
gas = ct.Solution('ideal-gas.yaml')
data = gas.input_data
self.assertEqual(data['custom-field']['first'], True)
self.assertEqual(data['custom-field']['last'], [100, 200, 300])
def test_input_data_debye_huckel(self):
soln = ct.Solution('thermo-models.yaml', 'debye-huckel-B-dot-ak')
data = soln.input_data
self.assertEqual(data['thermo'], 'Debye-Huckel')
act_data = data['activity-data']
self.assertEqual(act_data['model'], 'B-dot-with-variable-a')
self.assertEqual(act_data['default-ionic-radius'], 4e-10)
self.assertNotIn('kinetics', data)
self.assertNotIn('transport', data)