Added core Transport methods to Cython module

This commit is contained in:
Ray Speth 2012-09-06 19:59:39 +00:00
parent 44fe268615
commit a9132d1fc3
3 changed files with 103 additions and 2 deletions

View file

@ -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)

View file

@ -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):
(<CxxDustyGasTransport*>self.transport).setPorosity(value)
property porosity:
def __set__(self, value):
(<CxxDustyGasTransport*>self.transport).setPorosity(value)
property tortuosity:
def __set__(self, value):
(<CxxDustyGasTransport*>self.transport).setTortuosity(value)
property meanPoreRadius:
def __set__(self, value):
(<CxxDustyGasTransport*>self.transport).setMeanPoreRadius(value)
property meanParticleDiameter:
def __set__(self, value):
(<CxxDustyGasTransport*>self.transport).setMeanParticleDiameter(value)
property permeability:
def __set__(self, value):
(<CxxDustyGasTransport*>self.transport).setPermeability(value)

View file

@ -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)