From 08733a721c816c5c6cd573a8039ee3c817c68117 Mon Sep 17 00:00:00 2001 From: rraustad Date: Fri, 15 Dec 2023 17:41:33 -0500 Subject: [PATCH] Get file to run and report system name --- src/EnergyPlus/AirLoopHVACDOAS.cc | 1 - .../Autosizing/HeatingCapacitySizing.cc | 2 +- src/EnergyPlus/ReportCoilSelection.cc | 61 +++++++- src/EnergyPlus/UnitarySystem.cc | 4 +- src/EnergyPlus/VariableSpeedCoils.cc | 146 ++++++++++-------- 5 files changed, 140 insertions(+), 74 deletions(-) diff --git a/src/EnergyPlus/AirLoopHVACDOAS.cc b/src/EnergyPlus/AirLoopHVACDOAS.cc index 6ab4644868e..d72172ffd3f 100644 --- a/src/EnergyPlus/AirLoopHVACDOAS.cc +++ b/src/EnergyPlus/AirLoopHVACDOAS.cc @@ -853,7 +853,6 @@ namespace AirLoopHVACDOAS { if (state.dataGlobal->BeginEnvrnFlag && this->MyEnvrnFlag) { bool ErrorsFound = false; Real64 rho; - state.dataSize->CurSysNum = this->m_OASystemNum; for (int CompNum = 1; CompNum <= state.dataAirLoop->OutsideAirSys(this->m_OASystemNum).NumComponents; ++CompNum) { std::string CompType = state.dataAirLoop->OutsideAirSys(this->m_OASystemNum).ComponentType(CompNum); std::string CompName = state.dataAirLoop->OutsideAirSys(this->m_OASystemNum).ComponentName(CompNum); diff --git a/src/EnergyPlus/Autosizing/HeatingCapacitySizing.cc b/src/EnergyPlus/Autosizing/HeatingCapacitySizing.cc index 3be70d31aab..bbb7536d2ec 100644 --- a/src/EnergyPlus/Autosizing/HeatingCapacitySizing.cc +++ b/src/EnergyPlus/Autosizing/HeatingCapacitySizing.cc @@ -451,7 +451,7 @@ Real64 HeatingCapacitySizer::size(EnergyPlusData &state, Real64 _originalValue, this->selectSizerOutput(state, errorsFound); - if (this->isCoilReportObject && this->curSysNum <= state.dataHVACGlobal->NumPrimaryAirSys) { + if (this->isCoilReportObject) { if (CoilInTemp > -999.0) { // set inlet air properties used during capacity sizing if available, allow for negative winter temps state.dataRptCoilSelection->coilSelectionReportObj->setCoilEntAirTemp( state, this->compName, this->compType, CoilInTemp, this->curSysNum, this->curZoneEqNum); diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index d8945992ddc..838ba697ae4 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -50,6 +50,7 @@ #include // EnergyPlus Headers +#include #include #include #include @@ -149,7 +150,9 @@ void ReportCoilSelection::writeCoilSelectionOutput(EnergyPlusData &state) OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchHeatCoilAirloopName, c->coilName_, - c->airloopNum > 0 ? state.dataAirSystemsData->PrimaryAirSystems(c->airloopNum).Name : "N/A"); + c->airloopNum > 0 && c->airloopNum <= state.dataHVACGlobal->NumPrimaryAirSys + ? state.dataAirSystemsData->PrimaryAirSystems(c->airloopNum).Name + : "N/A"); OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchHeatCoilPlantloopName, c->coilName_, @@ -248,7 +251,9 @@ void ReportCoilSelection::writeCoilSelectionOutput(EnergyPlusData &state) OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoilAirloopName_CCs, c->coilName_, - c->airloopNum > 0 ? state.dataAirSystemsData->PrimaryAirSystems(c->airloopNum).Name : "N/A"); + c->airloopNum > 0 && c->airloopNum <= state.dataHVACGlobal->NumPrimaryAirSys + ? state.dataAirSystemsData->PrimaryAirSystems(c->airloopNum).Name + : "N/A"); OutputReportPredefined::PreDefTableEntry(state, state.dataOutRptPredefined->pdchCoilPlantloopName_CCs, c->coilName_, c->plantLoopName); // end of std 229 New coil connections table entries @@ -543,7 +548,7 @@ void ReportCoilSelection::doAirLoopSetup(EnergyPlusData &state, int const coilVe { // this routine sets up some things for central air systems, needs to follow setting of an airloop num auto &c(coilSelectionDataObjs[coilVecIndex]); - if (c->airloopNum > 0 && allocated(state.dataAirSystemsData->PrimaryAirSystems)) { + if (c->airloopNum > 0 && c->airloopNum <= state.dataAirSystemsData->PrimaryAirSystems.size()) { // see if there is an OA controller if (state.dataAirSystemsData->PrimaryAirSystems(c->airloopNum).OASysExists) { // loop over OA controllers and match node num ? @@ -735,7 +740,12 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) } // if (zoneEquipList.numOfEquipTypes > 0) } // if (c->ZoneEqNum > 0) - if (c->airloopNum > 0 && c->zoneEqNum == 0) { + if (c->airloopNum > state.dataHVACGlobal->NumPrimaryAirSys && c->oASysNum > 0) { + c->coilLocation = "DOAS AirLoop"; + c->typeHVACname = "AirLoopHVAC:DedicatedOutdoorAirSystem"; + int DOASSysNum = state.dataAirLoop->OutsideAirSys(c->oASysNum).AirLoopDOASNum; + c->userNameforHVACsystem = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].Name; + } else if (c->airloopNum > 0 && c->zoneEqNum == 0) { c->coilLocation = "AirLoop"; c->typeHVACname = "AirLoopHVAC"; c->userNameforHVACsystem = state.dataAirSystemsData->PrimaryAirSystems(c->airloopNum).Name; @@ -1276,7 +1286,8 @@ void ReportCoilSelection::setCoilCoolingCapacity( // if ( c->zoneEqNum > 0 ) doZoneEqSetup( index ); c->oASysNum = curOASysNum; - if (curSysNum > 0 && c->zoneEqNum == 0 && allocated(state.dataSize->FinalSysSizing) && allocated(SysSizPeakDDNum)) { + if (curSysNum > 0 && c->zoneEqNum == 0 && allocated(state.dataSize->FinalSysSizing) && allocated(SysSizPeakDDNum) && + curSysNum <= state.dataHVACGlobal->NumPrimaryAirSys) { // These next blocks does not always work with SizingPeriod:WeatherFileDays or SizingPeriod:WeatherFileConditionType, protect against hard // crash @@ -1530,7 +1541,7 @@ void ReportCoilSelection::setCoilHeatingCapacity( doAirLoopSetup(state, index); c->zoneEqNum = curZoneEqNum; // if ( c->zoneEqNum > 0 ) doZoneEqSetup( index ); - if (curSysNum > 0 && c->zoneEqNum == 0 && allocated(state.dataSize->FinalSysSizing)) { + if (curSysNum > 0 && c->zoneEqNum == 0 && curSysNum <= state.dataSize->FinalSysSizing.size()) { auto &finalSysSizing = state.dataSize->FinalSysSizing(curSysNum); c->desDayNameAtSensPeak = finalSysSizing.HeatDesDay; @@ -1755,6 +1766,42 @@ void ReportCoilSelection::setCoilHeatingCapacity( c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( state, c->coilDesLvgTemp, c->coilDesLvgHumRat, state.dataEnvrn->StdBaroPress, "ReportCoilSelection::setCoilHeatingCapacity"); c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW(c->coilDesLvgTemp, c->coilDesLvgHumRat); + } else if (curOASysNum > 0 && c->airloopNum > state.dataHVACGlobal->NumPrimaryAirSys) { + if (!state.dataAirLoopHVACDOAS->airloopDOAS.empty()) { + c->oASysNum = curOASysNum; // where should this get set? It's -999 here. + int DOASSysNum = state.dataAirLoop->OutsideAirSys(curOASysNum).AirLoopDOASNum; + c->coilDesEntTemp = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].HeatOutTemp; + c->coilDesEntHumRat = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].HeatOutHumRat; + if (c->coilDesEntTemp > -999.0 && c->coilDesEntHumRat > -999.0) { + c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb( + state, c->coilDesEntTemp, c->coilDesEntHumRat, state.dataEnvrn->StdBaroPress, "ReportCoilSelection::setCoilHeatingCapacity"); + c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW(c->coilDesEntTemp, c->coilDesEntHumRat); + } + c->coilDesLvgTemp = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].PreheatTemp; + c->coilDesLvgHumRat = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].PreheatHumRat; + if (c->coilDesLvgTemp > -999.0 && c->coilDesLvgHumRat > -999.0) { + c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb( + state, c->coilDesLvgTemp, c->coilDesLvgHumRat, state.dataEnvrn->StdBaroPress, "ReportCoilSelection::setCoilHeatingCapacity"); + c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW(c->coilDesLvgTemp, c->coilDesLvgHumRat); + } + int sizMethod = 0; + bool sizMethodsAreTheSame = true; + for (int airLoopNum = 0; airLoopNum < state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].m_AirLoopNum.size(); ++airLoopNum) { + int actualAirLoopNum = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].m_AirLoopNum[airLoopNum]; + if (airLoopNum == 0) { + sizMethod = state.dataSize->FinalSysSizing(actualAirLoopNum).SizingOption; + } else { + if (sizMethod != state.dataSize->FinalSysSizing(actualAirLoopNum).SizingOption) { + sizMethodsAreTheSame = false; + } + } + } + if (sizMethodsAreTheSame) { + c->coilSizingMethodConcurrence = sizMethod; + } else { + // c->coilSizingMethodConcurrence = DataSizing::Combination; // TRANE + } + } } else { // do nothing } @@ -1772,7 +1819,7 @@ void ReportCoilSelection::setCoilHeatingCapacity( c->coilDesMassFlow = finalZoneSizing.DesHeatMassFlow; c->coilDesVolFlow = c->coilDesMassFlow / state.dataEnvrn->StdRhoAir; } - } else if (curSysNum > 0 && allocated(state.dataSize->FinalSysSizing)) { + } else if (curSysNum > 0 && curSysNum <= state.dataHVACGlobal->NumPrimaryAirSys) { auto &finalSysSizing = state.dataSize->FinalSysSizing(curSysNum); if (curOASysNum > 0 && allocated(state.dataSize->OASysEqSizing)) { auto &oASysEqSizing = state.dataSize->OASysEqSizing(curSysNum); diff --git a/src/EnergyPlus/UnitarySystem.cc b/src/EnergyPlus/UnitarySystem.cc index 9d8a50a558f..748bd87ad6e 100644 --- a/src/EnergyPlus/UnitarySystem.cc +++ b/src/EnergyPlus/UnitarySystem.cc @@ -15933,7 +15933,9 @@ namespace UnitarySystems { thisOASysEqSizing.HeatingCapacity = false; this->m_FirstPass = false; } else if (state.dataSize->CurSysNum > 0) { - state.dataAirLoop->AirLoopControlInfo(state.dataSize->CurSysNum).UnitarySysSimulating = false; + if (state.dataSize->CurSysNum <= state.dataHVACGlobal->NumPrimaryAirSys) { + state.dataAirLoop->AirLoopControlInfo(state.dataSize->CurSysNum).UnitarySysSimulating = false; + } DataSizing::resetHVACSizingGlobals(state, state.dataSize->CurZoneEqNum, state.dataSize->CurSysNum, this->m_FirstPass); } else if (state.dataSize->CurZoneEqNum > 0) { DataSizing::resetHVACSizingGlobals(state, state.dataSize->CurZoneEqNum, state.dataSize->CurSysNum, this->m_FirstPass); diff --git a/src/EnergyPlus/VariableSpeedCoils.cc b/src/EnergyPlus/VariableSpeedCoils.cc index 7f65a7237fa..90ca8076bd9 100644 --- a/src/EnergyPlus/VariableSpeedCoils.cc +++ b/src/EnergyPlus/VariableSpeedCoils.cc @@ -4748,10 +4748,16 @@ namespace VariableSpeedCoils { } } else { CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name); - if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow >= DataHVACGlobals::SmallAirVolFlow) { - RatedAirVolFlowRateDes = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow; + if (state.dataSize->CurOASysNum > 0 && state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum > -1) { + auto &thisAirloopDOAS = + state.dataAirLoopHVACDOAS->airloopDOAS[state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum]; + RatedAirVolFlowRateDes = thisAirloopDOAS.SizingMassFlow / state.dataEnvrn->StdRhoAir; } else { - RatedAirVolFlowRateDes = 0.0; + if (state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow >= DataHVACGlobals::SmallAirVolFlow) { + RatedAirVolFlowRateDes = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum).DesMainVolFlow; + } else { + RatedAirVolFlowRateDes = 0.0; + } } } } @@ -4800,72 +4806,84 @@ namespace VariableSpeedCoils { } } else { CheckSysSizing(state, format("COIL:{}{}", varSpeedCoil.CoolHeatType, CurrentObjSubfix), varSpeedCoil.Name); - auto &finalSysSizing = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum); - VolFlowRate = varSpeedCoil.RatedAirVolFlowRate; - if (VolFlowRate >= DataHVACGlobals::SmallAirVolFlow) { - if (state.dataSize->CurOASysNum > 0) { // coil is in the OA stream - MixTemp = finalSysSizing.OutTempAtCoolPeak; - MixHumRat = finalSysSizing.OutHumRatAtCoolPeak; - SupTemp = finalSysSizing.PrecoolTemp; - SupHumRat = finalSysSizing.PrecoolHumRat; - } else { // coil is on the main air loop - SupTemp = finalSysSizing.CoolSupTemp; - SupHumRat = finalSysSizing.CoolSupHumRat; - if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).NumOACoolCoils == - 0) { // there is no precooling of the OA stream - MixTemp = finalSysSizing.MixTempAtCoolPeak; - MixHumRat = finalSysSizing.MixHumRatAtCoolPeak; - } else { // there is precooling of OA stream - if (VolFlowRate > 0.0) { - OutAirFrac = finalSysSizing.DesOutAirVolFlow / VolFlowRate; - } else { - OutAirFrac = 1.0; + if (state.dataSize->CurOASysNum > 0 && state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum > -1) { + auto &thisAirloopDOAS = + state.dataAirLoopHVACDOAS->airloopDOAS[state.dataAirLoop->OutsideAirSys(state.dataSize->CurOASysNum).AirLoopDOASNum]; + VolFlowRate = thisAirloopDOAS.SizingMassFlow / state.dataEnvrn->StdRhoAir; + MixTemp = thisAirloopDOAS.SizingCoolOATemp; + SupTemp = thisAirloopDOAS.PrecoolTemp; + MixHumRat = thisAirloopDOAS.SizingCoolOAHumRat; + SupHumRat = thisAirloopDOAS.PrecoolHumRat; + RatedCapCoolTotalDes = VolFlowRate * state.dataEnvrn->StdRhoAir * + (Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat) - Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat)); + } else { + auto &finalSysSizing = state.dataSize->FinalSysSizing(state.dataSize->CurSysNum); + VolFlowRate = varSpeedCoil.RatedAirVolFlowRate; + if (VolFlowRate >= DataHVACGlobals::SmallAirVolFlow) { + if (state.dataSize->CurOASysNum > 0) { // coil is in the OA stream + MixTemp = finalSysSizing.OutTempAtCoolPeak; + MixHumRat = finalSysSizing.OutHumRatAtCoolPeak; + SupTemp = finalSysSizing.PrecoolTemp; + SupHumRat = finalSysSizing.PrecoolHumRat; + } else { // coil is on the main air loop + SupTemp = finalSysSizing.CoolSupTemp; + SupHumRat = finalSysSizing.CoolSupHumRat; + if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).NumOACoolCoils == + 0) { // there is no precooling of the OA stream + MixTemp = finalSysSizing.MixTempAtCoolPeak; + MixHumRat = finalSysSizing.MixHumRatAtCoolPeak; + } else { // there is precooling of OA stream + if (VolFlowRate > 0.0) { + OutAirFrac = finalSysSizing.DesOutAirVolFlow / VolFlowRate; + } else { + OutAirFrac = 1.0; + } + OutAirFrac = min(1.0, max(0.0, OutAirFrac)); + MixTemp = OutAirFrac * finalSysSizing.PrecoolTemp + (1.0 - OutAirFrac) * finalSysSizing.RetTempAtCoolPeak; + MixHumRat = OutAirFrac * finalSysSizing.PrecoolHumRat + (1.0 - OutAirFrac) * finalSysSizing.RetHumRatAtCoolPeak; } - OutAirFrac = min(1.0, max(0.0, OutAirFrac)); - MixTemp = OutAirFrac * finalSysSizing.PrecoolTemp + (1.0 - OutAirFrac) * finalSysSizing.RetTempAtCoolPeak; - MixHumRat = OutAirFrac * finalSysSizing.PrecoolHumRat + (1.0 - OutAirFrac) * finalSysSizing.RetHumRatAtCoolPeak; } - } - OutTemp = finalSysSizing.OutTempAtCoolPeak; - MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat); - SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat); - - // design fan heat will be added to coil load - Real64 FanCoolLoad = - DataAirSystems::calcFanDesignHeatGain(state, state.dataSize->DataFanEnumType, state.dataSize->DataFanIndex, VolFlowRate); - // inlet/outlet temp is adjusted after enthalpy is calculcated so fan heat is not double counted - Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat); - if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanLocation == - DataAirSystems::FanPlacement::BlowThru) { - MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate); - } else if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanLocation == - DataAirSystems::FanPlacement::DrawThru) { - SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate); - } - MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName); - if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) { - RatedSourceTempCool = OutTemp; - } else { - RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum); - } - TotCapTempModFac = - Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool); + OutTemp = finalSysSizing.OutTempAtCoolPeak; + MixEnth = Psychrometrics::PsyHFnTdbW(MixTemp, MixHumRat); + SupEnth = Psychrometrics::PsyHFnTdbW(SupTemp, SupHumRat); + + // design fan heat will be added to coil load + Real64 FanCoolLoad = + DataAirSystems::calcFanDesignHeatGain(state, state.dataSize->DataFanEnumType, state.dataSize->DataFanIndex, VolFlowRate); + // inlet/outlet temp is adjusted after enthalpy is calculcated so fan heat is not double counted + Real64 CpAir = Psychrometrics::PsyCpAirFnW(MixHumRat); + if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanLocation == + DataAirSystems::FanPlacement::BlowThru) { + MixTemp += FanCoolLoad / (CpAir * rhoair * VolFlowRate); + } else if (state.dataAirSystemsData->PrimaryAirSystems(state.dataSize->CurSysNum).supFanLocation == + DataAirSystems::FanPlacement::DrawThru) { + SupTemp -= FanCoolLoad / (CpAir * rhoair * VolFlowRate); + } + MixWetBulb = Psychrometrics::PsyTwbFnTdbWPb(state, MixTemp, MixHumRat, state.dataEnvrn->StdBaroPress, RoutineName); + if (varSpeedCoil.CondenserType == DataHeatBalance::RefrigCondenserType::Air) { + RatedSourceTempCool = OutTemp; + } else { + RatedSourceTempCool = GetVSCoilRatedSourceTemp(state, DXCoilNum); + } + TotCapTempModFac = + Curve::CurveValue(state, varSpeedCoil.MSCCapFTemp(varSpeedCoil.NormSpedLevel), MixWetBulb, RatedSourceTempCool); - // The mixed air temp for zone equipment without an OA mixer is 0. - // This test avoids a negative capacity until a solution can be found. - if (MixEnth > SupEnth) { - CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad; - } else { - CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad; - } - CoolCapAtPeak = max(0.0, CoolCapAtPeak); - if (TotCapTempModFac > 0.0) { - RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac; + // The mixed air temp for zone equipment without an OA mixer is 0. + // This test avoids a negative capacity until a solution can be found. + if (MixEnth > SupEnth) { + CoolCapAtPeak = (rhoair * VolFlowRate * (MixEnth - SupEnth)) + FanCoolLoad; + } else { + CoolCapAtPeak = (rhoair * VolFlowRate * (48000.0 - SupEnth)) + FanCoolLoad; + } + CoolCapAtPeak = max(0.0, CoolCapAtPeak); + if (TotCapTempModFac > 0.0) { + RatedCapCoolTotalDes = CoolCapAtPeak / TotCapTempModFac; + } else { + RatedCapCoolTotalDes = CoolCapAtPeak; + } } else { - RatedCapCoolTotalDes = CoolCapAtPeak; + RatedCapCoolTotalDes = 0.0; } - } else { - RatedCapCoolTotalDes = 0.0; } }