Skip to content

Commit

Permalink
Merge c2616e6 into a2dd99e
Browse files Browse the repository at this point in the history
  • Loading branch information
mjwitte authored Sep 6, 2024
2 parents a2dd99e + c2616e6 commit e979e37
Show file tree
Hide file tree
Showing 19 changed files with 3,986 additions and 237 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,9 @@ \subsubsection{SpaceHVAC:ZoneEquipmentMixer Adjustments}\label{space-hvac-zoneeq

After all of the zone HVAC equipment is simulated, the flow rates on the space outlet nodes are set to the space fraction times the zone equipment inlet node flow rate.

\subsubsection{SpaceHVAC:ZoneReturnMixer Adjustments}\label{space-hvac-zoneretmixer-adjustments}
When a SpaceHVAC:ZoneReturnMixer is used, after zone-level return node flow rates are set, the space return node flow rates are set. The space flow rates are set based on the same method used for zones (sum of inlet flows minus sum of exhaust flows). Then the space flow rates are adjusted proportionately so the sum is equal to the previously determined zone-level return node flow rate. Then the conditions on the zone return nodes are set to the combined space outlet node conditions weighted by the space return node flow rates.

\subsection{References}\label{references-043}

Ceylan, H. T., and G. E. Myers. 1980. Long-time Solutions to Heat Conduction Transients with Time-Dependent Inputs. ASME Journal of Heat Transfer, Volume 102, No. 1, pp.~115-120.
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -243,6 +243,12 @@ \subsubsection{EndZoneSizingCalc}\label{endzonesizingcalc}

If \emph{heating design air flow method} is \emph{flow/zone}, then \emph{heating design air flow rate} will be used for the design max heating air flow rate. If \emph{heating design air flow method} is \emph{design day}, then the design day calculation will set the design max heating air flow rate. If \emph{heating design air flow method} is \emph{design day with limit}, then the maximum from \emph{heating max flow per area}, \emph{heating max flow} and \emph{heating max flow fraction} will set an upper limit on the design max heating air flow rate. The design max heating air flow rate must always be \textgreater{} = the ventilation requirement. In each case, the outside airflow will be modified based on zone ventilation effectiveness specified in the zone sizing object.

\subsection{Space Sizing}\label{space-sizing}
When ZoneAirHeatBalanceAlgorithm ``Do Space Heat Balance for Sizing'' is ``Yes'', the same sizing calculations described above will be performed for each space that is part of a controlled zone, using the same thermostat setpoints as the parent zone. The space sizing results will be reported the same as zone sizing results (eio, table, and spsz outputs).

\subsection{NonCoincident Zone Sizing}\label{noncoincident-zone-sizing}
Sizing:Zone has an option for ``Type of Space Sum to Use'', ``Coincident'' or ``NonCoincident''. Coincident zone sizing (the default) is always calculated first, with all spaces in the zone lumped together. For ``NonCoincident'' zone sizing, if the zone contains more than one space, the zone sizing results will be overwritten using the sums and averages of the space sizing results. If all spaces for a given load type (heating or cooling) peak on the same design day, then that day will be reported as the zone peak day, otherwise the zone design day will be "N/A". The zone peak time will be determined by scanning the peak zone sequential loads which are calculated by summing the space peak day sequential loads.

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

\subsection{Air Terminal Unit Sizing}\label{air-terminal-unit-sizing}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -487,7 +487,7 @@ \subsubsection{Inputs}\label{inputs-1-052-seqsplitter}
\paragraph{Field: Space Fraction Method}\label{field-seqsplitter-space-sizing-basis}

The method used to autosize the space fractions. The choices are: DesignCoolingLoad, DesignHeatingLoad, FloorArea, Volume, and PerimeterLength. The default is DesignCoolingLoad.
For example, if there are 3 Spaces listed below, the Space Output Fractions will be sized to Space1DesignCoolingLoad / Sum(Space1thru3DesignCoolingLoad).
For example, if there are 3 Spaces listed below, the Space 1 Output Fraction will be sized to Space1DesignCoolingLoad / Sum(Space1thru3DesignCoolingLoad). PerimeterLength sums the width of exterior walls in each space.

\paragraph{Field: Space \textless{}x\textgreater{} Name}\label{field-seqsplitter-space-name}

Expand Down Expand Up @@ -547,7 +547,7 @@ \subsubsection{Inputs}\label{inputs-1-052-seqmixer}
\paragraph{Field: Space Fraction Method}\label{field-seqmixer-space-sizing-basis}

The method used to autosize the space fractions. The choices are: DesignCoolingLoad, DesignHeatingLoad, FloorArea, Volume, and PerimeterLength. The default is DesignCoolingLoad.
For example, if there are 3 Spaces listed below, the Space Output Fractions will be sized to Space1DesignCoolingLoad / Sum(Space1thru3DesignCoolingLoad).
For example, if there are 3 Spaces listed below, the Space 1 Output Fraction will be sized to Space1DesignCoolingLoad / Sum(Space1thru3DesignCoolingLoad). PerimeterLength sums the width of exterior walls in each space.

\paragraph{Field: Space \textless{}x\textgreater{} Name}\label{field-seqmixer-space-name}

Expand Down
4 changes: 3 additions & 1 deletion src/EnergyPlus/ConvectionCoefficients.cc
Original file line number Diff line number Diff line change
Expand Up @@ -4054,7 +4054,9 @@ void DynamicIntConvSurfaceClassification(EnergyPlusData &state, int const SurfNu
}
} break;
case DataZoneEquipment::ZoneEquipType::VentilatedSlab:
case DataZoneEquipment::ZoneEquipType::LowTemperatureRadiant: {
case DataZoneEquipment::ZoneEquipType::LowTemperatureRadiantConstFlow:
case DataZoneEquipment::ZoneEquipType::LowTemperatureRadiantVarFlow:
case DataZoneEquipment::ZoneEquipType::LowTemperatureRadiantElectric: {
if (zoneEquipConfig.InFloorActiveElement) {
for (int spaceNumLoop : zone.spaceIndexes) {
auto const &thisSpace = state.dataHeatBal->space(spaceNumLoop);
Expand Down
3 changes: 1 addition & 2 deletions src/EnergyPlus/DataHeatBalance.hh
Original file line number Diff line number Diff line change
Expand Up @@ -458,6 +458,7 @@ namespace DataHeatBalance {
Real64 Volume = Constant::AutoCalculate; // Volume entered by user [m3] or calculated
Real64 ExtGrossWallArea = 0.0; // Exterior Wall Area for Zone (Gross)
Real64 ExteriorTotalSurfArea = 0.0; // Total surface area of all exterior surfaces for Zone
Real64 extPerimeter = 0.0; // Total exposed perimeter (sum of width of exterior walls)
int SystemZoneNodeNumber = 0; // This is the zone or space node number for the system for a controlled zone
Real64 FloorArea = 0.0; // Floor area used for this space
Real64 TotOccupants = 0.0; // total design occupancy (sum of NumberOfPeople for the space People objects, not multiplied)
Expand All @@ -472,7 +473,6 @@ namespace DataHeatBalance {
int spaceTypeNum = 0; // Points to spaceType for this space
EPVector<std::string> tags; // Optional tags for reporting
EPVector<int> surfaces; // Pointers to surfaces in this space
Real64 calcFloorArea = 0.0; // Calculated floor area used for this space
bool hasFloor = false; // Has "Floor" surface
Real64 fracZoneFloorArea = 0.0; // fraction of total floor area for all spaces in zone
Real64 fracZoneVolume = 0.0; // fraction of total volume for all spaces in zone
Expand Down Expand Up @@ -586,7 +586,6 @@ namespace DataHeatBalance {
// 2=Plenum Zone, 11=Solar Wall, 12=Roof Pond
Real64 UserEnteredFloorArea = Constant::AutoCalculate; // User input floor area for this zone
// Calculated after input
Real64 CalcFloorArea = 0.0; // Calculated floor area excluding air boundary surfaces
Real64 geometricFloorArea = 0.0; // Calculated floor area including air boundary surfaces
Real64 CeilingArea = 0.0; // Ceiling area excluding air boundary surfaces
Real64 geometricCeilingArea = 0.0; // Ceiling area area including air boundary surfaces
Expand Down
14 changes: 5 additions & 9 deletions src/EnergyPlus/DataSizing.cc
Original file line number Diff line number Diff line change
Expand Up @@ -762,16 +762,12 @@ Real64 OARequirementsData::calcOAFlowRate(EnergyPlusData &state,
Real64 curNumOccupants = 0.0;
Real64 maxOccupants = 0.0;
if (spaceNum > 0) {
floorArea = state.dataHeatBal->space(spaceNum).FloorArea;
// TODO MJW: For now just proportion space volume by floor area
if (thisZone.FloorArea > 0.0) {
volume = thisZone.Volume * state.dataHeatBal->space(spaceNum).FloorArea / thisZone.FloorArea;
} else {
volume = 0.0;
}
nomTotOccupants = state.dataHeatBal->space(spaceNum).TotOccupants;
auto &thisSpace = state.dataHeatBal->space(spaceNum);
floorArea = thisSpace.FloorArea;
volume = thisSpace.Volume;
nomTotOccupants = thisSpace.TotOccupants;
curNumOccupants = state.dataHeatBal->spaceIntGain(spaceNum).NOFOCC;
maxOccupants = state.dataHeatBal->space(spaceNum).maxOccupants;
maxOccupants = thisSpace.maxOccupants;
} else {
floorArea = thisZone.FloorArea;
volume = thisZone.Volume;
Expand Down
105 changes: 45 additions & 60 deletions src/EnergyPlus/DataZoneEquipment.cc
Original file line number Diff line number Diff line change
Expand Up @@ -126,10 +126,13 @@ constexpr std::array<std::string_view, static_cast<int>(ZoneEquipType::Num)> zon
"ZONEHVAC:BASEBOARD:RADIANTCONVECTIVE:WATER", // BaseboardWater
"ZONEHVAC:BASEBOARD:RADIANTCONVECTIVE:ELECTRIC", // BaseboardElectric
"ZONEHVAC:HIGHTEMPERATURERADIANT", // HighTempRadiant
"ZONEHVAC:LOWTEMPERATURERADIANT:VARIABLEFLOW", // LowTempRadiant
"ZONEHVAC:LOWTEMPERATURERADIANT:CONSTANTFLOW", // LowTempRadiantConstFlow
"ZONEHVAC:LOWTEMPERATURERADIANT:VARIABLEFLOW", // LowTempRadiantVarFlow
"ZONEHVAC:LOWTEMPERATURERADIANT:ELECTRIC", // LowTempRadiantElectric
"FAN:ZONEEXHAUST", // ExhaustFan
"HEATEXCHANGER:AIRTOAIR:FLATPLATE", // HeatExchanger
"WATERHEATER:HEATPUMP:PUMPEDCONDENSER", // HeatPumpWaterHeater
"WATERHEATER:HEATPUMP:PUMPEDCONDENSER", // HeatPumpWaterHeaterPumpedCondenser
"WATERHEATER:HEATPUMP:WRAPPEDCONDENSER", // HeatPumpWaterHeaterWrappedCondenser
"ZONEHVAC:DEHUMIDIFIER:DX", // DXDehumidifier
"ZONEHVAC:REFRIGERATIONCHILLERSET", // RefrigerationAirChillerSet
"ZONEHVAC:FORCEDAIR:USERDEFINED", // UserDefinedVACForcedAir
Expand Down Expand Up @@ -984,16 +987,9 @@ void processZoneEquipmentInput(EnergyPlusData &state,
}

if (thisZoneEquipList.EquipType(ZoneEquipTypeNum) == ZoneEquipType::Invalid) {
if (thisZoneEquipList.EquipTypeName(ZoneEquipTypeNum) == "ZONEHVAC:LOWTEMPERATURERADIANT:CONSTANTFLOW" ||
thisZoneEquipList.EquipTypeName(ZoneEquipTypeNum) == "ZONEHVAC:LOWTEMPERATURERADIANT:ELECTRIC") {
thisZoneEquipList.EquipType(ZoneEquipTypeNum) = ZoneEquipType::LowTemperatureRadiant;
} else if (thisZoneEquipList.EquipTypeName(ZoneEquipTypeNum) == "WATERHEATER:HEATPUMP:WRAPPEDCONDENSER") {
thisZoneEquipList.EquipType(ZoneEquipTypeNum) = DataZoneEquipment::ZoneEquipType::HeatPumpWaterHeater;
} else {
ShowSevereError(state, format("{}{} = {}", RoutineName, CurrentModuleObject, thisZoneEquipList.Name));
ShowContinueError(state, format("..Invalid Equipment Type = {}", thisZoneEquipList.EquipType(ZoneEquipTypeNum)));
state.dataZoneEquip->GetZoneEquipmentDataErrorsFound = true;
}
ShowSevereError(state, format("{}{} = {}", RoutineName, CurrentModuleObject, thisZoneEquipList.Name));
ShowContinueError(state, format("..Invalid Equipment Type = {}", thisZoneEquipList.EquipType(ZoneEquipTypeNum)));
state.dataZoneEquip->GetZoneEquipmentDataErrorsFound = true;
}
}
} // End parsing all extensible Zone Equipment info
Expand Down Expand Up @@ -1216,17 +1212,10 @@ void processZoneEquipSplitterInput(EnergyPlusData &state,
auto &ip = state.dataInputProcessing->inputProcessor;
std::string const zeqTypeName = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "zone_equipment_object_type");
thisZeqSplitter.zoneEquipType = DataZoneEquipment::ZoneEquipType(getEnumValue(zoneEquipTypeNamesUC, zeqTypeName));
// SpaceHVAC TODO: Copied this block from processZoneEquipmentInput section for ZoneHVAC:EquipmentList - seems this could be simplified
if (thisZeqSplitter.zoneEquipType == ZoneEquipType::Invalid) {
if (zeqTypeName == "ZONEHVAC:LOWTEMPERATURERADIANT:CONSTANTFLOW" || zeqTypeName == "ZONEHVAC:LOWTEMPERATURERADIANT:ELECTRIC") {
thisZeqSplitter.zoneEquipType = ZoneEquipType::LowTemperatureRadiant;
} else if (zeqTypeName == "WATERHEATER:HEATPUMP:WRAPPEDCONDENSER") {
thisZeqSplitter.zoneEquipType = DataZoneEquipment::ZoneEquipType::HeatPumpWaterHeater;
} else {
ShowSevereError(state, format("{}{} = {}", RoutineName, zeqSplitterModuleObject, thisZeqSplitter.Name));
ShowContinueError(state, format("..Invalid Equipment Type = {}", zeqTypeName));
state.dataZoneEquip->GetZoneEquipmentDataErrorsFound = true;
}
ShowSevereError(state, format("{}{} = {}", RoutineName, zeqSplitterModuleObject, thisZeqSplitter.Name));
ShowContinueError(state, format("..Invalid Equipment Type = {}", zeqTypeName));
state.dataZoneEquip->GetZoneEquipmentDataErrorsFound = true;
}

thisZeqSplitter.zoneEquipName = ip->getAlphaFieldValue(objectFields, objectSchemaProps, "zone_equipment_name");
Expand Down Expand Up @@ -1867,11 +1856,9 @@ void ZoneEquipmentSplitterMixer::size(EnergyPlusData &state)
}
break;
case DataZoneEquipment::SpaceEquipSizingBasis::PerimeterLength:
ShowFatalError(state,
format("ZoneEquipmentSplitterMixer::size: Space Fraction Method={} not supported for {}={}",
DataZoneEquipment::spaceEquipSizingBasisNamesUC[(int)this->spaceSizingBasis],
BranchNodeConnections::ConnectionObjectTypeNames[(int)this->spaceEquipType],
this->Name));
for (auto &thisSpace : this->spaces) {
spacesTotal += state.dataHeatBal->space(thisSpace.spaceIndex).extPerimeter;
}
break;
default:
// If method is not set, then return
Expand All @@ -1890,43 +1877,41 @@ void ZoneEquipmentSplitterMixer::size(EnergyPlusData &state)
for (auto &thisSpace : this->spaces) {
thisSpace.fraction = spaceFrac;
}
return;
} else {
// Calculate space fractions
for (auto &thisSpace : this->spaces) {
if (thisSpace.fraction == DataSizing::AutoSize) {
switch (this->spaceSizingBasis) {
case DataZoneEquipment::SpaceEquipSizingBasis::DesignCoolingLoad:
thisSpace.fraction = state.dataSize->FinalSpaceSizing(thisSpace.spaceIndex).DesCoolLoad / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::DesignHeatingLoad:
thisSpace.fraction = state.dataSize->FinalSpaceSizing(thisSpace.spaceIndex).DesHeatLoad / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::FloorArea:
thisSpace.fraction = state.dataHeatBal->space(thisSpace.spaceIndex).FloorArea / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::Volume:
thisSpace.fraction = state.dataHeatBal->space(thisSpace.spaceIndex).Volume / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::PerimeterLength:
thisSpace.fraction = state.dataHeatBal->space(thisSpace.spaceIndex).extPerimeter / spacesTotal;
break;
default:
break;
}
}
}
}

// Calculate space fractions
// Report sizing results
int spaceCounter = 0;
for (auto &thisSpace : this->spaces) {
++spaceCounter;
if (thisSpace.fraction == DataSizing::AutoSize) {
switch (this->spaceSizingBasis) {
case DataZoneEquipment::SpaceEquipSizingBasis::DesignCoolingLoad:
thisSpace.fraction = state.dataSize->FinalSpaceSizing(thisSpace.spaceIndex).DesCoolLoad / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::DesignHeatingLoad:
thisSpace.fraction = state.dataSize->FinalSpaceSizing(thisSpace.spaceIndex).DesHeatLoad / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::FloorArea:
thisSpace.fraction = state.dataHeatBal->space(thisSpace.spaceIndex).FloorArea / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::Volume:
thisSpace.fraction = state.dataHeatBal->space(thisSpace.spaceIndex).Volume / spacesTotal;
break;
case DataZoneEquipment::SpaceEquipSizingBasis::PerimeterLength:
ShowFatalError(state,
format("ZoneEquipmentSplitterMixer::size: Space Fraction Method={} not supported for {}={}",
DataZoneEquipment::spaceEquipSizingBasisNamesUC[(int)this->spaceSizingBasis],
BranchNodeConnections::ConnectionObjectTypeNames[(int)this->spaceEquipType],
this->Name));
break;
default:
break;
}
BaseSizer::reportSizerOutput(state,
BranchNodeConnections::ConnectionObjectTypeNames[(int)this->spaceEquipType],
this->Name,
format("Space {} Fraction", spaceCounter),
thisSpace.fraction);
}
BaseSizer::reportSizerOutput(state,
BranchNodeConnections::ConnectionObjectTypeNames[(int)this->spaceEquipType],
this->Name,
format("Space {} Fraction", spaceCounter),
thisSpace.fraction);
}
}

Expand Down
7 changes: 5 additions & 2 deletions src/EnergyPlus/DataZoneEquipment.hh
Original file line number Diff line number Diff line change
Expand Up @@ -135,10 +135,13 @@ namespace DataZoneEquipment {
BaseboardWater,
BaseboardElectric,
HighTemperatureRadiant,
LowTemperatureRadiant,
LowTemperatureRadiantConstFlow,
LowTemperatureRadiantVarFlow,
LowTemperatureRadiantElectric,
ExhaustFan,
HeatExchanger,
HeatPumpWaterHeater,
HeatPumpWaterHeaterPumpedCondenser,
HeatPumpWaterHeaterWrappedCondenser,
DehumidifierDX,
RefrigerationChillerSet,
UserDefinedHVACForcedAir,
Expand Down
Loading

0 comments on commit e979e37

Please sign in to comment.