From bb2d1c099321b952a3c39b9f5695358671ac0fe6 Mon Sep 17 00:00:00 2001 From: Ray Speth Date: Sun, 23 Aug 2015 17:09:17 -0400 Subject: [PATCH] [Thermo] Prevent setting thermodynamic state variables to NaN Throwing an exception when a state variable is being set to NaN transforms some reactor network integration errors from unrecoverable errors into recoverable errors. --- include/cantera/thermo/Phase.h | 13 ++++++++----- test/thermo/ThermoPhase_Test.cpp | 11 +++++++++++ 2 files changed, 19 insertions(+), 5 deletions(-) diff --git a/include/cantera/thermo/Phase.h b/include/cantera/thermo/Phase.h index 4226399da..cdb456329 100644 --- a/include/cantera/thermo/Phase.h +++ b/include/cantera/thermo/Phase.h @@ -611,10 +611,12 @@ public: //! Note the density of a phase is an independent variable. //! @param[in] density_ density (kg/m^3). virtual void setDensity(const doublereal density_) { - if (density_ <= 0.0) { - throw CanteraError("Phase::setDensity()", "density must be positive"); + if (density_ > 0.0) { + m_dens = density_; + } else { + throw CanteraError("Phase::setDensity()", + "density must be positive"); } - m_dens = density_; } //! Set the internally stored molar density (kmol/m^3) of the phase. @@ -624,11 +626,12 @@ public: //! Set the internally stored temperature of the phase (K). //! @param temp Temperature in Kelvin virtual void setTemperature(const doublereal temp) { - if (temp <= 0) { + if (temp > 0) { + m_temp = temp; + } else { throw CanteraError("Phase::setTemperature", "temperature must be positive"); } - m_temp = temp; } //@} diff --git a/test/thermo/ThermoPhase_Test.cpp b/test/thermo/ThermoPhase_Test.cpp index b2bd84fc4..a8116380a 100644 --- a/test/thermo/ThermoPhase_Test.cpp +++ b/test/thermo/ThermoPhase_Test.cpp @@ -91,4 +91,15 @@ TEST_F(TestThermoMethods, getMassFractionsByName) EXPECT_EQ(Y.size(), (size_t) 3); } +TEST_F(TestThermoMethods, setState_nan) +{ + double nan = std::numeric_limits::quiet_NaN(); + thermo->setState_TP(500, 12345); + EXPECT_THROW(thermo->setState_TP(nan, 55555), CanteraError); + EXPECT_THROW(thermo->setState_TP(555, nan), CanteraError); + EXPECT_THROW(thermo->setState_HP(nan, 55555), CanteraError); + EXPECT_THROW(thermo->setState_SV(1234, nan), CanteraError); + EXPECT_THROW(thermo->setState_TR(555, nan), CanteraError); +} + }