Skip to content

Commit

Permalink
Merge pull request #10673 from NREL/10663_WindowAC_FanSizing
Browse files Browse the repository at this point in the history
Fix #10663 - Fan runtime fraction < 1 when flow rate scaling using DesignSpecification:ZoneHVAC:Sizing
  • Loading branch information
Myoldmopar authored Feb 10, 2025
2 parents a339be9 + ee02986 commit 3dc4673
Show file tree
Hide file tree
Showing 2 changed files with 595 additions and 78 deletions.
152 changes: 79 additions & 73 deletions src/EnergyPlus/WindowAC.cc
Original file line number Diff line number Diff line change
Expand Up @@ -870,10 +870,20 @@ namespace WindowAC {
// SUBROUTINE PARAMETER DEFINITIONS:
static constexpr std::string_view RoutineName("SizeWindowAC: "); // include trailing blank space

Real64 MaxAirVolFlowDes = 0.0;
Real64 MaxAirVolFlowUser = 0.0;
Real64 OutAirVolFlowDes = 0.0;
Real64 OutAirVolFlowUser = 0.0;
// SUBROUTINE LOCAL VARIABLE DECLARATIONS:
auto &windowAC = state.dataWindowAC->WindAC(WindACNum);

Real64 MaxAirVolFlowDes = 0.0; // Autosized maximum air flow for reporting
Real64 MaxAirVolFlowUser = 0.0; // Hardsized maximum air flow for reporting
Real64 OutAirVolFlowDes = 0.0; // Autosized outdoor air flow for reporting
Real64 OutAirVolFlowUser = 0.0; // Hardsized outdoor ari flow for reporting
bool IsAutoSize = false; // Indicator to autosize
std::string const CompType = "ZoneHVAC:WindowAirConditioner"; // component name
std::string const CompName = windowAC.Name; // component type
Real64 TempSize = AutoSize; // autosized value of coil input field
int FieldNum = 2; // IDD numeric field number where input field description is found
bool PrintFlag = false; // TRUE when sizing information is reported in the eio file

state.dataSize->DataFracOfAutosizedCoolingAirflow = 1.0;
state.dataSize->DataFracOfAutosizedHeatingAirflow = 1.0;
state.dataSize->DataFracOfAutosizedCoolingCapacity = 1.0;
Expand All @@ -882,145 +892,141 @@ namespace WindowAC {
state.dataSize->ZoneHeatingOnlyFan = false;
state.dataSize->ZoneCoolingOnlyFan = true;
state.dataSize->DataScalableCapSizingON = false;
std::string const CompType = "ZoneHVAC:WindowAirConditioner";
std::string const CompName = state.dataWindowAC->WindAC(WindACNum).Name;
state.dataSize->DataZoneNumber = state.dataWindowAC->WindAC(WindACNum).ZonePtr;
state.dataSize->DataFanType = state.dataWindowAC->WindAC(WindACNum).fanType;
state.dataSize->DataFanIndex = state.dataWindowAC->WindAC(WindACNum).FanIndex;
state.dataSize->DataFanPlacement = state.dataWindowAC->WindAC(WindACNum).fanPlace;
state.dataSize->DataZoneNumber = windowAC.ZonePtr;
state.dataSize->DataFanType = windowAC.fanType;
state.dataSize->DataFanIndex = windowAC.FanIndex;
state.dataSize->DataFanPlacement = windowAC.fanPlace;

if (state.dataSize->CurZoneEqNum > 0) {
bool PrintFlag; // TRUE when sizing information is reported in the eio file
std::string SizingString; // input field sizing description (e.g., Nominal Capacity)
auto &ZoneEqSizing = state.dataSize->ZoneEqSizing(state.dataSize->CurZoneEqNum);
Real64 TempSize; // autosized value of coil input field
auto &zoneEqSizing = state.dataSize->ZoneEqSizing(state.dataSize->CurZoneEqNum);

if (state.dataWindowAC->WindAC(WindACNum).HVACSizingIndex > 0) {
int zoneHVACIndex = state.dataWindowAC->WindAC(WindACNum).HVACSizingIndex;
if (windowAC.HVACSizingIndex > 0) {
// N1 , \field Maximum Supply Air Flow Rate
auto const &zoneHVACSizing = state.dataSize->ZoneHVACSizing(windowAC.HVACSizingIndex);

int SizingMethod = HVAC::CoolingAirflowSizing;
PrintFlag = true;
int SAFMethod = state.dataSize->ZoneHVACSizing(zoneHVACIndex).CoolingSAFMethod;
ZoneEqSizing.SizingMethod(SizingMethod) = SAFMethod;
int const SAFMethod = zoneHVACSizing.CoolingSAFMethod;
zoneEqSizing.SizingMethod(SizingMethod) = SAFMethod;
if (SAFMethod == None || SAFMethod == SupplyAirFlowRate || SAFMethod == FlowPerFloorArea ||
SAFMethod == FractionOfAutosizedCoolingAirflow) {
if (SAFMethod == SupplyAirFlowRate) {
if (state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow > 0.0) {
ZoneEqSizing.AirVolFlow = state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow;
ZoneEqSizing.SystemAirFlow = true;
if (zoneHVACSizing.MaxCoolAirVolFlow > 0.0) {
zoneEqSizing.AirVolFlow = zoneHVACSizing.MaxCoolAirVolFlow;
zoneEqSizing.SystemAirFlow = true;
}
TempSize = state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow;
TempSize = zoneHVACSizing.MaxCoolAirVolFlow;
} else if (SAFMethod == FlowPerFloorArea) {
ZoneEqSizing.SystemAirFlow = true;
ZoneEqSizing.AirVolFlow = state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow *
state.dataHeatBal->Zone(state.dataSize->DataZoneNumber).FloorArea;
TempSize = ZoneEqSizing.AirVolFlow;
zoneEqSizing.SystemAirFlow = true;
zoneEqSizing.AirVolFlow =
zoneHVACSizing.MaxCoolAirVolFlow * state.dataHeatBal->Zone(state.dataSize->DataZoneNumber).FloorArea;
TempSize = zoneEqSizing.AirVolFlow;
state.dataSize->DataScalableSizingON = true;
} else if (SAFMethod == FractionOfAutosizedCoolingAirflow) {
state.dataSize->DataFracOfAutosizedCoolingAirflow = state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow;
state.dataSize->DataFracOfAutosizedCoolingAirflow = zoneHVACSizing.MaxCoolAirVolFlow;
TempSize = AutoSize;
state.dataSize->DataScalableSizingON = true;
} else {
TempSize = state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow;
TempSize = zoneHVACSizing.MaxCoolAirVolFlow;
}
bool errorsFound = false;
CoolingAirFlowSizer sizingCoolingAirFlow;
std::string stringOverride = "Maximum Supply Air Flow Rate [m3/s]";
if (state.dataGlobal->isEpJSON) stringOverride = "maximum_supply_air_flow_rate [m3/s]";
if (state.dataGlobal->isEpJSON) {
stringOverride = "maximum_supply_air_flow_rate [m3/s]";
}
sizingCoolingAirFlow.overrideSizingString(stringOverride);
// sizingCoolingAirFlow.setHVACSizingIndexData(FanCoil(FanCoilNum).HVACSizingIndex);
// sizingCoolingAirFlow.setHVACSizingIndexData(windowAC.HVACSizingIndex);
sizingCoolingAirFlow.initializeWithinEP(state, CompType, CompName, PrintFlag, RoutineName);
state.dataWindowAC->WindAC(WindACNum).MaxAirVolFlow = sizingCoolingAirFlow.size(state, TempSize, errorsFound);
windowAC.MaxAirVolFlow = sizingCoolingAirFlow.size(state, TempSize, errorsFound);

} else if (SAFMethod == FlowPerCoolingCapacity) {
SizingMethod = HVAC::CoolingCapacitySizing;
TempSize = AutoSize;
PrintFlag = false;
state.dataSize->DataScalableSizingON = true;
state.dataSize->DataFlowUsedForSizing = state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).DesCoolVolFlow;
if (state.dataSize->ZoneHVACSizing(zoneHVACIndex).CoolingCapMethod == FractionOfAutosizedCoolingCapacity) {
state.dataSize->DataFracOfAutosizedCoolingCapacity = state.dataSize->ZoneHVACSizing(zoneHVACIndex).ScaledCoolingCapacity;
if (zoneHVACSizing.CoolingCapMethod == FractionOfAutosizedCoolingCapacity) {
state.dataSize->DataFracOfAutosizedCoolingCapacity = zoneHVACSizing.ScaledCoolingCapacity;
}
bool errorsFound = false;
CoolingCapacitySizer sizerCoolingCapacity;
sizerCoolingCapacity.overrideSizingString(SizingString);
sizerCoolingCapacity.overrideSizingString("");
sizerCoolingCapacity.initializeWithinEP(state, CompType, CompName, PrintFlag, RoutineName);
state.dataSize->DataCapacityUsedForSizing = sizerCoolingCapacity.size(state, TempSize, errorsFound);
state.dataSize->DataFlowPerCoolingCapacity = state.dataSize->ZoneHVACSizing(zoneHVACIndex).MaxCoolAirVolFlow;
state.dataSize->DataFlowPerCoolingCapacity = zoneHVACSizing.MaxCoolAirVolFlow;
PrintFlag = true;
TempSize = AutoSize;
errorsFound = false;
CoolingAirFlowSizer sizingCoolingAirFlow;
std::string stringOverride = "Maximum Supply Air Flow Rate [m3/s]";
if (state.dataGlobal->isEpJSON) stringOverride = "maximum_supply_air_flow_rate [m3/s]";
if (state.dataGlobal->isEpJSON) {
stringOverride = "maximum_supply_air_flow_rate [m3/s]";
}
sizingCoolingAirFlow.overrideSizingString(stringOverride);
// sizingCoolingAirFlow.setHVACSizingIndexData(FanCoil(FanCoilNum).HVACSizingIndex);
// sizingCoolingAirFlow.setHVACSizingIndexData(windowAC.HVACSizingIndex);
sizingCoolingAirFlow.initializeWithinEP(state, CompType, CompName, PrintFlag, RoutineName);
state.dataWindowAC->WindAC(WindACNum).MaxAirVolFlow = sizingCoolingAirFlow.size(state, TempSize, errorsFound);
windowAC.MaxAirVolFlow = sizingCoolingAirFlow.size(state, TempSize, errorsFound);
}
// DataScalableSizingON = false;

// initialize capacity sizing variables: cooling
int CapSizingMethod = state.dataSize->ZoneHVACSizing(zoneHVACIndex).CoolingCapMethod;
ZoneEqSizing.SizingMethod(SizingMethod) = CapSizingMethod;
// capacity sizing methods (HeatingDesignCapacity, CapacityPerFloorArea, FractionOfAutosizedCoolingCapacity, and
// FractionOfAutosizedHeatingCapacity )
int const CapSizingMethod = zoneHVACSizing.CoolingCapMethod;
zoneEqSizing.SizingMethod(SizingMethod) = CapSizingMethod;
if (CapSizingMethod == CoolingDesignCapacity || CapSizingMethod == CapacityPerFloorArea ||
CapSizingMethod == FractionOfAutosizedCoolingCapacity) {
if (CapSizingMethod == HeatingDesignCapacity) {
if (state.dataSize->ZoneHVACSizing(zoneHVACIndex).ScaledCoolingCapacity > 0.0) {
ZoneEqSizing.CoolingCapacity = true;
ZoneEqSizing.DesCoolingLoad = state.dataSize->ZoneHVACSizing(zoneHVACIndex).ScaledCoolingCapacity;
if (CapSizingMethod == CoolingDesignCapacity) {
if (zoneHVACSizing.ScaledCoolingCapacity > 0.0) {
zoneEqSizing.CoolingCapacity = true;
zoneEqSizing.DesCoolingLoad = zoneHVACSizing.ScaledCoolingCapacity;
}
} else if (CapSizingMethod == CapacityPerFloorArea) {
ZoneEqSizing.CoolingCapacity = true;
ZoneEqSizing.DesCoolingLoad = state.dataSize->ZoneHVACSizing(zoneHVACIndex).ScaledCoolingCapacity *
state.dataHeatBal->Zone(state.dataSize->DataZoneNumber).FloorArea;
zoneEqSizing.CoolingCapacity = true;
zoneEqSizing.DesCoolingLoad =
zoneHVACSizing.ScaledCoolingCapacity * state.dataHeatBal->Zone(state.dataSize->DataZoneNumber).FloorArea;
state.dataSize->DataScalableCapSizingON = true;
} else if (CapSizingMethod == FractionOfAutosizedCoolingCapacity) {
state.dataSize->DataFracOfAutosizedCoolingCapacity = state.dataSize->ZoneHVACSizing(zoneHVACIndex).ScaledCoolingCapacity;
state.dataSize->DataFracOfAutosizedCoolingCapacity = zoneHVACSizing.ScaledCoolingCapacity;
state.dataSize->DataScalableCapSizingON = true;
}
}
} else {
// no scalble sizing method has been specified. Sizing proceeds using the method
// no scalable sizing method has been specified. Sizing proceeds using the method
// specified in the zoneHVAC object
// N1 , \field Maximum Supply Air Flow Rate
int FieldNum = 1;
PrintFlag = true;
SizingString = state.dataWindowAC->WindACNumericFields(WindACNum).FieldNames(FieldNum) + " [m3/s]";
TempSize = state.dataWindowAC->WindAC(WindACNum).MaxAirVolFlow;
std::string stringOverride = state.dataWindowAC->WindACNumericFields(WindACNum).FieldNames(FieldNum) + " [m3/s]";
TempSize = windowAC.MaxAirVolFlow;
bool errorsFound = false;
SystemAirFlowSizer sizerSystemAirFlow;
sizerSystemAirFlow.overrideSizingString(SizingString);
// sizerSystemAirFlow.setHVACSizingIndexData(FanCoil(FanCoilNum).HVACSizingIndex);
sizerSystemAirFlow.overrideSizingString(stringOverride);
// sizerSystemAirFlow.setHVACSizingIndexData(windowAC.HVACSizingIndex);
sizerSystemAirFlow.initializeWithinEP(state, CompType, CompName, PrintFlag, RoutineName);
state.dataWindowAC->WindAC(WindACNum).MaxAirVolFlow = sizerSystemAirFlow.size(state, TempSize, errorsFound);
windowAC.MaxAirVolFlow = sizerSystemAirFlow.size(state, TempSize, errorsFound);
}
}

if (state.dataWindowAC->WindAC(WindACNum).OutAirVolFlow == AutoSize) {
if (windowAC.OutAirVolFlow == AutoSize) {

if (state.dataSize->CurZoneEqNum > 0) {

CheckZoneSizing(state,
state.dataWindowAC->cWindowAC_UnitTypes(state.dataWindowAC->WindAC(WindACNum).UnitType),
state.dataWindowAC->WindAC(WindACNum).Name);
state.dataWindowAC->WindAC(WindACNum).OutAirVolFlow =
min(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).MinOA, state.dataWindowAC->WindAC(WindACNum).MaxAirVolFlow);
if (state.dataWindowAC->WindAC(WindACNum).OutAirVolFlow < SmallAirVolFlow) {
state.dataWindowAC->WindAC(WindACNum).OutAirVolFlow = 0.0;
CheckZoneSizing(state, state.dataWindowAC->cWindowAC_UnitTypes(windowAC.UnitType), windowAC.Name);
windowAC.OutAirVolFlow = min(state.dataSize->FinalZoneSizing(state.dataSize->CurZoneEqNum).MinOA, windowAC.MaxAirVolFlow);
if (windowAC.OutAirVolFlow < SmallAirVolFlow) {
windowAC.OutAirVolFlow = 0.0;
}
BaseSizer::reportSizerOutput(state,
state.dataWindowAC->cWindowAC_UnitTypes(state.dataWindowAC->WindAC(WindACNum).UnitType),
state.dataWindowAC->WindAC(WindACNum).Name,
state.dataWindowAC->cWindowAC_UnitTypes(windowAC.UnitType),
windowAC.Name,
"Maximum Outdoor Air Flow Rate [m3/s]",
state.dataWindowAC->WindAC(WindACNum).OutAirVolFlow);
windowAC.OutAirVolFlow);
}
}

if (state.dataSize->CurZoneEqNum > 0) {
auto &ZoneEqSizing = state.dataSize->ZoneEqSizing(state.dataSize->CurZoneEqNum);
ZoneEqSizing.OAVolFlow = state.dataWindowAC->WindAC(WindACNum).OutAirVolFlow;
ZoneEqSizing.AirVolFlow = state.dataWindowAC->WindAC(WindACNum).MaxAirVolFlow;
zoneEqSizing.OAVolFlow = windowAC.OutAirVolFlow;
zoneEqSizing.AirVolFlow = windowAC.MaxAirVolFlow;
// Make the Fan be sized by this
zoneEqSizing.CoolingAirFlow = true;
zoneEqSizing.CoolingAirVolFlow = windowAC.MaxAirVolFlow;
}

state.dataSize->DataScalableCapSizingON = false;
Expand Down
Loading

0 comments on commit 3dc4673

Please sign in to comment.