Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Improved Support for Multi-speed Fans #9746

Merged
merged 34 commits into from
Aug 16, 2023
Merged
Show file tree
Hide file tree
Changes from 15 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
339d44e
Upload a draft NFP
lgu1234 Nov 18, 2022
5e095fb
Revise NFP based on comments
lgu1234 Dec 1, 2022
ee4cbff
Update NFP based on comments
lgu1234 Jan 9, 2023
9206678
Merge branch 'develop' into MultispeedFans
lgu1234 Jan 9, 2023
52a199a
Final NFP
lgu1234 Jan 12, 2023
1da6891
Merge branch 'develop' into MultispeedFans
lgu1234 Jan 12, 2023
09e6b25
Upload design document
lgu1234 Feb 22, 2023
c52794b
Merge branch 'develop' into MultispeedFans
lgu1234 Feb 22, 2023
9ffbd6e
Initial upload
lgu1234 May 10, 2023
b5424bd
Merge branch 'develop' into MultispeedFans
lgu1234 May 10, 2023
e86f452
Clang format
lgu1234 May 10, 2023
029f6ba
Clang format
lgu1234 May 11, 2023
95499ca
Correct a mistake in unit test
lgu1234 May 11, 2023
187ef58
Clang format more
lgu1234 May 11, 2023
c7599db
Clang format in unit test
lgu1234 May 11, 2023
ea74729
Upload a rvi file and correct a mistake
lgu1234 May 15, 2023
9fa565c
Merge branch 'develop' into MultispeedFans
lgu1234 May 15, 2023
8bbc5bd
Address comments
lgu1234 May 17, 2023
8d0b646
Merge branch 'develop' into MultispeedFans
lgu1234 May 17, 2023
bfdd62a
Adjust inputs due to idd changes
lgu1234 May 17, 2023
8466b38
Merge branch 'develop' into MultispeedFans
lgu1234 May 18, 2023
a9ea65b
Merge branch 'develop' into MultispeedFans
lgu1234 Jun 7, 2023
fde9769
Merge branch 'develop' into MultispeedFans
lgu1234 Jun 14, 2023
9c31b28
Address comments
lgu1234 Jul 6, 2023
dcc69ed
Merge branch 'MultispeedFans' of https://github.com/NREL/EnergyPlus i…
lgu1234 Jul 6, 2023
13eb113
Merge branch 'develop' into MultispeedFans
lgu1234 Jul 6, 2023
9c8a271
CLang format
lgu1234 Jul 6, 2023
47bc2ce
Merge branch 'develop' into MultispeedFans
lgu1234 Jul 6, 2023
f44c7fe
Address comments
lgu1234 Jul 19, 2023
538b5a8
Merge branch 'develop' into MultispeedFans
lgu1234 Jul 19, 2023
b03e970
Merge branch 'develop' into MultispeedFans
lgu1234 Aug 16, 2023
cfee11b
Conflict correction
lgu1234 Aug 16, 2023
5fec7ee
Merge branch 'develop' into MultispeedFans
lgu1234 Aug 16, 2023
36a9e38
Clang format
lgu1234 Aug 16, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1,083 changes: 1,083 additions & 0 deletions design/FY2023/NFP_MultispeedFans.md

Large diffs are not rendered by default.

Large diffs are not rendered by default.

21 changes: 18 additions & 3 deletions idd/Energy+.idd.in
Original file line number Diff line number Diff line change
Expand Up @@ -36447,10 +36447,18 @@ ZoneHVAC:WaterToAirHeatPump,
\note Constant results in 100% water flow regardless of compressor PLR
\note Cycling results in water flow that matches compressor PLR
\note ConstantOnDemand results in 100% water flow whenever the coil is on, but is 0% whenever the coil has no load
A20; \field Design Specification ZoneHVAC Sizing Object Name
A20, \field Design Specification ZoneHVAC Sizing Object Name
\note Enter the name of a DesignSpecificationZoneHVACSizing object.
\type object-list
\object-list DesignSpecificationZoneHVACSizingName
A21, \field Design Specification Multispeed Object Type
\type choice
\key UnitarySystemPerformance:Multispeed
\note Enter the type of performance specification object used to describe the multispeed coil or fan.
A22; \field Design Specification Multispeed Object Name
\type object-list
\object-list UnitarySystemPerformaceNames
\note Enter the name of the performance specification object used to describe the multispeed coil or fan.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Add two new optional fields as proposed

Copy link
Member

Choose a reason for hiding this comment

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

Two optional fields, no transition 👍

Copy link
Member

Choose a reason for hiding this comment

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

The wording here is a little funny, but maybe there's precedent:

\note Enter the name of the performance specification objec

The phrase "Enter the name of..." sounds like it's one of the many interactive text-based games I probably don't still play in 2023. If there is any other change to make, I'd prefer to at least take out the word "Enter". @mjwitte any thoughts on this one?

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@Myoldmopar Actually, I copy the note from the same field used in UnitarySystem. I am open to any changes.

A27; \field Design Specification Multispeed Object Name
\type object-list
\object-list UnitarySystemPerformaceNames
\note Enter the name of the performance specification object used to describe the multispeed coil.

Copy link
Contributor

Choose a reason for hiding this comment

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

@lgu1234 If there are other changes to make, then let's change this everywhere to simply say "\note The name of the . . . "

Copy link
Contributor Author

Choose a reason for hiding this comment

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

@mjwitte Done everywhere (3 objects)

Copy link
Member

Choose a reason for hiding this comment

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

The note actually still appears to say "Enter the name..." But it's fine, and not worth any other commits.


ZoneHVAC:Dehumidifier:DX,
\memo This object calculates the performance of zone (room) air dehumidifiers.
Expand Down Expand Up @@ -42334,14 +42342,21 @@ ZoneHVAC:TerminalUnit:VariableRefrigerantFlow,
\default 21.0
\units C
\note Supplemental heater will not operate when outdoor temperature exceeds this value.
A19; \field Controlling Zone or Thermostat Location
A19, \field Controlling Zone or Thermostat Location
\type object-list
\object-list ZoneNames
\note Used only for AirloopHVAC equipment on a main branch and defines zone name where thermostat is located.
\note Not required for zone equipment. Leave blank if terminal unit is used in AirLoopHVAC:OutdoorAirSystem:EquipmentList.
\note Required when terminal unit is used on main AirloopHVAC branch and coils are not set point controlled.
\note When terminal unit is used in air loop and is load controlled, this zone's thermostat will control operation.

A20, \field Design Specification Multispeed Object Type
\type choice
\key UnitarySystemPerformance:Multispeed
\note Enter the type of performance specification object used to describe the multispeed coil or fan.
A21; \field Design Specification Multispeed Object Name
\type object-list
\object-list UnitarySystemPerformaceNames
\note Enter the name of the performance specification object used to describe the multispeed coil or fan.
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Add two new optional fields as proposed

Copy link
Member

Choose a reason for hiding this comment

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

Two optional fields, no transition 👍


\group Zone HVAC Radiative/Convective Units

Expand Down
10 changes: 10 additions & 0 deletions src/EnergyPlus/HVACFan.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1169,6 +1169,16 @@ namespace HVACFan {
}
}

int FanSystem::fanNumOfSpeed() const
{
return m_numSpeeds;
}

Real64 FanSystem::AirMassFlowRateAtSpeed(int const SpeedNum)
{
return m_massFlowAtSpeed[SpeedNum];
}
Copy link
Contributor

Choose a reason for hiding this comment

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

If m_numSpeeds and m_massFlowAtSpeed were public you wouldn't need these new functions.

Copy link
Contributor Author

Choose a reason for hiding this comment

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

I don't have any problems to make these two members as public. I am going to wait a couple of days.


// void
// FanSystem::fanIsSecondaryDriver()
//{
Expand Down
4 changes: 4 additions & 0 deletions src/EnergyPlus/HVACFan.hh
Original file line number Diff line number Diff line change
Expand Up @@ -109,6 +109,10 @@ namespace HVACFan {

void FanInputsForDesignHeatGain(EnergyPlusData &state, Real64 &deltaP, Real64 &motEff, Real64 &totEff, Real64 &motInAirFrac);

int fanNumOfSpeed() const;

Real64 AirMassFlowRateAtSpeed(int const SpeedNum);

// void
// fanIsSecondaryDriver();

Expand Down
585 changes: 468 additions & 117 deletions src/EnergyPlus/HVACVariableRefrigerantFlow.cc

Large diffs are not rendered by default.

125 changes: 70 additions & 55 deletions src/EnergyPlus/HVACVariableRefrigerantFlow.hh
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,7 @@
#include <EnergyPlus/PlantComponent.hh>
#include <EnergyPlus/SingleDuct.hh>
#include <EnergyPlus/StandardRatings.hh>
#include <EnergyPlus/UnitarySystem.hh>
#include <EnergyPlus/UtilityRoutines.hh>

namespace EnergyPlus {
Expand Down Expand Up @@ -700,61 +701,75 @@ namespace HVACVariableRefrigerantFlow {
bool SuppHeatingCoilPresent = false; // FALSE if coil not present
std::string AvailManagerListName; // Name of an availability manager list object
int AvailStatus = 0;
Real64 TerminalUnitSensibleRate = 0.0; // sensible cooling/heating rate of VRF terminal unit (W)
Real64 TerminalUnitLatentRate = 0.0; // latent dehumidification/humidification rate of VRF terminal unit (W)
Real64 TotalCoolingRate = 0.0; // report variable for total cooling rate (W)
Real64 TotalHeatingRate = 0.0; // report variable for total heating rate (W)
Real64 SensibleCoolingRate = 0.0; // report variable for sensible cooling rate (W)
Real64 SensibleHeatingRate = 0.0; // report variable for sensible heating rate (W)
Real64 LatentCoolingRate = 0.0; // report variable for latent cooling rate (W)
Real64 LatentHeatingRate = 0.0; // report variable for latent heating rate (W)
Real64 TotalCoolingEnergy = 0.0; // report variable for total cooling energy (J)
Real64 TotalHeatingEnergy = 0.0; // report variable for total heating energy (J)
Real64 SensibleCoolingEnergy = 0.0; // report variable for sensible cooling energy (J)
Real64 SensibleHeatingEnergy = 0.0; // report variable for sensible heating energy (J)
Real64 LatentCoolingEnergy = 0.0; // report variable for latent cooling energy (J)
Real64 LatentHeatingEnergy = 0.0; // report variable for latent heating energy (J)
bool EMSOverridePartLoadFrac = false; // User defined EMS function
Real64 EMSValueForPartLoadFrac = 0.0; // user defined value for EMS function
int IterLimitExceeded = 0; // index used for warning messages
int FirstIterfailed = 0; // index used for warning messages
int HVACSizingIndex = 0; // index of a HVACSizing object for a VRF terminal
bool ATMixerExists = false; // True if there is an ATMixer
std::string ATMixerName; // name of air terminal mixer
int ATMixerIndex = 0; // index to the air terminal mixer
int ATMixerType = 0; // 1 = inlet side mixer, 2 = supply side mixer
int ATMixerPriNode = 0; // primary inlet air node number for the air terminal mixer
int ATMixerSecNode = 0; // secondary air inlet node number for the air terminal mixer
int ATMixerOutNode = 0; // outlet air node number for the air terminal mixer
int SuppHeatCoilAirInletNode = 0; // supplemental heating coil air inlet node
int SuppHeatCoilAirOutletNode = 0; // supplemental heating coil air outlet node
int SuppHeatCoilFluidInletNode = 0; // supplemental heating coil fluid inlet node
int SuppHeatCoilFluidOutletNode = 0; // supplemental heating coil fluid outlet node
bool firstPass = true; // used to reset global sizing data
PlantLocation SuppHeatCoilPlantLoc{}; // supplemental heating coil plant component index
Real64 coilInNodeT = 0.0; // coil inlet node temp at full flow (C)
Real64 coilInNodeW = 0.0; // coil inlet node humidity ratio at full flow (kg/kg)
int fanInletNode = 0; // fan inlet node index
int fanOutletNode = 0; // fan outlet node index
bool MySuppCoilPlantScanFlag = true; // flag used to initialize plant comp for water and steam heating coils
int airLoopNum = 0; // index to air loop
bool isInOASys = false; // true if TU is configured in outside air system
bool isInAirLoop = false; // true if TU is configured in an air loop
bool isInZone = false; // true if TU is configured as zone equipment
bool isSetPointControlled = false; // TU is controlled via setpoint instead of the standard load control
bool coolSPActive = false; // set point controlled cooling coil active (needs to operate)
bool heatSPActive = false; // set point controlled heating coil active (needs to operate)
Real64 coolLoadToSP = 0.0; // load to set point in cooling mode
Real64 heatLoadToSP = 0.0; // load to set point in heating mode
Real64 coilTempSetPoint = 0.0; // coil control temperature
Real64 suppTempSetPoint = 0.0; // supplemental heating coil control temperature
Real64 controlZoneMassFlowFrac = 1.0; // ratio of control zone air mass flow rate to total zone air mass flow rate
int zoneSequenceCoolingNum = 0; // zone equipment cooling sequence
int zoneSequenceHeatingNum = 0; // zone equipment heating sequence
int coolCoilAirInNode = 0; // cooling coil air inlet node number
int coolCoilAirOutNode = 0; // cooling coil air outlet node number
int heatCoilAirInNode = 0; // heating coil air inlet node number
int heatCoilAirOutNode = 0; // heating coil air outlet node number
Real64 TerminalUnitSensibleRate = 0.0; // sensible cooling/heating rate of VRF terminal unit (W)
Real64 TerminalUnitLatentRate = 0.0; // latent dehumidification/humidification rate of VRF terminal unit (W)
Real64 TotalCoolingRate = 0.0; // report variable for total cooling rate (W)
Real64 TotalHeatingRate = 0.0; // report variable for total heating rate (W)
Real64 SensibleCoolingRate = 0.0; // report variable for sensible cooling rate (W)
Real64 SensibleHeatingRate = 0.0; // report variable for sensible heating rate (W)
Real64 LatentCoolingRate = 0.0; // report variable for latent cooling rate (W)
Real64 LatentHeatingRate = 0.0; // report variable for latent heating rate (W)
Real64 TotalCoolingEnergy = 0.0; // report variable for total cooling energy (J)
Real64 TotalHeatingEnergy = 0.0; // report variable for total heating energy (J)
Real64 SensibleCoolingEnergy = 0.0; // report variable for sensible cooling energy (J)
Real64 SensibleHeatingEnergy = 0.0; // report variable for sensible heating energy (J)
Real64 LatentCoolingEnergy = 0.0; // report variable for latent cooling energy (J)
Real64 LatentHeatingEnergy = 0.0; // report variable for latent heating energy (J)
bool EMSOverridePartLoadFrac = false; // User defined EMS function
Real64 EMSValueForPartLoadFrac = 0.0; // user defined value for EMS function
int IterLimitExceeded = 0; // index used for warning messages
int FirstIterfailed = 0; // index used for warning messages
int HVACSizingIndex = 0; // index of a HVACSizing object for a VRF terminal
bool ATMixerExists = false; // True if there is an ATMixer
std::string ATMixerName; // name of air terminal mixer
int ATMixerIndex = 0; // index to the air terminal mixer
int ATMixerType = 0; // 1 = inlet side mixer, 2 = supply side mixer
int ATMixerPriNode = 0; // primary inlet air node number for the air terminal mixer
int ATMixerSecNode = 0; // secondary air inlet node number for the air terminal mixer
int ATMixerOutNode = 0; // outlet air node number for the air terminal mixer
int SuppHeatCoilAirInletNode = 0; // supplemental heating coil air inlet node
int SuppHeatCoilAirOutletNode = 0; // supplemental heating coil air outlet node
int SuppHeatCoilFluidInletNode = 0; // supplemental heating coil fluid inlet node
int SuppHeatCoilFluidOutletNode = 0; // supplemental heating coil fluid outlet node
bool firstPass = true; // used to reset global sizing data
PlantLocation SuppHeatCoilPlantLoc{}; // supplemental heating coil plant component index
Real64 coilInNodeT = 0.0; // coil inlet node temp at full flow (C)
Real64 coilInNodeW = 0.0; // coil inlet node humidity ratio at full flow (kg/kg)
int fanInletNode = 0; // fan inlet node index
int fanOutletNode = 0; // fan outlet node index
bool MySuppCoilPlantScanFlag = true; // flag used to initialize plant comp for water and steam heating coils
int airLoopNum = 0; // index to air loop
bool isInOASys = false; // true if TU is configured in outside air system
bool isInAirLoop = false; // true if TU is configured in an air loop
bool isInZone = false; // true if TU is configured as zone equipment
bool isSetPointControlled = false; // TU is controlled via setpoint instead of the standard load control
bool coolSPActive = false; // set point controlled cooling coil active (needs to operate)
bool heatSPActive = false; // set point controlled heating coil active (needs to operate)
Real64 coolLoadToSP = 0.0; // load to set point in cooling mode
Real64 heatLoadToSP = 0.0; // load to set point in heating mode
Real64 coilTempSetPoint = 0.0; // coil control temperature
Real64 suppTempSetPoint = 0.0; // supplemental heating coil control temperature
Real64 controlZoneMassFlowFrac = 1.0; // ratio of control zone air mass flow rate to total zone air mass flow rate
int zoneSequenceCoolingNum = 0; // zone equipment cooling sequence
int zoneSequenceHeatingNum = 0; // zone equipment heating sequence
int coolCoilAirInNode = 0; // cooling coil air inlet node number
int coolCoilAirOutNode = 0; // cooling coil air outlet node number
int heatCoilAirInNode = 0; // heating coil air inlet node number
int heatCoilAirOutNode = 0; // heating coil air outlet node number
std::string DesignSpecMultispeedHPType; // Multiuple performance object type
std::string DesignSpecMultispeedHPName; // Multiuple performance object name
int DesignSpecMSHPIndex = -1; // Multiuple performance index
int NumOfSpeedHeating = 0; // Number of heating speed
int NumOfSpeedCooling = 0; // Number of cooling speed
int HeatSpeedNum = 0; // Heating speed number
int CoolSpeedNum = 0; // Cooling speed number
std::vector<Real64> CoolVolumeFlowRate;
std::vector<Real64> CoolMassFlowRate;
std::vector<Real64> HeatVolumeFlowRate;
std::vector<Real64> HeatMassFlowRate;
int SpeedNum = 0;
Real64 SpeedRatio = 0.0;
Real64 CycRatio = 0.0;
Copy link
Contributor Author

Choose a reason for hiding this comment

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

Add new variables


// Methods for New VRF Model: Fluid Temperature Control
//******************************************************************************
Expand Down
Loading