diff --git a/src/model/ZoneHVACPackagedTerminalHeatPump.cpp b/src/model/ZoneHVACPackagedTerminalHeatPump.cpp index 40cda15284..59bc6aaa74 100644 --- a/src/model/ZoneHVACPackagedTerminalHeatPump.cpp +++ b/src/model/ZoneHVACPackagedTerminalHeatPump.cpp @@ -359,6 +359,12 @@ namespace model { double ZoneHVACPackagedTerminalHeatPump_Impl::dXHeatingCoilSizingRatio() const { boost::optional value = getDouble(OS_ZoneHVAC_PackagedTerminalHeatPumpFields::DXHeatingCoilSizingRatio, true); + if (!value) { + // it is an error if we get here (eg: cloned from an object that had it unset), however we don't want to crash + LOG(Error, "Required DX Heating Coil Sizing Ratio not set, defaulting to 1.0"); + const_cast(this)->setDXHeatingCoilSizingRatio(1.0); // NOLINT + value = getDouble(OS_ZoneHVAC_PackagedTerminalHeatPumpFields::DXHeatingCoilSizingRatio, true); + } OS_ASSERT(value); return value.get(); } diff --git a/src/model/test/ZoneHVACPackagedTerminalHeatPump_GTest.cpp b/src/model/test/ZoneHVACPackagedTerminalHeatPump_GTest.cpp index 0b1dee273d..e5067e4d81 100644 --- a/src/model/test/ZoneHVACPackagedTerminalHeatPump_GTest.cpp +++ b/src/model/test/ZoneHVACPackagedTerminalHeatPump_GTest.cpp @@ -40,6 +40,7 @@ #include "../BoilerHotWater.hpp" #include +#include using namespace openstudio; @@ -308,6 +309,23 @@ TEST_F(ModelFixture, ZoneHVACPackagedTerminalHeatPump_CoilSystemCoolingDXHeatExc model::ZoneHVACPackagedTerminalHeatPump pthp(m, availabilitySchedule, fan, heatingCoil, coolingCoil, supplementalHeatingCoil); } +TEST_F(ModelFixture, ZoneHVACPackagedTerminalHeatPump_DXHeatingCoilSizingRatio_Unset) { + // Test for #5635 - cloning from an object that never had this required field set (eg: an + // older template) must not return whatever garbage memory the underlying getter finds + model::Model m; + model::CoilHeatingDXVariableSpeed heatingCoil(m); + model::CoilCoolingDXVariableSpeed coolingCoil(m); + model::ScheduleCompact availabilitySchedule(m); + model::FanConstantVolume fan(m, availabilitySchedule); + model::CoilHeatingElectric supplementalHeatingCoil(m, availabilitySchedule); + + model::ZoneHVACPackagedTerminalHeatPump pthp(m, availabilitySchedule, fan, heatingCoil, coolingCoil, supplementalHeatingCoil); + EXPECT_EQ(1.0, pthp.dXHeatingCoilSizingRatio()); + + ASSERT_TRUE(pthp.setString(OS_ZoneHVAC_PackagedTerminalHeatPumpFields::DXHeatingCoilSizingRatio, "")); + EXPECT_EQ(1.0, pthp.dXHeatingCoilSizingRatio()); +} + TEST_F(ModelFixture, ZoneHVACPackagedTerminalHeatPump_SupplyAirFanOpSch) { model::Model m; model::CoilHeatingDXVariableSpeed heatingCoil(m);