diff --git a/include/cantera/zeroD/ReactorNet.h b/include/cantera/zeroD/ReactorNet.h index 4393f45c5..83c3d1bb8 100644 --- a/include/cantera/zeroD/ReactorNet.h +++ b/include/cantera/zeroD/ReactorNet.h @@ -35,6 +35,11 @@ public: //! using the current mixture state as the initial condition. void setInitialTime(double time); + //! Get the maximum time step. + double maxTimeStep() { + return m_maxstep; + } + //! Set the maximum time step. void setMaxTimeStep(double maxstep); diff --git a/interfaces/cython/cantera/_cantera.pxd b/interfaces/cython/cantera/_cantera.pxd index 9fbd48b6c..67939086e 100644 --- a/interfaces/cython/cantera/_cantera.pxd +++ b/interfaces/cython/cantera/_cantera.pxd @@ -630,6 +630,7 @@ cdef extern from "cantera/zerodim.h" namespace "Cantera": void setTolerances(double, double) double rtol() double atol() + double maxTimeStep() void setMaxTimeStep(double) void setMaxErrTestFails(int) void setMaxSteps(int) diff --git a/interfaces/cython/cantera/reactor.pyx b/interfaces/cython/cantera/reactor.pyx index c35558281..bc0911ad2 100644 --- a/interfaces/cython/cantera/reactor.pyx +++ b/interfaces/cython/cantera/reactor.pyx @@ -761,11 +761,11 @@ cdef class MassFlowController(FlowDevice): .. math:: \dot m = \max(\dot m_0*g(t), 0.), - where :math:`\dot m_0` is a constant value and :math:`g(t)` is a function of + where :math:`\dot m_0` is a constant value and :math:`g(t)` is a function of time. Both :math:`\dot m_0` and :math:`g(t)` can be set individually by - the property `mass_flow_coeff` and the method `set_time_function`, - respectively. The method `set_mass_flow_rate` combines the former - into a single function. Note that if :math:`\dot m_0*g(t) < 0`, the mass flow + the property `mass_flow_coeff` and the method `set_time_function`, + respectively. The method `set_mass_flow_rate` combines the former + into a single function. Note that if :math:`\dot m_0*g(t) < 0`, the mass flow rate will be set to zero, since reversal of the flow direction is not allowed. Unlike a real mass flow controller, a MassFlowController object will @@ -805,7 +805,7 @@ cdef class MassFlowController(FlowDevice): Set the mass flow rate [kg/s] through this controller to be either a constant or an arbitrary function of time. See `Func1`. - Note that depending on the argument type, this method either changes + Note that depending on the argument type, this method either changes the property `mass_flow_coeff` or calls the `set_time_function` method. >>> mfc.set_mass_flow_rate(0.3) @@ -887,7 +887,7 @@ cdef class Valve(FlowDevice): Renamed to `set_pressure_function`. """ warnings.warn("To be removed after Cantera 2.5. " - "Renamed to `set_pressure_function` instead", DeprecationWarning) + "Renamed to 'set_pressure_function' instead", DeprecationWarning) self.set_pressure_function(k) @@ -909,8 +909,8 @@ cdef class Valve(FlowDevice): `set_pressure_function`. """ warnings.warn("To be removed after Cantera 2.5. " - "Use property `valve_coeff` and/or function " - "`set_pressure_function` instead.", DeprecationWarning) + "Use property 'valve_coeff' and/or function " + "'set_pressure_function' instead.", DeprecationWarning) if isinstance(k, _numbers.Real): self.valve_coeff = k @@ -936,7 +936,7 @@ cdef class PressureController(FlowDevice): .. math:: \dot m = \dot m_{\rm master} + K_v*f(P_1 - P_2) - where :math:`f` is the arbitrary function of a single argument. + where :math:`f` is the arbitrary function of a single argument. """ flowdevice_type = "PressureController" @@ -972,7 +972,7 @@ cdef class PressureController(FlowDevice): Replaced by property `pressure_coeff`. """ warnings.warn("To be removed after Cantera 2.5. " - "Use property `pressure_coeff` instead", DeprecationWarning) + "Use property 'pressure_coeff' instead", DeprecationWarning) (self.dev).setPressureCoeff(k) def set_master(self, FlowDevice d): @@ -1052,11 +1052,30 @@ cdef class ReactorNet: """ self.net.setInitialTime(t) + property max_time_step: + """ + Get/set the maximum time step *t* [s] that the integrator is + allowed to use. The default value is set to zero, i.e. no time + step maximum is used. + """ + def __get__(self): + return self.net.maxTimeStep() + + def __set__(self, double t): + self.net.setMaxTimeStep(t) + def set_max_time_step(self, double t): """ Set the maximum time step *t* [s] that the integrator is allowed to use. + + .. deprecated:: 2.5 + + To be deprecated with version 2.5, and removed thereafter. + Replaced by property `max_time_step`. """ + warnings.warn("To be removed after Cantera 2.5. " + "Use property 'max_time_step' instead", DeprecationWarning) self.net.setMaxTimeStep(t) property max_err_test_fails: diff --git a/interfaces/cython/cantera/test/test_reactor.py b/interfaces/cython/cantera/test/test_reactor.py index 71cc77634..1c93c2832 100644 --- a/interfaces/cython/cantera/test/test_reactor.py +++ b/interfaces/cython/cantera/test/test_reactor.py @@ -149,7 +149,20 @@ class TestReactor(utilities.CanteraTest): tEnd = 10.0 dt_max = 0.07 t = tStart - self.net.set_max_time_step(dt_max) + + with warnings.catch_warnings(record=True) as w: + + # cause all warnings to always be triggered. + warnings.simplefilter("always") + self.net.set_max_time_step(dt_max) + + self.assertEqual(len(w), 1) + self.assertTrue(issubclass(w[-1].category, DeprecationWarning)) + self.assertIn("To be removed after Cantera 2.5. ", + str(w[-1].message)) + + self.net.max_time_step = dt_max + self.assertEqual(self.net.max_time_step, dt_max) self.net.set_initial_time(tStart) self.assertNear(self.net.time, tStart) @@ -169,7 +182,7 @@ class TestReactor(utilities.CanteraTest): max_steps = 10 max_step_size = 1e-07 self.net.set_initial_time(0) - self.net.set_max_time_step(max_step_size) + self.net.max_time_step = max_step_size self.net.max_steps = max_steps with self.assertRaisesRegex( ct.CanteraError, 'mxstep steps taken before reaching tout'): @@ -461,7 +474,7 @@ class TestReactor(utilities.CanteraTest): self.assertNear(mfc.mdot(1.2), 0.) self.net.rtol = 1e-11 - self.net.set_max_time_step(0.05) + self.net.max_time_step = 0.05 self.net.advance(2.5) mb = self.r1.volume * self.r1.density @@ -900,7 +913,7 @@ class TestWellStirredReactorIgnition(utilities.CanteraTest): def test_ignition3(self): self.setup(900.0, 10*ct.one_atm, 1.0, 80.0) - self.net.set_max_time_step(0.5) + self.net.max_time_step = 0.5 t,T = self.integrate(100.0) self.assertTrue(T[-1] < 910) # mixture did not ignite @@ -978,8 +991,8 @@ class TestConstPressureReactor(utilities.CanteraTest): self.net1 = ct.ReactorNet([self.r1]) self.net2 = ct.ReactorNet([self.r2]) - self.net1.set_max_time_step(0.05) - self.net2.set_max_time_step(0.05) + self.net1.max_time_step = 0.05 + self.net2.max_time_step = 0.05 self.net2.max_err_test_fails = 10 def test_component_index(self):