Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Building Energy Standards Chiller Data Update #1676

Merged
merged 18 commits into from
Feb 16, 2024
Merged
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -5372,7 +5372,7 @@ def model_add_furnace_central_ac(model,
name: "#{air_loop.name} Cooling Coil",
type: 'Residential Central AC')
clg_coil.setRatedSensibleHeatRatio(shr)
clg_coil.setRatedCOP(OpenStudio::OptionalDouble.new(eer_to_cop(eer)))
clg_coil.setRatedCOP(OpenStudio::OptionalDouble.new(eer_to_cop_no_fan(eer)))
clg_coil.setRatedEvaporatorFanPowerPerVolumeFlowRate(OpenStudio::OptionalDouble.new(ac_w_per_cfm / OpenStudio.convert(1.0, 'cfm', 'm^3/s').get))
clg_coil.setNominalTimeForCondensateRemovalToBegin(OpenStudio::OptionalDouble.new(1000.0))
clg_coil.setRatioOfInitialMoistureEvaporationRateAndSteadyStateLatentCapacity(OpenStudio::OptionalDouble.new(1.5))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -281,7 +281,7 @@ def cop_to_seer_cooling_no_fan(cop)
# @return [Double] Coefficient of Performance (COP)
def seer_to_cop_cooling_with_fan(seer)
eer = -0.0182 * seer * seer + 1.1088 * seer
cop = (eer / 3.413 + 0.12) / (1 - 0.12)
cop = (eer / OpenStudio.convert(1.0, 'W', 'Btu/h').get + 0.12) / (1 - 0.12)

return cop
end
Expand All @@ -292,7 +292,7 @@ def seer_to_cop_cooling_with_fan(seer)
# @param cop [Double] Coefficient of Performance (COP)
# @return [Double] seasonal energy efficiency ratio (SEER)
def cop_to_seer_cooling_with_fan(cop)
eer = cop_to_eer(cop)
eer = cop_to_eer_no_fan(cop)
delta = 1.1088**2 - 4.0 * 0.0182 * eer
seer = (1.1088 - delta**0.5) / (2.0 * 0.0182)

Expand Down Expand Up @@ -343,13 +343,13 @@ def hspf_to_cop_heating_with_fan(hspf)
# @param eer [Double] Energy Efficiency Ratio (EER)
# @param capacity_w [Double] the heating capacity at AHRI rating conditions, in W
# @return [Double] Coefficient of Performance (COP)
def eer_to_cop(eer, capacity_w = nil)
def eer_to_cop_no_fan(eer, capacity_w = nil)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

These functions were mislabeled. They did not correspond to a straight EER to COP conversion but rather excluded the effect of the fan when doing the conversion.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@khaddad, @ckirney - as per our discussion/email, see the changes in lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb.

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks

if capacity_w.nil?
# The PNNL Method.
# r is the ratio of supply fan power to total equipment power at the rating condition,
# assumed to be 0.12 for the reference buildings per PNNL.
r = 0.12
cop = (eer / 3.413 + r) / (1 - r)
cop = (eer / OpenStudio.convert(1.0, 'W', 'Btu/h').get + r) / (1 - r)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Use the convert function of OS to get additional precision.

else
# The 90.1-2013 method
# Convert the capacity to Btu/hr
Expand All @@ -365,13 +365,13 @@ def eer_to_cop(eer, capacity_w = nil)
#
# @param cop [Double] COP
# @return [Double] Energy Efficiency Ratio (EER)
def cop_to_eer(cop, capacity_w = nil)
def cop_to_eer_no_fan(cop, capacity_w = nil)
if capacity_w.nil?
# The PNNL Method.
# r is the ratio of supply fan power to total equipment power at the rating condition,
# assumed to be 0.12 for the reference buildngs per PNNL.
r = 0.12
eer = 3.413 * (cop * (1 - r) - r)
eer = OpenStudio.convert(1.0, 'W', 'Btu/h').get * (cop * (1 - r) - r)
else
# The 90.1-2013 method
# Convert the capacity to Btu/hr
Expand All @@ -382,6 +382,14 @@ def cop_to_eer(cop, capacity_w = nil)
return eer
end

# Convert from EER to COP
#
# @param cop [Double] Energy Efficiency Ratio (EER)
# @return [Double] Coefficient of Performance (COP)
def eer_to_cop(eer)
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Add new function to do a straight EER to COP conversion.

return eer / OpenStudio.convert(1.0, 'W', 'Btu/h').get
end

# Convert from COP to kW/ton
#
# @param cop [Double] Coefficient of Performance (COP)
Expand Down
64 changes: 46 additions & 18 deletions lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,7 @@ def chiller_electric_eir_find_search_criteria(chiller_electric_eir)
# Determine if WaterCooled or AirCooled by
# checking if the chiller is connected to a condenser
# water loop or not. Use name as fallback for exporting HVAC library.
cooling_type = 'AirCooled'
if chiller_electric_eir.secondaryPlantLoop.is_initialized || chiller_electric_eir.name.get.to_s.include?('WaterCooled')
cooling_type = 'WaterCooled'
end
cooling_type = chiller_electric_eir.condenserType

search_criteria['cooling_type'] = cooling_type

Expand Down Expand Up @@ -59,6 +56,12 @@ def chiller_electric_eir_find_search_criteria(chiller_electric_eir)
search_criteria['compressor_type'] = compressor_type
end

# @todo Find out what compliance path is desired
# perhaps this could be set using additional
# properties when the chiller is created
# Assume path a by default for now
search_criteria['compliance_path'] = 'Path A'

return search_criteria
end

Expand Down Expand Up @@ -92,13 +95,26 @@ def chiller_electric_eir_standard_minimum_full_load_efficiency(chiller_electric_
capacity_tons = OpenStudio.convert(capacity_w, 'W', 'ton').get
chlr_props = model_find_object(standards_data['chillers'], search_criteria, capacity_tons, Date.today)

if chlr_props.nil? || !chlr_props['minimum_full_load_efficiency']
if chlr_props.nil?
search_criteria.delete('compliance_path')
chlr_props = model_find_object(standards_data['chillers'], search_criteria, capacity_tons, Date.today)
end
if chlr_props.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ChillerElectricEIR', "For #{chiller_electric_eir.name}, cannot find minimum full load efficiency.")
return nil
else
# lookup the efficiency value
kw_per_ton = chlr_props['minimum_full_load_efficiency']
cop = kw_per_ton_to_cop(kw_per_ton)
cop = nil
if !chlr_props['minimum_coefficient_of_performance'].nil?
cop = chlr_props['minimum_coefficient_of_performance']
elsif !chlr_props['minimum_energy_efficiency_ratio'].nil?
cop = eer_to_cop(chlr_props['minimum_energy_efficiency_ratio'])
elsif !chlr_props['minimum_kilowatts_per_tons'].nil?
cop = kw_per_ton_to_cop(chlr_props['minimum_kilowatts_per_tons'])
end
if cop.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ChillerElectricEIR', "For #{chiller_electric_eir.name}, cannot find minimum full load efficiency.")
return nil
end
end

return cop
Expand Down Expand Up @@ -128,10 +144,26 @@ def chiller_electric_eir_apply_efficiency_and_curves(chiller_electric_eir, clg_t

# Get the chiller properties
chlr_props = model_find_object(chillers, search_criteria, capacity_tons, Date.today)
unless chlr_props
cop = nil
if chlr_props.nil?
search_criteria.delete('compliance_path')
chlr_props = model_find_object(standards_data['chillers'], search_criteria, capacity_tons, Date.today)
end
if chlr_props.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ChillerElectricEIR', "For #{chiller_electric_eir.name}, cannot find chiller properties using #{search_criteria}, cannot apply standard efficiencies or curves.")
successfully_set_all_properties = false
return successfully_set_all_properties
return false
else
if !chlr_props['minimum_coefficient_of_performance'].nil?
cop = chlr_props['minimum_coefficient_of_performance']
elsif !chlr_props['minimum_energy_efficiency_ratio'].nil?
cop = eer_to_cop(chlr_props['minimum_energy_efficiency_ratio'])
elsif !chlr_props['minimum_kilowatts_per_tons'].nil?
cop = kw_per_ton_to_cop(chlr_props['minimum_kilowatts_per_tons'])
end
if cop.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ChillerElectricEIR', "For #{chiller_electric_eir.name}, cannot find minimum full load efficiency.")
return false
end
end

# Make the CAPFT curve
Expand Down Expand Up @@ -163,15 +195,11 @@ def chiller_electric_eir_apply_efficiency_and_curves(chiller_electric_eir, clg_t
end

# Set the efficiency value
kw_per_ton = nil
cop = nil
if chlr_props['minimum_full_load_efficiency']
kw_per_ton = chlr_props['minimum_full_load_efficiency']
cop = kw_per_ton_to_cop(kw_per_ton)
chiller_electric_eir.setReferenceCOP(cop)
else
if cop.nil?
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ChillerElectricEIR', "For #{chiller_electric_eir.name}, cannot find minimum full load efficiency, will not be set.")
successfully_set_all_properties = false
else
chiller_electric_eir.setReferenceCOP(cop)
end

# Append the name with size and kw/ton
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,7 @@ def coil_cooling_dx_multi_speed_apply_efficiency_and_curves(coil_cooling_dx_mult
capacity_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
capacity_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
ptac_eer = ptac_eer_coeff_1 + (ptac_eer_coeff_2 * capacity_btu_per_hr)
cop = eer_to_cop(ptac_eer)
cop = eer_to_cop_no_fan(ptac_eer)
# self.setName("#{self.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer}EER")
new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{ptac_eer}")
Expand All @@ -181,7 +181,7 @@ def coil_cooling_dx_multi_speed_apply_efficiency_and_curves(coil_cooling_dx_mult
# If specified as EER
unless ac_props['minimum_energy_efficiency_ratio'].nil?
min_eer = ac_props['minimum_energy_efficiency_ratio']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand All @@ -198,7 +198,7 @@ def coil_cooling_dx_multi_speed_apply_efficiency_and_curves(coil_cooling_dx_mult
# If specified as EER (heat pump)
unless ac_props['minimum_full_load_efficiency'].nil?
min_eer = ac_props['minimum_full_load_efficiency']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down Expand Up @@ -281,7 +281,7 @@ def coil_cooling_dx_multi_speed_standard_minimum_cop(coil_cooling_dx_multi_speed
# If specified as EER
unless ac_props['minimum_energy_efficiency_ratio'].nil?
min_eer = ac_props['minimum_energy_efficiency_ratio']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{coil_dx_subcategory(coil_cooling_dx_multi_speed)} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand All @@ -298,7 +298,7 @@ def coil_cooling_dx_multi_speed_standard_minimum_cop(coil_cooling_dx_multi_speed
# If specified as EER (heat pump)
unless ac_props['minimum_full_load_efficiency'].nil?
min_eer = ac_props['minimum_full_load_efficiency']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{template}: #{coil_cooling_dx_multi_speed.name}: #{cooling_type} #{heating_type} #{coil_dx_subcategory(coil_cooling_dx_multi_speed)} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,7 @@ def coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_spe
eer_calc_cap_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
eer_calc_cap_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
pthp_eer = pthp_eer_coeff_1 - (pthp_eer_coeff_2 * eer_calc_cap_btu_per_hr / 1000.0)
cop = eer_to_cop(pthp_eer)
cop = eer_to_cop_no_fan(pthp_eer)
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{pthp_eer.round(1)}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{pthp_eer.round(1)}")
end
Expand All @@ -104,7 +104,7 @@ def coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_spe
eer_calc_cap_btu_per_hr = 7000 if capacity_btu_per_hr < 7000
eer_calc_cap_btu_per_hr = 15_000 if capacity_btu_per_hr > 15_000
ptac_eer = ptac_eer_coeff_1 - (ptac_eer_coeff_2 * eer_calc_cap_btu_per_hr / 1000.0)
cop = eer_to_cop(ptac_eer)
cop = eer_to_cop_no_fan(ptac_eer)
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{ptac_eer.round(1)}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{ptac_eer.round(1)}")
end
Expand Down Expand Up @@ -140,7 +140,7 @@ def coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_spe
# If specified as EER
unless ac_props['minimum_energy_efficiency_ratio'].nil?
min_eer = ac_props['minimum_energy_efficiency_ratio']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand All @@ -156,7 +156,7 @@ def coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_spe
# If specified as EER (heat pump)
unless ac_props['minimum_full_load_efficiency'].nil?
min_eer = ac_props['minimum_full_load_efficiency']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -70,7 +70,7 @@ def coil_cooling_dx_two_speed_standard_minimum_cop(coil_cooling_dx_two_speed, re
# If specified as EER
unless ac_props['minimum_energy_efficiency_ratio'].nil?
min_eer = ac_props['minimum_energy_efficiency_ratio']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_two_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXTwoSpeed', "For #{template}: #{coil_cooling_dx_two_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand All @@ -86,7 +86,7 @@ def coil_cooling_dx_two_speed_standard_minimum_cop(coil_cooling_dx_two_speed, re
# If specified as EER (heat pump)
unless ac_props['minimum_full_load_efficiency'].nil?
min_eer = ac_props['minimum_full_load_efficiency']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_cooling_dx_two_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXTwoSpeed', "For #{template}: #{coil_cooling_dx_two_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ def coil_cooling_water_to_air_heat_pump_standard_minimum_cop(coil_cooling_water_
# If specified as EER (heat pump)
unless coil_props['minimum_full_load_efficiency'].nil?
min_eer = coil_props['minimum_full_load_efficiency']
cop = eer_to_cop(min_eer, capacity_w = nil)
cop = eer_to_cop_no_fan(min_eer, capacity_w = nil)
new_comp_name = "#{coil_cooling_water_to_air_heat_pump.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "For #{template}: #{coil_cooling_water_to_air_heat_pump.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ def coil_heating_dx_multi_speed_apply_efficiency_and_curves(coil_heating_dx_mult
# If specified as EER
unless hp_props['minimum_energy_efficiency_ratio'].nil?
min_eer = hp_props['minimum_energy_efficiency_ratio']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
coil_heating_dx_multi_speed.setName("#{coil_heating_dx_multi_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER")
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXMultiSpeed', "For #{template}: #{coil_heating_dx_multi_speed.name}: #{suppl_heating_type} #{subcategory} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -164,7 +164,7 @@ def coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_spe
# If specified as EER
unless ac_props['minimum_energy_efficiency_ratio'].nil?
min_eer = ac_props['minimum_energy_efficiency_ratio']
cop = eer_to_cop(min_eer)
cop = eer_to_cop_no_fan(min_eer)
new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_eer.round(1)}EER"
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: #{suppl_heating_type} #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
end
Expand Down
Loading