diff --git a/interfaces/cython/cantera/_cantera.pxd b/interfaces/cython/cantera/_cantera.pxd index 6f689d81a..eb5eb3fc9 100644 --- a/interfaces/cython/cantera/_cantera.pxd +++ b/interfaces/cython/cantera/_cantera.pxd @@ -176,6 +176,7 @@ cdef extern from "cantera/thermo/ThermoPhase.h" namespace "Cantera": void setState_UV(double, double) except + void setState_SP(double, double) except + void setState_SV(double, double) except + + void setState_RP(double, double) except + # molar thermodynamic properties: double enthalpy_mole() except + diff --git a/interfaces/cython/cantera/test/test_thermo.py b/interfaces/cython/cantera/test/test_thermo.py index 58c0dc980..ed31103c4 100644 --- a/interfaces/cython/cantera/test/test_thermo.py +++ b/interfaces/cython/cantera/test/test_thermo.py @@ -295,6 +295,13 @@ class TestThermoPhase(utilities.CanteraTest): self.phase.SVY = s1, v1, Y1 check_state(T1, rho1, Y1) + self.phase.TDY = T0, rho0, Y0 + self.phase.DPX = rho1, P1, X1 + check_state(T1, rho1, Y1) + + self.phase.TDY = T0, rho0, Y0 + self.phase.DPY = rho1, P1, Y1 + check_state(T1, rho1, Y1) def test_setState_mass(self): self.check_setters(T1 = 500.0, rho1 = 1.5, @@ -379,6 +386,20 @@ class TestThermoPhase(utilities.CanteraTest): self.assertNear(V, self.phase.v) self.assertArrayNear(X, self.phase.X) + D,P,X = self.phase.DPX + self.assertNear(D, self.phase.density) + self.assertNear(P, self.phase.P) + self.assertArrayNear(X, self.phase.X) + + D,P,Y = self.phase.DPY + self.assertNear(D, self.phase.density) + self.assertNear(P, self.phase.P) + self.assertArrayNear(Y, self.phase.Y) + + D,P = self.phase.DP + self.assertNear(D, self.phase.density) + self.assertNear(P, self.phase.P) + def test_getState_mass(self): self.phase.TDY = 350.0, 0.7, 'H2:0.1, H2O2:0.1, AR:0.8' self.check_getters() diff --git a/interfaces/cython/cantera/thermo.pyx b/interfaces/cython/cantera/thermo.pyx index be310a554..760b0f7f7 100644 --- a/interfaces/cython/cantera/thermo.pyx +++ b/interfaces/cython/cantera/thermo.pyx @@ -886,6 +886,35 @@ cdef class ThermoPhase(_SolutionBase): self.thermo.setState_UV(U / self._mass_factor(), V / self._mass_factor()) + property DP: + def __get__(self): + return self.density, self.P + def __set__(self, values): + assert len(values) == 2 + D = values[0] if values[0] is not None else self.density + P = values[1] if values[1] is not None else self.P + self.thermo.setState_RP(D*self._mass_factor(), P) + + property DPX: + def __get__(self): + return self.density, self.P, self.X + def __set__(self, values): + assert len(values) == 3 + D = values[0] if values[0] is not None else self.density + P = values[1] if values[1] is not None else self.P + self.X = values[2] + self.thermo.setState_RP(D*self._mass_factor(), P) + + property DPY: + def __get__(self): + return self.density, self.P, self.Y + def __set__(self, values): + assert len(values) == 3 + D = values[0] if values[0] is not None else self.density + P = values[1] if values[1] is not None else self.P + self.Y = values[2] + self.thermo.setState_RP(D*self._mass_factor(), P) + property HP: """Get/Set enthalpy [J/kg or J/kmol] and pressure [Pa].""" def __get__(self):