From ce812276a31af73879066151c462af076c24b5fa Mon Sep 17 00:00:00 2001 From: "Lerond, Jeremy" Date: Mon, 14 Oct 2024 16:08:16 -0700 Subject: [PATCH 1/2] Add variable speed cooling coil to AFN --- .../src/overview/group-airflow-network.tex | 2 + idd/Energy+.idd.in | 1 + src/EnergyPlus/AirflowNetwork/src/Solver.cpp | 12 +++- .../unit/AirflowNetworkHVAC.unit.cc | 64 +++++++++++++++++++ 4 files changed, 77 insertions(+), 2 deletions(-) diff --git a/doc/input-output-reference/src/overview/group-airflow-network.tex b/doc/input-output-reference/src/overview/group-airflow-network.tex index 61599bfaeaa..5a3076c36d4 100644 --- a/doc/input-output-reference/src/overview/group-airflow-network.tex +++ b/doc/input-output-reference/src/overview/group-airflow-network.tex @@ -2156,6 +2156,8 @@ \subsubsection{Inputs}\label{inputs-2016-06-16} \hyperref[coilcoolingdxtwostagewithhumiditycontrolmode]{Coil:Cooling:DX:TwoStageWithHumidityControlMode} \item \hyperref[coilcoolingdxmultispeed]{Coil:Cooling:DX:MultiSpeed} +\item + \hyperref[coilcoolingdxvariablespeed]{Coil:Cooling:DX:VariableSpeed} \item \hyperref[coilheatingdxmultispeed]{Coil:Heating:DX:MultiSpeed} \item diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index fa0cf2f26d9..50d379687c2 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -26706,6 +26706,7 @@ AirflowNetwork:Distribution:Component:Coil, \key Coil:Cooling:DX:TwoStageWithHumidityControlMode \key Coil:Cooling:DX:MultiSpeed \key Coil:Heating:DX:MultiSpeed + \key Coil:Cooling:DX:VariableSpeed \key Coil:Heating:Desuperheater \key Coil:Heating:Electric:MultiStage \key Coil:Heating:Gas:MultiStage diff --git a/src/EnergyPlus/AirflowNetwork/src/Solver.cpp b/src/EnergyPlus/AirflowNetwork/src/Solver.cpp index 47073976e3a..22076431b87 100644 --- a/src/EnergyPlus/AirflowNetwork/src/Solver.cpp +++ b/src/EnergyPlus/AirflowNetwork/src/Solver.cpp @@ -10530,8 +10530,6 @@ namespace AirflowNetwork { } else { ShowSevereError(m_state, "SetDXCoilAirLoopNumber: Could not find Coil \"Name=\"" + DisSysCompCoilData(i).name + "\""); } - // SetDXCoilAirLoopNumber(DisSysCompCoilData(i).name, - // DisSysCompCoilData(i).AirLoopNum); } } else if (SELECT_CASE_var == "COIL:COOLING:DX:SINGLESPEED") { ValidateComponent( @@ -10612,6 +10610,16 @@ namespace AirflowNetwork { SetDXCoilAirLoopNumber(m_state, DisSysCompCoilData(i).name, DisSysCompCoilData(i).AirLoopNum); } + } else if (SELECT_CASE_var == "COIL:COOLING:DX:VARIABLESPEED") { + ValidateComponent( + m_state, "Coil:Cooling:DX:VariableSpeed", DisSysCompCoilData(i).name, IsNotOK, format(RoutineName) + CurrentModuleObject); + ++MultiSpeedHPIndicator; + if (IsNotOK) { + ErrorsFound = true; + } else { + SetDXCoilAirLoopNumber(m_state, DisSysCompCoilData(i).name, DisSysCompCoilData(i).AirLoopNum); + } + } else if (SELECT_CASE_var == "COIL:HEATING:DX:MULTISPEED") { ValidateComponent( m_state, "Coil:Heating:DX:MultiSpeed", DisSysCompCoilData(i).name, IsNotOK, format(RoutineName) + CurrentModuleObject); diff --git a/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc b/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc index 54e70f64c19..c17f2711202 100644 --- a/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc +++ b/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc @@ -6100,6 +6100,70 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_CheckNumOfFansInAirLoopTest) EXPECT_TRUE(compare_err_stream(error_string, true)); } +TEST_F(EnergyPlusFixture, AirflowNetwork_ValidateVarSpeedCoolingCoil) +{ + std::string const idf_objects = delimited_string({ + + " Coil:Cooling:DX:VariableSpeed,", + " Super Coil, !- Name", + " Cooling Coil Air Inlet Node_unit1, !- Indoor Air Inlet Node Name", + " Heating Coil Air Inlet Node_unit1, !- Indoor Air Outlet Node Name", + " 1, !- Number of Speeds {dimensionless}", + " 1, !- Nominal Speed Level {dimensionless}", + " autosize, !- Gross Rated Total Cooling Capacity At Selected Nominal Speed Level {W}", + " autosize, !- Rated Air Flow Rate At Selected Nominal Speed Level {m3/s}", + " , !- Nominal Time for Condensate to Begin Leaving the Coil {s}", + " , !- Initial Moisture Evaporation Rate Divided by Steady-State AC Latent Capacity {dimensionless}", + " , !- Maximum Cycling Rate {cycles/hr}", + " , !- Latent Capacity Time Constant {s}", + " , !- Fan Delay Time {s}", + " HPCOOLPLFFPLR, !- Energy Part Load Fraction Curve Name", + " , !- Condenser Air Inlet Node Name", + " AirCooled, !- Condenser Type", + " , !- Evaporative Condenser Pump Rated Power Consumption {W}", + " , !- Crankcase Heater Capacity {W}", + " , !- Crankcase Heater Capacity Function of Temperature Curve Name", + " 10, !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C}", + " -25, !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}", + " , !- Supply Water Storage Tank Name", + " , !- Condensate Collection Water Storage Tank Name", + " , !- Basin Heater Capacity {W/K}", + " 2, !- Basin Heater Setpoint Temperature {C}", + " , !- Basin Heater Operating Schedule Name", + " 15000, !- Speed 1 Reference Unit Gross Rated Total Cooling Capacity {W}", + " 0.55, !- Speed 1 Reference Unit Gross Rated Sensible Heat Ratio {dimensionless}", + " 4.3, !- Speed 1 Reference Unit Gross Rated Cooling COP {W/W}", + " 0.05, !- Speed 1 Reference Unit Rated Air Flow Rate {m3/s}", + " , !- 2017 Speed 1 Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)}", + " , !- 2023 Speed 1 Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)}", + " , !- Speed 1 Reference Unit Rated Condenser Air Flow Rate {m3/s}", + " , !- Speed 1 Reference Unit Rated Pad Effectiveness of Evap Precooling {dimensionless}", + " HPCoolingCAPFTemp, !- Speed 1 Total Cooling Capacity Function of Temperature Curve Name", + " HPCoolingCAPFFF, !- Speed 1 Total Cooling Capacity Function of Air Flow Fraction Curve Name", + " HPCoolingEIRFTemp, !- Speed 1 Energy Input Ratio Function of Temperature Curve Name", + " HPCoolingEIRFFF; !- Speed 1 Energy Input Ratio Function of Air Flow Fraction Curve Name", + }); + + ASSERT_TRUE(process_idf(idf_objects)); + + state->dataAirSystemsData->PrimaryAirSystems.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Coil:Cooling:DX:VariableSpeed"; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).Name = "VariableSpeedCoolingCoil"; + + state->afn->DisSysNumOfCoils = 1; + state->afn->DisSysCompCoilData.allocate(1); + state->afn->DisSysCompCoilData(1).EPlusType = "COIL:COOLING:DX:VARIABLESPEED"; + state->afn->DisSysCompCoilData(1).name = "Super Coil"; + + int num_coils = state->dataInputProcessing->inputProcessor->getNumObjectsFound(*state, "Coil:Cooling:DX:VariableSpeed"); + + state->afn->validate_distribution(); +} + // Missing an AirflowNetwork:Distribution:Node for the Zone Air Node TEST_F(EnergyPlusFixture, AirflowNetwork_CheckMultiZoneNodes_NoZoneNode) { From 5a57a68d619ee63b4c43179267b9353b3aeb033c Mon Sep 17 00:00:00 2001 From: "Lerond, Jeremy" Date: Mon, 14 Oct 2024 16:30:19 -0700 Subject: [PATCH 2/2] Add variable speed heating coil to AFN --- .../src/overview/group-airflow-network.tex | 2 + idd/Energy+.idd.in | 1 + src/EnergyPlus/AirflowNetwork/src/Solver.cpp | 14 ++++- .../unit/AirflowNetworkHVAC.unit.cc | 58 ++++++++++++++----- 4 files changed, 60 insertions(+), 15 deletions(-) diff --git a/doc/input-output-reference/src/overview/group-airflow-network.tex b/doc/input-output-reference/src/overview/group-airflow-network.tex index 5a3076c36d4..d06129e9d67 100644 --- a/doc/input-output-reference/src/overview/group-airflow-network.tex +++ b/doc/input-output-reference/src/overview/group-airflow-network.tex @@ -2160,6 +2160,8 @@ \subsubsection{Inputs}\label{inputs-2016-06-16} \hyperref[coilcoolingdxvariablespeed]{Coil:Cooling:DX:VariableSpeed} \item \hyperref[coilheatingdxmultispeed]{Coil:Heating:DX:MultiSpeed} +\item + \hyperref[coilheatingdxvariablespeed]{Coil:Heating:DX:VariableSpeed} \item \hyperref[coilheatingdesuperheater]{Coil:Heating:Desuperheater} \end{itemize} diff --git a/idd/Energy+.idd.in b/idd/Energy+.idd.in index 50d379687c2..81244c4baae 100644 --- a/idd/Energy+.idd.in +++ b/idd/Energy+.idd.in @@ -26707,6 +26707,7 @@ AirflowNetwork:Distribution:Component:Coil, \key Coil:Cooling:DX:MultiSpeed \key Coil:Heating:DX:MultiSpeed \key Coil:Cooling:DX:VariableSpeed + \key Coil:Heating:DX:VariableSpeed \key Coil:Heating:Desuperheater \key Coil:Heating:Electric:MultiStage \key Coil:Heating:Gas:MultiStage diff --git a/src/EnergyPlus/AirflowNetwork/src/Solver.cpp b/src/EnergyPlus/AirflowNetwork/src/Solver.cpp index 22076431b87..15076b114e4 100644 --- a/src/EnergyPlus/AirflowNetwork/src/Solver.cpp +++ b/src/EnergyPlus/AirflowNetwork/src/Solver.cpp @@ -10610,6 +10610,16 @@ namespace AirflowNetwork { SetDXCoilAirLoopNumber(m_state, DisSysCompCoilData(i).name, DisSysCompCoilData(i).AirLoopNum); } + } else if (SELECT_CASE_var == "COIL:HEATING:DX:MULTISPEED") { + ValidateComponent( + m_state, "Coil:Heating:DX:MultiSpeed", DisSysCompCoilData(i).name, IsNotOK, format(RoutineName) + CurrentModuleObject); + ++MultiSpeedHPIndicator; + if (IsNotOK) { + ErrorsFound = true; + } else { + SetDXCoilAirLoopNumber(m_state, DisSysCompCoilData(i).name, DisSysCompCoilData(i).AirLoopNum); + } + } else if (SELECT_CASE_var == "COIL:COOLING:DX:VARIABLESPEED") { ValidateComponent( m_state, "Coil:Cooling:DX:VariableSpeed", DisSysCompCoilData(i).name, IsNotOK, format(RoutineName) + CurrentModuleObject); @@ -10620,9 +10630,9 @@ namespace AirflowNetwork { SetDXCoilAirLoopNumber(m_state, DisSysCompCoilData(i).name, DisSysCompCoilData(i).AirLoopNum); } - } else if (SELECT_CASE_var == "COIL:HEATING:DX:MULTISPEED") { + } else if (SELECT_CASE_var == "COIL:HEATING:DX:VARIABLESPEED") { ValidateComponent( - m_state, "Coil:Heating:DX:MultiSpeed", DisSysCompCoilData(i).name, IsNotOK, format(RoutineName) + CurrentModuleObject); + m_state, "Coil:Heating:DX:VariableSpeed", DisSysCompCoilData(i).name, IsNotOK, format(RoutineName) + CurrentModuleObject); ++MultiSpeedHPIndicator; if (IsNotOK) { ErrorsFound = true; diff --git a/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc b/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc index c17f2711202..15b913bf43c 100644 --- a/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc +++ b/tst/EnergyPlus/unit/AirflowNetworkHVAC.unit.cc @@ -6100,14 +6100,14 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_CheckNumOfFansInAirLoopTest) EXPECT_TRUE(compare_err_stream(error_string, true)); } -TEST_F(EnergyPlusFixture, AirflowNetwork_ValidateVarSpeedCoolingCoil) +TEST_F(EnergyPlusFixture, AirflowNetwork_ValidateDistCoils) { std::string const idf_objects = delimited_string({ " Coil:Cooling:DX:VariableSpeed,", - " Super Coil, !- Name", - " Cooling Coil Air Inlet Node_unit1, !- Indoor Air Inlet Node Name", - " Heating Coil Air Inlet Node_unit1, !- Indoor Air Outlet Node Name", + " Super Coil, !- Name", + " Node_1, !- Indoor Air Inlet Node Name", + " Node_2, !- Indoor Air Outlet Node Name", " 1, !- Number of Speeds {dimensionless}", " 1, !- Nominal Speed Level {dimensionless}", " autosize, !- Gross Rated Total Cooling Capacity At Selected Nominal Speed Level {W}", @@ -6130,9 +6130,9 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_ValidateVarSpeedCoolingCoil) " , !- Basin Heater Capacity {W/K}", " 2, !- Basin Heater Setpoint Temperature {C}", " , !- Basin Heater Operating Schedule Name", - " 15000, !- Speed 1 Reference Unit Gross Rated Total Cooling Capacity {W}", - " 0.55, !- Speed 1 Reference Unit Gross Rated Sensible Heat Ratio {dimensionless}", - " 4.3, !- Speed 1 Reference Unit Gross Rated Cooling COP {W/W}", + " 15000, !- Speed 1 Reference Unit Gross Rated Total Cooling Capacity {W}", + " 0.55, !- Speed 1 Reference Unit Gross Rated Sensible Heat Ratio {dimensionless}", + " 4.3, !- Speed 1 Reference Unit Gross Rated Cooling COP {W/W}", " 0.05, !- Speed 1 Reference Unit Rated Air Flow Rate {m3/s}", " , !- 2017 Speed 1 Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)}", " , !- 2023 Speed 1 Rated Evaporator Fan Power Per Volume Flow Rate {W/(m3/s)}", @@ -6142,6 +6142,36 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_ValidateVarSpeedCoolingCoil) " HPCoolingCAPFFF, !- Speed 1 Total Cooling Capacity Function of Air Flow Fraction Curve Name", " HPCoolingEIRFTemp, !- Speed 1 Energy Input Ratio Function of Temperature Curve Name", " HPCoolingEIRFFF; !- Speed 1 Energy Input Ratio Function of Air Flow Fraction Curve Name", + "", + " Coil:Heating:DX:VariableSpeed,", + " Super Heating Coil, !- Name", + " Node_1, !- Indoor Air Inlet Node Name", + " Node_2, !- Indoor Air Outlet Node Name", + " 1, !- Number of Speeds {dimensionless}", + " 1, !- Nominal Speed Level {dimensionless}", + " autosize, !- Rated Heating Capacity At Selected Nominal Speed Level {W}", + " autosize, !- Rated Air Flow Rate At Selected Nominal Speed Level {m3/s}", + " HPHEATPLFFPLR, !- Energy Part Load Fraction Curve Name", + " , !- Defrost Energy Input Ratio Function of Temperature Curve Name", + " -8, !- Minimum Outdoor Dry-Bulb Temperature for Compressor Operation {C}", + " , !- Outdoor Dry-Bulb Temperature to Turn On Compressor {C}", + " 5, !- Maximum Outdoor Dry-Bulb Temperature for Defrost Operation {C}", + " , !- Crankcase Heater Capacity {W}", + " , !- Crankcase Heater Capacity Function of Temperature Curve Name", + " 10, !- Maximum Outdoor Dry-Bulb Temperature for Crankcase Heater Operation {C}", + " ReverseCycle, !- Defrost Strategy", + " Timed, !- Defrost Control", + " 0.058333, !- Defrost Time Period Fraction", + " , !- Resistive Defrost Heater Capacity {W}", + " 17500, !- Speed 1 Reference Unit Gross Rated Heating Capacity {W}", + " 4.5, !- Speed 1 Reference Unit Gross Rated Heating COP {W/W}", + " 0.05, !- Speed 1 Reference Unit Rated Air Flow Rate {m3/s}", + " 773.3, !- 2017 Speed 1 Rated Supply Air Fan Power Per Volume Flow Rate {W/(m3/s)}", + " 934.4, !- 2023 Speed 1 Rated Supply Air Fan Power Per Volume Flow Rate {W/(m3/s)}", + " HPHeatingCAPFTemp, !- Speed 1 Heating Capacity Function of Temperature Curve Name", + " HPHeatingCAPFFF, !- Speed 1 Total Heating Capacity Function of Air Flow Fraction Curve Name", + " HPHeatingEIRFTemp, !- Speed 1 Energy Input Ratio Function of Temperature Curve Name", + " HPHeatingEIRFFF; !- Speed 1 Energy Input Ratio Function of Air Flow Fraction Curve Name ", }); ASSERT_TRUE(process_idf(idf_objects)); @@ -6149,17 +6179,19 @@ TEST_F(EnergyPlusFixture, AirflowNetwork_ValidateVarSpeedCoolingCoil) state->dataAirSystemsData->PrimaryAirSystems.allocate(1); state->dataAirSystemsData->PrimaryAirSystems(1).NumBranches = 1; state->dataAirSystemsData->PrimaryAirSystems(1).Branch.allocate(1); - state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 1; - state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(1); + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).TotalComponents = 2; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp.allocate(2); state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).TypeOf = "Coil:Cooling:DX:VariableSpeed"; state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(1).Name = "VariableSpeedCoolingCoil"; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(2).TypeOf = "Coil:Heating:DX:VariableSpeed"; + state->dataAirSystemsData->PrimaryAirSystems(1).Branch(1).Comp(2).Name = "VariableSpeedHeatingCoil"; - state->afn->DisSysNumOfCoils = 1; - state->afn->DisSysCompCoilData.allocate(1); + state->afn->DisSysNumOfCoils = 2; + state->afn->DisSysCompCoilData.allocate(2); state->afn->DisSysCompCoilData(1).EPlusType = "COIL:COOLING:DX:VARIABLESPEED"; state->afn->DisSysCompCoilData(1).name = "Super Coil"; - - int num_coils = state->dataInputProcessing->inputProcessor->getNumObjectsFound(*state, "Coil:Cooling:DX:VariableSpeed"); + state->afn->DisSysCompCoilData(2).EPlusType = "COIL:HEATING:DX:VARIABLESPEED"; + state->afn->DisSysCompCoilData(2).name = "Super Heating Coil"; state->afn->validate_distribution(); }