Revision history [back]
Short story: if you have clicked on "Use Ideal Air Loads" in the OS App next to the thermal Zone, you will want to request Zone Ventilation Mass Flow Rate [kg/s]
instead, as it uses a ZoneVentilation:DesignFlowRate
to mimic the DSOA, all output variables available for this object are here
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with anHVACTemplate:Zone:IdealLoadsAirSystem
which will get expanded by E+ as aZoneHVAC:IdealLoadsAirSystem
by E+, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
Short story: if you have clicked on "Use Ideal Air Loads" in the OS App next to the thermal Zone, you will want to request Zone Ventilation Mass Flow Rate [kg/s]
instead, as it uses a ZoneVentilation:DesignFlowRate
to mimic the DSOA, all output variables available for this object are here
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with anHVACTemplate:Zone:IdealLoadsAirSystem
whichwitch will get expanded by E+ as aZoneHVAC:IdealLoadsAirSystem
by E+, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
Short story: if you have clicked on "Use Ideal Air Loads" in the OS App next to the thermal Zone, you will want to request Zone Ventilation Mass Flow Rate [kg/s]
instead, as it uses a ZoneVentilation:DesignFlowRate
to mimic the DSOA, all output variables available for this object are here
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with anHVACTemplate:Zone:IdealLoadsAirSystem
witchwith will get expanded by E+ as aZoneHVAC:IdealLoadsAirSystem
by E+, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
Short story: if you have clicked on "Use Ideal Air Loads" in the OS App next to the thermal Zone, you will want to request Zone Ventilation Mass Flow Rate [kg/s]
instead, as it uses a ZoneVentilation:DesignFlowRate
to mimic the DSOA, all output variables available for this object are here
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with anHVACTemplate:Zone:IdealLoadsAirSystem
with will get expanded by E+ as aZoneHVAC:IdealLoadsAirSystem
by E+, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with anHVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as aHVACTemplate:Zone:IdealLoadsAirSystem
ZoneHVAC:IdealLoadsAirSystem, but it won't have theZoneHVAC:IdealLoadsAirSystem
by E+,DesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, soyou can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, andyou can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
ruby
puts "hello world!'
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
ruby
puts "hello world!'
Initial setup
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: puts i # Notice DSOA is empty...
Out[3]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
# Translate to E+
w = ft.translateModel(m)
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Proof in action
Initial setup
Example using an explicit ZoneHVACIdealLoadsAirSystem
In [1]:
# Create an Example model (1 Zone, 4 spaces, 1 spaceType)
model
m = OpenStudio::Model::exampleModel()
# It has one zone, connected to a AirLoopHVAC, we remove it
m.getAirLoopHVACs[0].remove
# Create a DSOA and assign to the only space Type in the model
space_type = m.getSpaceTypes[0]
dsoa = DesignSpecificationOutdoorAir.new(m)
dsoa.setOutdoorAirFlowAirChangesperHour(0.6)
dsoa.setName("DSOA 0.6 ACH")
Using an explicit ZoneHVACIdealLoadsAirSystem
In [2]:
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone
i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m)
i.addToThermalZone(z)
In [3]: [2]: puts i # Notice DSOA is empty...
Out[3]:
Out[2]:
OS:ZoneHVAC:IdealLoadsAirSystem,
{03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
{79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name
{846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
, !- Design Specification Outdoor Air Object Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
In [4]:
[3]:
# Translate to E+
w = ft.translateModel(m)
In [4]:
# Show result
puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]:
ZoneHVAC:IdealLoadsAirSystem,
Zone HVAC Ideal Loads Air System 1, !- Name
, !- Availability Schedule Name
Node 3, !- Zone Supply Air Node Name
Node 2, !- Zone Exhaust Air Node Name
, !- System Inlet Air Node Name
, !- Maximum Heating Supply Air Temperature {C}
, !- Minimum Cooling Supply Air Temperature {C}
, !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir}
, !- Heating Limit
, !- Maximum Heating Air Flow Rate {m3/s}
, !- Maximum Sensible Heating Capacity {W}
, !- Cooling Limit
, !- Maximum Cooling Air Flow Rate {m3/s}
, !- Maximum Total Cooling Capacity {W}
, !- Heating Availability Schedule Name
, !- Cooling Availability Schedule Name
, !- Dehumidification Control Type
, !- Cooling Sensible Heat Ratio {dimensionless}
, !- Humidification Control Type
DSOA 0.6 ACH, Design Specification Outdoor Air 1, !- Design Specification Outdoor Air Object Name
, !- Outdoor Air Inlet Node Name
, !- Demand Controlled Ventilation Type
, !- Outdoor Air Economizer Type
, !- Heat Recovery Type
, !- Sensible Heat Recovery Effectiveness {dimensionless}
; !- Latent Heat Recovery Effectiveness {dimensionless}
Using setUseIdealAirLoads
In [5]:
i.remove
z.setUseIdealAirLoads(true)
w = ft.translateModel(m)
puts w.getObjectsByType("ZoneVentilation:DesignFlowRate".to_IddObjectType)
Out[5]:
ZoneVentilation:DesignFlowRate,
Thermal Zone 1 Ventilation Air Changes per Hour, !- Name
Thermal Zone 1, !- Zone or ZoneList Name
{03b5360a-8d83-4cd5-b891-217534a53d2c}, !- Schedule Name
AirChanges/Hour, !- Design Flow Rate Calculation Method
, !- Design Flow Rate {m3/s}
, !- Flow Rate per Zone Floor Area {m3/s-m2}
, !- Flow Rate per Person {m3/s-person}
0.6, !- Air Changes per Hour {1/hr}
, !- Ventilation Type
, !- Fan Pressure Rise {Pa}
, !- Fan Total Efficiency
, !- Constant Term Coefficient
, !- Temperature Term Coefficient
, !- Velocity Term Coefficient
; !- Velocity Squared Term Coefficient
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Example using an explicit ZoneHVACIdealLoadsAirSystem
I dug into the source code. There are two different thing that could be happening:
- If you clicked on a ThermalZone checkbox in the OS App to enable Ideal Air Loads (meaning
zone.setUseIdealAirLoads(true)
behind the scenes), you'll end up with an HVACTemplate:ZoneIdealLoadsAirSystem with will get expanded by E+ as a ZoneHVAC:IdealLoadsAirSystem, but it won't have theDesignSpecific:OutdoorAir
(DSOA) object. Instead, aZoneVentilation:DesignFlowRate
object is created to match the DSOA, so you can request the output variableZone Ventilation Mass Flow Rate [kg/s]
- If you use the API, you can explicitly create a
ZoneHVACIdealLoadsAirSystem
and assign that as an actual equipment to the thermal Zone, and in this case the DSOA will be gotten and properly translated, and you can use the Output variableZone Ideal Loads Outdoor Air Mass Flow Rate
Source:
- When setUseIdealAirLoads
- Use a HVACTemplate:Zone:IdealLoadsAirSystem: ForwardTranslateThermalZone.cpp#L668
- translate DSOA as ZV:DesignFlowRate happens around ForwardTranslateThermalZone.cpp#L775
- When explicitly creating a
OS:ZoneHVACIdealLoadsAirSystem
: ForwardTranslateZoneHVACIdealLoadsAirSystem.cpp#L178:L198
Example using an explicit ZoneHVACIdealLoadsAirSystem
In [1]: # Create an Example model m = OpenStudio::Model::exampleModel() # It has one zone, connected to a AirLoopHVAC, we remove it m.getAirLoopHVACs[0].remove
# We create a ZoneHVACIdealLoadsAirSystem and add it to the thermal Zone i = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(m) i.addToThermalZone(z)
In [2]: puts i # Notice DSOA is empty... Out[2]: OS:ZoneHVAC:IdealLoadsAirSystem, {03253713-01e8-44d8-a6a9-ea3509fdcbe0}, !- Handle Zone HVAC Ideal Loads Air System 1, !- Name , !- Availability Schedule Name {79065160-831c-4d50-97bb-a32156865d3d}, !- Zone Supply Air Node Name {846003a5-290c-490b-8623-3e59384f5dd3}, !- Zone Exhaust Air Node Name , !- Maximum Heating Supply Air Temperature {C} , !- Minimum Cooling Supply Air Temperature {C} , !- Maximum Heating Supply Air Humidity Ratio {kg-H2O/kg-air} , !- Minimum Cooling Supply Air Humidity Ratio {kg-H2O/kg-air} , !- Heating Limit , !- Maximum Heating Air Flow Rate {m3/s} , !- Maximum Sensible Heating Capacity {W} , !- Cooling Limit , !- Maximum Cooling Air Flow Rate {m3/s} , !- Maximum Total Cooling Capacity {W} , !- Heating Availability Schedule Name , !- Cooling Availability Schedule Name , !- Dehumidification Control Type , !- Cooling Sensible Heat Ratio {dimensionless} , !- Humidification Control Type , !- Design Specification Outdoor Air Object Name , !- Demand Controlled Ventilation Type , !- Outdoor Air Economizer Type , !- Heat Recovery Type , !- Sensible Heat Recovery Effectiveness {dimensionless} ; !- Latent Heat Recovery Effectiveness {dimensionless}
In [3]: # Translate to E+ w = ft.translateModel(m)
In [4]: # Show result puts w.getObjectsByType("ZoneHVAC:IdealLoadsAirSystem".to_IddObjectType)
Out[4]: ZoneHVAC:IdealLoadsAirSystem, Zone HVAC Ideal Loads Air System 1, !- Name , !- Availability Schedule Name Node 3, !- Zone Supply Air Node Name Node 2, !- Zone Exhaust Air Node Name , !- System Inlet Air Node Name , !- Maximum Heating Supply Air Temperature {C} , !- Minimum Cooling Supply Air Temperature {C} , !- Maximum Heating Supply Air Humidity Ratio {kgWater/kgDryAir} , !- Minimum Cooling Supply Air Humidity Ratio {kgWater/kgDryAir} , !- Heating Limit , !- Maximum Heating Air Flow Rate {m3/s} , !- Maximum Sensible Heating Capacity {W} , !- Cooling Limit , !- Maximum Cooling Air Flow Rate {m3/s} , !- Maximum Total Cooling Capacity {W} , !- Heating Availability Schedule Name , !- Cooling Availability Schedule Name , !- Dehumidification Control Type , !- Cooling Sensible Heat Ratio {dimensionless} , !- Humidification Control Type Design Specification Outdoor Air 1, !- Design Specification Outdoor Air Object Name , !- Outdoor Air Inlet Node Name , !- Demand Controlled Ventilation Type , !- Outdoor Air Economizer Type , !- Heat Recovery Type , !- Sensible Heat Recovery Effectiveness {dimensionless} ; !- Latent Heat Recovery Effectiveness {dimensionless}