From 935f0bfc016b8683300effc1d001235c0bf37dca Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 9 Jul 2024 13:28:21 +0200 Subject: [PATCH 1/3] Fix the trivial floating point comparison differences by replacing EXPECT_EQ with EXPECT_DOUBLE_EQ or EXPECT_NEAR ``` ctest -R '(EnergyPlusFixture.BaseSizer_setZoneCoilInletConditions|EnergyPlusFixture.DXCoils_Test1|EnergyPlusFixture.TestCalcCBF|EnergyPlusFixture.VRFFluidControl_FanSysModel_OnOffModeTest|EnergyPlusFixture.HeatBalanceManager_TestZonePropertyLocalEnv|EnergyPlusFixture.HeatBalanceSurfaceManager_TestSurfPropertyLocalEnv|EnergyPlusFixture.ITE_Env_Class_Update_Class_H1|SQLiteFixture.UpdateSizing_EndSysSizingCalc|EnergyPlusFixture.BIPVT_calculateBIPVTMaxHeatGain|EnergyPlusFixture.Psychrometrics_PsyCpAirFn_Test|ZoneIdealLoadsTest.IdealLoads_Fix_SA_HumRat_Test|EnergyPlusFixture.SolarShadingTest_CTRANS|EnergyPlusFixture.VentilatedSlab_InitVentilatedSlabTest|EnergyPlusFixture.StratifiedTankSourceTemperatures)' --output-on-failure ``` --- .../unit/Autosizing/BaseClassSizing.unit.cc | 22 ++++++++--------- tst/EnergyPlus/unit/DXCoils.unit.cc | 3 +-- .../unit/HVACVariableRefrigerantFlow.unit.cc | 2 +- .../unit/HeatBalanceManager.unit.cc | 4 ++-- .../unit/HeatBalanceSurfaceManager.unit.cc | 10 ++++---- tst/EnergyPlus/unit/InternalHeatGains.unit.cc | 7 +++--- .../unit/OutputReportTabular.unit.cc | 2 +- .../unit/PurchasedAirManager.unit.cc | 24 +++++++++---------- tst/EnergyPlus/unit/SolarShading.unit.cc | 13 +++++++--- tst/EnergyPlus/unit/VentilatedSlab.unit.cc | 4 ++-- tst/EnergyPlus/unit/WaterThermalTanks.unit.cc | 2 +- 11 files changed, 49 insertions(+), 44 deletions(-) diff --git a/tst/EnergyPlus/unit/Autosizing/BaseClassSizing.unit.cc b/tst/EnergyPlus/unit/Autosizing/BaseClassSizing.unit.cc index 13791f61851..e15bf616142 100644 --- a/tst/EnergyPlus/unit/Autosizing/BaseClassSizing.unit.cc +++ b/tst/EnergyPlus/unit/Autosizing/BaseClassSizing.unit.cc @@ -738,7 +738,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) Real64 calcCoilInletCond = zoneCond; CoolingCapacitySizer sizer; Real64 coilInletCond = sizer.setHeatCoilInletTempForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate > 0 and ZoneEqSizing.OAVolFlow = 0 so coilInlet condition based on mixed return and ATMixer condition zoneEqSizing.ATMixerVolFlow = 1.0; @@ -747,7 +747,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) Real64 oaCond = zoneEqSizing.ATMixerHeatPriDryBulb; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setHeatCoilInletTempForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate = 0 and ZoneEqSizing.OAVolFlow > 0 so coilInlet condition based on mixed return and OA condition zoneEqSizing.ATMixerVolFlow = 0.0; @@ -756,7 +756,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) oaCond = finalZoneSizing.OutTempAtHeatPeak; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setHeatCoilInletTempForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // Test heating mode coil inlet humidity ratio zoneEqSizing.ATMixerHeatPriDryBulb = 0.0; @@ -774,7 +774,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) zoneCond = finalZoneSizing.ZoneHumRatAtHeatPeak; calcCoilInletCond = zoneCond; coilInletCond = sizer.setHeatCoilInletHumRatForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate > 0 and ZoneEqSizing.OAVolFlow = 0 so coilInlet condition based on mixed return and ATMixer condition zoneEqSizing.ATMixerVolFlow = 1.0; @@ -783,7 +783,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) oaCond = zoneEqSizing.ATMixerHeatPriHumRat; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setHeatCoilInletHumRatForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate = 0 and ZoneEqSizing.OAVolFlow > 0 so coilInlet condition based on mixed return and OA condition zoneEqSizing.ATMixerVolFlow = 0.0; @@ -810,7 +810,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) zoneCond = finalZoneSizing.ZoneTempAtCoolPeak; calcCoilInletCond = zoneCond; coilInletCond = sizer.setCoolCoilInletTempForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate > 0 and ZoneEqSizing.OAVolFlow = 0 so coilInlet condition based on mixed return and ATMixer condition zoneEqSizing.ATMixerVolFlow = 1.0; @@ -819,7 +819,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) oaCond = zoneEqSizing.ATMixerCoolPriDryBulb; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setCoolCoilInletTempForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate = 0 and ZoneEqSizing.OAVolFlow > 0 so coilInlet condition based on mixed return and OA condition zoneEqSizing.ATMixerVolFlow = 0.0; @@ -828,7 +828,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) oaCond = finalZoneSizing.OutTempAtCoolPeak; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setCoolCoilInletTempForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // Test cooling mode coil inlet humidity ratio zoneEqSizing.ATMixerCoolPriDryBulb = 0.0; @@ -846,7 +846,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) zoneCond = finalZoneSizing.ZoneHumRatAtCoolPeak; calcCoilInletCond = zoneCond; coilInletCond = sizer.setCoolCoilInletHumRatForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate > 0 and ZoneEqSizing.OAVolFlow = 0 so coilInlet condition based on mixed return and ATMixer condition zoneEqSizing.ATMixerVolFlow = 1.0; @@ -855,7 +855,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) oaCond = zoneEqSizing.ATMixerCoolPriHumRat; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setCoolCoilInletHumRatForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); // ATMixer flow rate = 0 and ZoneEqSizing.OAVolFlow > 0 so coilInlet condition based on mixed return and OA condition zoneEqSizing.ATMixerVolFlow = 0.0; @@ -864,7 +864,7 @@ TEST_F(EnergyPlusFixture, BaseSizer_setZoneCoilInletConditions) oaCond = finalZoneSizing.OutHumRatAtCoolPeak; calcCoilInletCond = (oaFrac * oaCond) + ((1.0 - oaFrac) * zoneCond); coilInletCond = sizer.setCoolCoilInletHumRatForZoneEqSizing(oaFrac, zoneEqSizing, finalZoneSizing); - EXPECT_EQ(coilInletCond, calcCoilInletCond); + EXPECT_DOUBLE_EQ(coilInletCond, calcCoilInletCond); zoneEqSizing.ATMixerCoolPriHumRat = 0.0; finalZoneSizing.ZoneHumRatAtCoolPeak = 0.0; diff --git a/tst/EnergyPlus/unit/DXCoils.unit.cc b/tst/EnergyPlus/unit/DXCoils.unit.cc index 98d38f6f197..50322d87b27 100644 --- a/tst/EnergyPlus/unit/DXCoils.unit.cc +++ b/tst/EnergyPlus/unit/DXCoils.unit.cc @@ -271,7 +271,6 @@ TEST_F(EnergyPlusFixture, DXCoils_Test1) // air outlet condition is right next to the saturation curve EXPECT_DOUBLE_EQ(TdbAtOutlet, tSatAtOutlet); // Tdb higher than TSat by 1.8E-15 C - EXPECT_GT(TdbAtOutlet, tSatAtOutlet); // Tdb higher than TSat by 1.8E-15 C EXPECT_NEAR(1.0, rhAtOutlet, 0.00001); // 99.9995% RH (i.e., it's not 100% as PsyRhFnTdbWPb would have reported previously) EXPECT_LT(rhAtOutlet, 1.0); // just to the right of saturation curve @@ -952,7 +951,7 @@ TEST_F(EnergyPlusFixture, TestCalcCBF) InletAirHumRat = Psychrometrics::PsyWFnTdbTwbPb(*state, InletDBTemp, InletWBTemp, AirPressure); CBF_calculated = CalcCBF(*state, CoilType, CoilName, InletDBTemp, InletAirHumRat, TotalCap, AirVolFlowRate, SHR, true); CBF_expected = 0.17268167698750708; - EXPECT_DOUBLE_EQ(CBF_calculated, CBF_expected); + EXPECT_NEAR(CBF_calculated, CBF_expected, 0.000000000000001); // push inlet condition towards saturation curve to test CBF calculation robustness InletWBTemp = 19.7; // 19.72 DB / 19.7 WB diff --git a/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc b/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc index e672738732c..3f5b22152fe 100644 --- a/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc +++ b/tst/EnergyPlus/unit/HVACVariableRefrigerantFlow.unit.cc @@ -10834,7 +10834,7 @@ TEST_F(EnergyPlusFixture, VRFFluidControl_FanSysModel_OnOffModeTest) SimVRF(*state, VRFTUNum, FirstHVACIteration, OnOffAirFlowRatio, SysOutputProvided, LatOutputProvided, QZnReq); // check fan operation for cooling mode Real64 Result_AirMassFlowRateDesign = state->dataFans->fans(1)->maxAirMassFlowRate; - EXPECT_NEAR(Result_AirMassFlowRateDesign, 0.347052, 0.000001); + EXPECT_NEAR(Result_AirMassFlowRateDesign, 0.347052, 0.000002); Real64 Result_AirMassFlowRate = state->dataLoopNodes->Node(state->dataFans->fans(1)->outletNodeNum).MassFlowRate; EXPECT_NEAR(Result_AirMassFlowRate, state->dataDXCoils->DXCoil(1).RatedAirMassFlowRate(1), 0.000001); Real64 Result_FanPower = state->dataFans->fans(1)->totalPower; diff --git a/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc index 6705b2b7fbe..5532e6f098f 100644 --- a/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceManager.unit.cc @@ -1279,8 +1279,8 @@ TEST_F(EnergyPlusFixture, HeatBalanceManager_TestZonePropertyLocalEnv) EXPECT_EQ(20.0, state->dataLoopNodes->Node(1).OutAirWetBulb); EXPECT_EQ(1.5, state->dataLoopNodes->Node(1).OutAirWindSpeed); EXPECT_EQ(90.0, state->dataLoopNodes->Node(1).OutAirWindDir); - EXPECT_DOUBLE_EQ(0.012611481326656135, state->dataLoopNodes->Node(1).HumRat); - EXPECT_DOUBLE_EQ(57247.660939392081, state->dataLoopNodes->Node(1).Enthalpy); + EXPECT_NEAR(0.012611481326656135, state->dataLoopNodes->Node(1).HumRat, 0.000000000000001); + EXPECT_NEAR(57247.660939392081, state->dataLoopNodes->Node(1).Enthalpy, 0.000000001); InitHeatBalance(*state); diff --git a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc index 9ccde1e195b..4b8411051ef 100644 --- a/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc +++ b/tst/EnergyPlus/unit/HeatBalanceSurfaceManager.unit.cc @@ -1909,8 +1909,8 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_TestSurfPropertyLocalEnv) EXPECT_EQ(20.0, state->dataLoopNodes->Node(1).OutAirWetBulb); EXPECT_EQ(1.5, state->dataLoopNodes->Node(1).OutAirWindSpeed); EXPECT_EQ(90.0, state->dataLoopNodes->Node(1).OutAirWindDir); - EXPECT_DOUBLE_EQ(0.012611481326656135, state->dataLoopNodes->Node(1).HumRat); - EXPECT_DOUBLE_EQ(57247.660939392081, state->dataLoopNodes->Node(1).Enthalpy); + EXPECT_NEAR(0.012611481326656135, state->dataLoopNodes->Node(1).HumRat, 0.000000000000001); + EXPECT_NEAR(57247.660939392081, state->dataLoopNodes->Node(1).Enthalpy, 0.000000001); InitSurfaceHeatBalance(*state); @@ -8725,7 +8725,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_SurroundingSurfacesTempTest) 1, !- Multiplier autocalculate, !- Ceiling Height {m} autocalculate; !- Volume {m3} - + Material, Concrete Block, !- Name MediumRough, !- Roughness @@ -8806,7 +8806,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_SurroundingSurfacesTempTest) SrdSurfs:Surface 3, !- Surrounding Surface 3 Name 0.1, !- Surrounding Surface 3 View Factor Surrounding Temp Sch 3; !- Surrounding Surface 3 Temperature Schedule Name - + Schedule:Compact, Surrounding Temp Sch 1, !- Name Any Number, !- Schedule Type Limits Name @@ -8830,7 +8830,7 @@ TEST_F(EnergyPlusFixture, HeatBalanceSurfaceManager_SurroundingSurfacesTempTest) ScheduleTypeLimits, Any Number; !- Name - + BuildingSurface:Detailed, Wall, !- Name Wall, !- Surface Type diff --git a/tst/EnergyPlus/unit/InternalHeatGains.unit.cc b/tst/EnergyPlus/unit/InternalHeatGains.unit.cc index 623f453dbbb..9524df5c5f5 100644 --- a/tst/EnergyPlus/unit/InternalHeatGains.unit.cc +++ b/tst/EnergyPlus/unit/InternalHeatGains.unit.cc @@ -3343,7 +3343,7 @@ TEST_F(EnergyPlusFixture, ITE_Env_Class_Update_Class_H1) // if (TDPAirIn > DPMax[EnvClass]) EXPECT_EQ(thisZoneITEq.TimeAboveDewpointT, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisZoneITEq.TimeOutOfOperRange, state->dataGlobal->TimeStepZone); - EXPECT_EQ(thisZoneITEq.DewpointTAboveDeltaT, TDPAirIn - DPMax[EnvClass]); + EXPECT_NEAR(thisZoneITEq.DewpointTAboveDeltaT, TDPAirIn - DPMax[EnvClass], 0.000000000001); EXPECT_EQ(thisZnRpt.ITEqTimeAboveDewpointT, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisZnRpt.ITEqTimeOutOfOperRange, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisspaceRpt.ITEqTimeAboveDewpointT, state->dataGlobal->TimeStepZone); @@ -3424,15 +3424,14 @@ TEST_F(EnergyPlusFixture, ITE_Env_Class_Update_Class_H1) // if (TDPAirIn > DPMax[EnvClass]) EXPECT_EQ(thisZoneITEq.TimeAboveDewpointT, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisZoneITEq.TimeOutOfOperRange, state->dataGlobal->TimeStepZone); - EXPECT_EQ(thisZoneITEq.DewpointTAboveDeltaT, TDPAirIn - DPMax[EnvClass]); - EXPECT_EQ(thisZnRpt.ITEqTimeAboveDewpointT, state->dataGlobal->TimeStepZone); + EXPECT_NEAR(thisZoneITEq.DewpointTAboveDeltaT, TDPAirIn - DPMax[EnvClass], 0.000000000001); EXPECT_EQ(thisZnRpt.ITEqTimeOutOfOperRange, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisspaceRpt.ITEqTimeAboveDewpointT, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisspaceRpt.ITEqTimeOutOfOperRange, state->dataGlobal->TimeStepZone); EXPECT_EQ(thisZoneITEq.TimeAboveDewpointT, 1.0); EXPECT_EQ(thisZoneITEq.TimeOutOfOperRange, 1.0); - EXPECT_EQ(thisZoneITEq.DewpointTAboveDeltaT, TDPAirIn - DPMax[EnvClass]); + EXPECT_NEAR(thisZoneITEq.DewpointTAboveDeltaT, TDPAirIn - DPMax[EnvClass], 0.000000000001); EXPECT_EQ(thisZnRpt.ITEqTimeAboveDewpointT, 1.0); EXPECT_EQ(thisZnRpt.ITEqTimeOutOfOperRange, 1.0); EXPECT_EQ(thisspaceRpt.ITEqTimeAboveDewpointT, 1.0); diff --git a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc index 4028d542cf9..333ea62a9c2 100644 --- a/tst/EnergyPlus/unit/OutputReportTabular.unit.cc +++ b/tst/EnergyPlus/unit/OutputReportTabular.unit.cc @@ -12634,7 +12634,7 @@ TEST_F(SQLiteFixture, UpdateSizing_EndSysSizingCalc) " AND RowName = 'Peak Sensible Load with Sizing Factor'"); // check the value from result records Real64 return_val = execAndReturnFirstDouble(query); - EXPECT_EQ(return_val, 5080.22); + EXPECT_NEAR(5080.22, return_val, 0.011); } TEST_F(EnergyPlusFixture, OutputReportTabularMonthly_WarnMonthly) diff --git a/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc b/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc index 7308ec40291..8ddad9c43a3 100644 --- a/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc +++ b/tst/EnergyPlus/unit/PurchasedAirManager.unit.cc @@ -1461,22 +1461,22 @@ TEST_F(ZoneIdealLoadsTest, IdealLoads_Fix_SA_HumRat_Test) CalcPurchAirLoads(*state, 1, SysOutputProvided, MoistOutputProvided, 1); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).MinCoolSuppAirHumRat, 0.009); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).MinCoolSuppAirHumRat, 0.009); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).SupplyTemp, 20.228931255157292); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).SupplyTemp, 20.228931255157292); // Without the current fix, this SupplyHumRat value would be 0.009, which is incorrect: - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).SupplyHumRat, 0.01); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).SupplyHumRat, 0.01); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).MixedAirTemp, 30.0); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).MixedAirHumRat, 0.012); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).MixedAirTemp, 30.0); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).MixedAirHumRat, 0.012); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).SenCoilLoad, -1003.6327856486452); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).LatCoilLoad, 5574.8612856486452); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).SenCoilLoad, -1003.6327856486452); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).LatCoilLoad, 5574.8612856486452); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).SenOutputToZone, -1000.0000000000002); - EXPECT_EQ(state->dataPurchasedAirMgr->PurchAir(1).LatOutputToZone, 5571.2285000000002); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).SenOutputToZone, -1000.0000000000002); + EXPECT_DOUBLE_EQ(state->dataPurchasedAirMgr->PurchAir(1).LatOutputToZone, 5571.2285000000002); - EXPECT_EQ(state->dataLoopNodes->Node(1).Enthalpy, 45712.285000000003); - EXPECT_EQ(state->dataLoopNodes->Node(1).HumRat, 0.01); - EXPECT_EQ(state->dataLoopNodes->Node(1).Temp, 20.228931255157292); + EXPECT_DOUBLE_EQ(state->dataLoopNodes->Node(1).Enthalpy, 45712.285000000003); + EXPECT_DOUBLE_EQ(state->dataLoopNodes->Node(1).HumRat, 0.01); + EXPECT_DOUBLE_EQ(state->dataLoopNodes->Node(1).Temp, 20.228931255157292); } diff --git a/tst/EnergyPlus/unit/SolarShading.unit.cc b/tst/EnergyPlus/unit/SolarShading.unit.cc index dc0d2d47e29..95db5651794 100644 --- a/tst/EnergyPlus/unit/SolarShading.unit.cc +++ b/tst/EnergyPlus/unit/SolarShading.unit.cc @@ -3444,9 +3444,16 @@ TEST_F(EnergyPlusFixture, SolarShadingTest_CTRANS) Vector expected_lcsy(0.96592582628906831, 0.25881904510252079, -0.0); Vector expected_lcsz(0.0, 0.0, 1.0); - EXPECT_EQ(expected_lcsx, lcsx); - EXPECT_EQ(expected_lcsy, lcsy); - EXPECT_EQ(expected_lcsz, lcsz); + auto compare_double_vectors = [](Vector const & exp, Vector const& actual) { + ASSERT_EQ(exp.size(), actual.size()); + for (size_t i = 0; i < exp.size(); ++i) { + EXPECT_NEAR(exp[i], actual[i], 0.0000000000000001) << "Failed at index " < xs(4, 0.0); Array1D ys(4, 0.0); diff --git a/tst/EnergyPlus/unit/VentilatedSlab.unit.cc b/tst/EnergyPlus/unit/VentilatedSlab.unit.cc index 7898facf97f..3e0e6779b31 100644 --- a/tst/EnergyPlus/unit/VentilatedSlab.unit.cc +++ b/tst/EnergyPlus/unit/VentilatedSlab.unit.cc @@ -2382,6 +2382,6 @@ TEST_F(EnergyPlusFixture, VentilatedSlab_InitVentilatedSlabTest) EXPECT_EQ("ZONE4VENTSLAB", state->dataVentilatedSlab->VentSlab(2).Name); InitVentilatedSlab(*state, Item, VentSlabZoneNum, FirstHVACIteration); - EXPECT_EQ(324.38499999999999, state->dataVentilatedSlab->VentSlab(1).TotalSurfaceArea); - EXPECT_EQ(139.21499999999997, state->dataVentilatedSlab->VentSlab(2).TotalSurfaceArea); + EXPECT_DOUBLE_EQ(324.38499999999999, state->dataVentilatedSlab->VentSlab(1).TotalSurfaceArea); + EXPECT_DOUBLE_EQ(139.21499999999997, state->dataVentilatedSlab->VentSlab(2).TotalSurfaceArea); } diff --git a/tst/EnergyPlus/unit/WaterThermalTanks.unit.cc b/tst/EnergyPlus/unit/WaterThermalTanks.unit.cc index ff99c1ca594..3fe539052c3 100644 --- a/tst/EnergyPlus/unit/WaterThermalTanks.unit.cc +++ b/tst/EnergyPlus/unit/WaterThermalTanks.unit.cc @@ -1754,7 +1754,7 @@ TEST_F(EnergyPlusFixture, StratifiedTankSourceTemperatures) Tank.CalcWaterThermalTankStratified(*state); // check source inlet and outlet temperatures are different - EXPECT_EQ(Tank.SourceInletTemp, 5.0); + EXPECT_DOUBLE_EQ(Tank.SourceInletTemp, 5.0); EXPECT_NEAR(Tank.SourceOutletTemp, 10.34, 0.01); } From 8a7de96bd46e2eaad7a392e450b684bdcb06aa9c Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 9 Jul 2024 13:33:38 +0200 Subject: [PATCH 2/3] Fix the non trivial ones. cf https://github.com/NREL/EnergyPlus/issues/10122#issuecomment-2217405175 --- .../unit/PhotovoltaicThermalCollectors.unit.cc | 8 ++++++++ tst/EnergyPlus/unit/Psychrometrics.unit.cc | 15 ++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/tst/EnergyPlus/unit/PhotovoltaicThermalCollectors.unit.cc b/tst/EnergyPlus/unit/PhotovoltaicThermalCollectors.unit.cc index b4fe3bb4e60..58f832bb704 100644 --- a/tst/EnergyPlus/unit/PhotovoltaicThermalCollectors.unit.cc +++ b/tst/EnergyPlus/unit/PhotovoltaicThermalCollectors.unit.cc @@ -419,8 +419,16 @@ TEST_F(EnergyPlusFixture, BIPVT_calculateBIPVTMaxHeatGain) state->dataHeatBal->SurfQRadSWOutIncident(thisBIPVT.SurfNum) = 0.0; thisBIPVT.calculateBIPVTMaxHeatGain(*state, tempSetPoint, bypassFraction, potentialHeatGain, potentialOutletTemp, eff, tCollector); +#if defined(__APPLE__) && defined __arm64__ + // BIPVT uses solveLinSysBackSub to solve a system of linear equations using Gaussian elimination and back substitution method + // The iteration is slightly different on mac M1, leading to an extra iteration happening to satisfy the error tolerance of 1e-3 and leads to + // different results, cf https://github.com/NREL/EnergyPlus/issues/10122#issuecomment-2217405175 + EXPECT_NEAR(bypassFraction, 0.249, 0.001); + EXPECT_NEAR(potentialHeatGain, -3021.77, 0.01); +#else EXPECT_NEAR(bypassFraction, 0.248, 0.001); EXPECT_NEAR(potentialHeatGain, -3023.06, 0.01); +#endif EXPECT_NEAR(potentialOutletTemp, 22.0, 0.01); EXPECT_NEAR(eff, 0.0, 0.0001); EXPECT_NEAR(tCollector, 20.38, 0.01); diff --git a/tst/EnergyPlus/unit/Psychrometrics.unit.cc b/tst/EnergyPlus/unit/Psychrometrics.unit.cc index a0a2cd9d70f..2213c9858a0 100644 --- a/tst/EnergyPlus/unit/Psychrometrics.unit.cc +++ b/tst/EnergyPlus/unit/Psychrometrics.unit.cc @@ -309,7 +309,7 @@ TEST_F(EnergyPlusFixture, Psychrometrics_PsyCpAirFn_Test) // check result EXPECT_NEAR(analytic_result, numerical_result, 1.0E-010); - // Test 5: analytical vs numerical cp values for psychomteric chart T and W range + // Test 5: analytical vs numerical cp values for psychrometric chart T and W range Real64 SSE = 0.0; Real64 Error = 0.0; Real64 Error_sum = 0.0; @@ -336,11 +336,24 @@ TEST_F(EnergyPlusFixture, Psychrometrics_PsyCpAirFn_Test) } Real64 StdError = std::sqrt(SSE / 100); Real64 Error_avg = Error_sum / 101; + // check analytical vs numerical cp values stats + EXPECT_LT(Error_min, 0.0); + EXPECT_GT(Error_max, 0.0); + EXPECT_GT(Error_avg, 0.0); + EXPECT_GT(StdError, 0.0); + +#if defined(__APPLE__) && defined __arm64__ + EXPECT_GE(std::abs(Error_min), -2.8808244678657502e-10); + EXPECT_LE(Error_max, 2.5875124265439808e-10); + EXPECT_LE(Error_avg, 1.5508032789728189e-09); + EXPECT_LE(StdError, 6.7111413639467468e-10); +#else EXPECT_DOUBLE_EQ(Error_min, -2.8808244678657502e-10); EXPECT_DOUBLE_EQ(Error_max, 2.5875124265439808e-10); EXPECT_DOUBLE_EQ(Error_avg, 1.5508032789728189e-09); EXPECT_DOUBLE_EQ(StdError, 6.7111413639467468e-10); +#endif } TEST_F(EnergyPlusFixture, Psychrometrics_CpAirValue_Test) From 03f72014c9027b1896ccbd8272f6eab0a5298228 Mon Sep 17 00:00:00 2001 From: Julien Marrec Date: Tue, 9 Jul 2024 13:51:38 +0200 Subject: [PATCH 3/3] clang format --- tst/EnergyPlus/unit/SolarShading.unit.cc | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tst/EnergyPlus/unit/SolarShading.unit.cc b/tst/EnergyPlus/unit/SolarShading.unit.cc index 95db5651794..3dc05ae5ab4 100644 --- a/tst/EnergyPlus/unit/SolarShading.unit.cc +++ b/tst/EnergyPlus/unit/SolarShading.unit.cc @@ -3444,10 +3444,10 @@ TEST_F(EnergyPlusFixture, SolarShadingTest_CTRANS) Vector expected_lcsy(0.96592582628906831, 0.25881904510252079, -0.0); Vector expected_lcsz(0.0, 0.0, 1.0); - auto compare_double_vectors = [](Vector const & exp, Vector const& actual) { + auto compare_double_vectors = [](Vector const &exp, Vector const &actual) { ASSERT_EQ(exp.size(), actual.size()); for (size_t i = 0; i < exp.size(); ++i) { - EXPECT_NEAR(exp[i], actual[i], 0.0000000000000001) << "Failed at index " <