Skip to content

Commit

Permalink
Merge pull request #6338 from NREL/VAVDesignMinFlow6327
Browse files Browse the repository at this point in the history
Fix VAV min flow frac > 1.0 and a bunch of termunitsizing issues related to multiple airloops
  • Loading branch information
Myoldmopar authored Mar 17, 2018
2 parents 92d176e + 30ba4e2 commit 8074325
Show file tree
Hide file tree
Showing 31 changed files with 1,421 additions and 1,048 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -81,6 +81,8 @@ \subsection{System Design Flow Rate and Load Summation and Adjustment}\label{sys

There is a logical flag \emph{SysSizingCalc} corresponding to \emph{ZoneSizingCalc}. It is used to allow the component routines to distinguish a normal simulation call from a being called during a system sizing calculation.

\emph{Note that throughout this section, any reference to a ``zone'' is equivalent to ``air terminal unit''}.

\subsubsection{BeginDay}\label{beginday}

\begin{enumerate}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,9 @@ \subsection{Zone Design Data Arrays}\label{zone-design-data-arrays}

\emph{FinalZoneSizing(i)} corresponds to \emph{CalcFinalZoneSizing} but includes the effect of the user specified sizing factor or user specified zone design flow rate.

The data stored in \emph{CalcZoneSizing}, \emph{CalcFinalZoneSizing}, \emph{ZoneSizing} and \emph{FinalZoneSizing} includes the following data items.
\emph{TermUnitFinalZoneSizing(k)} corresponds to \emph{FinalZoneSizing} but includes the effect of any air system terminal unit sizing factors input with DesignSpecification:AirTerminal:Sizing objects. The index k is for each air terminal unit. There may be more or less terminal units than there are controlled zones.

The data stored in \emph{CalcZoneSizing}, \emph{CalcFinalZoneSizing}, \emph{ZoneSizing}, \emph{FinalZoneSizing} and \emph{TermUnitFinalZoneSizing} includes the following data items.

% table 40
\begin{longtable}[c]{p{1.85in}p{4.13in}}
Expand All @@ -36,7 +38,7 @@ \subsection{Zone Design Data Arrays}\label{zone-design-data-arrays}
\midrule
\endhead

All the data from ZoneSizingInput & \tabularnewline
Select data from ZoneSizingInput & \tabularnewline
DesHeatMassFlow & the zone design heating air mass flow rate in [kg/s] \tabularnewline
DesCoolMassFlow & the zone design cooling air mass flow rate in [kg/s] \tabularnewline
DesHeatLoad & the zone design heating load in [W] \tabularnewline
Expand Down Expand Up @@ -206,9 +208,61 @@ \subsubsection{EndZoneSizingCalc}\label{endzonesizingcalc}

\textbf{This concludes the calculation of the zone design flow rates and loads.}

\subsection{Air Terminal Unit Sizing}\label{air-terminal-unit-sizing}

Each controlled zone may have one or more air terminal units (AirTerminal:*) served by one or more central air handlers (AirLoopHVAC). Each air terminal unit may reference a DesignSpecification:AirTerminal:Sizing object which is used to adjust the \emph{FinalZoneSizing} data for each terminal unit with these user inputs:

\begin{tabular}{lp{0.7\linewidth}}
\\
$DesSensCoolingFrac$ &= Fraction of Design Sensible Cooling Load\\
$DesCoolSATRatio$ &= Cooling Design Supply Air Temperature Difference Ratio\\
$DesSensHeatingFrac$ &= Fraction of Design Sensible Heating Load\\
$DesHeatSATRatio$ &= Heating Design Supply Air Temperature Difference Ratio\\
$MinOAFrac$ &= Fraction of Minimum Outdoor Air Flow\\
\\
\end{tabular}

All of these factors default to 1.0. Function \emph{UpdateTermUnitFinalZoneSizing} first fills each instance of \emph{TermUnitFinalZoneSizing} with a copy of \emph{FinaZoneSizing} for the controlled zone served by the terminal unit. Then, if there is an applicable DesignSpecification:AirTerminal:Sizing input, the following adjustments are made:

\begin{equation}
{CoolLoad_{TU}} = {CoolLoad_{FZ}} \cdot {DesSensCoolingFrac}
\end{equation}

\begin{equation}
{minOAFlow_{TU}} = {minOAFlow_{FZ}} \cdot {MinOAFrac}
\end{equation}

\begin{equation}
{CoolFlowRatio} = {DesSensCoolingFrac} / {DesCoolSATRatio}
\end{equation}

{\scriptsize
\begin{equation}
{CoolFlow_{TU}} = {CoolFlowNoOA_{FZ}} \cdot CoolFlowRatio + {MinOAFrac} \cdot ( {CoolFlowWithOA_{FZ}} - {CoolFlowNoOA_{FZ}} )
\end{equation}}

\begin{equation}
{CoolFlow_{TU}} = max({CoolFlow_{TU}},{minOAFlow_{TU}})
\end{equation}

Where:

\begin{tabular}{lp{0.7\linewidth}}
\\
$CoolLoad$ &= Cooling load variables: $DesCoolLoad, CoolLoadSeq, NonAirSysDesCoolLoad$\\
$CoolFlow$ &= Cooling flow variables: $DesCoolVolFlow, CoolFlowSeq$\\
$CoolFlowNoOA$ &= Cooling flow variables not adjusted for minimum outdoor air: $DesCoolVolFlowNoOA, CoolFlowSeqNoOA$\\
$minOAFlow$ &= minimum outdoor air flow rate\\
Subscript $FZ$ &= Value from $FinalZoneSizing$\\
Subscript $TU$ &= Value for $TermUnitFinalZoneSizing$\\
\\
\end{tabular}

Likewise for heating.

\subsection{Zone HVAC Scalable Sizing}\label{zone-hvac-scalable-sizing}

For zone HVAC equipments scalable sizing applies to supply air flow rate and capacity for both cooling and heating. The scalable sizing method allowed for supply air flow rates include: \emph{FractionOfAutosizedCoolingAirflow}, \emph{FractionOfAutosizedHeatingAirflow}, \emph{FlowPerFloorArea, FlowPerCoolingCapacity}, and \emph{FlowPerHeatingCapacity}. The supply air flow rate scalable sizing methods are defined as follows:
For zone HVAC equipment, scalable sizing applies to supply air flow rate and capacity for both cooling and heating. The scalable sizing method allowed for supply air flow rates include: \emph{FractionOfAutosizedCoolingAirflow}, sizing method allowed for supply air flow rates include: \emph{FractionOfAutosizedCoolingAirflow}, \emph{FractionOfAutosizedHeatingAirflow}, \emph{FlowPerFloorArea, FlowPerCoolingCapacity}, and \emph{FlowPerHeatingCapacity}. The supply air flow rate scalable sizing methods are defined as follows:

\textbf{\emph{FlowPerFloorArea}}: the simulation engine determine the supply air flow rates from the user specified \emph{supply air flow rates per unit floor area} and the zone floor area of the zone served by the zone HVAC equipment.

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -1522,13 +1522,6 @@ \subsection{DesignSpecification:AirTerminal:Sizing}\label{designspecificationair

This object modifies the sizing of an air loop terminal unit. It may be referenced by a ZoneHVAC:AirDistributionUnit or AirTerminal:SingleDuct:Uncontrolled object. The values specified here are applied to the base sizing results from the corresponding Sizing:Zone inputs. Any given DesignSpecification:AirTerminal:Sizing object may be used by multiple terminal units with similar characteristics.

This feature has the following limitations:
\begin{itemize}
\item It does not work with VRP sizing.
\item It does not work with a specified system flow rate in Sizing:System.
\item It does not work if the base minimum outdoor air flow exceeds the heating or cooling air flow.
\end{itemize}

\subsubsection{Inputs}\label{inputs-52-007}

\paragraph{Field: Name}\label{field-name-2-009}
Expand Down
5 changes: 5 additions & 0 deletions src/EnergyPlus/AirTerminalUnit.hh
Original file line number Diff line number Diff line change
Expand Up @@ -149,6 +149,10 @@ public: // Methods
Real64
getPrimAirDesignVolFlow() = 0;

virtual
int
getTermUnitSizingIndex() = 0;

protected: // Data

AirTerminalUnitType terminalType; // Type of air distribution unit //Legacy For use during transition to OO
Expand All @@ -166,6 +170,7 @@ protected: // Data
int zoneNodeIndex; // index in node structure for the zone node for this air terminal
int ctrlZoneInNodeIndex; // which controlled zone inlet node number corresponds with this unit
int airLoopNum; // index to airloop that this terminal unit is connected to
int termUnitSizingNum; // index to TermUnitSizing, TermUnitFinalZoneSizing, and more for this air distribution unit
}; // AirTerminalUnit

} // EnergyPlus
Expand Down
66 changes: 60 additions & 6 deletions src/EnergyPlus/DataSizing.cc
Original file line number Diff line number Diff line change
Expand Up @@ -344,12 +344,6 @@ namespace DataSizing {
Array1D< Real64 > DBySys; // Population Diversity by system
Array1D< std::string > PeakPsOccurrenceDateTimeStringBySys; // string describing when Ps peak occurs
Array1D< std::string > PeakPsOccurrenceEnvironmentStringBySys; // string describing Environment when Ps peak occurs
//Array1D< Real64 > PzSumBySysCool; // saved value of TotalPeople which is Pz-sum used in 62.1 tabular report
//Array1D< Real64 > PzSumBySysHeat; // saved value of TotalPeople which is Pz-sum used in 62.1 tabular report
//Array1D< Real64 > PsBySysCool; // saved value of PeakPeople which is Ps used in 62.1 tabular report
//Array1D< Real64 > PsBySysHeat; // saved value of PeakPeople which is Ps used in 62.1 tabular report
//Array1D< Real64 > DBySysCool; // saved value of PopulatonDiversity which is D used in 62.1 tabular report
//Array1D< Real64 > DBySysHeat; // saved value of PopulatonDiversity which is D used in 62.1 tabular report
Array1D< Real64 > VouBySys; // uncorrected system outdoor air requirement, for std 62.1 VRP
Array1D< Real64 > VpsClgBySys; // System primary airflow Vps, for cooling for std 62.1 VRP
Array1D< Real64 > VpsHtgBySys; // system primary airflow Vps, for heating for std 62.1 VRP
Expand Down Expand Up @@ -548,6 +542,66 @@ namespace DataSizing {
SensCoolCapTemp.deallocate();
}

Real64
TermUnitSizingData::applyTermUnitSizingCoolFlow(
Real64 const & coolFlowWithOA, // Cooling flow rate with MinOA limit applied
Real64 const & coolFlowNoOA // Cooling flow rate without MinOA limit applied
)
{
// Apply DesignSpecification:AirTerminal:Sizing to cooling flow (could be vol flow or mass flow)
Real64 coolFlowRatio = 1.0;
if ( this->SpecDesCoolSATRatio > 0.0 ) {
coolFlowRatio = this->SpecDesSensCoolingFrac / this->SpecDesCoolSATRatio;
} else {
coolFlowRatio = this->SpecDesSensCoolingFrac;
}
Real64 adjustedFlow = coolFlowNoOA * coolFlowRatio + ( coolFlowWithOA - coolFlowNoOA ) * this->SpecMinOAFrac;
return adjustedFlow;
}

Real64
TermUnitSizingData::applyTermUnitSizingHeatFlow(
Real64 const & heatFlowWithOA, // Heating flow rate with MinOA limit applied
Real64 const & heatFlowNoOA // Heating flow rate without MinOA limit applied
)
{
// Apply DesignSpecification:AirTerminal:Sizing to heating flow (could be vol flow or mass flow)
Real64 heatFlowRatio = 1.0;
if ( this->SpecDesHeatSATRatio > 0.0 ) {
heatFlowRatio = this->SpecDesSensHeatingFrac / this->SpecDesHeatSATRatio;
} else {
heatFlowRatio = this->SpecDesSensHeatingFrac;
}
Real64 adjustedFlow = heatFlowNoOA * heatFlowRatio + ( heatFlowWithOA - heatFlowNoOA ) * this->SpecMinOAFrac;
return adjustedFlow;
}

void
ZoneSizingData::scaleZoneCooling(
Real64 const ratio // Scaling ratio
)
{
// Apply scaling ratio to TermUnitFinalZoneSizing cooling flow and load
this->DesCoolVolFlow = this->DesCoolVolFlow * ratio;
this->DesCoolMassFlow = this->DesCoolMassFlow * ratio;
this->DesCoolLoad = this->DesCoolLoad * ratio;
this->CoolFlowSeq = this->CoolFlowSeq * ratio;
this->CoolLoadSeq = this->CoolLoadSeq * ratio;
}

void
ZoneSizingData::scaleZoneHeating(
Real64 const ratio // Scaling ratio
)
{
// Apply scaling ratio to TermUnitFinalZoneSizing heating flow and load
this->DesHeatVolFlow = this->DesHeatVolFlow * ratio;
this->DesHeatMassFlow = this->DesHeatMassFlow * ratio;
this->DesHeatLoad = this->DesHeatLoad * ratio;
this->HeatFlowSeq = this->HeatFlowSeq * ratio;
this->HeatLoadSeq = this->HeatLoadSeq * ratio;
}

} // DataSizing

} // EnergyPlus
44 changes: 34 additions & 10 deletions src/EnergyPlus/DataSizing.hh
Original file line number Diff line number Diff line change
Expand Up @@ -405,6 +405,7 @@ namespace DataSizing {
{
// Members
std::string ZoneName; // name of a zone
std::string ADUName; // Terminal Unit Name (air distribution unit or direct air unit) - only assigned for TermUnitFinalZoneSizing
std::string CoolDesDay; // name of a cooling design day
std::string HeatDesDay; // name of a heating design day
int ZnCoolDgnSAMethod; // choice of how to get zone cooling design air temperature;
Expand Down Expand Up @@ -452,10 +453,12 @@ namespace DataSizing {
Real64 DOASHighSetpoint; // Dedicated Outside Air High Setpoint for Design [C]
int ActualZoneNum; // index into the Zone data array (in DataHeatBalance)
Real64 DesHeatMassFlow; // zone design heating air mass flow rate [kg/s]
Real64 DesHeatMassFlowNoOA; // zone design heating air mass flow rate without applying MinOA as a limit [kg/s]
Real64 DesHeatOAFlowFrac; // zone design heating OA air volume fraction [-]
bool EMSOverrideDesHeatMassOn; // true if EMS is acting on this structure
Real64 EMSValueDesHeatMassFlow; // Value EMS directing to use for Design Heating air mass flow [kg/s]
Real64 DesCoolMassFlow; // zone design cooling air mass flow rate [kg/s]
Real64 DesCoolMassFlowNoOA; // zone design cooling air mass flow rate without applying MinOA as a limit [kg/s]
Real64 DesCoolOAFlowFrac; // zone design cooling OA air volume fraction [-]
bool EMSOverrideDesCoolMassOn; // true if EMS is acting on this structure
Real64 EMSValueDesCoolMassFlow; // Value EMS directing to use for Design Cooling air mass flow [kg/s]
Expand All @@ -470,10 +473,12 @@ namespace DataSizing {
Real64 DesHeatDens; // zone design heating air density [kg/m3]
Real64 DesCoolDens; // zone design cooling air density [kg/m3]
Real64 DesHeatVolFlow; // zone design heating air volume flow rate including sizing factor and scaled to match airflow sizing [m3/s]
Real64 DesHeatVolFlowNoOA; // zone design heating air volume flow rate including sizing factor and scaled to match airflow sizing without MinOA limit [m3/s]
Real64 NonAirSysDesHeatVolFlow; // base zone design heating air volume flow rate including sizing factor [m3/s]
bool EMSOverrideDesHeatVolOn; // true if EMS is acting on this structure
Real64 EMSValueDesHeatVolFlow; // Value EMS directing to use for Design Heating air volume flow [m3/s]
Real64 DesCoolVolFlow; // zone design cooling air volume flow rate [m3/s]
Real64 DesCoolVolFlowNoOA; // zone design cooling air volume flow rate without applying MinOA as a limit [m3/s]
Real64 NonAirSysDesCoolVolFlow; // base zone design cooling air volume flow rate including sizing factor [m3/s]
bool EMSOverrideDesCoolVolOn; // true if EMS is acting on this structure
Real64 EMSValueDesCoolVolFlow; // Value EMS directing to use for Design cooling air volume flow [m3/s]
Expand Down Expand Up @@ -526,10 +531,10 @@ namespace DataSizing {
// DesCoolMinAirFlowPerArea
Real64 DesHeatMaxAirFlow2; // design heating maximum air flow rate [m3/s] derived from
// DesHeatMaxAirFlowPerArea
Array1D< Real64 > HeatFlowSeq; // daily sequence of zone heating air mass flow rate
// (zone time step)
Array1D< Real64 > CoolFlowSeq; // daily sequence of zone cooling air mass flow rate
// (zone time step)
Array1D< Real64 > HeatFlowSeq; // daily sequence of zone heating air mass flow rate (zone time step) [kg/s]
Array1D< Real64 > HeatFlowSeqNoOA; // daily sequence of zone heating air mass flow rate (zone time step) without MinOA limit [kg/s]
Array1D< Real64 > CoolFlowSeq; // daily sequence of zone cooling air mass flow rate (zone time step) [kg/s]
Array1D< Real64 > CoolFlowSeqNoOA; // daily sequence of zone cooling air mass flow rate (zone time step) without MinOA limit [kg/s]
Array1D< Real64 > HeatLoadSeq; // daily sequence of zone heating load (zone time step)
Array1D< Real64 > CoolLoadSeq; // daily sequence of zone cooling load (zone time step)
Array1D< Real64 > HeatZoneTempSeq; // daily sequence of zone temperatures (heating, zone time step)
Expand Down Expand Up @@ -616,10 +621,12 @@ namespace DataSizing {
DOASHighSetpoint( 0.0 ),
ActualZoneNum( 0 ),
DesHeatMassFlow( 0.0 ),
DesHeatMassFlowNoOA( 0.0 ),
DesHeatOAFlowFrac( 0.0 ),
EMSOverrideDesHeatMassOn( false ),
EMSValueDesHeatMassFlow( 0.0 ),
DesCoolMassFlow( 0.0 ),
DesCoolMassFlowNoOA( 0.0 ),
DesCoolOAFlowFrac( 0.0 ),
EMSOverrideDesCoolMassOn( false ),
EMSValueDesCoolMassFlow( 0.0 ),
Expand All @@ -634,10 +641,12 @@ namespace DataSizing {
DesHeatDens( 0.0 ),
DesCoolDens( 0.0 ),
DesHeatVolFlow( 0.0 ),
DesHeatVolFlowNoOA( 0.0 ),
NonAirSysDesHeatVolFlow( 0.0 ),
EMSOverrideDesHeatVolOn( false ),
EMSValueDesHeatVolFlow( 0.0 ),
DesCoolVolFlow( 0.0 ),
DesCoolVolFlowNoOA( 0.0 ),
NonAirSysDesCoolVolFlow( 0.0 ),
EMSOverrideDesCoolVolOn( false ),
EMSValueDesCoolVolFlow( 0.0 ),
Expand Down Expand Up @@ -712,12 +721,22 @@ namespace DataSizing {
DOASTotCoolLoad( 0.0 )
{}

void
scaleZoneCooling(
Real64 const ratio // Scaling ratio
);
void
scaleZoneHeating(
Real64 const ratio // Scaling ratio
);

};

struct TermUnitSizingData
{
// Members
int CtrlZoneNum; // Controlled zone number (index to FinalZoneSizing, etc.)
std::string ADUName; // Terminal Unit Name (air distribution unit or direct air unit)
Real64 AirVolFlow; // design air vol flow rate for single duct terminal unit [m3/s]
Real64 MaxHWVolFlow; // design Hot Water vol flow for single duct terminal unit [m3/s]
Real64 MaxSTVolFlow; // design Steam vol flow rate for single duct terminal unit [m3/s]
Expand Down Expand Up @@ -756,6 +775,17 @@ namespace DataSizing {
SpecMinOAFrac ( 1.0 )
{}

Real64
applyTermUnitSizingCoolFlow(
Real64 const & coolFlowWithOA, // Cooling flow rate with MinOA limit applied
Real64 const & coolFlowNoOA // Cooling flow rate without MinOA limit applied
);

Real64
applyTermUnitSizingHeatFlow(
Real64 const & heatFlowWithOA, // Heating flow rate with MinOA limit applied
Real64 const & heatFlowNoOA // Heating flow rate without MinOA limit applied
);
};

struct ZoneEqSizingData // data saved from zone eq component sizing and passed to subcomponents
Expand Down Expand Up @@ -1430,12 +1460,6 @@ namespace DataSizing {
extern Array1D< std::string > PeakPsOccurrenceDateTimeStringBySys; // string describing date and time when Ps peak occurs
extern Array1D< std::string > PeakPsOccurrenceEnvironmentStringBySys; // string describing Environment when Ps peak occurs

//extern Array1D< Real64 > PzSumBySysCool; // saved value of TotalPeople which is Pz-sum used in 62.1 tabular report
//extern Array1D< Real64 > PzSumBySysHeat; // saved value of TotalPeople which is Pz-sum used in 62.1 tabular report
//extern Array1D< Real64 > PsBySysCool; // saved value of PeakPeople which is Ps used in 62.1 tabular report
//extern Array1D< Real64 > PsBySysHeat; // saved value of PeakPeople which is Ps used in 62.1 tabular report
//extern Array1D< Real64 > DBySysCool; // saved value of PopulatonDiversity which is D used in 62.1 tabular report
//extern Array1D< Real64 > DBySysHeat; // saved value of PopulatonDiversity which is D used in 62.1 tabular report
extern Array1D< Real64 > VouBySys; // uncorrected system outdoor air requirement, for std 62.1 VRP

extern Array1D< Real64 > VpsClgBySys; // System primary airflow Vps, for cooling for std 62.1 VRP
Expand Down
3 changes: 2 additions & 1 deletion src/EnergyPlus/DirectAirManager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -343,10 +343,11 @@ namespace DirectAirManager {
DirectAir( DirectAirNum ).TermUnitSizingNum = thisZoneEqConfig.AirDistUnitCool( SupAirIn ).TermUnitSizingIndex;
DirectAir( DirectAirNum ).ZoneEqNum = CtrlZone;
DirectAir( DirectAirNum ).CtrlZoneInNodeIndex = SupAirIn;
{ auto & thisTermUnitSizingData( DataSizing::TermUnitSizing( DirectAir( DirectAirNum ).TermUnitSizingNum ) );
thisTermUnitSizingData.ADUName = DirectAir( DirectAirNum ).EquipID;
// Fill TermUnitSizing with specs from DesignSpecification:AirTerminal:Sizing if there is one attached to this terminal unit
if ( DirectAir( DirectAirNum ).AirTerminalSizingSpecIndex > 0 ) {
{ auto const & thisAirTermSizingSpec( DataSizing::AirTerminalSizingSpec( DirectAir( DirectAirNum ).AirTerminalSizingSpecIndex ) );
{ auto & thisTermUnitSizingData( DataSizing::TermUnitSizing( thisZoneEqConfig.AirDistUnitCool( SupAirIn ).TermUnitSizingIndex ) );
thisTermUnitSizingData.SpecDesCoolSATRatio = thisAirTermSizingSpec.DesCoolSATRatio;
thisTermUnitSizingData.SpecDesHeatSATRatio = thisAirTermSizingSpec.DesHeatSATRatio;
thisTermUnitSizingData.SpecDesSensCoolingFrac = thisAirTermSizingSpec.DesSensCoolingFrac;
Expand Down
Loading

0 comments on commit 8074325

Please sign in to comment.