Source code for honeybee_openstudio.hvac.standards.thermal_zone
# coding=utf-8
"""Module taken from OpenStudio-standards.
https://github.com/NREL/openstudio-standards/blob/master/
lib/openstudio-standards/thermal_zone/thermal_zone.rb
"""
from __future__ import division
import sys
[docs]
def thermal_zone_get_outdoor_airflow_rate(thermal_zone):
"""Calculates the zone outdoor airflow requirement (Voz).
The result will be based on the inputs in the DesignSpecification:OutdoorAir
objects in all spaces in the zone.
Args:
thermal_zone: [OpenStudio::Model::ThermalZone] OpenStudio ThermalZone object.
Returns:
[Double] the zone outdoor air flow rate in cubic meters per second (m^3/s).
"""
tot_oa_flow_rate = 0.0
spaces = thermal_zone.spaces()
# Variables for merging outdoor air
sum_oa_for_people = 0.0
sum_oa_for_floor_area = 0.0
sum_oa_rate = 0.0
sum_oa_for_volume = 0.0
# Find common variables for the new space
for space in spaces:
floor_area = space.floorArea() if sys.version_info >= (3, 0) else space.floorArea
number_of_people = space.numberOfPeople()
volume = space.volume()
dsn_oa = space.designSpecificationOutdoorAir()
if not dsn_oa.is_initialized():
continue
dsn_oa = dsn_oa.get()
# compute outdoor air rates in case we need them
oa_for_people = number_of_people * dsn_oa.outdoorAirFlowperPerson()
oa_for_floor_area = floor_area * dsn_oa.outdoorAirFlowperFloorArea()
oa_rate = dsn_oa.outdoorAirFlowRate()
oa_for_volume = volume * dsn_oa.outdoorAirFlowAirChangesperHour() / 3600
# First check if this space uses the Maximum method and other spaces do not
if dsn_oa.outdoorAirMethod() == 'Maximum':
sum_oa_rate += max([oa_for_people, oa_for_floor_area, oa_rate, oa_for_volume])
elif dsn_oa.outdoorAirMethod() == 'Sum':
sum_oa_for_people += oa_for_people
sum_oa_for_floor_area += oa_for_floor_area
sum_oa_rate += oa_rate
sum_oa_for_volume += oa_for_volume
tot_oa_flow_rate += sum_oa_for_people
tot_oa_flow_rate += sum_oa_for_floor_area
tot_oa_flow_rate += sum_oa_rate
tot_oa_flow_rate += sum_oa_for_volume
return tot_oa_flow_rate
[docs]
def thermal_zone_get_outdoor_airflow_rate_per_area(thermal_zone):
"""Calculates the zone outdoor airflow requirement and divides by the zone area.
Args:
thermal_zone: [OpenStudio::Model::ThermalZone] OpenStudio ThermalZone object.
Returns:
[Double] the zone outdoor air flow rate in cubic meters per second
per floor area(m3/s/m2).
"""
# Find total area of the zone
sum_floor_area = 0.0
for space in thermal_zone.spaces():
floor_area = space.floorArea() if sys.version_info >= (3, 0) else space.floorArea
sum_floor_area += floor_area
# Get the OA flow rate
tot_oa_flow_rate = thermal_zone_get_outdoor_airflow_rate(thermal_zone)
# Calculate the per-area value
tot_oa_flow_rate_per_area = tot_oa_flow_rate / sum_floor_area
return tot_oa_flow_rate_per_area
[docs]
def thermal_zone_get_occupancy_schedule(model, thermal_zone):
"""Get the occupancy schedule of the zone.
Args:
thermal_zone: [OpenStudio::Model::ThermalZone] OpenStudio ThermalZone object.
"""
# Get all the occupancy schedules in spaces.
# Check people added via the SpaceType and hard-assigned to the Space itself.
occupancy_sch = None
num_ppl_sch = None
for space in thermal_zone.spaces():
# From the space type
space_type = space.spaceType() if sys.version_info >= (3, 0) else space.spaceType
if space_type.is_initialized():
for people in space_type.get().people():
num_ppl_sch = people.numberofPeopleSchedule()
if not num_ppl_sch.is_initialized():
continue
occupancy_sch = num_ppl_sch.get()
break
if num_ppl_sch is None: # From the space
for space in thermal_zone.spaces():
for people in space.people():
num_ppl_sch = people.numberofPeopleSchedule()
if not num_ppl_sch.is_initialized():
continue
occupancy_sch = num_ppl_sch.get()
break
# if there is no occupancy, use always off
if occupancy_sch is None:
return model.alwaysOffDiscreteSchedule()
return occupancy_sch