From 13fa0c7a4f469c590520b8eb31be4b5c4242da93 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Tue, 22 Mar 2016 10:29:13 -0400 Subject: [PATCH] Add invalidateCache() function to ThermoPhase and Kinetics This can be used to invalidate cached data after a change to underlying data such as species thermo coefficients or reaction rate coefficients. Needs to be user-accessible so that dependent objects can be updated manually. --- include/cantera/kinetics/BulkKinetics.h | 1 + include/cantera/kinetics/GasKinetics.h | 1 + include/cantera/kinetics/Kinetics.h | 2 ++ include/cantera/thermo/Phase.h | 4 ++++ include/cantera/thermo/ThermoPhase.h | 2 ++ interfaces/cython/cantera/_cantera.pxd | 2 ++ src/kinetics/BulkKinetics.cpp | 7 +++++++ src/kinetics/GasKinetics.cpp | 6 ++++++ src/kinetics/Kinetics.cpp | 1 + src/thermo/Phase.cpp | 4 ++++ src/thermo/ThermoPhase.cpp | 5 +++++ 11 files changed, 35 insertions(+) diff --git a/include/cantera/kinetics/BulkKinetics.h b/include/cantera/kinetics/BulkKinetics.h index 16f9b10a1..925e256f5 100644 --- a/include/cantera/kinetics/BulkKinetics.h +++ b/include/cantera/kinetics/BulkKinetics.h @@ -40,6 +40,7 @@ public: virtual bool ready() const; virtual void setMultiplier(size_t i, double f); + virtual void invalidateCache(); protected: virtual void addElementaryReaction(ElementaryReaction& r); diff --git a/include/cantera/kinetics/GasKinetics.h b/include/cantera/kinetics/GasKinetics.h index a598b230e..a0ee54a06 100644 --- a/include/cantera/kinetics/GasKinetics.h +++ b/include/cantera/kinetics/GasKinetics.h @@ -55,6 +55,7 @@ public: virtual void modifyReaction(size_t i, shared_ptr rNew); virtual void finalize(); virtual bool ready() const; + virtual void invalidateCache(); //@} void updateROP(); diff --git a/include/cantera/kinetics/Kinetics.h b/include/cantera/kinetics/Kinetics.h index b2fb829ac..1d4389395 100644 --- a/include/cantera/kinetics/Kinetics.h +++ b/include/cantera/kinetics/Kinetics.h @@ -803,6 +803,8 @@ public: m_perturb[i] = f; } + virtual void invalidateCache() {}; + //@} /** diff --git a/include/cantera/thermo/Phase.h b/include/cantera/thermo/Phase.h index 15e9403b2..5b0d1bdee 100644 --- a/include/cantera/thermo/Phase.h +++ b/include/cantera/thermo/Phase.h @@ -724,6 +724,10 @@ public: return m_stateNum; } + //! Invalidate any cached values which are normally updated only when a + //! change in state is detected + virtual void invalidateCache(); + protected: //! Cached for saved calculations within each ThermoPhase. /*! diff --git a/include/cantera/thermo/ThermoPhase.h b/include/cantera/thermo/ThermoPhase.h index 1a762a66e..dc814e333 100644 --- a/include/cantera/thermo/ThermoPhase.h +++ b/include/cantera/thermo/ThermoPhase.h @@ -1537,6 +1537,8 @@ public: */ virtual void setStateFromXML(const XML_Node& state); + virtual void invalidateCache(); + //! @} //! @name Derivatives of Thermodynamic Variables needed for Applications //! @{ diff --git a/interfaces/cython/cantera/_cantera.pxd b/interfaces/cython/cantera/_cantera.pxd index 91de2b0c2..699b4645b 100644 --- a/interfaces/cython/cantera/_cantera.pxd +++ b/interfaces/cython/cantera/_cantera.pxd @@ -124,6 +124,7 @@ cdef extern from "cantera/thermo/ThermoPhase.h" namespace "Cantera": void addUndefinedElements() except + cbool addSpecies(shared_ptr[CxxSpecies]) except + void initThermo() except + + void invalidateCache() except + # basic thermodynamic properties double temperature() except + @@ -361,6 +362,7 @@ cdef extern from "cantera/kinetics/Kinetics.h" namespace "Cantera": void addReaction(shared_ptr[CxxReaction]) except + void finalize() except + void modifyReaction(int, shared_ptr[CxxReaction]) except + + void invalidateCache() except + shared_ptr[CxxReaction] reaction(size_t) except + cbool isReversible(int) except + diff --git a/src/kinetics/BulkKinetics.cpp b/src/kinetics/BulkKinetics.cpp index 32123ee41..c2079e7b9 100644 --- a/src/kinetics/BulkKinetics.cpp +++ b/src/kinetics/BulkKinetics.cpp @@ -159,4 +159,11 @@ void BulkKinetics::setMultiplier(size_t i, double f) { m_ROP_ok = false; } +void BulkKinetics::invalidateCache() +{ + Kinetics::invalidateCache(); + m_ROP_ok = false; + m_temp += 0.13579; +} + } diff --git a/src/kinetics/GasKinetics.cpp b/src/kinetics/GasKinetics.cpp index 5286745ae..1d0346be4 100644 --- a/src/kinetics/GasKinetics.cpp +++ b/src/kinetics/GasKinetics.cpp @@ -402,4 +402,10 @@ bool GasKinetics::ready() const return m_finalized; } +void GasKinetics::invalidateCache() +{ + BulkKinetics::invalidateCache(); + m_pres += 0.13579; +} + } diff --git a/src/kinetics/Kinetics.cpp b/src/kinetics/Kinetics.cpp index 4536b9d46..0b2e78f9e 100644 --- a/src/kinetics/Kinetics.cpp +++ b/src/kinetics/Kinetics.cpp @@ -644,6 +644,7 @@ void Kinetics::modifyReaction(size_t i, shared_ptr rNew) rOld->productString(), rNew->productString()); } m_reactions[i] = rNew; + invalidateCache(); } shared_ptr Kinetics::reaction(size_t i) diff --git a/src/thermo/Phase.cpp b/src/thermo/Phase.cpp index bdc10035f..2097074e0 100644 --- a/src/thermo/Phase.cpp +++ b/src/thermo/Phase.cpp @@ -864,4 +864,8 @@ bool Phase::ready() const return (m_kk > 0); } +void Phase::invalidateCache() { + m_cache.clear(); +} + } // namespace Cantera diff --git a/src/thermo/ThermoPhase.cpp b/src/thermo/ThermoPhase.cpp index a716b5379..acc1637be 100644 --- a/src/thermo/ThermoPhase.cpp +++ b/src/thermo/ThermoPhase.cpp @@ -757,6 +757,11 @@ void ThermoPhase::setStateFromXML(const XML_Node& state) } } +void ThermoPhase::invalidateCache() { + Phase::invalidateCache(); + m_tlast += 0.1234; +} + void ThermoPhase::equilibrate(const std::string& XY, const std::string& solver, double rtol, int max_steps, int max_iter, int estimate_equil, int log_level)