From 357143149b1edc617a3c2f27961362937eacb108 Mon Sep 17 00:00:00 2001 From: rraustad Date: Wed, 5 Jun 2024 20:42:45 -0400 Subject: [PATCH 01/20] Improve coil association in ReportCoilSelection function doFinalProcessingOfCoilData --- src/EnergyPlus/ReportCoilSelection.cc | 52 ++++++ .../unit/ReportCoilSelection.unit.cc | 149 ++++++++++++++++++ 2 files changed, 201 insertions(+) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 183aa090711..c4d10fbfe55 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -55,6 +55,7 @@ #include #include #include +#include #include #include #include @@ -66,8 +67,11 @@ #include #include #include +#include #include #include +#include +#include #include #include @@ -709,6 +713,54 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) c->typeHVACname += " or " + zoneEquipList.EquipTypeName(equipLoop); c->userNameforHVACsystem += " or " + zoneEquipList.EquipName(equipLoop); } + } else if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop) == + DataZoneEquipment::ZoneEquipType::AirDistributionUnit) { + bool foundItem = false; + int aduIndex = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipIndex(equipLoop); + for (int eqIndex = 1; eqIndex <= state.dataDefineEquipment->AirDistUnit(aduIndex).NumComponents; ++eqIndex) { + switch (state.dataDefineEquipment->AirDistUnit(aduIndex).EquipTypeEnum(eqIndex)) { + case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat: + case DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolReheat: + case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheatVSFan: + for (auto tu : state.dataSingleDuct->sd_airterminal) { + if (tu.ReheatName != c->coilName_) continue; + c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); + c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); + foundItem = true; + c->coilLocation = "Zone Equipment"; + break; + } + break; + case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_SeriesPIU_Reheat: + case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_ParallelPIU_Reheat: + for (auto tu : state.dataPowerInductionUnits->PIU) { + if (tu.HCoil != c->coilName_) continue; + c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); + c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); + foundItem = true; + c->coilLocation = "Zone Equipment"; + break; + } + break; + default: { + foundItem = true; + break; + } + } + if (foundItem) break; + } + } else if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop) == + DataZoneEquipment::ZoneEquipType::UnitarySystem) { + for (auto unitSys : state.dataUnitarySystems->unitarySys) { + if (unitSys.Name != state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop)) continue; + if (unitSys.m_CoolingCoilName != c->coilName_ && unitSys.m_HeatingCoilName != c->coilName_ && + unitSys.m_SuppHeatCoilName != c->coilName_) + continue; + c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); + c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + break; + } } } // for (equipLoop) } // if (zoneEquipList.numOfEquipTypes > 0) diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index e807026b49e..09030919387 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -56,6 +56,7 @@ // EnergyPlus Headers #include #include +#include #include #include #include @@ -64,6 +65,7 @@ #include #include #include +#include using namespace EnergyPlus; @@ -943,3 +945,150 @@ TEST_F(EnergyPlusFixture, ReportCoilSelection_4PipeFCU_ElecHeatingCoil) EXPECT_NEAR(RatedCoilTotCap, c1->coilSensCapAtPeak, 0.1); EXPECT_NEAR(result_sensCapacity, c1->coilSensCapAtPeak, 0.1); } + +TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) +{ + Real64 constexpr mult = 1.0; + int curSysNum = 0; + int curOASysNum = 0; + int curZoneEqNum = 1; + std::string coil1Name("ElecHeatCoil"); // user-defined name of the coil + std::string coil1Type("Coil:Heating:Electric"); // idf input object class name of coil + + // set up coil selection report object by calling a public function (i.e., calls getIndexForOrCreateDataObjFromCoilName) + state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil1Name, coil1Type, mult); + bool isValidCoilType = state->dataRptCoilSelection->coilSelectionReportObj->isCompTypeCoil(coil1Type); + EXPECT_TRUE(isValidCoilType); + auto &c1 = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; + c1->zoneEqNum = curZoneEqNum; + + state->dataGlobal->NumOfZones = 1; + state->dataHeatBal->Zone.allocate(state->dataGlobal->NumOfZones); + state->dataHeatBal->Zone(1).Name = "Zone 1"; + + state->dataZoneEquip->ZoneEquipList.allocate(1); + auto &zoneEquipList = state->dataZoneEquip->ZoneEquipList(curZoneEqNum); + + zoneEquipList.NumOfEquipTypes = 1; + zoneEquipList.EquipName.allocate(1); + zoneEquipList.EquipTypeName.allocate(1); + zoneEquipList.EquipType.allocate(1); + zoneEquipList.EquipName(1) = "Zone 1 FCU"; + zoneEquipList.EquipTypeName(1) = "ZoneHVAC:FourPipeFanCoil"; + zoneEquipList.EquipType(1) = DataZoneEquipment::ZoneEquipType::FourPipeFanCoil; + + // test that 1 equipment in the equipment list has data that is read from EquipmentList data. + EXPECT_TRUE(Util::SameString(c1->coilLocation, "unknown")); + EXPECT_TRUE(Util::SameString(c1->typeHVACname, "unknown")); + EXPECT_TRUE(Util::SameString(c1->userNameforHVACsystem, "unknown")); + + state->dataRptCoilSelection->coilSelectionReportObj->finishCoilSummaryReportTable(*state); + + EXPECT_TRUE(Util::SameString(c1->coilLocation, "Zone Equipment")); + EXPECT_TRUE(Util::SameString(c1->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); + EXPECT_TRUE(Util::SameString(c1->userNameforHVACsystem, "Zone 1 FCU")); + + // add another coil and hvac system and increase equipment list to 2 + zoneEquipList.NumOfEquipTypes = 2; + zoneEquipList.EquipName.allocate(2); + zoneEquipList.EquipTypeName.allocate(2); + zoneEquipList.EquipType.allocate(2); + zoneEquipList.EquipIndex.allocate(2); + + EXPECT_TRUE(Util::SameString(zoneEquipList.EquipName(1), "")); // equipment list data is cleared + EXPECT_TRUE(Util::SameString(zoneEquipList.EquipName(2), "")); + + zoneEquipList.EquipName(1) = "Zone 1 FCU"; + zoneEquipList.EquipTypeName(1) = "ZoneHVAC:FourPipeFanCoil"; + zoneEquipList.EquipType(1) = DataZoneEquipment::ZoneEquipType::FourPipeFanCoil; + zoneEquipList.EquipIndex(1) = 1; // point to FCU #1 + zoneEquipList.EquipName(2) = "Zone 1 ADU"; + zoneEquipList.EquipTypeName(2) = "ZoneHVAC:AirDistributionUnit"; + zoneEquipList.EquipType(2) = DataZoneEquipment::ZoneEquipType::AirDistributionUnit; + zoneEquipList.EquipIndex(2) = 1; // point to single duct TU #1 + + // create an air distribution unit and TU with coil + state->dataDefineEquipment->AirDistUnit.allocate(1); + state->dataDefineEquipment->AirDistUnit(1).NumComponents = 1; + state->dataDefineEquipment->AirDistUnit(1).EquipTypeEnum.allocate(1); + state->dataDefineEquipment->AirDistUnit(1).EquipTypeEnum(1) = DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat; + + // test that 2 equipment in the equipment list will fill coil selection data + std::string coil2Name("ElecHeatCoil 2"); // user-defined name of the coil + std::string coil2Type("Coil:Heating:Electric"); // idf input object class name of coil + + state->dataSingleDuct->sd_airterminal.allocate(1); + state->dataSingleDuct->sd_airterminal(1).ReheatName = coil2Name; + + // set up coil selection report object by calling a public function (i.e., calls getIndexForOrCreateDataObjFromCoilName) + state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil2Name, coil2Type, mult); + auto &c1a = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; + auto &c2a = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[1]; + c2a->zoneEqNum = curZoneEqNum; + + EXPECT_TRUE(Util::SameString(c2a->coilLocation, "unknown")); + EXPECT_TRUE(Util::SameString(c2a->typeHVACname, "unknown")); + EXPECT_TRUE(Util::SameString(c2a->userNameforHVACsystem, "unknown")); + + state->dataRptCoilSelection->coilSelectionReportObj->finishCoilSummaryReportTable(*state); + + EXPECT_TRUE(Util::SameString(c1a->coilLocation, "Zone Equipment")); + EXPECT_TRUE(Util::SameString(c1a->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); + EXPECT_TRUE(Util::SameString(c1a->userNameforHVACsystem, "Zone 1 FCU")); + EXPECT_TRUE(Util::SameString(c2a->coilLocation, "Zone Equipment")); + EXPECT_TRUE(Util::SameString(c2a->typeHVACname, "ZoneHVAC:AirDistributionUnit")); + EXPECT_TRUE(Util::SameString(c2a->userNameforHVACsystem, "Zone 1 ADU")); + + // delete coil report objects. These do not need to be switched, but start from scratch anyway + state->dataRptCoilSelection->coilSelectionReportObj->numCoilsReported_ = 0; + state->dataRptCoilSelection->coilSelectionReportObj.reset(nullptr); + createCoilSelectionReportObj(*state); + + state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil1Name, coil1Type, mult); + state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil2Name, coil2Type, mult); + auto &c1b = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; + auto &c2b = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[1]; + c1b->zoneEqNum = curZoneEqNum; + c2b->zoneEqNum = curZoneEqNum; + + // check equipment order in equipment list + EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil)); + EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(2), DataZoneEquipment::ZoneEquipType::AirDistributionUnit)); + + // now switch the equipment order and try again + std::string tmpEquipName = zoneEquipList.EquipName(1); + std::string tmpEquipTypeName = zoneEquipList.EquipTypeName(1); + auto tmpEquipType = zoneEquipList.EquipType(1); + int tmpEquipIndex = zoneEquipList.EquipIndex(1); + + zoneEquipList.EquipName(1) = zoneEquipList.EquipName(2); + zoneEquipList.EquipTypeName(1) = zoneEquipList.EquipTypeName(2); + zoneEquipList.EquipType(1) = zoneEquipList.EquipType(2); + zoneEquipList.EquipIndex(1) = zoneEquipList.EquipIndex(2); + + zoneEquipList.EquipName(2) = tmpEquipName; + zoneEquipList.EquipTypeName(2) = tmpEquipTypeName; + zoneEquipList.EquipType(2) = tmpEquipType; + zoneEquipList.EquipIndex(2) = tmpEquipIndex; + + // check that equipment order 1s reversed equipment list + EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(2), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil)); + EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::AirDistributionUnit)); + + state->dataRptCoilSelection->coilSelectionReportObj->finishCoilSummaryReportTable(*state); + + EXPECT_TRUE(Util::SameString(c1b->coilLocation, "Zone Equipment")); + EXPECT_TRUE(Util::SameString(c1b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); + EXPECT_TRUE(Util::SameString(c1b->userNameforHVACsystem, "Zone 1 FCU")); + + // and existing logic is flawed or I'm missing something + // note that the coil is not associated with either parent + // nowhere in doFinalProcessingOfCoilData is the coil name checked for the specific coil report (except new code) + // EXPECT_TRUE(Util::SameString(c2b->coilLocation, "Zone Equipment")); + // EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:AirDistributionUnit")); + // EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 ADU")); + + EXPECT_TRUE(Util::SameString(c2b->coilLocation, "Zone Equipment")); + EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); + EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 FCU")); +} From a846460530f8221cae6f67a349222c38eb9829aa Mon Sep 17 00:00:00 2001 From: rraustad Date: Wed, 5 Jun 2024 21:17:02 -0400 Subject: [PATCH 02/20] This is better but still not robust --- src/EnergyPlus/ReportCoilSelection.cc | 3 ++- tst/EnergyPlus/unit/ReportCoilSelection.unit.cc | 12 +++--------- 2 files changed, 5 insertions(+), 10 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index c4d10fbfe55..f6cccd0a9cb 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -690,6 +690,7 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) c->coilLocation = "Zone Equipment"; } else if (zoneEquipList.NumOfEquipTypes > 1) { bool foundOne(false); + bool foundItem = false; for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { // go with the first ZoneHVAC device in the list DataZoneEquipment::ZoneEquipType equipType = zoneEquipList.EquipType(equipLoop); @@ -715,7 +716,6 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) } } else if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop) == DataZoneEquipment::ZoneEquipType::AirDistributionUnit) { - bool foundItem = false; int aduIndex = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipIndex(equipLoop); for (int eqIndex = 1; eqIndex <= state.dataDefineEquipment->AirDistUnit(aduIndex).NumComponents; ++eqIndex) { switch (state.dataDefineEquipment->AirDistUnit(aduIndex).EquipTypeEnum(eqIndex)) { @@ -762,6 +762,7 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) break; } } + if (foundItem) break; } // for (equipLoop) } // if (zoneEquipList.numOfEquipTypes > 0) } // if (c->ZoneEqNum > 0) diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index 09030919387..5286edad1d1 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -1077,18 +1077,12 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) state->dataRptCoilSelection->coilSelectionReportObj->finishCoilSummaryReportTable(*state); + // existing logic is flawed when multiple zone equipment are in the same zone (e.g., PTAC and FanCoil) EXPECT_TRUE(Util::SameString(c1b->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c1b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); EXPECT_TRUE(Util::SameString(c1b->userNameforHVACsystem, "Zone 1 FCU")); - // and existing logic is flawed or I'm missing something - // note that the coil is not associated with either parent - // nowhere in doFinalProcessingOfCoilData is the coil name checked for the specific coil report (except new code) - // EXPECT_TRUE(Util::SameString(c2b->coilLocation, "Zone Equipment")); - // EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:AirDistributionUnit")); - // EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 ADU")); - EXPECT_TRUE(Util::SameString(c2b->coilLocation, "Zone Equipment")); - EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); - EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 FCU")); + EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:AirDistributionUnit")); + EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 ADU")); } From 1925d5b2b42d28d2ff92fe5ef733d92002924001 Mon Sep 17 00:00:00 2001 From: rraustad Date: Thu, 6 Jun 2024 11:44:38 -0400 Subject: [PATCH 03/20] Remove line that hides diffs --- src/EnergyPlus/ReportCoilSelection.cc | 1 - 1 file changed, 1 deletion(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index f6cccd0a9cb..af268fad244 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -743,7 +743,6 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) } break; default: { - foundItem = true; break; } } From f814c7eff4c9d33a9053b52af769d10d4f507942 Mon Sep 17 00:00:00 2001 From: rraustad Date: Fri, 7 Jun 2024 20:19:20 -0400 Subject: [PATCH 04/20] Step 1: drill down on EquipmentList to find coil --- src/EnergyPlus/ReportCoilSelection.cc | 202 ++++++++++++-------------- 1 file changed, 93 insertions(+), 109 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index af268fad244..1156599bb5f 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -632,42 +632,57 @@ void ReportCoilSelection::doZoneEqSetup(EnergyPlusData &state, int const coilVec c->coilLocation = "Unknown"; c->typeHVACname = "Unknown"; c->userNameforHVACsystem = "Unknown"; - // now search equiment - if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).NumOfEquipTypes == 1) { // this must be it, fill strings for type and name - c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(1); - c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(1); - c->coilLocation = "Zone Equipment"; - c->zoneHVACTypeNum = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(1); - c->zoneHVACIndex = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipIndex(1); - } else if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).NumOfEquipTypes > 1) { - bool foundOne(false); - for (int equipLoop = 1; equipLoop <= state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).NumOfEquipTypes; ++equipLoop) { - // go with the first ZoneHVAC device in the list - DataZoneEquipment::ZoneEquipType equipType = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop); - if (equipType == DataZoneEquipment::ZoneEquipType::VariableRefrigerantFlowTerminal || - equipType == DataZoneEquipment::ZoneEquipType::EnergyRecoveryVentilator || - equipType == DataZoneEquipment::ZoneEquipType::FourPipeFanCoil || equipType == DataZoneEquipment::ZoneEquipType::OutdoorAirUnit || - equipType == DataZoneEquipment::ZoneEquipType::PackagedTerminalAirConditioner || - equipType == DataZoneEquipment::ZoneEquipType::PackagedTerminalHeatPump || - equipType == DataZoneEquipment::ZoneEquipType::UnitHeater || equipType == DataZoneEquipment::ZoneEquipType::UnitVentilator || - equipType == DataZoneEquipment::ZoneEquipType::VentilatedSlab || - equipType == DataZoneEquipment::ZoneEquipType::PackagedTerminalHeatPumpWaterToAir || - equipType == DataZoneEquipment::ZoneEquipType::WindowAirConditioner || - equipType == DataZoneEquipment::ZoneEquipType::DehumidifierDX) { - if (!foundOne) { - c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); - c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); - foundOne = true; - c->coilLocation = "Zone Equipment"; - c->zoneHVACTypeNum = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop); - c->zoneHVACIndex = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipIndex(equipLoop); - } else { // or may have found another - c->typeHVACname += " or " + state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); - c->userNameforHVACsystem += " or " + state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); + // now search equipment + auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); + bool keepLooking = true; + for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { + for (auto eqName : zoneEquipList.EquipName) { + if (eqName == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (auto eqSub : zoneEquipList.EquipData) { + if (eqSub.Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (auto eqSubSub : eqSub.SubEquipData) { + if (eqSubSub.Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (auto eqSubSubSub : eqSubSub.SubSubEquipData) { + if (eqSubSubSub.Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + } + } + if (!keepLooking) break; + } + if (!keepLooking) break; + } } + if (!keepLooking) break; } } - } + if (!keepLooking) break; + } // for (equipLoop) } } @@ -684,87 +699,56 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) c->userNameforHVACsystem = "Unknown"; // now search equipment auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); - if (zoneEquipList.NumOfEquipTypes == 1) { // this must be it, fill strings for type and name - c->typeHVACname = zoneEquipList.EquipTypeName(1); - c->userNameforHVACsystem = zoneEquipList.EquipName(1); - c->coilLocation = "Zone Equipment"; - } else if (zoneEquipList.NumOfEquipTypes > 1) { - bool foundOne(false); - bool foundItem = false; - for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { - // go with the first ZoneHVAC device in the list - DataZoneEquipment::ZoneEquipType equipType = zoneEquipList.EquipType(equipLoop); - if (equipType == DataZoneEquipment::ZoneEquipType::VariableRefrigerantFlowTerminal || - equipType == DataZoneEquipment::ZoneEquipType::EnergyRecoveryVentilator || - equipType == DataZoneEquipment::ZoneEquipType::FourPipeFanCoil || - equipType == DataZoneEquipment::ZoneEquipType::OutdoorAirUnit || - equipType == DataZoneEquipment::ZoneEquipType::PackagedTerminalAirConditioner || - equipType == DataZoneEquipment::ZoneEquipType::PackagedTerminalHeatPump || - equipType == DataZoneEquipment::ZoneEquipType::UnitHeater || equipType == DataZoneEquipment::ZoneEquipType::UnitVentilator || - equipType == DataZoneEquipment::ZoneEquipType::VentilatedSlab || - equipType == DataZoneEquipment::ZoneEquipType::PackagedTerminalHeatPumpWaterToAir || - equipType == DataZoneEquipment::ZoneEquipType::WindowAirConditioner || - equipType == DataZoneEquipment::ZoneEquipType::DehumidifierDX) { - if (!foundOne) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - foundOne = true; - c->coilLocation = "Zone Equipment"; - } else { // or may have found another - c->typeHVACname += " or " + zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem += " or " + zoneEquipList.EquipName(equipLoop); - } - } else if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop) == - DataZoneEquipment::ZoneEquipType::AirDistributionUnit) { - int aduIndex = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipIndex(equipLoop); - for (int eqIndex = 1; eqIndex <= state.dataDefineEquipment->AirDistUnit(aduIndex).NumComponents; ++eqIndex) { - switch (state.dataDefineEquipment->AirDistUnit(aduIndex).EquipTypeEnum(eqIndex)) { - case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat: - case DataDefineEquip::ZnAirLoopEquipType::SingleDuctConstVolReheat: - case DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheatVSFan: - for (auto tu : state.dataSingleDuct->sd_airterminal) { - if (tu.ReheatName != c->coilName_) continue; - c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); - c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); - foundItem = true; - c->coilLocation = "Zone Equipment"; - break; - } - break; - case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_SeriesPIU_Reheat: - case DataDefineEquip::ZnAirLoopEquipType::SingleDuct_ParallelPIU_Reheat: - for (auto tu : state.dataPowerInductionUnits->PIU) { - if (tu.HCoil != c->coilName_) continue; - c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); - c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); - foundItem = true; - c->coilLocation = "Zone Equipment"; - break; - } - break; - default: { + bool keepLooking = true; + for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { + for (auto eqName : zoneEquipList.EquipName) { + if (eqName == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (auto eqSub : zoneEquipList.EquipData) { + if (eqSub.Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; break; } + if (keepLooking) { + for (auto eqSubSub : eqSub.SubEquipData) { + if (eqSubSub.Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (auto eqSubSubSub : eqSubSub.SubSubEquipData) { + if (eqSubSubSub.Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + } + } + if (!keepLooking) break; + } + if (!keepLooking) break; } - if (foundItem) break; - } - } else if (state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipType(equipLoop) == - DataZoneEquipment::ZoneEquipType::UnitarySystem) { - for (auto unitSys : state.dataUnitarySystems->unitarySys) { - if (unitSys.Name != state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop)) continue; - if (unitSys.m_CoolingCoilName != c->coilName_ && unitSys.m_HeatingCoilName != c->coilName_ && - unitSys.m_SuppHeatCoilName != c->coilName_) - continue; - c->typeHVACname = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipTypeName(equipLoop); - c->userNameforHVACsystem = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum).EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - break; } + if (!keepLooking) break; } - if (foundItem) break; - } // for (equipLoop) - } // if (zoneEquipList.numOfEquipTypes > 0) - } // if (c->ZoneEqNum > 0) + } + if (!keepLooking) break; + } // for (equipLoop) + } // if (c->ZoneEqNum > 0) if (c->airloopNum > state.dataHVACGlobal->NumPrimaryAirSys && c->oASysNum > 0) { c->coilLocation = "DOAS AirLoop"; From 08cf5042a6fe0833cb2cf65ec3f5991ef14e8f43 Mon Sep 17 00:00:00 2001 From: rraustad Date: Sat, 8 Jun 2024 19:01:57 -0400 Subject: [PATCH 05/20] Revise method and update unit test --- src/EnergyPlus/ReportCoilSelection.cc | 167 ++++++------------ src/EnergyPlus/ReportCoilSelection.hh | 2 + .../unit/ReportCoilSelection.unit.cc | 93 ++++++---- 3 files changed, 114 insertions(+), 148 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 1156599bb5f..aeb5d7f68ba 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -629,60 +629,7 @@ void ReportCoilSelection::doZoneEqSetup(EnergyPlusData &state, int const coilVec } if (c->zoneEqNum > 0) { - c->coilLocation = "Unknown"; - c->typeHVACname = "Unknown"; - c->userNameforHVACsystem = "Unknown"; - // now search equipment - auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); - bool keepLooking = true; - for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { - for (auto eqName : zoneEquipList.EquipName) { - if (eqName == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - for (auto eqSub : zoneEquipList.EquipData) { - if (eqSub.Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - for (auto eqSubSub : eqSub.SubEquipData) { - if (eqSubSub.Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - for (auto eqSubSubSub : eqSubSub.SubSubEquipData) { - if (eqSubSubSub.Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - } - } - if (!keepLooking) break; - } - if (!keepLooking) break; - } - } - if (!keepLooking) break; - } - } - if (!keepLooking) break; - } // for (equipLoop) + associateZoneCoilWithParent(state, c); } } @@ -694,61 +641,8 @@ void ReportCoilSelection::doFinalProcessingOfCoilData(EnergyPlusData &state) // mine final/hard values from coil models if (c->zoneEqNum > 0) { - c->coilLocation = "Unknown"; - c->typeHVACname = "Unknown"; - c->userNameforHVACsystem = "Unknown"; - // now search equipment - auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); - bool keepLooking = true; - for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { - for (auto eqName : zoneEquipList.EquipName) { - if (eqName == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - for (auto eqSub : zoneEquipList.EquipData) { - if (eqSub.Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - for (auto eqSubSub : eqSub.SubEquipData) { - if (eqSubSub.Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - for (auto eqSubSubSub : eqSubSub.SubSubEquipData) { - if (eqSubSubSub.Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - } - } - if (!keepLooking) break; - } - if (!keepLooking) break; - } - } - if (!keepLooking) break; - } - } - if (!keepLooking) break; - } // for (equipLoop) - } // if (c->ZoneEqNum > 0) + associateZoneCoilWithParent(state, c); + } if (c->airloopNum > state.dataHVACGlobal->NumPrimaryAirSys && c->oASysNum > 0) { c->coilLocation = "DOAS AirLoop"; @@ -1015,6 +909,61 @@ int ReportCoilSelection::getIndexForOrCreateDataObjFromCoilName(EnergyPlusData & return index; } +void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std::unique_ptr &c) +{ + c->coilLocation = "Unknown"; + c->typeHVACname = "Unknown"; + c->userNameforHVACsystem = "Unknown"; + // now search equipment + auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); + bool keepLooking = true; + for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { + if (zoneEquipList.EquipName(equipLoop) == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + if (zoneEquipList.EquipData(equipLoop).Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + if (keepLooking) { + for (int subsubEq = 1; subsubEq <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++subsubEq) { + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name == c->coilName_) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + keepLooking = false; + break; + } + } + if (!keepLooking) break; + } + if (!keepLooking) break; + } + if (!keepLooking) break; + } + if (!keepLooking) break; + } + if (!keepLooking) break; + } // for (equipLoop) +} + void ReportCoilSelection::setRatedCoilConditions(EnergyPlusData &state, std::string const &coilName, // ! user-defined name of the coil std::string const &coilObjName, // coil object name, e.g., Coil:Cooling:Water diff --git a/src/EnergyPlus/ReportCoilSelection.hh b/src/EnergyPlus/ReportCoilSelection.hh index 105b82899f7..22fb8f44783 100644 --- a/src/EnergyPlus/ReportCoilSelection.hh +++ b/src/EnergyPlus/ReportCoilSelection.hh @@ -432,6 +432,8 @@ private: // methods std::string const &coilType // idf input object class name of coil ); + void associateZoneCoilWithParent(EnergyPlusData &state, std::unique_ptr &c); + public: // data int numCoilsReported_; std::vector> coilSelectionDataObjs; diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index 5286edad1d1..27f93874914 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -321,6 +321,7 @@ TEST_F(EnergyPlusFixture, ReportCoilSelection_ZoneEqCoil) state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipName(2) = "Zone 2 Unit Heater"; state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipTypeName(2) = "ZoneHVAC:UnitHeater"; state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipType(2) = DataZoneEquipment::ZoneEquipType::UnitHeater; + state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipData.allocate(3); Real64 totGrossCap = 500.0; Real64 sensGrossCap = 500.0; @@ -581,6 +582,7 @@ TEST_F(EnergyPlusFixture, ReportCoilSelection_ZoneEqCoolingCoil) state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipName(2) = "Zone 2 Unit Heater"; state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipTypeName(2) = "ZoneHVAC:UnitHeater"; state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipType(2) = DataZoneEquipment::ZoneEquipType::UnitHeater; + state->dataZoneEquip->ZoneEquipList(curZoneEqNum).EquipData.allocate(3); Real64 totGrossCap = 500.0; Real64 sensGrossCap = 400.0; @@ -952,8 +954,8 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) int curSysNum = 0; int curOASysNum = 0; int curZoneEqNum = 1; - std::string coil1Name("ElecHeatCoil"); // user-defined name of the coil - std::string coil1Type("Coil:Heating:Electric"); // idf input object class name of coil + std::string coil1Name = "ElecHeatCoil"; // user-defined name of the coil + std::string coil1Type = "Coil:Heating:Electric"; // idf input object class name of coil // set up coil selection report object by calling a public function (i.e., calls getIndexForOrCreateDataObjFromCoilName) state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil1Name, coil1Type, mult); @@ -962,20 +964,21 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) auto &c1 = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; c1->zoneEqNum = curZoneEqNum; - state->dataGlobal->NumOfZones = 1; - state->dataHeatBal->Zone.allocate(state->dataGlobal->NumOfZones); - state->dataHeatBal->Zone(1).Name = "Zone 1"; - state->dataZoneEquip->ZoneEquipList.allocate(1); auto &zoneEquipList = state->dataZoneEquip->ZoneEquipList(curZoneEqNum); zoneEquipList.NumOfEquipTypes = 1; zoneEquipList.EquipName.allocate(1); zoneEquipList.EquipTypeName.allocate(1); + zoneEquipList.EquipData.allocate(1); zoneEquipList.EquipType.allocate(1); zoneEquipList.EquipName(1) = "Zone 1 FCU"; zoneEquipList.EquipTypeName(1) = "ZoneHVAC:FourPipeFanCoil"; zoneEquipList.EquipType(1) = DataZoneEquipment::ZoneEquipType::FourPipeFanCoil; + zoneEquipList.EquipData(1).Name = "ZoneHVAC:FourPipeFanCoil"; + zoneEquipList.EquipData(1).NumSubEquip = 1; + zoneEquipList.EquipData(1).SubEquipData.allocate(1); + zoneEquipList.EquipData(1).SubEquipData(1).Name = "ElecHeatCoil"; // test that 1 equipment in the equipment list has data that is read from EquipmentList data. EXPECT_TRUE(Util::SameString(c1->coilLocation, "unknown")); @@ -992,33 +995,35 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) zoneEquipList.NumOfEquipTypes = 2; zoneEquipList.EquipName.allocate(2); zoneEquipList.EquipTypeName.allocate(2); + zoneEquipList.EquipData.allocate(2); zoneEquipList.EquipType.allocate(2); zoneEquipList.EquipIndex.allocate(2); EXPECT_TRUE(Util::SameString(zoneEquipList.EquipName(1), "")); // equipment list data is cleared EXPECT_TRUE(Util::SameString(zoneEquipList.EquipName(2), "")); + // test that 2 equipment in the equipment list will fill coil selection data + std::string coil2Name = "ElecHeatCoil 2"; // user-defined name of the coil + std::string coil2Type = "Coil:Heating:Electric"; // idf input object class name of coil + zoneEquipList.EquipName(1) = "Zone 1 FCU"; zoneEquipList.EquipTypeName(1) = "ZoneHVAC:FourPipeFanCoil"; zoneEquipList.EquipType(1) = DataZoneEquipment::ZoneEquipType::FourPipeFanCoil; - zoneEquipList.EquipIndex(1) = 1; // point to FCU #1 + zoneEquipList.EquipData(1).Name = "ZoneHVAC:FourPipeFanCoil"; + zoneEquipList.EquipData(1).NumSubEquip = 1; + zoneEquipList.EquipData(1).SubEquipData.allocate(1); + zoneEquipList.EquipData(1).SubEquipData(1).Name = coil1Name; + zoneEquipList.EquipName(2) = "Zone 1 ADU"; zoneEquipList.EquipTypeName(2) = "ZoneHVAC:AirDistributionUnit"; zoneEquipList.EquipType(2) = DataZoneEquipment::ZoneEquipType::AirDistributionUnit; - zoneEquipList.EquipIndex(2) = 1; // point to single duct TU #1 - - // create an air distribution unit and TU with coil - state->dataDefineEquipment->AirDistUnit.allocate(1); - state->dataDefineEquipment->AirDistUnit(1).NumComponents = 1; - state->dataDefineEquipment->AirDistUnit(1).EquipTypeEnum.allocate(1); - state->dataDefineEquipment->AirDistUnit(1).EquipTypeEnum(1) = DataDefineEquip::ZnAirLoopEquipType::SingleDuctVAVReheat; - - // test that 2 equipment in the equipment list will fill coil selection data - std::string coil2Name("ElecHeatCoil 2"); // user-defined name of the coil - std::string coil2Type("Coil:Heating:Electric"); // idf input object class name of coil - - state->dataSingleDuct->sd_airterminal.allocate(1); - state->dataSingleDuct->sd_airterminal(1).ReheatName = coil2Name; + zoneEquipList.EquipData(2).Name = "Zone 1 ADU"; + zoneEquipList.EquipData(2).NumSubEquip = 1; + zoneEquipList.EquipData(2).SubEquipData.allocate(1); + zoneEquipList.EquipData(2).SubEquipData(1).Name = "AIRTERMINAL:SINGLEDUCT:VAV:REHEAT"; + zoneEquipList.EquipData(2).SubEquipData(1).NumSubSubEquip = 1; + zoneEquipList.EquipData(2).SubEquipData(1).SubSubEquipData.allocate(1); + zoneEquipList.EquipData(2).SubEquipData(1).SubSubEquipData(1).Name = coil2Name; // set up coil selection report object by calling a public function (i.e., calls getIndexForOrCreateDataObjFromCoilName) state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil2Name, coil2Type, mult); @@ -1035,54 +1040,64 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c1a->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c1a->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); EXPECT_TRUE(Util::SameString(c1a->userNameforHVACsystem, "Zone 1 FCU")); + EXPECT_TRUE(Util::SameString(c1a->coilName_, coil1Name)); + EXPECT_TRUE(Util::SameString(c2a->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c2a->typeHVACname, "ZoneHVAC:AirDistributionUnit")); EXPECT_TRUE(Util::SameString(c2a->userNameforHVACsystem, "Zone 1 ADU")); + EXPECT_TRUE(Util::SameString(c2a->coilName_, coil2Name)); - // delete coil report objects. These do not need to be switched, but start from scratch anyway + // check equipment order and note coil1Name is associated with 4PipeFanCoil + EXPECT_ENUM_EQ(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil); + EXPECT_TRUE(Util::SameString(zoneEquipList.EquipData(1).SubEquipData(1).Name, coil1Name)); + EXPECT_ENUM_EQ(zoneEquipList.EquipType(2), DataZoneEquipment::ZoneEquipType::AirDistributionUnit); + EXPECT_TRUE(Util::SameString(zoneEquipList.EquipData(2).SubEquipData(1).SubSubEquipData(1).Name, coil2Name)); + + // delete coil report objects to start from scratch state->dataRptCoilSelection->coilSelectionReportObj->numCoilsReported_ = 0; state->dataRptCoilSelection->coilSelectionReportObj.reset(nullptr); createCoilSelectionReportObj(*state); - state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil1Name, coil1Type, mult); + // switch coil order in coil reports to try to find issues state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil2Name, coil2Type, mult); + state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil1Name, coil1Type, mult); auto &c1b = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; auto &c2b = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[1]; c1b->zoneEqNum = curZoneEqNum; c2b->zoneEqNum = curZoneEqNum; - // check equipment order in equipment list - EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil)); - EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(2), DataZoneEquipment::ZoneEquipType::AirDistributionUnit)); - - // now switch the equipment order and try again + // switch the equipment order to try to find issues std::string tmpEquipName = zoneEquipList.EquipName(1); std::string tmpEquipTypeName = zoneEquipList.EquipTypeName(1); + auto tmpEqData = zoneEquipList.EquipData(1); auto tmpEquipType = zoneEquipList.EquipType(1); - int tmpEquipIndex = zoneEquipList.EquipIndex(1); zoneEquipList.EquipName(1) = zoneEquipList.EquipName(2); zoneEquipList.EquipTypeName(1) = zoneEquipList.EquipTypeName(2); zoneEquipList.EquipType(1) = zoneEquipList.EquipType(2); - zoneEquipList.EquipIndex(1) = zoneEquipList.EquipIndex(2); + zoneEquipList.EquipData(1) = zoneEquipList.EquipData(2); zoneEquipList.EquipName(2) = tmpEquipName; zoneEquipList.EquipTypeName(2) = tmpEquipTypeName; zoneEquipList.EquipType(2) = tmpEquipType; - zoneEquipList.EquipIndex(2) = tmpEquipIndex; + zoneEquipList.EquipData(2) = tmpEqData; - // check that equipment order 1s reversed equipment list - EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(2), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil)); - EXPECT_TRUE(compare_enums(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::AirDistributionUnit)); + // check that equipment order is reversed in equipment list and note coil1Name is associated with 4PipeFanCoil + EXPECT_ENUM_EQ(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::AirDistributionUnit); + EXPECT_TRUE(Util::SameString(zoneEquipList.EquipData(1).SubEquipData(1).SubSubEquipData(1).Name, coil2Name)); + EXPECT_ENUM_EQ(zoneEquipList.EquipType(2), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil); + EXPECT_TRUE(Util::SameString(zoneEquipList.EquipData(2).SubEquipData(1).Name, coil1Name)); state->dataRptCoilSelection->coilSelectionReportObj->finishCoilSummaryReportTable(*state); - // existing logic is flawed when multiple zone equipment are in the same zone (e.g., PTAC and FanCoil) EXPECT_TRUE(Util::SameString(c1b->coilLocation, "Zone Equipment")); - EXPECT_TRUE(Util::SameString(c1b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); - EXPECT_TRUE(Util::SameString(c1b->userNameforHVACsystem, "Zone 1 FCU")); + EXPECT_TRUE(Util::SameString(c1b->typeHVACname, "ZoneHVAC:AirDistributionUnit")); + EXPECT_TRUE(Util::SameString(c1b->userNameforHVACsystem, "Zone 1 ADU")); + EXPECT_TRUE(Util::SameString(c1b->coilName_, coil2Name)); + // note coil1Name is associated with 4PipeFanCoil EXPECT_TRUE(Util::SameString(c2b->coilLocation, "Zone Equipment")); - EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:AirDistributionUnit")); - EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 ADU")); + EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); + EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 FCU")); + EXPECT_TRUE(Util::SameString(c2b->coilName_, coil1Name)); } From 2ef4f57a5dc45294fb7765372681796d129a552d Mon Sep 17 00:00:00 2001 From: rraustad Date: Sat, 8 Jun 2024 19:03:55 -0400 Subject: [PATCH 06/20] Update a comment --- tst/EnergyPlus/unit/ReportCoilSelection.unit.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index 27f93874914..d924244f26e 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -1025,7 +1025,7 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) zoneEquipList.EquipData(2).SubEquipData(1).SubSubEquipData.allocate(1); zoneEquipList.EquipData(2).SubEquipData(1).SubSubEquipData(1).Name = coil2Name; - // set up coil selection report object by calling a public function (i.e., calls getIndexForOrCreateDataObjFromCoilName) + // set up coil selection report object by calling a public function that calls getIndexForOrCreateDataObjFromCoilName state->dataRptCoilSelection->coilSelectionReportObj->setCoilReheatMultiplier(*state, coil2Name, coil2Type, mult); auto &c1a = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; auto &c2a = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[1]; From 64e51e645092afd4074c67bd34323243c1bcc9ed Mon Sep 17 00:00:00 2001 From: rraustad Date: Sat, 8 Jun 2024 20:50:15 -0400 Subject: [PATCH 07/20] Add warning to flesh out any outlier configurations --- src/EnergyPlus/ReportCoilSelection.cc | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index aeb5d7f68ba..f9943ca8cf9 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -961,7 +961,10 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std if (!keepLooking) break; } if (!keepLooking) break; - } // for (equipLoop) + } // for (equipLoop) + if (c->typeHVACname == "Unknown") { + ShowWarningError(state, format("Parent object not found for zone coil = {}", c->coilName_)); + } } void ReportCoilSelection::setRatedCoilConditions(EnergyPlusData &state, From 4e4ba903569a5626717451537bcf95115bb21658 Mon Sep 17 00:00:00 2001 From: rraustad Date: Sat, 8 Jun 2024 20:58:53 -0400 Subject: [PATCH 08/20] clang format --- src/EnergyPlus/ReportCoilSelection.cc | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index f9943ca8cf9..1a578b65bea 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -961,7 +961,7 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std if (!keepLooking) break; } if (!keepLooking) break; - } // for (equipLoop) + } // for (equipLoop) if (c->typeHVACname == "Unknown") { ShowWarningError(state, format("Parent object not found for zone coil = {}", c->coilName_)); } From d078cb358194906382ada1ecb0772c4270ba07fe Mon Sep 17 00:00:00 2001 From: rraustad Date: Sat, 8 Jun 2024 21:41:24 -0400 Subject: [PATCH 09/20] Remove includes --- src/EnergyPlus/ReportCoilSelection.cc | 4 ---- 1 file changed, 4 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 1a578b65bea..56147561e16 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -55,7 +55,6 @@ #include #include #include -#include #include #include #include @@ -67,11 +66,8 @@ #include #include #include -#include #include #include -#include -#include #include #include From 08d6068053c045c9dcd9b20ae8e48c623462b7a0 Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Sun, 9 Jun 2024 19:31:33 -0400 Subject: [PATCH 10/20] Fix ventilated slab node connections --- src/EnergyPlus/ReportCoilSelection.cc | 11 +++++- src/EnergyPlus/ReportCoilSelection.hh | 2 + src/EnergyPlus/VentilatedSlab.cc | 54 +++++++++++++-------------- src/EnergyPlus/WaterCoils.cc | 2 + 4 files changed, 41 insertions(+), 28 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index f9943ca8cf9..c9e22ccf5ee 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -961,7 +961,7 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std if (!keepLooking) break; } if (!keepLooking) break; - } // for (equipLoop) + } // for (equipLoop) if (c->typeHVACname == "Unknown") { ShowWarningError(state, format("Parent object not found for zone coil = {}", c->coilName_)); } @@ -1963,6 +1963,15 @@ void ReportCoilSelection::setCoilSupplyFanInfo(EnergyPlusData &state, if (c->supFanNum == 0) c->supFanNum = Fans::GetFanIndex(state, fanName); } +void ReportCoilSelection::setCoilEqNum( + EnergyPlusData &state, std::string const &coilName, std::string const &coilType, int const curSysNum, int const curZoneEqNum) +{ + int index = getIndexForOrCreateDataObjFromCoilName(state, coilName, coilType); + auto &c(coilSelectionDataObjs[index]); + c->airloopNum = curSysNum; + c->zoneEqNum = curZoneEqNum; +} + std::string ReportCoilSelection::getTimeText(EnergyPlusData &state, int const timeStepAtPeak) { std::string returnString = ""; diff --git a/src/EnergyPlus/ReportCoilSelection.hh b/src/EnergyPlus/ReportCoilSelection.hh index 22fb8f44783..994aa0f139a 100644 --- a/src/EnergyPlus/ReportCoilSelection.hh +++ b/src/EnergyPlus/ReportCoilSelection.hh @@ -404,6 +404,8 @@ public: // methods HVAC::FanType fanType, int fanIndex); + void setCoilEqNum(EnergyPlusData &state, std::string const &coilName, std::string const &coilType, int const curSysNum, int const curZoneEqNum); + static std::string getTimeText(EnergyPlusData &state, int const timeStepAtPeak); bool isCompTypeFan(std::string const &compType // string component type, input object class name diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index 6fccd5a9419..cb004216734 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -774,13 +774,13 @@ namespace VentilatedSlab { DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); + ObjectIsParent); ventSlab.OAMixerOutNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(23), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-OA MIXER", + ventSlab.Name, DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, @@ -791,7 +791,7 @@ namespace VentilatedSlab { DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, ventSlab.Name, DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Internal, + DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, ObjectIsParent); @@ -814,13 +814,13 @@ namespace VentilatedSlab { DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); + ObjectIsParent); ventSlab.OAMixerOutNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(23), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-OA MIXER", + ventSlab.Name, DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, @@ -831,7 +831,7 @@ namespace VentilatedSlab { DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, ventSlab.Name, DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Internal, + DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, ObjectIsParent); @@ -841,7 +841,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(18), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-SYSTEM", + ventSlab.Name, DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, @@ -863,12 +863,12 @@ namespace VentilatedSlab { DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, - ObjectIsNotParent); + ObjectIsParent); ventSlab.OAMixerOutNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(23), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-OA MIXER", + ventSlab.Name, DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, @@ -902,15 +902,15 @@ namespace VentilatedSlab { ErrorsFound = true; } - ventSlab.ZoneAirInNode = GetOnlySingleNode(state, - state.dataIPShortCut->cAlphaArgs(20), - ErrorsFound, - DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-SYSTEM", - DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Outlet, - NodeInputManager::CompFluidStream::Primary, - ObjectIsParent); + //ventSlab.ZoneAirInNode = GetOnlySingleNode(state, + // state.dataIPShortCut->cAlphaArgs(20), + // ErrorsFound, + // DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, + // ventSlab.Name + "-SYSTEM", + // DataLoopNode::NodeFluidType::Air, + // DataLoopNode::ConnectionType::Outlet, + // NodeInputManager::CompFluidStream::Primary, + // ObjectIsParent); ventSlab.ZoneAirInNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(20), @@ -928,7 +928,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(21), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-OA MIXER", + ventSlab.Name, DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, @@ -947,7 +947,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(22), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name + "-OA MIXER", + ventSlab.Name, DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::ReliefAir, NodeInputManager::CompFluidStream::Primary, @@ -978,7 +978,7 @@ namespace VentilatedSlab { // Add fan to component sets array SetUpCompSets(state, CurrentModuleObject, - ventSlab.Name + "-SYSTEM", + ventSlab.Name, "UNDEFINED", state.dataIPShortCut->cAlphaArgs(25), state.dataIPShortCut->cAlphaArgs(23), @@ -1246,27 +1246,27 @@ namespace VentilatedSlab { // Add cooling coil to component sets array when present SetUpCompSets(state, CurrentModuleObject, - ventSlab.Name + "-SYSTEM", + ventSlab.Name, state.dataIPShortCut->cAlphaArgs(30), state.dataIPShortCut->cAlphaArgs(31), - state.dataIPShortCut->cAlphaArgs(24), + "UNDEFINED", "UNDEFINED"); // Add heating coil to component sets array when cooling coil present SetUpCompSets(state, CurrentModuleObject, - ventSlab.Name + "-SYSTEM", + ventSlab.Name, state.dataIPShortCut->cAlphaArgs(27), state.dataIPShortCut->cAlphaArgs(28), "UNDEFINED", - state.dataIPShortCut->cAlphaArgs(19)); + "UNDEFINED"); break; } case CoilType::Heating: { // 'Heating' // Add heating coil to component sets array when no cooling coil present SetUpCompSets(state, CurrentModuleObject, - ventSlab.Name + "-SYSTEM", + ventSlab.Name, state.dataIPShortCut->cAlphaArgs(27), state.dataIPShortCut->cAlphaArgs(28), state.dataIPShortCut->cAlphaArgs(24), @@ -1277,7 +1277,7 @@ namespace VentilatedSlab { // Add cooling coil to component sets array when no heating coil present SetUpCompSets(state, CurrentModuleObject, - ventSlab.Name + "-SYSTEM", + ventSlab.Name, state.dataIPShortCut->cAlphaArgs(30), state.dataIPShortCut->cAlphaArgs(31), state.dataIPShortCut->cAlphaArgs(24), diff --git a/src/EnergyPlus/WaterCoils.cc b/src/EnergyPlus/WaterCoils.cc index c0a556302ff..667773c03ae 100644 --- a/src/EnergyPlus/WaterCoils.cc +++ b/src/EnergyPlus/WaterCoils.cc @@ -1763,6 +1763,8 @@ void InitWaterCoil(EnergyPlusData &state, int const CoilNum, bool const FirstHVA CalcSimpleHeatingCoil(state, CoilNum, HVAC::FanOp::Continuous, 1.0, state.dataWaterCoils->SimCalc); coilTypeName = "Coil:Heating:Water"; } + state.dataRptCoilSelection->coilSelectionReportObj->setCoilEqNum( + state, waterCoil.Name, coilTypeName, state.dataSize->CurSysNum, state.dataSize->CurZoneEqNum); // coil outlets Real64 RatedOutletWetBulb(0.0); From de02e190e297496ad3f3dea147bfe81fd028698a Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Sun, 9 Jun 2024 21:42:22 -0400 Subject: [PATCH 11/20] Fix DOAS crash --- src/EnergyPlus/ReportCoilSelection.cc | 9 +++++++-- src/EnergyPlus/ReportCoilSelection.hh | 7 ++++++- src/EnergyPlus/VentilatedSlab.cc | 2 +- src/EnergyPlus/WaterCoils.cc | 2 +- 4 files changed, 15 insertions(+), 5 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index c9e22ccf5ee..138ed8f351b 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -1963,12 +1963,17 @@ void ReportCoilSelection::setCoilSupplyFanInfo(EnergyPlusData &state, if (c->supFanNum == 0) c->supFanNum = Fans::GetFanIndex(state, fanName); } -void ReportCoilSelection::setCoilEqNum( - EnergyPlusData &state, std::string const &coilName, std::string const &coilType, int const curSysNum, int const curZoneEqNum) +void ReportCoilSelection::setCoilEqNum(EnergyPlusData &state, + std::string const &coilName, + std::string const &coilType, + int const curSysNum, + int const curOASysNum, + int const curZoneEqNum) { int index = getIndexForOrCreateDataObjFromCoilName(state, coilName, coilType); auto &c(coilSelectionDataObjs[index]); c->airloopNum = curSysNum; + c->oASysNum = curOASysNum; c->zoneEqNum = curZoneEqNum; } diff --git a/src/EnergyPlus/ReportCoilSelection.hh b/src/EnergyPlus/ReportCoilSelection.hh index 994aa0f139a..9dcdc798225 100644 --- a/src/EnergyPlus/ReportCoilSelection.hh +++ b/src/EnergyPlus/ReportCoilSelection.hh @@ -404,7 +404,12 @@ public: // methods HVAC::FanType fanType, int fanIndex); - void setCoilEqNum(EnergyPlusData &state, std::string const &coilName, std::string const &coilType, int const curSysNum, int const curZoneEqNum); + void setCoilEqNum(EnergyPlusData &state, + std::string const &coilName, + std::string const &coilType, + int const curSysNum, + int const curOASysNum, + int const curZoneEqNum); static std::string getTimeText(EnergyPlusData &state, int const timeStepAtPeak); diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index cb004216734..882d5bc7407 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -902,7 +902,7 @@ namespace VentilatedSlab { ErrorsFound = true; } - //ventSlab.ZoneAirInNode = GetOnlySingleNode(state, + // ventSlab.ZoneAirInNode = GetOnlySingleNode(state, // state.dataIPShortCut->cAlphaArgs(20), // ErrorsFound, // DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, diff --git a/src/EnergyPlus/WaterCoils.cc b/src/EnergyPlus/WaterCoils.cc index 667773c03ae..e7db4ad6cac 100644 --- a/src/EnergyPlus/WaterCoils.cc +++ b/src/EnergyPlus/WaterCoils.cc @@ -1764,7 +1764,7 @@ void InitWaterCoil(EnergyPlusData &state, int const CoilNum, bool const FirstHVA coilTypeName = "Coil:Heating:Water"; } state.dataRptCoilSelection->coilSelectionReportObj->setCoilEqNum( - state, waterCoil.Name, coilTypeName, state.dataSize->CurSysNum, state.dataSize->CurZoneEqNum); + state, waterCoil.Name, coilTypeName, state.dataSize->CurSysNum, state.dataSize->CurOASysNum, state.dataSize->CurZoneEqNum); // coil outlets Real64 RatedOutletWetBulb(0.0); From f1fd2e7d23c5020bdd46714a4271a2c14712033d Mon Sep 17 00:00:00 2001 From: rraustad Date: Mon, 10 Jun 2024 09:08:37 -0400 Subject: [PATCH 12/20] Cleanup --- src/EnergyPlus/BranchNodeConnections.cc | 3 ++- src/EnergyPlus/ReportCoilSelection.cc | 1 + src/EnergyPlus/VentilatedSlab.cc | 10 ---------- tst/EnergyPlus/unit/ReportCoilSelection.unit.cc | 2 -- 4 files changed, 3 insertions(+), 13 deletions(-) diff --git a/src/EnergyPlus/BranchNodeConnections.cc b/src/EnergyPlus/BranchNodeConnections.cc index 4f5a6c3c547..13eae586a28 100644 --- a/src/EnergyPlus/BranchNodeConnections.cc +++ b/src/EnergyPlus/BranchNodeConnections.cc @@ -1593,7 +1593,8 @@ void GetComponentData(EnergyPlusData &state, if (state.dataBranchNodeConnections->NodeConnections(Which).ObjectIsParent) IsParent = true; if (state.dataBranchNodeConnections->NodeConnections(Which).ConnectionType == DataLoopNode::ConnectionType::Inlet) { ++NumInlets; - } else if (state.dataBranchNodeConnections->NodeConnections(Which).ConnectionType == DataLoopNode::ConnectionType::Outlet) { + } + if (state.dataBranchNodeConnections->NodeConnections(Which).ConnectionType == DataLoopNode::ConnectionType::Outlet) { ++NumOutlets; } } diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 046200b8075..ddae383b852 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -958,6 +958,7 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std } if (!keepLooking) break; } // for (equipLoop) + if (c->typeHVACname == "Unknown") { ShowWarningError(state, format("Parent object not found for zone coil = {}", c->coilName_)); } diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index 882d5bc7407..44f6188e129 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -902,16 +902,6 @@ namespace VentilatedSlab { ErrorsFound = true; } - // ventSlab.ZoneAirInNode = GetOnlySingleNode(state, - // state.dataIPShortCut->cAlphaArgs(20), - // ErrorsFound, - // DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - // ventSlab.Name + "-SYSTEM", - // DataLoopNode::NodeFluidType::Air, - // DataLoopNode::ConnectionType::Outlet, - // NodeInputManager::CompFluidStream::Primary, - // ObjectIsParent); - ventSlab.ZoneAirInNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(20), ErrorsFound, diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index d924244f26e..834bfa2bed4 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -56,7 +56,6 @@ // EnergyPlus Headers #include #include -#include #include #include #include @@ -65,7 +64,6 @@ #include #include #include -#include using namespace EnergyPlus; From 5c2cbe8e8ff2b0a33efaee5f96bdffb7304a4b93 Mon Sep 17 00:00:00 2001 From: rraustad Date: Mon, 10 Jun 2024 09:23:09 -0400 Subject: [PATCH 13/20] Revert BranchNodeConnections change --- src/EnergyPlus/BranchNodeConnections.cc | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/EnergyPlus/BranchNodeConnections.cc b/src/EnergyPlus/BranchNodeConnections.cc index 13eae586a28..4f5a6c3c547 100644 --- a/src/EnergyPlus/BranchNodeConnections.cc +++ b/src/EnergyPlus/BranchNodeConnections.cc @@ -1593,8 +1593,7 @@ void GetComponentData(EnergyPlusData &state, if (state.dataBranchNodeConnections->NodeConnections(Which).ObjectIsParent) IsParent = true; if (state.dataBranchNodeConnections->NodeConnections(Which).ConnectionType == DataLoopNode::ConnectionType::Inlet) { ++NumInlets; - } - if (state.dataBranchNodeConnections->NodeConnections(Which).ConnectionType == DataLoopNode::ConnectionType::Outlet) { + } else if (state.dataBranchNodeConnections->NodeConnections(Which).ConnectionType == DataLoopNode::ConnectionType::Outlet) { ++NumOutlets; } } From ed89633d4f47d9097177233ebdd7b976161df605 Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Sun, 23 Jun 2024 20:54:51 -0400 Subject: [PATCH 14/20] get svg and coil sizing details correct --- src/EnergyPlus/ReportCoilSelection.cc | 59 +++++++++++++++------------ src/EnergyPlus/VentilatedSlab.cc | 44 ++++++++++---------- 2 files changed, 55 insertions(+), 48 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 138ed8f351b..056f844e309 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -917,46 +917,53 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std // now search equipment auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); bool keepLooking = true; + std::string fanType; + std::string fanName; for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { - if (zoneEquipList.EquipName(equipLoop) == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - if (keepLooking) { - if (zoneEquipList.EquipData(equipLoop).Name == c->coilName_) { + for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).TypeOf == "FAN:SYSTEMMODEL") { + fanType = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).TypeOf; + fanName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name; + } + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name == c->coilName_) { c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); c->coilLocation = "Zone Equipment"; + int zoneEqListIndex = Util::FindItemInList(zoneEquipList.Name, state.dataZoneEquip->ZoneEquipList); + if (c->zoneNum.empty()) c->zoneNum.resize(1); + c->zoneNum[0] = zoneEqListIndex; + if (c->zoneName.empty()) c->zoneName.resize(1); + c->zoneName[0] = state.dataHeatBal->Zone(zoneEqListIndex).Name; keepLooking = false; + } + if (!keepLooking) { + c->fanAssociatedWithCoilName = fanName; + c->fanTypeName = fanType; break; } if (keepLooking) { - for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name == c->coilName_) { + for (int subsubEq = 1; subsubEq <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++subsubEq) { + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).TypeOf == "FAN:SYSTEMMODEL") { + fanType = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).TypeOf; + fanName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name; + } + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name == c->coilName_) { c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); c->coilLocation = "Zone Equipment"; + int zoneEqListIndex = Util::FindItemInList(zoneEquipList.Name, state.dataZoneEquip->ZoneEquipList); + if (c->zoneNum.empty()) c->zoneNum.resize(1); + c->zoneNum[0] = zoneEqListIndex; + if (c->zoneName.empty()) c->zoneName.resize(1); + c->zoneName[0] = state.dataHeatBal->Zone(zoneEqListIndex).Name; keepLooking = false; - break; - } - if (keepLooking) { - for (int subsubEq = 1; subsubEq <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++subsubEq) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - keepLooking = false; - break; - } - } - if (!keepLooking) break; } - if (!keepLooking) break; } - if (!keepLooking) break; + if (!keepLooking) { + c->fanAssociatedWithCoilName = fanName; + c->fanTypeName = fanType; + break; + } } if (!keepLooking) break; } diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index 882d5bc7407..e27cb29435f 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -774,13 +774,13 @@ namespace VentilatedSlab { DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, - ObjectIsParent); + ObjectIsNotParent); ventSlab.OAMixerOutNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(23), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name, + ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, @@ -791,7 +791,7 @@ namespace VentilatedSlab { DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, ventSlab.Name, DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Outlet, + DataLoopNode::ConnectionType::Internal, NodeInputManager::CompFluidStream::Primary, ObjectIsParent); @@ -814,13 +814,13 @@ namespace VentilatedSlab { DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, - ObjectIsParent); + ObjectIsNotParent); ventSlab.OAMixerOutNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(23), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name, + ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, @@ -831,7 +831,7 @@ namespace VentilatedSlab { DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, ventSlab.Name, DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Outlet, + DataLoopNode::ConnectionType::Internal, NodeInputManager::CompFluidStream::Primary, ObjectIsParent); @@ -841,7 +841,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(18), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name, + ventSlab.Name + "-SYSTEM", DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, @@ -863,12 +863,12 @@ namespace VentilatedSlab { DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, - ObjectIsParent); + ObjectIsNotParent); ventSlab.OAMixerOutNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(23), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name, + ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, @@ -902,15 +902,15 @@ namespace VentilatedSlab { ErrorsFound = true; } - // ventSlab.ZoneAirInNode = GetOnlySingleNode(state, - // state.dataIPShortCut->cAlphaArgs(20), - // ErrorsFound, - // DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - // ventSlab.Name + "-SYSTEM", - // DataLoopNode::NodeFluidType::Air, - // DataLoopNode::ConnectionType::Outlet, - // NodeInputManager::CompFluidStream::Primary, - // ObjectIsParent); + ventSlab.ZoneAirInNode = GetOnlySingleNode(state, + state.dataIPShortCut->cAlphaArgs(20), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, + ventSlab.Name + "-SYSTEM", + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Outlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsParent); ventSlab.ZoneAirInNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(20), @@ -928,7 +928,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(21), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name, + ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, @@ -947,7 +947,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(22), ErrorsFound, DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, - ventSlab.Name, + ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, DataLoopNode::ConnectionType::ReliefAir, NodeInputManager::CompFluidStream::Primary, @@ -1249,7 +1249,7 @@ namespace VentilatedSlab { ventSlab.Name, state.dataIPShortCut->cAlphaArgs(30), state.dataIPShortCut->cAlphaArgs(31), - "UNDEFINED", + state.dataIPShortCut->cAlphaArgs(24), "UNDEFINED"); // Add heating coil to component sets array when cooling coil present @@ -1259,7 +1259,7 @@ namespace VentilatedSlab { state.dataIPShortCut->cAlphaArgs(27), state.dataIPShortCut->cAlphaArgs(28), "UNDEFINED", - "UNDEFINED"); + state.dataIPShortCut->cAlphaArgs(19)); break; } case CoilType::Heating: { // 'Heating' From 1bf868c04ab01b91961ce14f477217ff30ba7cbe Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Sun, 23 Jun 2024 23:06:55 -0400 Subject: [PATCH 15/20] Failed to commit final changes --- src/EnergyPlus/VentilatedSlab.cc | 73 +++++++++++++++++++++++++++++++- 1 file changed, 71 insertions(+), 2 deletions(-) diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index e27cb29435f..dc3db3fd496 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -763,9 +763,18 @@ namespace VentilatedSlab { DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Internal, + DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, ObjectIsNotParent); + ventSlab.ReturnAirNode = GetOnlySingleNode(state, + state.dataIPShortCut->cAlphaArgs(18), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, + ventSlab.Name, + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Inlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsParent); ventSlab.RadInNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(19), ErrorsFound, @@ -803,9 +812,18 @@ namespace VentilatedSlab { DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, ventSlab.Name + "-OA MIXER", DataLoopNode::NodeFluidType::Air, - DataLoopNode::ConnectionType::Internal, + DataLoopNode::ConnectionType::Outlet, NodeInputManager::CompFluidStream::Primary, ObjectIsNotParent); + ventSlab.ReturnAirNode = GetOnlySingleNode(state, + state.dataIPShortCut->cAlphaArgs(18), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, + ventSlab.Name, + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Inlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsParent); ventSlab.RadInNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(19), ErrorsFound, @@ -846,6 +864,15 @@ namespace VentilatedSlab { DataLoopNode::ConnectionType::Inlet, NodeInputManager::CompFluidStream::Primary, ObjectIsParent); + ventSlab.ReturnAirNode = GetOnlySingleNode(state, + state.dataIPShortCut->cAlphaArgs(18), + ErrorsFound, + DataLoopNode::ConnectionObjectType::ZoneHVACVentilatedSlab, + ventSlab.Name, + DataLoopNode::NodeFluidType::Air, + DataLoopNode::ConnectionType::Inlet, + NodeInputManager::CompFluidStream::Primary, + ObjectIsParent); ventSlab.ReturnAirNode = GetOnlySingleNode(state, state.dataIPShortCut->cAlphaArgs(18), ErrorsFound, @@ -975,6 +1002,14 @@ namespace VentilatedSlab { ventSlab.MaxOASchedPtr = ventSlab.MinOASchedPtr; } + //// Add fan to internal component sets array + // SetUpCompSets(state, + // CurrentModuleObject, + // ventSlab.Name + "-SYSTEM", + // "UNDEFINED", + // state.dataIPShortCut->cAlphaArgs(25), + // state.dataIPShortCut->cAlphaArgs(23), + // state.dataIPShortCut->cAlphaArgs(24)); // Add fan to component sets array SetUpCompSets(state, CurrentModuleObject, @@ -1243,6 +1278,24 @@ namespace VentilatedSlab { switch (ventSlab.coilOption) { case CoilType::Both: { // 'HeatingAndCooling' + //// Add cooling coil to interanal component sets array when present + // SetUpCompSets(state, + // CurrentModuleObject, + // ventSlab.Name + "-SYSTEM", + // state.dataIPShortCut->cAlphaArgs(30), + // state.dataIPShortCut->cAlphaArgs(31), + // state.dataIPShortCut->cAlphaArgs(24), + // "UNDEFINED"); + + //// Add heating coil to internal component sets array when cooling coil present + // SetUpCompSets(state, + // CurrentModuleObject, + // ventSlab.Name + "-SYSTEM", + // state.dataIPShortCut->cAlphaArgs(27), + // state.dataIPShortCut->cAlphaArgs(28), + // "UNDEFINED", + // state.dataIPShortCut->cAlphaArgs(19)); + // Add cooling coil to component sets array when present SetUpCompSets(state, CurrentModuleObject, @@ -1263,6 +1316,14 @@ namespace VentilatedSlab { break; } case CoilType::Heating: { // 'Heating' + //// Add heating coil to internal component sets array when no cooling coil present + // SetUpCompSets(state, + // CurrentModuleObject, + // ventSlab.Name + "-SYSTEM", + // state.dataIPShortCut->cAlphaArgs(27), + // state.dataIPShortCut->cAlphaArgs(28), + // state.dataIPShortCut->cAlphaArgs(24), + // state.dataIPShortCut->cAlphaArgs(19)); // Add heating coil to component sets array when no cooling coil present SetUpCompSets(state, CurrentModuleObject, @@ -1274,6 +1335,14 @@ namespace VentilatedSlab { break; } case CoilType::Cooling: { // 'Cooling' + //// Add cooling coil to internal component sets array when no heating coil present + // SetUpCompSets(state, + // CurrentModuleObject, + // ventSlab.Name + "-SYSTEM", + // state.dataIPShortCut->cAlphaArgs(30), + // state.dataIPShortCut->cAlphaArgs(31), + // state.dataIPShortCut->cAlphaArgs(24), + // state.dataIPShortCut->cAlphaArgs(19)); // Add cooling coil to component sets array when no heating coil present SetUpCompSets(state, CurrentModuleObject, From 09bf0b0208db3d8869a300bf1672002674ecb4fe Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Sun, 23 Jun 2024 23:31:47 -0400 Subject: [PATCH 16/20] Update unit test, delete commented code --- src/EnergyPlus/VentilatedSlab.cc | 43 ------------------- .../unit/ReportCoilSelection.unit.cc | 8 ++++ 2 files changed, 8 insertions(+), 43 deletions(-) diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index dc3db3fd496..9b75161b018 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -1002,14 +1002,6 @@ namespace VentilatedSlab { ventSlab.MaxOASchedPtr = ventSlab.MinOASchedPtr; } - //// Add fan to internal component sets array - // SetUpCompSets(state, - // CurrentModuleObject, - // ventSlab.Name + "-SYSTEM", - // "UNDEFINED", - // state.dataIPShortCut->cAlphaArgs(25), - // state.dataIPShortCut->cAlphaArgs(23), - // state.dataIPShortCut->cAlphaArgs(24)); // Add fan to component sets array SetUpCompSets(state, CurrentModuleObject, @@ -1278,24 +1270,6 @@ namespace VentilatedSlab { switch (ventSlab.coilOption) { case CoilType::Both: { // 'HeatingAndCooling' - //// Add cooling coil to interanal component sets array when present - // SetUpCompSets(state, - // CurrentModuleObject, - // ventSlab.Name + "-SYSTEM", - // state.dataIPShortCut->cAlphaArgs(30), - // state.dataIPShortCut->cAlphaArgs(31), - // state.dataIPShortCut->cAlphaArgs(24), - // "UNDEFINED"); - - //// Add heating coil to internal component sets array when cooling coil present - // SetUpCompSets(state, - // CurrentModuleObject, - // ventSlab.Name + "-SYSTEM", - // state.dataIPShortCut->cAlphaArgs(27), - // state.dataIPShortCut->cAlphaArgs(28), - // "UNDEFINED", - // state.dataIPShortCut->cAlphaArgs(19)); - // Add cooling coil to component sets array when present SetUpCompSets(state, CurrentModuleObject, @@ -1316,15 +1290,6 @@ namespace VentilatedSlab { break; } case CoilType::Heating: { // 'Heating' - //// Add heating coil to internal component sets array when no cooling coil present - // SetUpCompSets(state, - // CurrentModuleObject, - // ventSlab.Name + "-SYSTEM", - // state.dataIPShortCut->cAlphaArgs(27), - // state.dataIPShortCut->cAlphaArgs(28), - // state.dataIPShortCut->cAlphaArgs(24), - // state.dataIPShortCut->cAlphaArgs(19)); - // Add heating coil to component sets array when no cooling coil present SetUpCompSets(state, CurrentModuleObject, ventSlab.Name, @@ -1335,14 +1300,6 @@ namespace VentilatedSlab { break; } case CoilType::Cooling: { // 'Cooling' - //// Add cooling coil to internal component sets array when no heating coil present - // SetUpCompSets(state, - // CurrentModuleObject, - // ventSlab.Name + "-SYSTEM", - // state.dataIPShortCut->cAlphaArgs(30), - // state.dataIPShortCut->cAlphaArgs(31), - // state.dataIPShortCut->cAlphaArgs(24), - // state.dataIPShortCut->cAlphaArgs(19)); // Add cooling coil to component sets array when no heating coil present SetUpCompSets(state, CurrentModuleObject, diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index 834bfa2bed4..bd1f65a043f 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -57,6 +57,7 @@ #include #include #include +//#include #include #include #include @@ -962,6 +963,8 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) auto &c1 = state->dataRptCoilSelection->coilSelectionReportObj->coilSelectionDataObjs[0]; c1->zoneEqNum = curZoneEqNum; + state->dataHeatBal->Zone.allocate(1); + state->dataHeatBal->Zone(1).Name = "ThisZone"; state->dataZoneEquip->ZoneEquipList.allocate(1); auto &zoneEquipList = state->dataZoneEquip->ZoneEquipList(curZoneEqNum); @@ -988,6 +991,7 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c1->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c1->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); EXPECT_TRUE(Util::SameString(c1->userNameforHVACsystem, "Zone 1 FCU")); + EXPECT_TRUE(Util::SameString(c1->zoneName[0], "ThisZone")); // add another coil and hvac system and increase equipment list to 2 zoneEquipList.NumOfEquipTypes = 2; @@ -1039,11 +1043,13 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c1a->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); EXPECT_TRUE(Util::SameString(c1a->userNameforHVACsystem, "Zone 1 FCU")); EXPECT_TRUE(Util::SameString(c1a->coilName_, coil1Name)); + EXPECT_TRUE(Util::SameString(c1a->zoneName[0], "ThisZone")); EXPECT_TRUE(Util::SameString(c2a->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c2a->typeHVACname, "ZoneHVAC:AirDistributionUnit")); EXPECT_TRUE(Util::SameString(c2a->userNameforHVACsystem, "Zone 1 ADU")); EXPECT_TRUE(Util::SameString(c2a->coilName_, coil2Name)); + EXPECT_TRUE(Util::SameString(c2a->zoneName[0], "ThisZone")); // check equipment order and note coil1Name is associated with 4PipeFanCoil EXPECT_ENUM_EQ(zoneEquipList.EquipType(1), DataZoneEquipment::ZoneEquipType::FourPipeFanCoil); @@ -1092,10 +1098,12 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c1b->typeHVACname, "ZoneHVAC:AirDistributionUnit")); EXPECT_TRUE(Util::SameString(c1b->userNameforHVACsystem, "Zone 1 ADU")); EXPECT_TRUE(Util::SameString(c1b->coilName_, coil2Name)); + EXPECT_TRUE(Util::SameString(c1b->zoneName[0], "ThisZone")); // note coil1Name is associated with 4PipeFanCoil EXPECT_TRUE(Util::SameString(c2b->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c2b->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 FCU")); EXPECT_TRUE(Util::SameString(c2b->coilName_, coil1Name)); + EXPECT_TRUE(Util::SameString(c2b->zoneName[0], "ThisZone")); } From b87aadc321cab812844328e5329d5f4be4df6d04 Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Sun, 23 Jun 2024 23:34:14 -0400 Subject: [PATCH 17/20] revert deleted comment --- src/EnergyPlus/VentilatedSlab.cc | 1 + 1 file changed, 1 insertion(+) diff --git a/src/EnergyPlus/VentilatedSlab.cc b/src/EnergyPlus/VentilatedSlab.cc index 9b75161b018..b190ddafc75 100644 --- a/src/EnergyPlus/VentilatedSlab.cc +++ b/src/EnergyPlus/VentilatedSlab.cc @@ -1290,6 +1290,7 @@ namespace VentilatedSlab { break; } case CoilType::Heating: { // 'Heating' + // Add heating coil to component sets array when no cooling coil present SetUpCompSets(state, CurrentModuleObject, ventSlab.Name, From 3148c2275d7bc95c4cccd11808e2a605ab1a0698 Mon Sep 17 00:00:00 2001 From: Richard Raustad Date: Mon, 24 Jun 2024 17:44:24 -0400 Subject: [PATCH 18/20] Update fan logic and add to unit test --- src/EnergyPlus/ReportCoilSelection.cc | 37 +++++++++++++------ .../unit/ReportCoilSelection.unit.cc | 18 +++++++-- 2 files changed, 39 insertions(+), 16 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index 9ddb94c2a95..df7ec2f11b3 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -913,14 +913,11 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std // now search equipment auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); bool keepLooking = true; + bool fanFound = false; std::string fanType; std::string fanName; for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).TypeOf == "FAN:SYSTEMMODEL") { - fanType = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).TypeOf; - fanName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name; - } if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name == c->coilName_) { c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); @@ -933,16 +930,22 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std keepLooking = false; } if (!keepLooking) { - c->fanAssociatedWithCoilName = fanName; - c->fanTypeName = fanType; + // if coil is found look in this same list for a fan + for (int fanEqNum = 1; fanEqNum <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++fanEqNum) { + if (zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:SYSTEMMODEL" || + zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:ONOFF" || + zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:CONSTANTVOLUME" || + zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:VARIABLEVOLUME" || + zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:COMPONENTMODEL") { + c->fanTypeName = zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf; + c->fanAssociatedWithCoilName = zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).Name; + break; + } + } break; } if (keepLooking) { for (int subsubEq = 1; subsubEq <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++subsubEq) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).TypeOf == "FAN:SYSTEMMODEL") { - fanType = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).TypeOf; - fanName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name; - } if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name == c->coilName_) { c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); @@ -956,8 +959,18 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std } } if (!keepLooking) { - c->fanAssociatedWithCoilName = fanName; - c->fanTypeName = fanType; + // if coil is found look in this same list for a fan + for (int fanEqNum = 1; fanEqNum <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++fanEqNum) { + if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:SYSTEMMODEL" || + zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:ONOFF" || + zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:CONSTANTVOLUME" || + zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:VARIABLEVOLUME" || + zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:COMPONENTMODEL") { + c->fanTypeName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf; + c->fanAssociatedWithCoilName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).Name; + break; + } + } break; } } diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index bd1f65a043f..c2e497c48f5 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -977,9 +977,11 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) zoneEquipList.EquipTypeName(1) = "ZoneHVAC:FourPipeFanCoil"; zoneEquipList.EquipType(1) = DataZoneEquipment::ZoneEquipType::FourPipeFanCoil; zoneEquipList.EquipData(1).Name = "ZoneHVAC:FourPipeFanCoil"; - zoneEquipList.EquipData(1).NumSubEquip = 1; - zoneEquipList.EquipData(1).SubEquipData.allocate(1); + zoneEquipList.EquipData(1).NumSubEquip = 2; + zoneEquipList.EquipData(1).SubEquipData.allocate(2); zoneEquipList.EquipData(1).SubEquipData(1).Name = "ElecHeatCoil"; + zoneEquipList.EquipData(1).SubEquipData(2).Name = "MyFan1"; + zoneEquipList.EquipData(1).SubEquipData(2).TypeOf = "FAN:ONOFF"; // test that 1 equipment in the equipment list has data that is read from EquipmentList data. EXPECT_TRUE(Util::SameString(c1->coilLocation, "unknown")); @@ -992,6 +994,8 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c1->typeHVACname, "ZoneHVAC:FourPipeFanCoil")); EXPECT_TRUE(Util::SameString(c1->userNameforHVACsystem, "Zone 1 FCU")); EXPECT_TRUE(Util::SameString(c1->zoneName[0], "ThisZone")); + EXPECT_TRUE(Util::SameString(c1->fanTypeName, "FAN:ONOFF")); + EXPECT_TRUE(Util::SameString(c1->fanAssociatedWithCoilName, "MyFan1")); // add another coil and hvac system and increase equipment list to 2 zoneEquipList.NumOfEquipTypes = 2; @@ -1012,9 +1016,11 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) zoneEquipList.EquipTypeName(1) = "ZoneHVAC:FourPipeFanCoil"; zoneEquipList.EquipType(1) = DataZoneEquipment::ZoneEquipType::FourPipeFanCoil; zoneEquipList.EquipData(1).Name = "ZoneHVAC:FourPipeFanCoil"; - zoneEquipList.EquipData(1).NumSubEquip = 1; - zoneEquipList.EquipData(1).SubEquipData.allocate(1); + zoneEquipList.EquipData(1).NumSubEquip = 2; + zoneEquipList.EquipData(1).SubEquipData.allocate(2); zoneEquipList.EquipData(1).SubEquipData(1).Name = coil1Name; + zoneEquipList.EquipData(1).SubEquipData(2).Name = "MyFan1"; + zoneEquipList.EquipData(1).SubEquipData(2).TypeOf = "FAN:ONOFF"; zoneEquipList.EquipName(2) = "Zone 1 ADU"; zoneEquipList.EquipTypeName(2) = "ZoneHVAC:AirDistributionUnit"; @@ -1044,6 +1050,8 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c1a->userNameforHVACsystem, "Zone 1 FCU")); EXPECT_TRUE(Util::SameString(c1a->coilName_, coil1Name)); EXPECT_TRUE(Util::SameString(c1a->zoneName[0], "ThisZone")); + EXPECT_TRUE(Util::SameString(c1a->fanTypeName, "FAN:ONOFF")); + EXPECT_TRUE(Util::SameString(c1a->fanAssociatedWithCoilName, "MyFan1")); EXPECT_TRUE(Util::SameString(c2a->coilLocation, "Zone Equipment")); EXPECT_TRUE(Util::SameString(c2a->typeHVACname, "ZoneHVAC:AirDistributionUnit")); @@ -1106,4 +1114,6 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) EXPECT_TRUE(Util::SameString(c2b->userNameforHVACsystem, "Zone 1 FCU")); EXPECT_TRUE(Util::SameString(c2b->coilName_, coil1Name)); EXPECT_TRUE(Util::SameString(c2b->zoneName[0], "ThisZone")); + EXPECT_TRUE(Util::SameString(c2b->fanTypeName, "FAN:ONOFF")); + EXPECT_TRUE(Util::SameString(c2b->fanAssociatedWithCoilName, "MyFan1")); } From 24ccdca03da5c6306ae292a90100995a01e1d993 Mon Sep 17 00:00:00 2001 From: rraustad Date: Tue, 25 Jun 2024 15:36:40 -0400 Subject: [PATCH 19/20] Revise search methodology --- src/EnergyPlus/ReportCoilSelection.cc | 101 +++++++++--------- .../unit/ReportCoilSelection.unit.cc | 1 + 2 files changed, 54 insertions(+), 48 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index df7ec2f11b3..bf8b302e646 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -912,41 +912,45 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std c->userNameforHVACsystem = "Unknown"; // now search equipment auto const &zoneEquipList = state.dataZoneEquip->ZoneEquipList(c->zoneEqNum); - bool keepLooking = true; - bool fanFound = false; + bool coilFound = false; std::string fanType; std::string fanName; for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { - for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).Name == c->coilName_) { - c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); - c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); - c->coilLocation = "Zone Equipment"; - int zoneEqListIndex = Util::FindItemInList(zoneEquipList.Name, state.dataZoneEquip->ZoneEquipList); - if (c->zoneNum.empty()) c->zoneNum.resize(1); - c->zoneNum[0] = zoneEqListIndex; - if (c->zoneName.empty()) c->zoneName.resize(1); - c->zoneName[0] = state.dataHeatBal->Zone(zoneEqListIndex).Name; - keepLooking = false; - } - if (!keepLooking) { - // if coil is found look in this same list for a fan - for (int fanEqNum = 1; fanEqNum <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++fanEqNum) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:SYSTEMMODEL" || - zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:ONOFF" || - zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:CONSTANTVOLUME" || - zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:VARIABLEVOLUME" || - zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf == "FAN:COMPONENTMODEL") { - c->fanTypeName = zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).TypeOf; - c->fanAssociatedWithCoilName = zoneEquipList.EquipData(equipLoop).SubEquipData(fanEqNum).Name; - break; - } - } - break; - } - if (keepLooking) { - for (int subsubEq = 1; subsubEq <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++subsubEq) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(subsubEq).Name == c->coilName_) { + // coil should be found only once, fan could be found multiple times, reset here + bool fanFound = false; + auto &thisSubEq = zoneEquipList.EquipData(equipLoop).SubEquipData; + auto thisSubCoilLambda = [&c](const DataZoneEquipment::SubEquipmentData &myCoil) { return myCoil.Name == c->coilName_; }; + auto thisSubFanLambda = [](const DataZoneEquipment::SubEquipmentData &myFan) { return myFan.TypeOf.rfind("FAN:", 0) == 0; }; + + // search for coil and fan SubEquipData and return parent type/name and fan type/name for coil reports. + auto const &coilIterator = std::find_if(thisSubEq.begin(), thisSubEq.end(), thisSubCoilLambda); + if (std::find_if(thisSubEq.begin(), thisSubEq.end(), thisSubCoilLambda) != thisSubEq.end()) { + c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); + c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); + c->coilLocation = "Zone Equipment"; + int zoneEqListIndex = Util::FindItemInList(zoneEquipList.Name, state.dataZoneEquip->ZoneEquipList); + if (c->zoneNum.empty()) c->zoneNum.resize(1); + c->zoneNum[0] = zoneEqListIndex; + if (c->zoneName.empty()) c->zoneName.resize(1); + c->zoneName[0] = state.dataHeatBal->Zone(zoneEqListIndex).Name; + coilFound = true; + } + auto const &fanIterator = std::find_if(thisSubEq.begin(), thisSubEq.end(), thisSubFanLambda); + if (fanIterator != thisSubEq.end()) { + unsigned int fanIndex = fanIterator - thisSubEq.begin(); + fanType = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].TypeOf; + fanName = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].Name; + fanFound = true; + } + // if coil not found in SubEquipData then maybe it's HXAssisted and in SubSubEquipData. Fan is usually already found if exists. + if (!coilFound || !fanFound) { + auto thisSubSubCoilLambda = [&c](const DataZoneEquipment::SubSubEquipmentData &myCoil) { return myCoil.Name == c->coilName_; }; + auto thisSubSubFanLambda = [](const DataZoneEquipment::SubSubEquipmentData &myFan) { return myFan.TypeOf.rfind("FAN:", 0) == 0; }; + for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { + auto &thisSubSubEq = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData; + if (!coilFound) { + auto const &coilIterator2 = std::find_if(thisSubSubEq.begin(), thisSubSubEq.end(), thisSubSubCoilLambda); + if (coilIterator2 != thisSubSubEq.end()) { c->typeHVACname = zoneEquipList.EquipTypeName(equipLoop); c->userNameforHVACsystem = zoneEquipList.EquipName(equipLoop); c->coilLocation = "Zone Equipment"; @@ -955,28 +959,29 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std c->zoneNum[0] = zoneEqListIndex; if (c->zoneName.empty()) c->zoneName.resize(1); c->zoneName[0] = state.dataHeatBal->Zone(zoneEqListIndex).Name; - keepLooking = false; + coilFound = true; } } - if (!keepLooking) { - // if coil is found look in this same list for a fan - for (int fanEqNum = 1; fanEqNum <= zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).NumSubSubEquip; ++fanEqNum) { - if (zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:SYSTEMMODEL" || - zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:ONOFF" || - zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:CONSTANTVOLUME" || - zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:VARIABLEVOLUME" || - zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf == "FAN:COMPONENTMODEL") { - c->fanTypeName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).TypeOf; - c->fanAssociatedWithCoilName = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData(fanEqNum).Name; - break; - } + if (!fanFound) { + auto const &fanIterator2 = std::find_if(thisSubSubEq.begin(), thisSubSubEq.end(), thisSubSubFanLambda); + if (fanIterator2 != thisSubSubEq.end()) { + unsigned int fanIndex = fanIterator2 - thisSubSubEq.begin(); + fanType = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].TypeOf; + fanName = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].Name; + fanFound = true; } - break; } + if (coilFound && fanFound) break; + } + } + if (coilFound) { + if (fanFound) { + c->fanTypeName = fanType; + c->fanAssociatedWithCoilName = fanName; } - if (!keepLooking) break; + break; } - if (!keepLooking) break; + } // for (equipLoop) if (c->typeHVACname == "Unknown") { diff --git a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc index c2e497c48f5..8f49067b8c5 100644 --- a/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc +++ b/tst/EnergyPlus/unit/ReportCoilSelection.unit.cc @@ -980,6 +980,7 @@ TEST_F(EnergyPlusFixture, Test_finishCoilSummaryReportTable) zoneEquipList.EquipData(1).NumSubEquip = 2; zoneEquipList.EquipData(1).SubEquipData.allocate(2); zoneEquipList.EquipData(1).SubEquipData(1).Name = "ElecHeatCoil"; + zoneEquipList.EquipData(1).SubEquipData(1).TypeOf = "Coil:Heating:Electric"; zoneEquipList.EquipData(1).SubEquipData(2).Name = "MyFan1"; zoneEquipList.EquipData(1).SubEquipData(2).TypeOf = "FAN:ONOFF"; From e7b5745fcfa53b11ac929e80e7effe05539c7c92 Mon Sep 17 00:00:00 2001 From: rraustad Date: Tue, 25 Jun 2024 16:42:39 -0400 Subject: [PATCH 20/20] Final changes --- src/EnergyPlus/ReportCoilSelection.cc | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) diff --git a/src/EnergyPlus/ReportCoilSelection.cc b/src/EnergyPlus/ReportCoilSelection.cc index fb97c3d30c0..b4733432d1f 100644 --- a/src/EnergyPlus/ReportCoilSelection.cc +++ b/src/EnergyPlus/ReportCoilSelection.cc @@ -915,12 +915,16 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std bool coilFound = false; std::string fanType; std::string fanName; + auto thisSubCoilLambda = [&c](const DataZoneEquipment::SubEquipmentData &myCoil) { return myCoil.Name == c->coilName_; }; + auto thisSubFanLambda = [](const DataZoneEquipment::SubEquipmentData &myFan) { return myFan.TypeOf.rfind("FAN:", 0) == 0; }; + auto thisSubSubCoilLambda = [&c](const DataZoneEquipment::SubSubEquipmentData &myCoil) { return myCoil.Name == c->coilName_; }; + auto thisSubSubFanLambda = [](const DataZoneEquipment::SubSubEquipmentData &myFan) { return myFan.TypeOf.rfind("FAN:", 0) == 0; }; + for (int equipLoop = 1; equipLoop <= zoneEquipList.NumOfEquipTypes; ++equipLoop) { // coil should be found only once, fan could be found multiple times, reset here + // for each type of equipment (equipLoop) only one coil and fan could be found as a pair bool fanFound = false; auto &thisSubEq = zoneEquipList.EquipData(equipLoop).SubEquipData; - auto thisSubCoilLambda = [&c](const DataZoneEquipment::SubEquipmentData &myCoil) { return myCoil.Name == c->coilName_; }; - auto thisSubFanLambda = [](const DataZoneEquipment::SubEquipmentData &myFan) { return myFan.TypeOf.rfind("FAN:", 0) == 0; }; // search for coil and fan SubEquipData and return parent type/name and fan type/name for coil reports. auto const &coilIterator = std::find_if(thisSubEq.begin(), thisSubEq.end(), thisSubCoilLambda); @@ -938,14 +942,13 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std auto const &fanIterator = std::find_if(thisSubEq.begin(), thisSubEq.end(), thisSubFanLambda); if (fanIterator != thisSubEq.end()) { unsigned int fanIndex = fanIterator - thisSubEq.begin(); - fanType = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].TypeOf; - fanName = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].Name; + // notice the brackets on the Array1D for [fanIndex] + fanType = thisSubEq[fanIndex].TypeOf; + fanName = thisSubEq[fanIndex].Name; fanFound = true; } // if coil not found in SubEquipData then maybe it's HXAssisted and in SubSubEquipData. Fan is usually already found if exists. if (!coilFound || !fanFound) { - auto thisSubSubCoilLambda = [&c](const DataZoneEquipment::SubSubEquipmentData &myCoil) { return myCoil.Name == c->coilName_; }; - auto thisSubSubFanLambda = [](const DataZoneEquipment::SubSubEquipmentData &myFan) { return myFan.TypeOf.rfind("FAN:", 0) == 0; }; for (int subEq = 1; subEq <= zoneEquipList.EquipData(equipLoop).NumSubEquip; ++subEq) { auto &thisSubSubEq = zoneEquipList.EquipData(equipLoop).SubEquipData(subEq).SubSubEquipData; if (!coilFound) { @@ -966,8 +969,9 @@ void ReportCoilSelection::associateZoneCoilWithParent(EnergyPlusData &state, std auto const &fanIterator2 = std::find_if(thisSubSubEq.begin(), thisSubSubEq.end(), thisSubSubFanLambda); if (fanIterator2 != thisSubSubEq.end()) { unsigned int fanIndex = fanIterator2 - thisSubSubEq.begin(); - fanType = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].TypeOf; - fanName = zoneEquipList.EquipData(equipLoop).SubEquipData[fanIndex].Name; + // notice the brackets on the Array1D for [fanIndex] + fanType = thisSubSubEq[fanIndex].TypeOf; + fanName = thisSubSubEq[fanIndex].Name; fanFound = true; } }