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']