lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb in openstudio-standards-0.6.0.rc2 vs lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb in openstudio-standards-0.6.3
- old
+ new
@@ -8,15 +8,13 @@
#
# @param water_heater_mixed [OpenStudio::Model::WaterHeaterMixed] water heater mixed object
# @return [Boolean] returns true if successful, false if not
def water_heater_mixed_apply_efficiency(water_heater_mixed)
# @todo remove this once workaround for HPWHs is removed
- if water_heater_mixed.partLoadFactorCurve.is_initialized
- if water_heater_mixed.partLoadFactorCurve.get.name.get.include?('HPWH_COP')
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.WaterHeaterMixed', "For #{water_heater_mixed.name}, the workaround for HPWHs has been applied, efficiency will not be changed.")
- return true
- end
+ if water_heater_mixed.partLoadFactorCurve.is_initialized && water_heater_mixed.partLoadFactorCurve.get.name.get.include?('HPWH_COP')
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.WaterHeaterMixed', "For #{water_heater_mixed.name}, the workaround for HPWHs has been applied, efficiency will not be changed.")
+ return true
end
# get number of water heaters
if water_heater_mixed.additionalProperties.getFeatureAsInteger('component_quantity').is_initialized
comp_qty = water_heater_mixed.additionalProperties.getFeatureAsInteger('component_quantity').get
@@ -119,11 +117,11 @@
# Fixed water heater efficiency per PNNL
water_heater_efficiency = 1.0
# Calculate the percent loss per hr
hr_loss_base = wh_props['hourly_loss_base']
hr_loss_allow = wh_props['hourly_loss_volume_allowance']
- hrly_loss_pct = hr_loss_base + hr_loss_allow / volume_gal
+ hrly_loss_pct = hr_loss_base + (hr_loss_allow / volume_gal)
# Convert to Btu/hr, assuming:
# Water at 120F, density = 8.25 lb/gal
# 1 Btu to raise 1 lb of water 1 F
# Therefore 8.25 Btu / gal of water * deg F
# 70F delta-T between water and zone
@@ -144,22 +142,22 @@
return false
end
et = wh_props['thermal_efficiency']
# Estimate storage tank volume
tank_volume = volume_gal > 100 ? (volume_gal - 100).round(0) : 0
- wh_tank_volume = volume_gal > 100 ? 100 : volume_gal
+ wh_tank_volume = [volume_gal, 100].min
# SL Storage Tank: polynomial regression based on a set of manufacturer data
- sl_tank = 0.0000005 * tank_volume**3 - 0.001 * tank_volume**2 + 1.3519 * tank_volume + 64.456 # in Btu/h
+ sl_tank = (0.0000005 * (tank_volume**3)) - (0.001 * (tank_volume**2)) + (1.3519 * tank_volume) + 64.456 # in Btu/h
# Calculate the max allowable standby loss (SL)
# Output capacity is assumed to be 10 * Tank volume
# Input capacity = Output capacity / Et
p_on = capacity_btu_per_hr / et
- sl_btu_per_hr = p_on / sl_cap_adj + sl_vol_drt * Math.sqrt(wh_tank_volume) + sl_tank
+ sl_btu_per_hr = (p_on / sl_cap_adj) + (sl_vol_drt * Math.sqrt(wh_tank_volume)) + sl_tank
# Calculate the skin loss coefficient (UA)
ua_btu_per_hr_per_f = (sl_btu_per_hr * et) / 70
# Calculate water heater efficiency
- water_heater_efficiency = (ua_btu_per_hr_per_f * 70 + p_on * et) / p_on
+ water_heater_efficiency = ((ua_btu_per_hr_per_f * 70) + (p_on * et)) / p_on
end
# Ensure that efficiency and UA were both set\
if water_heater_efficiency.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.WaterHeaterMixed', "For #{water_heater_mixed.name}, cannot calculate efficiency, cannot apply efficiency standard.")
@@ -290,20 +288,17 @@
# @return [String] returns water heater sub type
def water_heater_determine_sub_type(fuel_type, capacity_btu_per_hr, volume_gal)
sub_type = nil
capacity_w = OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get
# source: https://energycodeace.com/site/custom/public/reference-ace-2019/index.html#!Documents/52residentialwaterheatingequipment.htm
- if fuel_type == 'NaturalGas' && capacity_btu_per_hr <= 75_000 && (volume_gal >= 20 && volume_gal <= 100)
+ if (fuel_type == 'NaturalGas' && capacity_btu_per_hr <= 75_000 && (volume_gal >= 20 && volume_gal <= 100)) ||
+ (fuel_type == 'Electricity' && capacity_w <= 12_000 && (volume_gal >= 20 && volume_gal <= 120))
sub_type = 'consumer_storage'
- elsif fuel_type == 'Electricity' && capacity_w <= 12_000 && (volume_gal >= 20 && volume_gal <= 120)
- sub_type = 'consumer_storage'
- elsif fuel_type == 'NaturalGas' && capacity_btu_per_hr < 105_000 && volume_gal < 120
+ elsif (fuel_type == 'NaturalGas' && capacity_btu_per_hr < 105_000 && volume_gal < 120) ||
+ (fuel_type == 'Oil' && capacity_btu_per_hr < 140_000 && volume_gal < 120) ||
+ (fuel_type == 'Electricity' && capacity_w < 58_600 && volume_gal <= 2)
sub_type = 'residential_duty'
- elsif fuel_type == 'Oil' && capacity_btu_per_hr < 140_000 && volume_gal < 120
- sub_type = 'residential_duty'
- elsif fuel_type == 'Electricity' && capacity_w < 58_600 && volume_gal <= 2
- sub_type = 'residential_duty'
elsif volume_gal <= 2
sub_type = 'instantaneous'
end
return sub_type
@@ -324,17 +319,17 @@
# source: RESNET, https://www.resnet.us/wp-content/uploads/RESNET-EF-Calculator-2017.xlsx
if sub_type.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.WaterHeaterMixed', "No sub type identified for #{water_heater_mixed.name}, Energy Factor (EF) = Uniform Energy Factor (UEF) is assumed.")
return uniform_energy_factor
elsif sub_type == 'consumer_storage' && fuel_type == 'NaturalGas'
- return 0.9066 * uniform_energy_factor + 0.0711
+ return (0.9066 * uniform_energy_factor) + 0.0711
elsif sub_type == 'consumer_storage' && fuel_type == 'Electricity'
- return 2.4029 * uniform_energy_factor - 1.2844
+ return (2.4029 * uniform_energy_factor) - 1.2844
elsif sub_type == 'residential_duty' && (fuel_type == 'NaturalGas' || fuel_type == 'Oil')
- return 1.0005 * uniform_energy_factor + 0.0019
+ return (1.0005 * uniform_energy_factor) + 0.0019
elsif sub_type == 'residential_duty' && fuel_type == 'Electricity'
- return 1.0219 * uniform_energy_factor - 0.0025
+ return (1.0219 * uniform_energy_factor) - 0.0025
elsif sub_type == 'instantaneous'
return uniform_energy_factor
else
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.WaterHeaterMixed', "Invalid sub_type for #{water_heater_mixed.name}, Energy Factor (EF) = Uniform Energy Factor (UEF) is assumed.")
return uniform_energy_factor
@@ -351,11 +346,11 @@
# Calculate the skin loss coefficient (UA)
# differently depending on the fuel type
if fuel_type == 'Electricity'
# Fixed water heater efficiency per PNNL
water_heater_efficiency = 1.0
- ua_btu_per_hr_per_f = (41_094 * (1 / energy_factor - 1)) / (24 * 67.5)
+ ua_btu_per_hr_per_f = (41_094 * ((1 / energy_factor) - 1)) / (24 * 67.5)
elsif fuel_type == 'NaturalGas'
# Fixed water heater thermal efficiency per PNNL
water_heater_efficiency = 0.82
# Calculate the Recovery Efficiency (RE)
# based on a fixed capacity of 75,000 Btu/hr
@@ -363,10 +358,10 @@
# this system of equations:
# ua = (1/.95-1/re)/(67.5*(24/41094-1/(re*cap)))
# 0.82 = (ua*67.5+cap*re)/cap
# Solutions to the system of equations were determined
# for discrete values of Energy Factor (EF) and modeled using a regression
- recovery_efficiency = -0.1137 * energy_factor**2 + 0.1997 * energy_factor + 0.731
+ recovery_efficiency = (-0.1137 * (energy_factor**2)) + (0.1997 * energy_factor) + 0.731
# Calculate the skin loss coefficient (UA)
# Input capacity is assumed to be the output capacity
# divided by a burner efficiency of 80%
ua_btu_per_hr_per_f = (water_heater_efficiency - recovery_efficiency) * capacity_btu_per_hr / 0.8 / 67.5
end