From 7520170f30272ebd55f6136d7a3447b6021e1710 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Wed, 25 Sep 2013 22:57:36 +0000 Subject: [PATCH] [Cython] Improve support for building derived Cython modules The .pxd file now contains declarations for all of the cdef classes, and is installed with the module. --- interfaces/cython/cantera/_cantera.pxd | 98 ++++++++++++++++++++++ interfaces/cython/cantera/mixture.pyx | 4 - interfaces/cython/cantera/onedim.pyx | 17 ---- interfaces/cython/cantera/reactionpath.pyx | 7 -- interfaces/cython/cantera/reactor.pyx | 3 - interfaces/cython/cantera/thermo.pyx | 3 - interfaces/cython/setup.py.in | 3 +- 7 files changed, 100 insertions(+), 35 deletions(-) diff --git a/interfaces/cython/cantera/_cantera.pxd b/interfaces/cython/cantera/_cantera.pxd index 0595f08fb..283eea156 100644 --- a/interfaces/cython/cantera/_cantera.pxd +++ b/interfaces/cython/cantera/_cantera.pxd @@ -564,6 +564,8 @@ cdef extern from "wrappers.h": cdef string stringify(x) +ctypedef void (*thermoMethod1d)(CxxThermoPhase*, double*) except + + cdef class _SolutionBase: cdef CxxThermoPhase* thermo cdef CxxKinetics* kinetics @@ -572,9 +574,28 @@ cdef class _SolutionBase: cdef np.ndarray _selected_species cdef object parent +cdef class ThermoPhase(_SolutionBase): + cdef double _mass_factor(self) + cdef double _mole_factor(self) + cpdef int element_index(self, element) except * + cpdef int species_index(self, species) except * + cdef np.ndarray _getArray1(self, thermoMethod1d method) + cdef void _setArray1(self, thermoMethod1d method, values) except * + +cdef class InterfacePhase(ThermoPhase): + cdef CxxSurfPhase* surf + cdef class Kinetics(_SolutionBase): pass +cdef class InterfaceKinetics(Kinetics): + pass + +cdef class Mixture: + cdef CxxMultiPhase* mix + cdef list _phases + cpdef int element_index(self, element) except * + cdef class Func1: cdef CxxFunc1* func cdef object callable @@ -591,6 +612,21 @@ cdef class Reactor(ReactorBase): cdef CxxReactor* reactor cdef object _kinetics +cdef class Reservoir(ReactorBase): + pass + +cdef class ConstPressureReactor(Reactor): + pass + +cdef class IdealGasReactor(Reactor): + pass + +cdef class IdealGasConstPressureReactor(Reactor): + pass + +cdef class FlowReactor(Reactor): + pass + cdef class WallSurface: cdef CxxWall* cxxwall cdef object wall @@ -613,3 +649,65 @@ cdef class FlowDevice: cdef str name cdef ReactorBase _upstream cdef ReactorBase _downstream + +cdef class MassFlowController(FlowDevice): + pass + +cdef class Valve(FlowDevice): + pass + +cdef class PressureController(FlowDevice): + pass + +cdef class ReactorNet: + cdef CxxReactorNet net + cdef list _reactors + +cdef class Domain1D: + cdef CxxDomain1D* domain + +cdef class Boundary1D(Domain1D): + cdef CxxBdry1D* boundary + cdef _SolutionBase phase + +cdef class Inlet1D(Boundary1D): + cdef CxxInlet1D* inlet + +cdef class Outlet1D(Boundary1D): + cdef CxxOutlet1D* outlet + +cdef class OutletReservoir1D(Boundary1D): + cdef CxxOutletRes1D* outlet + +cdef class SymmetryPlane1D(Boundary1D): + cdef CxxSymm1D* symm + +cdef class Surface1D(Boundary1D): + cdef CxxSurf1D* surf + +cdef class ReactingSurface1D(Boundary1D): + cdef CxxReactingSurf1D* surf + +cdef class _FlowBase(Domain1D): + cdef CxxStFlow* flow + cdef _SolutionBase gas + +cdef class FreeFlow(_FlowBase): + pass + +cdef class AxisymmetricStagnationFlow(_FlowBase): + pass + +cdef class Sim1D: + cdef CxxSim1D* sim + cdef readonly object domains + cdef object _initialized + cdef Func1 interrupt + +cdef class ReactionPathDiagram: + cdef CxxReactionPathDiagram diagram + cdef CxxReactionPathBuilder builder + cdef Kinetics kinetics + cdef str element + cdef pybool built + cdef CxxStringStream _log diff --git a/interfaces/cython/cantera/mixture.pyx b/interfaces/cython/cantera/mixture.pyx index 6668ed275..a26c772cf 100644 --- a/interfaces/cython/cantera/mixture.pyx +++ b/interfaces/cython/cantera/mixture.pyx @@ -27,10 +27,6 @@ cdef class Mixture: Each one stores its own state information locally, and synchronizes the phases objects whenever it requires phase properties. """ - - cdef CxxMultiPhase* mix - cdef list _phases - def __cinit__(self, phases): self.mix = new CxxMultiPhase() self._phases = [] diff --git a/interfaces/cython/cantera/onedim.pyx b/interfaces/cython/cantera/onedim.pyx index e27c648a4..8f6fa483f 100644 --- a/interfaces/cython/cantera/onedim.pyx +++ b/interfaces/cython/cantera/onedim.pyx @@ -8,7 +8,6 @@ except ImportError: from scipy.special import erf cdef class Domain1D: - cdef CxxDomain1D* domain def __cinit__(self, *args, **kwargs): self.domain = NULL @@ -169,9 +168,6 @@ cdef class Boundary1D(Domain1D): :param phase: The (gas) phase corresponding to the adjacent flow domain """ - cdef CxxBdry1D* boundary - cdef _SolutionBase phase - def __cinit__(self, *args, **kwargs): self.boundary = NULL @@ -238,7 +234,6 @@ cdef class Inlet1D(Boundary1D): domain - it must be either the leftmost or rightmost domain in a stack. """ - cdef CxxInlet1D* inlet def __cinit__(self, *args, **kwargs): self.inlet = new CxxInlet1D() self.boundary = (self.inlet) @@ -258,7 +253,6 @@ cdef class Outlet1D(Boundary1D): A one-dimensional outlet. An outlet imposes a zero-gradient boundary condition on the flow. """ - cdef CxxOutlet1D* outlet def __cinit__(self, *args, **kwargs): self.outlet = new CxxOutlet1D() self.boundary = (self.outlet) @@ -271,7 +265,6 @@ cdef class OutletReservoir1D(Boundary1D): """ A one-dimensional outlet into a reservoir. """ - cdef CxxOutletRes1D* outlet def __cinit__(self, *args, **kwargs): self.outlet = new CxxOutletRes1D() self.boundary = (self.outlet) @@ -282,7 +275,6 @@ cdef class OutletReservoir1D(Boundary1D): cdef class SymmetryPlane1D(Boundary1D): """A symmetry plane.""" - cdef CxxSymm1D* symm def __cinit__(self, *args, **kwargs): self.symm = new CxxSymm1D() self.boundary = (self.symm) @@ -293,7 +285,6 @@ cdef class SymmetryPlane1D(Boundary1D): cdef class Surface1D(Boundary1D): """A solid surface.""" - cdef CxxSurf1D* surf def __cinit__(self, *args, **kwargs): self.surf = new CxxSurf1D() self.boundary = (self.surf) @@ -304,7 +295,6 @@ cdef class Surface1D(Boundary1D): cdef class ReactingSurface1D(Boundary1D): """A reacting solid surface.""" - cdef CxxReactingSurf1D* surf def __cinit__(self, *args, **kwargs): self.surf = new CxxReactingSurf1D() self.boundary = (self.surf) @@ -328,8 +318,6 @@ cdef class ReactingSurface1D(Boundary1D): cdef class _FlowBase(Domain1D): """ Base class for 1D flow domains """ - cdef CxxStFlow* flow - cdef _SolutionBase gas def __cinit__(self, *args, **kwargs): self.flow = NULL @@ -451,11 +439,6 @@ cdef class Sim1D: Domains are ordered left-to-right, with domain number 0 at the left. """ - cdef CxxSim1D* sim - cdef readonly object domains - cdef object _initialized - cdef Func1 interrupt - def __cinit__(self, *args, **kwargs): self.sim = NULL diff --git a/interfaces/cython/cantera/reactionpath.pyx b/interfaces/cython/cantera/reactionpath.pyx index 1fc70f097..0ec119731 100644 --- a/interfaces/cython/cantera/reactionpath.pyx +++ b/interfaces/cython/cantera/reactionpath.pyx @@ -1,11 +1,4 @@ cdef class ReactionPathDiagram: - cdef CxxReactionPathDiagram diagram - cdef CxxReactionPathBuilder builder - cdef Kinetics kinetics - cdef str element - cdef pybool built - cdef CxxStringStream _log - def __init__(self, Kinetics kin, str element): """ Create a reaction path diagram for the fluxes of the element *element* diff --git a/interfaces/cython/cantera/reactor.pyx b/interfaces/cython/cantera/reactor.pyx index c5811c173..0780eeeff 100644 --- a/interfaces/cython/cantera/reactor.pyx +++ b/interfaces/cython/cantera/reactor.pyx @@ -712,9 +712,6 @@ cdef class ReactorNet: >>> reactor_network = ReactorNet([r1, r2]) >>> reactor_network.advance(time) """ - cdef CxxReactorNet net - cdef list _reactors - def __init__(self, reactors=()): self._reactors = [] # prevents premature garbage collection for R in reactors: diff --git a/interfaces/cython/cantera/thermo.pyx b/interfaces/cython/cantera/thermo.pyx index 9d4461e92..85994a847 100644 --- a/interfaces/cython/cantera/thermo.pyx +++ b/interfaces/cython/cantera/thermo.pyx @@ -2,8 +2,6 @@ cdef enum Thermasis: mass_basis = 0 molar_basis = 1 -ctypedef void (*thermoMethod1d)(CxxThermoPhase*, double*) except + - cdef class ThermoPhase(_SolutionBase): """ A phase with an equation of state. @@ -814,7 +812,6 @@ cdef class ThermoPhase(_SolutionBase): cdef class InterfacePhase(ThermoPhase): """ A class representing a surface or edge phase""" - cdef CxxSurfPhase* surf def __cinit__(self, *args, **kwargs): if self.thermo.eosType() not in (thermo_type_surf, thermo_type_edge): raise TypeError('Underlying ThermoPhase object is of the wrong type.') diff --git a/interfaces/cython/setup.py.in b/interfaces/cython/setup.py.in index 2a0c84535..e83b9f6f3 100644 --- a/interfaces/cython/setup.py.in +++ b/interfaces/cython/setup.py.in @@ -61,4 +61,5 @@ setup(name="Cantera", ext_modules = exts, package_data = {'cantera.data': ['*.*'], 'cantera.test.data': ['*.*'], - 'cantera.examples': ['*/*.*']}) + 'cantera.examples': ['*/*.*'], + 'cantera': ['*.pxd']})