diff --git a/interfaces/cython/cantera/_cantera.pxd b/interfaces/cython/cantera/_cantera.pxd index a9aa4c10e..b5209ca09 100644 --- a/interfaces/cython/cantera/_cantera.pxd +++ b/interfaces/cython/cantera/_cantera.pxd @@ -157,10 +157,17 @@ cdef extern from "cantera/transport/TransportBase.h" namespace "Cantera": cdef cppclass CxxTransport "Cantera::Transport": CxxTransport(CxxThermoPhase*) double viscosity() except + + double thermalConductivity() except + + cdef extern from "cantera/transport/DustyGasTransport.h" namespace "Cantera": cdef cppclass CxxDustyGasTransport "Cantera::DustyGasTransport": void setPorosity(double) except + + void setTortuosity(double) except + + void setMeanPoreRadius(double) except + + void setMeanParticleDiameter(double) except + + void setPermeability(double) except + + cdef extern from "cantera/equil/MultiPhase.h" namespace "Cantera": cdef cppclass CxxMultiPhase "Cantera::MultiPhase": @@ -315,6 +322,15 @@ cdef extern from "wrappers.h": cdef void kin_getDestructionRates(CxxKinetics*, double*) except + cdef void kin_getNetProductionRates(CxxKinetics*, double*) except + + # Transport properties + cdef void tran_getMixDiffCoeffs(CxxTransport*, double*) except + + cdef void tran_getMixDiffCoeffsMass(CxxTransport*, double*) except + + cdef void tran_getMixDiffCoeffsMole(CxxTransport*, double*) except + + cdef void tran_getThermalDiffCoeffs(CxxTransport*, double*) except + + + cdef void tran_getMultiDiffCoeffs(CxxTransport*, size_t, double*) except + + cdef void tran_getBinaryDiffCoeffs(CxxTransport*, size_t, double*) except + + cdef string stringify(x) diff --git a/interfaces/cython/cantera/transport.pyx b/interfaces/cython/cantera/transport.pyx index a44ca2ce5..bfff53dd6 100644 --- a/interfaces/cython/cantera/transport.pyx +++ b/interfaces/cython/cantera/transport.pyx @@ -1,3 +1,24 @@ +ctypedef void (*transportMethod1d)(CxxTransport*, double*) except + +ctypedef void (*transportMethod2d)(CxxTransport*, size_t, double*) except + + +# NOTE: These cdef functions cannot be members of Transport because they would +# cause "layout conflicts" when creating derived classes with multiple bases, +# e.g. class Solution. [Cython 0.16] +cdef np.ndarray get_transport_1d(Transport tran, transportMethod1d method): + cdef np.ndarray[np.double_t, ndim=1] data = np.empty(tran.thermo.nSpecies()) + method(tran.transport, &data[0]) + if tran._selectedSpecies.size: + return data[tran._selectedSpecies] + else: + return data + +cdef np.ndarray get_transport_2d(Transport tran, transportMethod2d method): + cdef size_t kk = tran.thermo.nSpecies() + cdef np.ndarray[np.double_t, ndim=2] data = np.empty((kk, kk)) + method(tran.transport, kk, &data[0,0]) + return data + + cdef class Transport(_SolutionBase): def __init__(self, *args, **kwargs): if self.transport == NULL: @@ -8,10 +29,56 @@ cdef class Transport(_SolutionBase): def __get__(self): return self.transport.viscosity() + property thermalConductivity: + def __get__(self): + return self.transport.thermalConductivity() + + property mixDiffCoeffs: + def __get__(self): + return get_transport_1d(self, tran_getMixDiffCoeffs) + + property mixDiffCoeffsMass: + def __get__(self): + return get_transport_1d(self, tran_getMixDiffCoeffsMass) + + property mixDiffCoeffsMole: + def __get__(self): + return get_transport_1d(self, tran_getMixDiffCoeffsMole) + + property thermalDiffCoeffs: + def __get__(self): + return get_transport_1d(self, tran_getThermalDiffCoeffs) + + property multiDiffCoeffs: + def __get__(self): + return get_transport_2d(self, tran_getMultiDiffCoeffs) + + property binaryDiffCoeffs: + def __get__(self): + return get_transport_2d(self, tran_getBinaryDiffCoeffs) + + cdef class DustyGasTransport(Transport): def __init__(self, *args, **kwargs): self.transport = newTransportMgr(stringify("DustyGas"), self.thermo) super().__init__(*args, **kwargs) - def setPorosity(self, value): - (self.transport).setPorosity(value) + property porosity: + def __set__(self, value): + (self.transport).setPorosity(value) + + property tortuosity: + def __set__(self, value): + (self.transport).setTortuosity(value) + + property meanPoreRadius: + def __set__(self, value): + (self.transport).setMeanPoreRadius(value) + + property meanParticleDiameter: + def __set__(self, value): + (self.transport).setMeanParticleDiameter(value) + + property permeability: + def __set__(self, value): + (self.transport).setPermeability(value) diff --git a/interfaces/cython/cantera/wrappers.h b/interfaces/cython/cantera/wrappers.h index 92deb41d9..c5dc3248d 100644 --- a/interfaces/cython/cantera/wrappers.h +++ b/interfaces/cython/cantera/wrappers.h @@ -1,11 +1,21 @@ #include "cantera/thermo/ThermoPhase.h" +#include "cantera/transport/TransportBase.h" +// Function which populates a 1D array #define ARRAY_FUNC(PREFIX, CLASS_NAME, FUNC_NAME) \ void PREFIX ## _ ## FUNC_NAME(Cantera::CLASS_NAME* object, double* data) \ { object->FUNC_NAME(data); } +// function which takes a stride as the first argument and populates a 2D array +#define ARRAY_FUNC2(PREFIX, CLASS_NAME, FUNC_NAME) \ + void PREFIX ## _ ## FUNC_NAME(Cantera::CLASS_NAME* object, size_t dim, double* data) \ + { object->FUNC_NAME(dim, data); } + + #define THERMO_1D(FUNC_NAME) ARRAY_FUNC(thermo, ThermoPhase, FUNC_NAME) #define KIN_1D(FUNC_NAME) ARRAY_FUNC(kin, Kinetics, FUNC_NAME) +#define TRANSPORT_1D(FUNC_NAME) ARRAY_FUNC(tran, Transport, FUNC_NAME) +#define TRANSPORT_2D(FUNC_NAME) ARRAY_FUNC2(tran, Transport, FUNC_NAME) THERMO_1D(getMassFractions) THERMO_1D(setMassFractions) @@ -47,3 +57,11 @@ KIN_1D(getDeltaSSEntropy) KIN_1D(getCreationRates) KIN_1D(getDestructionRates) KIN_1D(getNetProductionRates) + +TRANSPORT_1D(getMixDiffCoeffs) +TRANSPORT_1D(getMixDiffCoeffsMass) +TRANSPORT_1D(getMixDiffCoeffsMole) +TRANSPORT_1D(getThermalDiffCoeffs) + +TRANSPORT_2D(getMultiDiffCoeffs) +TRANSPORT_2D(getBinaryDiffCoeffs)