diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index fa0cf2f26d9..da81362f9e2 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -977,6 +977,17 @@ HVACSystemRootFindingAlgorithm, \type integer \default 5 +HeatIndexAlgorithm, + \memo Specify whether the simplified or the extended method should be used + \memo Simplified: based on regression analysis carried out by Lans P. Rothfusz + \memo Extended: Based on paper by Lu & Romps + \unique-object + A1 ; \field Algorithm + \type choice + \key Simplified + \key Extended + \default Simplified + \group Compliance Objects Compliance:Building, diff --git a/src/EnergyPlus/DataHeatBalance.hh b/src/EnergyPlus/DataHeatBalance.hh index d0c04f26035..7de88a379c4 100644 --- a/src/EnergyPlus/DataHeatBalance.hh +++ b/src/EnergyPlus/DataHeatBalance.hh @@ -547,6 +547,19 @@ namespace DataHeatBalance { { } }; + + enum class HeatIndexMethod : int + { + Invalid = -1, + Simplified, + Extended, + Num + }; + static constexpr std::array(HeatIndexMethod::Num)> HeatIndexMethodUC = { + "SIMPLIFIED", + "EXTENDED", + }; + struct ZoneData : ZoneSpaceData { // Members @@ -1847,6 +1860,7 @@ struct HeatBalanceData : BaseGlobalStruct bool NoRegularMaterialsUsed = true; bool DoLatentSizing = false; // true when latent sizing is performed during zone sizing bool isAnyLatentLoad = false; + DataHeatBalance::HeatIndexMethod heatIndexMethod = DataHeatBalance::HeatIndexMethod::Simplified; Array1D ZoneListSNLoadHeatEnergy; Array1D ZoneListSNLoadCoolEnergy; diff --git a/src/EnergyPlus/HeatBalanceManager.cc b/src/EnergyPlus/HeatBalanceManager.cc index a4c2d6ceed3..2c2b3f14cd6 100644 --- a/src/EnergyPlus/HeatBalanceManager.cc +++ b/src/EnergyPlus/HeatBalanceManager.cc @@ -277,6 +277,8 @@ namespace HeatBalanceManager { GetIncidentSolarMultiplier(state, ErrorsFound); + GetHeatIndexMethod(state, ErrorsFound); + // Added SV 6/26/2013 to load scheduled surface gains GetScheduledSurfaceGains(state, ErrorsFound); @@ -2165,6 +2167,38 @@ namespace HeatBalanceManager { } } + void GetHeatIndexMethod(EnergyPlusData &state, bool &ErrorsFound) + { + static constexpr std::string_view RoutineName("GetHeatIndexMethod: "); + + Array1D_string Alphas(1); + Array1D Numbers(1); + int NumAlpha; + int NumNumber; + int IOStat; + + state.dataHeatBalMgr->CurrentModuleObject = "HeatIndexAlgorithm"; + int NumObjects = state.dataInputProcessing->inputProcessor->getNumObjectsFound(state, state.dataHeatBalMgr->CurrentModuleObject); + if (NumObjects > 0) { + state.dataInputProcessing->inputProcessor->getObjectItem(state, + state.dataHeatBalMgr->CurrentModuleObject, + 1, + Alphas, + NumAlpha, + Numbers, + NumNumber, + IOStat, + state.dataIPShortCut->lNumericFieldBlanks, + state.dataIPShortCut->lAlphaFieldBlanks, + state.dataIPShortCut->cAlphaFieldNames, + state.dataIPShortCut->cNumericFieldNames); + if (NumAlpha > 0) { + state.dataHeatBal->heatIndexMethod = + static_cast(getEnumValue(DataHeatBalance::HeatIndexMethodUC, Util::makeUPPER(Alphas(1)))); + } + } + } + void GetZoneLocalEnvData(EnergyPlusData &state, bool &ErrorsFound) // Error flag indicator (true if errors found) { // SUBROUTINE INFORMATION: diff --git a/src/EnergyPlus/HeatBalanceManager.hh b/src/EnergyPlus/HeatBalanceManager.hh index 7b415723c7b..e688bdd0f98 100644 --- a/src/EnergyPlus/HeatBalanceManager.hh +++ b/src/EnergyPlus/HeatBalanceManager.hh @@ -167,6 +167,8 @@ namespace HeatBalanceManager { void GetIncidentSolarMultiplier(EnergyPlusData &state, bool &ErrorsFound); + void GetHeatIndexMethod(EnergyPlusData &state, bool &ErrorsFound); + void GetScheduledSurfaceGains(EnergyPlusData &state, bool &ErrorsFound); // If errors found in input void CheckScheduledSurfaceGains(EnergyPlusData &state, int const ZoneNum); // Zone number for which error check will be performed diff --git a/src/EnergyPlus/HeatBalanceSurfaceManager.cc b/src/EnergyPlus/HeatBalanceSurfaceManager.cc index 1875ef883d0..f283b9f64b4 100644 --- a/src/EnergyPlus/HeatBalanceSurfaceManager.cc +++ b/src/EnergyPlus/HeatBalanceSurfaceManager.cc @@ -5522,7 +5522,7 @@ void CalcThermalResilience(EnergyPlusData &state) Real64 const ZoneW = state.dataZoneTempPredictorCorrector->zoneHeatBalance(ZoneNum).airHumRatAvg; Real64 const ZoneRH = Psychrometrics::PsyRhFnTdbWPb(state, ZoneT, ZoneW, state.dataEnvrn->OutBaroPress) * 100.0; Real64 const ZoneTF = ZoneT * (9.0 / 5.0) + 32.0; - if (ZoneTF * 3.0 + ZoneRH * 100.0 - 340.0 < 0.0) { + if (state.dataHeatBal->heatIndexMethod == DataHeatBalance::HeatIndexMethod::Simplified) { Real64 constexpr c1 = -42.379; Real64 constexpr c2 = 2.04901523; Real64 constexpr c3 = 10.14333127; diff --git a/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf b/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf index f357a9ebc52..e0a12c4c1b3 100644 --- a/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf +++ b/testfiles/1ZoneUncontrolled_Win_ASH55_Thermal_Comfort.idf @@ -653,6 +653,9 @@ 7.5, !- Y-Coordinate of Reference Point {m} 0.7; !- Z-Coordinate of Reference Point {m} + HeatIndexAlgorithm, + Simplified; + Output:Variable,*,Site Outdoor Air Barometric Pressure,hourly; Output:Variable,*,Site Outdoor Air Drybulb Temperature,hourly;