diff --git a/include/cantera/zeroD/ReactorBase.h b/include/cantera/zeroD/ReactorBase.h index 91e96af88..6076cbfcf 100644 --- a/include/cantera/zeroD/ReactorBase.h +++ b/include/cantera/zeroD/ReactorBase.h @@ -354,13 +354,10 @@ public: //! @} - //! Set the state of the Phase object associated with this reactor to the - //! reactor's current state. - virtual void restoreState(); - //! Set the state of the reactor to the associated ThermoPhase object. - //! This method is the inverse of restoreState() and will trigger integrator - //! reinitialization. + //! This method will trigger integrator reinitialization. + //! @deprecated To be removed after %Cantera 4.0. Use ReactorNet::reinitialize to + //! indicate a change in state that requires integrator reinitialization. virtual void syncState(); //! Update state information needed by connected reactors, flow devices, and walls. diff --git a/include/cantera/zeroD/ReactorDelegator.h b/include/cantera/zeroD/ReactorDelegator.h index 2fb83d0ca..5d91b3403 100644 --- a/include/cantera/zeroD/ReactorDelegator.h +++ b/include/cantera/zeroD/ReactorDelegator.h @@ -44,13 +44,6 @@ public: //! by Reactor::eval, this method should be called in either a "replace" or "after" //! delegate for Reactor::evalWalls(). virtual void setHeatRate(double q) = 0; - - //! Set the state of the thermo object to correspond to the state of the reactor - virtual void restoreThermoState() = 0; - - //! Set the state of the thermo object for surface *n* to correspond to the - //! state of that surface - virtual void restoreSurfaceState(size_t n) = 0; }; //! Delegate methods of the Reactor class to external functions @@ -144,14 +137,6 @@ public: R::m_Qdot = q; } - void restoreThermoState() override { - R::m_thermo->restoreState(R::m_state); - } - - void restoreSurfaceState(size_t n) override { - R::m_surfaces.at(n)->syncState(); - } - private: function m_initialize; function, double*)> m_getState; diff --git a/interfaces/cython/cantera/reactor.pxd b/interfaces/cython/cantera/reactor.pxd index 53d513773..68f5dabc5 100644 --- a/interfaces/cython/cantera/reactor.pxd +++ b/interfaces/cython/cantera/reactor.pxd @@ -38,7 +38,6 @@ cdef extern from "cantera/zerodim.h" namespace "Cantera": CxxReactorBase() except +translate_exception string type() shared_ptr[CxxSolution] phase() - void restoreState() except +translate_exception void syncState() except +translate_exception double volume() string name() @@ -77,7 +76,6 @@ cdef extern from "cantera/zerodim.h" namespace "Cantera": void setKinetics(CxxKinetics*) except +translate_exception void setCoverages(double*) void setCoverages(Composition&) except +translate_exception - void syncState() cdef cppclass CxxFlowReactorSurface "Cantera::FlowReactorSurface" (CxxReactorSurface): CxxFlowReactorSurface() except +translate_exception @@ -215,8 +213,6 @@ cdef extern from "cantera/zeroD/ReactorDelegator.h" namespace "Cantera": void setExpansionRate(double) double heatRate() void setHeatRate(double) - void restoreThermoState() except +translate_exception - void restoreSurfaceState(size_t) except +translate_exception ctypedef CxxReactorAccessor* CxxReactorAccessorPtr diff --git a/interfaces/cython/cantera/reactor.pyi b/interfaces/cython/cantera/reactor.pyi index 7e7c0efdd..dc3f1eb72 100644 --- a/interfaces/cython/cantera/reactor.pyi +++ b/interfaces/cython/cantera/reactor.pyi @@ -147,8 +147,6 @@ class ExtensibleReactor(Reactor): def heat_rate(self) -> float: ... @heat_rate.setter def heat_rate(self, qdot: float) -> None: ... - def restore_thermo_state(self) -> None: ... - def restore_surface_state(self, n: int) -> None: ... class ExtensibleIdealGasReactor(ExtensibleReactor): ... class ExtensibleConstPressureReactor(ExtensibleReactor): ... diff --git a/interfaces/cython/cantera/reactor.pyx b/interfaces/cython/cantera/reactor.pyx index 9e1549190..89da3e3aa 100644 --- a/interfaces/cython/cantera/reactor.pyx +++ b/interfaces/cython/cantera/reactor.pyx @@ -115,6 +115,11 @@ cdef class ReactorBase: Set the state of the Reactor to match that of the associated `ThermoPhase` object. After calling syncState(), call ReactorNet.reinitialize() before further integration. + + .. deprecated:: 4.0 + Manual synchronization of reactor state is no longer required. Call + `ReactorNet.reinitialize` directly to indicate a change in state that + requires integrator reinitialization. """ self.rbase.syncState() @@ -126,7 +131,6 @@ cdef class ReactorBase: .. versionchanged:: 3.2 Renamed from ``thermo``. """ - self.rbase.restoreState() return self._phase property volume: @@ -517,10 +521,6 @@ cdef class ExtensibleReactor(Reactor): Called once before the start of time integration. - ``sync_state(self) -> None`` - Responsible for setting the state of the reactor to correspond to the - state of the associated ThermoPhase object. - ``get_state(self, y : double[:]) -> None`` Responsible for populating the state vector ``y`` (length `n_vars`) with the initial state of the reactor. @@ -562,7 +562,6 @@ cdef class ExtensibleReactor(Reactor): delegatable_methods = { 'initialize': ('initialize', 'void(double)'), - 'sync_state': ('syncState', 'void()'), 'get_state': ('getState', 'void(double*)'), 'update_state': ('updateState', 'void(double*)'), 'update_connected': ('updateConnected', 'void(bool)'), @@ -614,20 +613,6 @@ cdef class ExtensibleReactor(Reactor): def heat_rate(self, qdot): self.accessor.setHeatRate(qdot) - def restore_thermo_state(self): - """ - Set the state of the thermo object to correspond to the state of the - reactor. - """ - self.accessor.restoreThermoState() - - def restore_surface_state(self, n): - """ - Set the state of the thermo object for surface ``n`` to correspond to the - state of that surface - """ - self.accessor.restoreSurfaceState(n) - cdef class ExtensibleIdealGasReactor(ExtensibleReactor): """ @@ -774,7 +759,6 @@ cdef class ReactorSurface(ReactorBase): def __get__(self): if self._phase is None: raise CanteraError('No kinetics manager present') - self.rbase.restoreState() return self._phase.coverages def __set__(self, coverages): if self._phase is None: diff --git a/samples/cxx/openmp_ignition/openmp_ignition.cpp b/samples/cxx/openmp_ignition/openmp_ignition.cpp index 82b748e87..aaeb1f465 100644 --- a/samples/cxx/openmp_ignition/openmp_ignition.cpp +++ b/samples/cxx/openmp_ignition/openmp_ignition.cpp @@ -66,7 +66,6 @@ void run() // Set up the problem gas->setState_TPX(T0[i], OneAtm, "CH4:0.5, O2:1.0, N2:3.76"); - reactor.syncState(); net.setInitialTime(0.0); // Integrate until we satisfy a crude estimate of the ignition delay diff --git a/samples/python/reactors/pfr.py b/samples/python/reactors/pfr.py index f96173ca7..92a7009db 100644 --- a/samples/python/reactors/pfr.py +++ b/samples/python/reactors/pfr.py @@ -127,7 +127,6 @@ states2 = ct.SolutionArray(gas2) for n in range(n_steps): # Set the state of the reservoir to match that of the previous reactor upstream.phase.TDY = r2.phase.TDY - upstream.syncState() # integrate the reactor forward in time until steady state is reached sim2.reinitialize() sim2.advance_to_steady_state() diff --git a/samples/python/reactors/surf_pfr_chain.py b/samples/python/reactors/surf_pfr_chain.py index a07995100..33be1765a 100644 --- a/samples/python/reactors/surf_pfr_chain.py +++ b/samples/python/reactors/surf_pfr_chain.py @@ -107,7 +107,6 @@ output_data = [] for n in range(NReactors): # Set the state of the reservoir to match that of the previous reactor upstream.phase.TDY = r.phase.TDY -# upstream.syncState() sim.reinitialize() sim.advance_to_steady_state() dist = n * rlen * 1.0e3 # distance in mm diff --git a/src/zeroD/MoleReactor.cpp b/src/zeroD/MoleReactor.cpp index 9ca4c0ae0..9ce612314 100644 --- a/src/zeroD/MoleReactor.cpp +++ b/src/zeroD/MoleReactor.cpp @@ -28,7 +28,6 @@ void MoleReactor::addSurfaceJacobian(vector> &triplets) { size_t offset = m_nsp; for (auto& S : m_surfaces) { - S->restoreState(); double A = S->area(); auto kin = S->kinetics(); size_t nk = S->thermo()->nSpecies(); diff --git a/src/zeroD/ReactorBase.cpp b/src/zeroD/ReactorBase.cpp index 6314fb5bd..f5078ec6c 100644 --- a/src/zeroD/ReactorBase.cpp +++ b/src/zeroD/ReactorBase.cpp @@ -101,11 +101,11 @@ ReactorSurface* ReactorBase::surface(size_t n) return m_surfaces[n]; } -void ReactorBase::restoreState() { -} - void ReactorBase::syncState() { + warn_deprecated("ReactorBase::syncState", + "To be removed after Cantera 4.0. Use ReactorNet::reinitialize to indicate " + "a change in state that requires integrator reinitialization."); if (m_net) { m_net->setNeedsReinit(); } diff --git a/test/python/test_reactor.py b/test/python/test_reactor.py index 2e430c5c0..ecf3330b9 100644 --- a/test/python/test_reactor.py +++ b/test/python/test_reactor.py @@ -933,7 +933,7 @@ class TestReactor: assert p1a == approx(p1b) assert p2a == approx(p2b) - def test_reinitialize(self): + def test_reinitialize(self, allow_deprecated): self.make_reactors(T1=300, T2=1000) self.add_wall(U=200, A=1.0) self.net.advance(1.0) @@ -941,6 +941,7 @@ class TestReactor: T2a = self.r2.T self.r1.phase.TD = 300, None + # Deprecated; After Cantera 4.0, replace with net.reinitialize() self.r1.syncState() self.r2.phase.TD = 1000, None @@ -955,6 +956,13 @@ class TestReactor: assert T1a == approx(T1b) assert T2a == approx(T2b) + # TODO: Remove after Cantera 4.0 when syncState is removed + def test_syncState_deprecated(self): + self.make_reactors(n_reactors=1) + self.net.advance(0.1) + with pytest.raises(ct.CanteraError): + self.r1.syncState() + def test_reservoir_sync(self): self.make_reactors(T1=800, n_reactors=1) self.gas1.TP = 900, ct.one_atm @@ -963,7 +971,6 @@ class TestReactor: self.net.advance(1.0) assert self.r1.T == approx(872.099, rel=1e-3) reservoir.phase.TP = 700, ct.one_atm - reservoir.syncState() self.net.reinitialize() self.net.advance(2.0) assert self.r1.T == approx(747.27, rel=1e-3)