Skip to content

Commit

Permalink
Merge pull request #10334 from NREL/10332-DOAS-incorrect-system-name-…
Browse files Browse the repository at this point in the history
…in-CoilDetails

Correct crash with DOAS VS DX coils and fix system name in Coil Sizing tables
  • Loading branch information
Myoldmopar authored Feb 16, 2024
2 parents 8823ee1 + 2308f5f commit 19484de
Show file tree
Hide file tree
Showing 6 changed files with 196 additions and 74 deletions.
1 change: 0 additions & 1 deletion src/EnergyPlus/AirLoopHVACDOAS.cc
Original file line number Diff line number Diff line change
Expand Up @@ -877,7 +877,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);
Expand Down
3 changes: 2 additions & 1 deletion src/EnergyPlus/Autosizing/HeatingCapacitySizing.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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);
Expand All @@ -461,6 +461,7 @@ Real64 HeatingCapacitySizer::size(EnergyPlusData &state, Real64 _originalValue,
state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirTemp(state, this->compName, this->compType, CoilOutTemp);
state.dataRptCoilSelection->coilSelectionReportObj->setCoilLvgAirHumRat(state, this->compName, this->compType, CoilOutHumRat);
}
state.dataRptCoilSelection->coilSelectionReportObj->setCoilAirFlow(state, this->compName, this->compType, DesVolFlow, this->wasAutoSized);
Real64 constexpr FanCoolLoad = 0.0;
Real64 constexpr TotCapTempModFac = 1.0;
state.dataRptCoilSelection->coilSelectionReportObj->setCoilHeatingCapacity(state,
Expand Down
1 change: 1 addition & 0 deletions src/EnergyPlus/DataSizing.hh
Original file line number Diff line number Diff line change
Expand Up @@ -120,6 +120,7 @@ namespace DataSizing {
// parameters for sizing
constexpr int NonCoincident(1);
constexpr int Coincident(2);
constexpr int Combination(3);

// parameters for Cooling Peak Load Type
enum class PeakLoad
Expand Down
102 changes: 95 additions & 7 deletions src/EnergyPlus/ReportCoilSelection.cc
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@
#include <string>

// EnergyPlus Headers
#include <EnergyPlus/AirLoopHVACDOAS.hh>
#include <EnergyPlus/BoilerSteam.hh>
#include <EnergyPlus/Data/EnergyPlusData.hh>
#include <EnergyPlus/DataAirLoop.hh>
Expand Down Expand Up @@ -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_,
Expand Down Expand Up @@ -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

Expand Down Expand Up @@ -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 <= int(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 ?
Expand Down Expand Up @@ -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;
Expand All @@ -754,6 +764,10 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state)
c->coilSizingMethodConcurrenceName = "Non-Coincident";
} else if (c->coilSizingMethodConcurrence == DataSizing::Coincident) {
c->coilSizingMethodConcurrenceName = "Coincident";
} else if (c->coilSizingMethodConcurrence == DataSizing::Combination) {
c->coilSizingMethodConcurrenceName = "Combination";
} else {
c->coilSizingMethodConcurrenceName = "N/A";
}

if (c->coilSizingMethodCapacity == DataSizing::CoolingDesignCapacity) {
Expand Down Expand Up @@ -1276,7 +1290,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
Expand Down Expand Up @@ -1370,6 +1385,8 @@ void ReportCoilSelection::setCoilCoolingCapacity(
c->rmSensibleAtPeak = finalSysSizing.SysCoolCoinSpaceSens;
} else if (c->coilSizingMethodConcurrence == DataSizing::NonCoincident) {
c->rmSensibleAtPeak = sumSensLoad;
} else { // DataSizing::Combination or other
c->rmSensibleAtPeak = sumSensLoad;
}

// now set Coil Ent And Lvg Conditions
Expand Down Expand Up @@ -1494,6 +1511,41 @@ void ReportCoilSelection::setCoilCoolingCapacity(
c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb(
state, c->coilDesLvgTemp, c->coilDesLvgHumRat, state.dataEnvrn->StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity");
c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW(c->coilDesLvgTemp, c->coilDesLvgHumRat);
} else if (curOASysNum > 0 && c->airloopNum > state.dataHVACGlobal->NumPrimaryAirSys) {
if (!state.dataAirLoopHVACDOAS->airloopDOAS.empty()) {
int DOASSysNum = state.dataAirLoop->OutsideAirSys(curOASysNum).AirLoopDOASNum;
c->coilDesEntTemp = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].SizingCoolOATemp;
c->coilDesEntHumRat = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].SizingCoolOAHumRat;
if (c->coilDesEntTemp > -999.0 && c->coilDesEntHumRat > -999.0) {
c->coilDesEntWetBulb = Psychrometrics::PsyTwbFnTdbWPb(
state, c->coilDesEntTemp, c->coilDesEntHumRat, state.dataEnvrn->StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity");
c->coilDesEntEnth = Psychrometrics::PsyHFnTdbW(c->coilDesEntTemp, c->coilDesEntHumRat);
}
c->coilDesLvgTemp = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].PrecoolTemp;
c->coilDesLvgHumRat = state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].PrecoolHumRat;
if (c->coilDesLvgTemp > -999.0 && c->coilDesLvgHumRat > -999.0) {
c->coilDesLvgWetBulb = Psychrometrics::PsyTwbFnTdbWPb(
state, c->coilDesLvgTemp, c->coilDesLvgHumRat, state.dataEnvrn->StdBaroPress, "ReportCoilSelection::setCoilCoolingCapacity");
c->coilDesLvgEnth = Psychrometrics::PsyHFnTdbW(c->coilDesLvgTemp, c->coilDesLvgHumRat);
}
int sizMethod = 0;
bool sizMethodsAreTheSame = true;
for (int airLoopNum = 0; airLoopNum < state.dataAirLoopHVACDOAS->airloopDOAS[DOASSysNum].NumOfAirLoops; ++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;
}
}
} else {
// do nothing
}
Expand Down Expand Up @@ -1530,7 +1582,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 <= int(state.dataSize->FinalSysSizing.size())) {
auto &finalSysSizing = state.dataSize->FinalSysSizing(curSysNum);
c->desDayNameAtSensPeak = finalSysSizing.HeatDesDay;

Expand Down Expand Up @@ -1755,6 +1807,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 > int(state.dataSize->FinalSysSizing.size())) {
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].NumOfAirLoops; ++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;
}
}
} else {
// do nothing
}
Expand All @@ -1772,7 +1860,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 <= int(state.dataSize->FinalSysSizing.size())) {
auto &finalSysSizing = state.dataSize->FinalSysSizing(curSysNum);
if (curOASysNum > 0 && allocated(state.dataSize->OASysEqSizing)) {
auto &oASysEqSizing = state.dataSize->OASysEqSizing(curSysNum);
Expand Down
4 changes: 3 additions & 1 deletion src/EnergyPlus/UnitarySystem.cc
Original file line number Diff line number Diff line change
Expand Up @@ -15999,7 +15999,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);
Expand Down
Loading

5 comments on commit 19484de

@nrel-bot-2c
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-22.04-gcc-11.4: OK (2784 of 2784 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-3
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-MacOS-10.18-clang-15.0.0: OK (2762 of 2763 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - Win64-Windows-10-VisualStudio-16: OK (2762 of 2762 tests passed, 0 test warnings)

Build Badge Test Badge

@nrel-bot-2
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-22.04-gcc-11.4-UnitTestsCoverage-Debug: OK (1975 of 1975 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

@nrel-bot-2b
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

develop (Myoldmopar) - x86_64-Linux-Ubuntu-22.04-gcc-11.4-IntegrationCoverage-Debug: OK (790 of 790 tests passed, 0 test warnings)

Build Badge Test Badge Coverage Badge

Please sign in to comment.