[Python] Add ability to get/set species transport data

This commit is contained in:
Ray Speth 2015-05-02 23:08:58 -04:00
parent fd659c09ea
commit 184bff328d
4 changed files with 121 additions and 0 deletions

View file

@ -82,10 +82,13 @@ cdef extern from "cantera/thermo/SpeciesThermoFactory.h":
(int, double, double, double, double*) except +
cdef extern from "cantera/thermo/Species.h" namespace "Cantera":
cdef cppclass CxxTransportData "Cantera::TransportData"
cdef cppclass CxxSpecies "Cantera::Species":
CxxSpecies()
CxxSpecies(string, Composition)
shared_ptr[CxxSpeciesThermo] thermo
shared_ptr[CxxTransportData] transport
string name
Composition composition
@ -379,6 +382,24 @@ cdef extern from "cantera/transport/DustyGasTransport.h" namespace "Cantera":
void getMolarFluxes(double*, double*, double, double*) except +
cdef extern from "cantera/transport/TransportData.h" namespace "Cantera":
cdef cppclass CxxTransportData "Cantera::TransportData":
CxxTransportData()
cdef cppclass CxxGasTransportData "Cantera::GasTransportData" (CxxTransportData):
CxxGasTransportData()
CxxGasTransportData(string, double, double, double, double, double, double)
void setCustomaryUnits(string, double, double, double, double, double, double)
string geometry
double diameter
double well_depth
double dipole
double polarizability
double rotational_relaxation
double acentric_factor
cdef extern from "cantera/equil/MultiPhase.h" namespace "Cantera":
cdef cppclass CxxMultiPhase "Cantera::MultiPhase":
CxxMultiPhase()
@ -777,6 +798,11 @@ cdef class SpeciesThermo:
cdef CxxSpeciesThermo* spthermo
cdef _assign(self, shared_ptr[CxxSpeciesThermo] other)
cdef class GasTransportData:
cdef shared_ptr[CxxTransportData] _data
cdef CxxGasTransportData* data
cdef _assign(self, shared_ptr[CxxTransportData] other)
cdef class _SolutionBase:
cdef CxxThermoPhase* thermo
cdef CxxKinetics* kinetics

View file

@ -131,3 +131,29 @@ class TestDustyGas(utilities.CanteraTest):
# Not sure why the following condition is not satisfied:
# self.assertNear(sum(fluxes1) / sum(abs(fluxes1)), 0.0)
class TestTransportData(utilities.CanteraTest):
@classmethod
def setUpClass(cls):
cls.gas = ct.Solution('h2o2.xml')
cls.gas.X = 'H2O:0.6, H2:0.4'
def test_read(self):
tr = self.gas.species('H2').transport
self.assertEqual(tr.geometry, 'linear')
self.assertNear(tr.diameter, 2.92e-10)
self.assertNear(tr.well_depth, 38.0 * ct.boltzmann)
self.assertNear(tr.polarizability, 0.79e-30)
self.assertNear(tr.rotational_relaxation, 280)
def test_set_customary_units(self):
tr1 = ct.GasTransportData()
tr1.set_customary_units('nonlinear', 2.60, 572.40, 1.84, 0.0, 4.00)
tr2 = self.gas.species('H2O').transport
self.assertEqual(tr1.geometry, tr2.geometry)
self.assertNear(tr1.diameter, tr2.diameter)
self.assertNear(tr1.well_depth, tr2.well_depth)
self.assertNear(tr1.dipole, tr2.dipole)
self.assertNear(tr1.polarizability, tr2.polarizability)
self.assertNear(tr1.rotational_relaxation, tr2.rotational_relaxation)

View file

@ -123,6 +123,12 @@ cdef class Species:
def __set__(self, SpeciesThermo spthermo):
self.species.thermo = spthermo._spthermo
property transport:
def __get__(self):
data = GasTransportData(init=False)
data._assign(self.species.transport)
return data
cdef class ThermoPhase(_SolutionBase):
"""

View file

@ -16,6 +16,69 @@ cdef np.ndarray get_transport_2d(Transport tran, transportMethod2d method):
return data
cdef class GasTransportData:
def __cinit__(self, geometry='', diameter=-1, well_depth=-1,
dipole=0.0, polarizability=0.0, rotational_relaxation=0.0,
acentric_factor=0.0, *, init=True):
if init:
self._data.reset(new CxxGasTransportData(stringify(geometry),
diameter, well_depth, dipole, polarizability,
rotational_relaxation, acentric_factor))
self.data = <CxxGasTransportData*?>self._data.get()
cdef _assign(self, shared_ptr[CxxTransportData] other):
self._data = other
self.data = <CxxGasTransportData*?>self._data.get()
def set_customary_units(self, geometry, diameter, well_depth, dipole=0.0,
polarizability=0.0, rotational_relaxation=0.0,
acentric_factor=0.0):
self.data.setCustomaryUnits(stringify(geometry), diameter, well_depth,
dipole, polarizability, rotational_relaxation, acentric_factor)
property geometry:
def __get__(self):
return pystr(self.data.geometry)
def __set__(self, geometry):
self.data.geometry = stringify(geometry)
property diameter:
def __get__(self):
return self.data.diameter
def __set__(self, diameter):
self.data.diameter = diameter
property well_depth:
def __get__(self):
return self.data.well_depth
def __set__(self, well_depth):
self.data.well_depth = well_depth
property dipole:
def __get__(self):
return self.data.dipole
def __set__(self, dipole):
self.data.dipole = dipole
property polarizability:
def __get__(self):
return self.data.polarizability
def __set__(self, polarizability):
self.data.polarizability = polarizability
property rotational_relaxation:
def __get__(self):
return self.data.rotational_relaxation
def __set__(self, rotational_relaxation):
self.data.rotational_relaxation = rotational_relaxation
property acentric_factor:
def __get__(self):
return self.data.acentric_factor
def __set__(self, acentric_factor):
self.data.acentric_factor = acentric_factor
cdef class Transport(_SolutionBase):
"""
This class is used to compute transport properties for a phase of matter.