lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb in openstudio-standards-0.2.11 vs lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb in openstudio-standards-0.2.12.rc1
- old
+ new
@@ -400,10 +400,12 @@
# TODO: determine the presence of MERV filters and other stuff
# in Table 6.5.3.1.1B
# perhaps need to extend AirLoopHVAC data model
has_fully_ducted_return_and_or_exhaust_air_systems = false
+ has_MERV_9_through_12 = false
+ has_MERV_13_through_15 = false
# Calculate Fan Power Limitation Pressure Drop Adjustment (in wc)
fan_pwr_adjustment_in_wc = 0
# Fully ducted return and/or exhaust air systems
@@ -411,10 +413,24 @@
adj_in_wc = 0.5
fan_pwr_adjustment_in_wc += adj_in_wc
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "--Added #{adj_in_wc} in wc for Fully ducted return and/or exhaust air systems")
end
+ # MERV 9 through 12
+ if has_MERV_9_through_12
+ adj_in_wc = 0.5
+ fan_pwr_adjustment_in_wc += adj_in_wc
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "--Added #{adj_in_wc} in wc for Particulate Filtration Credit: MERV 9 through 12")
+ end
+
+ # MERV 13 through 15
+ if has_MERV_13_through_15
+ adj_in_wc = 0.9
+ fan_pwr_adjustment_in_wc += adj_in_wc
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "--Added #{adj_in_wc} in wc for Particulate Filtration Credit: MERV 13 through 15")
+ end
+
# Convert the pressure drop adjustment to brake horsepower (bhp)
# assuming that all supply air passes through all devices
fan_pwr_adjustment_bhp = fan_pwr_adjustment_in_wc * dsn_air_flow_cfm / 4131
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Fan Power Limitation Pressure Drop Adjustment = #{fan_pwr_adjustment_bhp.round(2)} bhp")
@@ -461,11 +477,11 @@
fan_pwr_limit_type = 'constant volume'
elsif fan.to_FanVariableVolume.is_initialized
fan_pwr_limit_type = 'variable volume'
end
elsif comp.to_AirLoopHVACUnitarySystem.is_initialized
- fan = comp.to_AirLoopHVACUnitarySystem.get.supplyFan
+ fan = comp.to_AirLoopHVACUnitarySystem.get.supplyFan.get
if fan.to_FanConstantVolume.is_initialized || comp.to_FanOnOff.is_initialized
fan_pwr_limit_type = 'constant volume'
elsif fan.to_FanVariableVolume.is_initialized
fan_pwr_limit_type = 'variable volume'
end
@@ -480,13 +496,21 @@
end
# Calculate the Allowable Fan System brake horsepower per Table G3.1.2.9
allowable_fan_bhp = 0
if fan_pwr_limit_type == 'constant volume'
- allowable_fan_bhp = dsn_air_flow_cfm * 0.00094 + fan_pwr_adjustment_bhp
+ if dsn_air_flow_cfm > 0
+ allowable_fan_bhp = dsn_air_flow_cfm * 0.00094 + fan_pwr_adjustment_bhp
+ else
+ allowable_fan_bhp = 0.00094
+ end
elsif fan_pwr_limit_type == 'variable volume'
- allowable_fan_bhp = dsn_air_flow_cfm * 0.0013 + fan_pwr_adjustment_bhp
+ if dsn_air_flow_cfm > 0
+ allowable_fan_bhp = dsn_air_flow_cfm * 0.0013 + fan_pwr_adjustment_bhp
+ else
+ allowable_fan_bhp = 0.0013
+ end
end
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Allowable brake horsepower = #{allowable_fan_bhp.round(2)}HP based on #{dsn_air_flow_cfm.round} cfm and #{fan_pwr_adjustment_bhp.round(2)} bhp of adjustment.")
# Calculate and report the total area for debugging/testing
floor_area_served_m2 = air_loop_hvac_floor_area_served(air_loop_hvac)
@@ -496,11 +520,17 @@
return allowable_fan_bhp
end
floor_area_served_ft2 = OpenStudio.convert(floor_area_served_m2, 'm^2', 'ft^2').get
cfm_per_ft2 = dsn_air_flow_cfm / floor_area_served_ft2
- cfm_per_hp = dsn_air_flow_cfm / allowable_fan_bhp
+
+ if allowable_fan_bhp.zero?
+ cfm_per_hp = 0
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "AirLoopHVAC #{air_loop_hvac.name} has zero allowable fan bhp, probably due to zero design air flow cfm'.")
+ else
+ cfm_per_hp = dsn_air_flow_cfm / allowable_fan_bhp
+ end
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: area served = #{floor_area_served_ft2.round} ft^2.")
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: flow per area = #{cfm_per_ft2.round} cfm/ft^2.")
OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: flow per hp = #{cfm_per_hp.round} cfm/hp.")
return allowable_fan_bhp
@@ -846,10 +876,10 @@
'climate_zone' => climate_zone,
'data_center' => is_dc
}
econ_limits = model_find_object(standards_data['economizers'], search_criteria)
if econ_limits.nil?
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "Cannot find economizer limits for #{template}, #{climate_zone}, assuming no economizer required.")
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "Cannot find economizer limits for template '#{template}' and climate zone '#{climate_zone}', assuming no economizer required.")
return economizer_required
end
# Determine the minimum capacity and whether or not it is a data center
minimum_capacity_btu_per_hr = econ_limits['capacity_limit']