diff --git a/interfaces/cython/cantera/_cantera.pxd b/interfaces/cython/cantera/_cantera.pxd index 5c84bc982..74a330347 100644 --- a/interfaces/cython/cantera/_cantera.pxd +++ b/interfaces/cython/cantera/_cantera.pxd @@ -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 diff --git a/interfaces/cython/cantera/test/test_transport.py b/interfaces/cython/cantera/test/test_transport.py index 090469737..17fb99db2 100644 --- a/interfaces/cython/cantera/test/test_transport.py +++ b/interfaces/cython/cantera/test/test_transport.py @@ -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) diff --git a/interfaces/cython/cantera/thermo.pyx b/interfaces/cython/cantera/thermo.pyx index 7987985a2..82bd4d334 100644 --- a/interfaces/cython/cantera/thermo.pyx +++ b/interfaces/cython/cantera/thermo.pyx @@ -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): """ diff --git a/interfaces/cython/cantera/transport.pyx b/interfaces/cython/cantera/transport.pyx index a6ef5fea1..eb7509f94 100644 --- a/interfaces/cython/cantera/transport.pyx +++ b/interfaces/cython/cantera/transport.pyx @@ -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 = self._data.get() + + cdef _assign(self, shared_ptr[CxxTransportData] other): + self._data = other + self.data = 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.