diff --git a/resources/measures/upgrade_hvac_vrf_hr_doas/measure.rb b/resources/measures/upgrade_hvac_vrf_hr_doas/measure.rb
index 91b4e2d83..d2245e00c 100644
--- a/resources/measures/upgrade_hvac_vrf_hr_doas/measure.rb
+++ b/resources/measures/upgrade_hvac_vrf_hr_doas/measure.rb
@@ -298,6 +298,40 @@ def get_tabular_data(model, sql, report_name, report_for_string, table_name, row
result
end
+ # --------------------------------------- #
+ # supporting method
+ # --------------------------------------- #
+ # return dependent varible based on two independent variables from TableMultiVariableLookup
+ # @param model [OpenStudio::Model::TableMultiVariableLookup] OpenStudio TableMultiVariableLookup object
+ # @param ind_var_1 [Double] independent variable 1
+ # @param ind_var_2 [Double] independent variable 2
+ # @return [Double] dependent variable value
+ def get_dep_var_from_lookup_table_with_two_ind_var(lookup_table, ind_var_1, ind_var_2)
+ unless lookup_table.to_TableMultiVariableLookup.is_initialized
+ runner.registerError("#{lookup_table.name} is not a OpenStudio::Model::TableMultiVariableLookup object.")
+ return false
+ end
+
+ # check if the lookup only has two independent variables
+ if lookup_table.numberofIndependentVariables == 2
+
+ # get independent variable 1 and 2 from table
+ array_ind_var_1 = lookup_table.xValues(0)
+ array_ind_var_2 = lookup_table.xValues(1)
+
+ # find the closest independent variable 1 and 2 from table based on method inputs
+ closest_ind_var_1 = array_ind_var_1.min_by{|x| (ind_var_1-x).abs}
+ closest_ind_var_2 = array_ind_var_2.min_by{|x| (ind_var_2-x).abs}
+
+ # grab dependent variable from the closest independent variables
+ dependent_var_val = lookup_table.yValue([closest_ind_var_1, closest_ind_var_2]).get
+ else
+ runner.registerError('This TableMultiVariableLookup is not based on two independent variables.')
+ return false
+ end
+ return dependent_var_val
+ end
+
# --------------------------------------- #
# supporting method
# extracting VRF object specifications from existing (fully populated) object
@@ -1899,8 +1933,8 @@ def run(model, runner, user_arguments)
# loop through each outdoor unit
model.getAirConditionerVariableRefrigerantFlows.each do |ou|
- puts("### ####################################")
- puts("### OU name = #{ou.name}")
+ # puts("### ####################################")
+ # puts("### OU name = #{ou.name}")
capacity_outdoor_unit_new = 0
ou.terminals.each do |iu|
@@ -1917,29 +1951,69 @@ def run(model, runner, user_arguments)
else
runner.registerError("cannot get CoilHeatingDXVariableRefrigerantFlow object")
end
- puts("--- ------------------------------------")
- puts("--- IU cooling coil name = #{coil_cooling.name}")
+ # puts("--- ------------------------------------")
+ # puts("--- IU cooling coil name = #{coil_cooling.name}")
row_name_cooling = coil_cooling.name.to_s.upcase
row_name_heating = coil_heating.name.to_s.upcase
# get design_cooling_load
column_name = 'Zone Sensible Heat Gain at Ideal Loads Peak'
design_cooling_load = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_cooling, column_name).to_f
- puts("--- #{coil_cooling.name} | design_cooling_load = #{design_cooling_load} W")
+ # puts("--- #{coil_cooling.name} | design_cooling_load = #{design_cooling_load} W")
+
+ # get design cooling temperature
+ column_name = 'Outdoor Air Drybulb at Ideal Loads Peak'
+ design_cooling_temp = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_cooling, column_name).to_f
+ # puts("--- #{coil_cooling.name} | design_cooling_temp = #{design_cooling_temp} C")
# get design_heating_load
column_name = 'Zone Sensible Heat Gain at Ideal Loads Peak'
design_heating_load = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_heating, column_name).to_f
- puts("--- #{coil_cooling.name} | design_heating_load = #{design_heating_load} W")
+ # puts("--- #{coil_cooling.name} | design_heating_load = #{design_heating_load} W")
+
+ # get design heating temperature
+ column_name = 'Outdoor Air Drybulb at Ideal Loads Peak'
+ design_heating_temp = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_heating, column_name).to_f
+ # puts("--- #{coil_cooling.name} | design_heating_temp = #{design_heating_temp} C")
# get capacity_original_rated
column_name = 'Coil Final Gross Total Capacity'
capacity_original_rated = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_cooling, column_name).to_f
- puts("--- #{coil_cooling.name} | capacity_original_rated = #{capacity_original_rated} W")
+ # puts("--- #{coil_cooling.name} | capacity_original_rated = #{capacity_original_rated} W")
+
+ # get capacity modifier curves
+ capacity_modifier_curve_cooling = ou.coolingCapacityRatioModifierFunctionofLowTemperatureCurve.get
+ capacity_modifier_curve_heating = ou.heatingCapacityRatioModifierFunctionofLowTemperatureCurve.get
+ # puts("--- #{coil_cooling.name} | capacity_modifier_curve_cooling = #{capacity_modifier_curve_cooling.name}")
+ # puts("--- #{coil_cooling.name} | capacity_modifier_curve_heating = #{capacity_modifier_curve_heating.name}")
+
+ # get capacity modifier for cooling
+ if capacity_modifier_curve_cooling.to_TableMultiVariableLookup.is_initialized
+ capacity_modifier_curve_cooling = capacity_modifier_curve_cooling.to_TableMultiVariableLookup.get
+ capacity_modifier_cooling = get_dep_var_from_lookup_table_with_two_ind_var(capacity_modifier_curve_cooling, OpenStudio.convert(67.0,'F','C').get, design_cooling_temp)
+ else
+ capacity_modifier_cooling = capacity_modifier_curve_cooling.evaluate(OpenStudio.convert(67.0,'F','C').get, design_cooling_temp)
+ end
+ # puts("--- #{coil_cooling.name} | capacity_modifier_cooling = #{capacity_modifier_cooling}")
- # skip upsizing if indoor unit is not expected as heating dominant unit
- if design_heating_load <= design_cooling_load
- puts("--- #{coil_cooling.name} | this indoor unit is not expected as heating dominant, so skipping for upsizing.")
+ # get capacity modifier for heating
+ if capacity_modifier_curve_cooling.to_TableMultiVariableLookup.is_initialized
+ capacity_modifier_curve_heating = capacity_modifier_curve_heating.to_TableMultiVariableLookup.get
+ capacity_modifier_heating = get_dep_var_from_lookup_table_with_two_ind_var(capacity_modifier_curve_heating, OpenStudio.convert(70.0,'F','C').get, design_heating_temp)
+ else
+ capacity_modifier_heating = capacity_modifier_curve_heating.evaluate(OpenStudio.convert(70.0,'F','C').get, design_heating_temp)
+ end
+ # puts("--- #{coil_cooling.name} | capacity_modifier_heating = #{capacity_modifier_heating}")
+
+ # get rated capacities based on design loads
+ rated_cooling_capacity_based_on_design_load = design_cooling_load / capacity_modifier_cooling
+ rated_heating_capacity_based_on_design_load = design_heating_load / capacity_modifier_heating
+ # puts("--- #{coil_cooling.name} | rated_cooling_capacity_based_on_design_load = #{rated_cooling_capacity_based_on_design_load} W")
+ # puts("--- #{coil_cooling.name} | rated_heating_capacity_based_on_design_load = #{rated_heating_capacity_based_on_design_load} W")
+
+ # skip upsizing if indoor unit is not expected as heating dominant
+ if rated_heating_capacity_based_on_design_load <= rated_cooling_capacity_based_on_design_load
+ # puts("--- #{coil_cooling.name} | this indoor unit is not expected as heating dominant, so skipping for upsizing.")
capacity_outdoor_unit_new += capacity_original_rated
next
end
@@ -1947,64 +2021,63 @@ def run(model, runner, user_arguments)
# get design_air_flow_rate_m_3_per_sec
column_name = 'Coil Air Volume Flow Rate at Ideal Loads Peak'
design_air_flow_rate_m_3_per_sec = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_cooling, column_name).to_f
- puts("--- #{coil_cooling.name} | design_air_flow_rate_m_3_per_sec = #{design_air_flow_rate_m_3_per_sec} m3/s")
+ # puts("--- #{coil_cooling.name} | design_air_flow_rate_m_3_per_sec = #{design_air_flow_rate_m_3_per_sec} m3/s")
# get fan_heat_gain
column_name = 'Supply Fan Air Heat Gain at Ideal Loads Peak'
fan_heat_gain = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_cooling, column_name).to_f
- puts("--- #{coil_cooling.name} | fan_heat_gain = #{fan_heat_gain} W")
-
+ # puts("--- #{coil_cooling.name} | fan_heat_gain = #{fan_heat_gain} W")
+
# get rated_capacity_modifier
column_name = 'Coil Off-Rating Capacity Modifier at Ideal Loads Peak'
rated_capacity_modifier = get_tabular_data(model, sql, 'CoilSizingDetails', 'Entire Facility', 'Coils', row_name_cooling, column_name).to_f
- puts("--- #{coil_cooling.name} | rated_capacity_modifier = #{rated_capacity_modifier}")
+ # puts("--- #{coil_cooling.name} | rated_capacity_modifier = #{rated_capacity_modifier}")
# get capacity_upsized_rated
capacity_upsized_rated = capacity_original_rated * (1 + upsizing_allowance_pct / 100.0)
- puts("--- #{coil_cooling.name} | capacity_upsized_rated = #{capacity_upsized_rated} W")
+ # puts("--- #{coil_cooling.name} | capacity_upsized_rated = #{capacity_upsized_rated} W")
# get design capacity from upsized rated capacity
capacity_upsized_design = capacity_upsized_rated * rated_capacity_modifier
- puts("--- #{coil_cooling.name} | capacity_upsized_design = #{capacity_upsized_design}")
+ # puts("--- #{coil_cooling.name} | capacity_upsized_design = #{capacity_upsized_design}")
capacity_upsized_design_wo_fan_heat_gain = capacity_upsized_design - fan_heat_gain
- puts("--- #{coil_cooling.name} | capacity_upsized_design_wo_fan_heat_gain = #{capacity_upsized_design_wo_fan_heat_gain}")
+ # puts("--- #{coil_cooling.name} | capacity_upsized_design_wo_fan_heat_gain = #{capacity_upsized_design_wo_fan_heat_gain}")
# check design capacity against design heating load
if capacity_upsized_design_wo_fan_heat_gain > design_heating_load
capacity_final_design = design_heating_load
- puts("--- #{coil_cooling.name} | upsized design load (#{capacity_upsized_design_wo_fan_heat_gain.round(0)} W) larger than actual design heating load (#{design_heating_load.round(0)} W)")
+ # puts("--- #{coil_cooling.name} | upsized design load (#{capacity_upsized_design_wo_fan_heat_gain.round(0)} W) larger than actual design heating load (#{design_heating_load.round(0)} W)")
else
capacity_final_design = capacity_upsized_design_wo_fan_heat_gain
end
- puts("--- #{coil_cooling.name} | capacity_final_design = #{capacity_final_design}")
+ # puts("--- #{coil_cooling.name} | capacity_final_design = #{capacity_final_design}")
# get final upsized rated capacity
capacity_final_rated = capacity_final_design + fan_heat_gain
capacity_final_rated = capacity_final_rated / rated_capacity_modifier
if capacity_final_rated < capacity_original_rated
- puts("--- #{coil_cooling.name} | recalculation of rated capacity (#{capacity_final_rated.round(0)} W) is less than original rated capacity (#{capacity_original_rated.round(0)} W)")
+ # puts("--- #{coil_cooling.name} | recalculation of rated capacity (#{capacity_final_rated.round(0)} W) is less than original rated capacity (#{capacity_original_rated.round(0)} W)")
capacity_final_rated = capacity_original_rated
end
- puts("--- #{coil_cooling.name} | capacity_final_rated = #{capacity_final_rated}")
-
+ # puts("--- #{coil_cooling.name} | capacity_final_rated = #{capacity_final_rated}")
- # get CFM/ton
- design_air_flow_rate_cfm = design_air_flow_rate_m_3_per_sec * 2118.88
- puts("--- #{coil_cooling.name} | design_air_flow_rate_cfm = #{design_air_flow_rate_cfm} CFM")
+ # get CFM/ton
+ design_air_flow_rate_cfm = design_air_flow_rate_m_3_per_sec * 2118.88
+ # puts("--- #{coil_cooling.name} | design_air_flow_rate_cfm = #{design_air_flow_rate_cfm} CFM")
capacity_upsized_rated_ton = capacity_final_rated * 0.000284345
- puts("--- #{coil_cooling.name} | capacity_upsized_rated_ton = #{capacity_upsized_rated_ton} ton")
+ # puts("--- #{coil_cooling.name} | capacity_upsized_rated_ton = #{capacity_upsized_rated_ton} ton")
cfm_per_ton = design_air_flow_rate_cfm / capacity_upsized_rated_ton
- puts("--- #{coil_cooling.name} | cfm_per_ton = #{cfm_per_ton}")
+ # puts("--- #{coil_cooling.name} | cfm_per_ton = #{cfm_per_ton}")
# adjust indoor unit flow rate if CFM/ton is out of bound between 300 and 450 CFM/ton
if cfm_per_ton < 300.0
- puts("--- #{coil_cooling.name} | CFM/ton minimum limit violated. Adjusting air flow rate to match with minimum limit.")
+ # puts("--- #{coil_cooling.name} | CFM/ton minimum limit violated. Adjusting air flow rate to match with minimum limit.")
new_air_flow_rate_cfm = 300 * capacity_upsized_rated_ton
- puts("--- #{coil_cooling.name} | indoor unit air flow adjusted match with minimum limit = #{new_air_flow_rate_cfm} CFM")
+ # puts("--- #{coil_cooling.name} | indoor unit air flow adjusted match with minimum limit = #{new_air_flow_rate_cfm} CFM")
elsif cfm_per_ton > 450
- puts("--- #{coil_cooling.name} | CFM/ton maximum limit violated. Adjusting air flow rate to match with maximum limit.")
+ # puts("--- #{coil_cooling.name} | CFM/ton maximum limit violated. Adjusting air flow rate to match with maximum limit.")
new_air_flow_rate_cfm = 450 * capacity_upsized_rated_ton
- puts("--- #{coil_cooling.name} | indoor unit air flow adjusted match with maximum limit = #{new_air_flow_rate_cfm} CFM")
+ # puts("--- #{coil_cooling.name} | indoor unit air flow adjusted match with maximum limit = #{new_air_flow_rate_cfm} CFM")
else
new_air_flow_rate_cfm = design_air_flow_rate_cfm
end
@@ -2012,60 +2085,60 @@ def run(model, runner, user_arguments)
# override new specifications: rated air flow rate for cooling coil
if coil_cooling.ratedAirFlowRate.is_initialized
- puts("--- #{coil_cooling.name} | indoor unit cooling air flow rate before = #{coil_cooling.ratedAirFlowRate} m3/s")
+ # puts("--- #{coil_cooling.name} | indoor unit cooling air flow rate before = #{coil_cooling.ratedAirFlowRate} m3/s")
elsif coil_cooling.autosizedRatedAirFlowRate.is_initialized
- puts("--- #{coil_cooling.name} | indoor unit cooling air flow rate before = #{coil_cooling.autosizedRatedAirFlowRate} m3/s")
+ # puts("--- #{coil_cooling.name} | indoor unit cooling air flow rate before = #{coil_cooling.autosizedRatedAirFlowRate} m3/s")
else
runner.registerError("Cannot find rated air flow rate for cooling.")
end
coil_cooling.setRatedAirFlowRate(new_air_flow_rate_m_3_per_s)
- puts("--- #{coil_cooling.name} | indoor unit cooling air flow rate after = #{coil_cooling.ratedAirFlowRate} m3/s")
+ # puts("--- #{coil_cooling.name} | indoor unit cooling air flow rate after = #{coil_cooling.ratedAirFlowRate} m3/s")
# override new specifications: rated air flow rate for heating coil
if coil_heating.ratedAirFlowRate.is_initialized
- puts("--- #{coil_heating.name} | indoor unit heating air flow rate before = #{coil_heating.ratedAirFlowRate} m3/s")
+ # puts("--- #{coil_heating.name} | indoor unit heating air flow rate before = #{coil_heating.ratedAirFlowRate} m3/s")
elsif coil_heating.autosizedRatedAirFlowRate.is_initialized
- puts("--- #{coil_heating.name} | indoor unit heating air flow rate before = #{coil_heating.autosizedRatedAirFlowRate} m3/s")
+ # puts("--- #{coil_heating.name} | indoor unit heating air flow rate before = #{coil_heating.autosizedRatedAirFlowRate} m3/s")
else
runner.registerError("Cannot find rated air flow rate for heating.")
end
coil_heating.setRatedAirFlowRate(new_air_flow_rate_m_3_per_s)
- puts("--- #{coil_heating.name} | indoor unit heating air flow rate after = #{coil_heating.ratedAirFlowRate} m3/s")
+ # puts("--- #{coil_heating.name} | indoor unit heating air flow rate after = #{coil_heating.ratedAirFlowRate} m3/s")
# override new specifications: rated capacity for cooling
if coil_cooling.ratedTotalCoolingCapacity.is_initialized
- puts("--- #{coil_cooling.name} | indoor unit cooling capacity before = #{coil_cooling.ratedTotalCoolingCapacity} W")
+ # puts("--- #{coil_cooling.name} | indoor unit cooling capacity before = #{coil_cooling.ratedTotalCoolingCapacity} W")
elsif coil_cooling.autosizedRatedTotalCoolingCapacity.is_initialized
- puts("--- #{coil_cooling.name} | indoor unit cooling capacity before = #{coil_cooling.autosizedRatedTotalCoolingCapacity} W")
+ # puts("--- #{coil_cooling.name} | indoor unit cooling capacity before = #{coil_cooling.autosizedRatedTotalCoolingCapacity} W")
else
runner.registerError("Cannot find rated capacity for cooling.")
end
coil_cooling.setRatedTotalCoolingCapacity(capacity_final_rated)
- puts("--- #{coil_cooling.name} | indoor unit cooling capacity after = #{coil_cooling.ratedTotalCoolingCapacity} W")
+ # puts("--- #{coil_cooling.name} | indoor unit cooling capacity after = #{coil_cooling.ratedTotalCoolingCapacity} W")
# override new specifications: rated capacity for heating
if coil_heating.ratedTotalHeatingCapacity.is_initialized
- puts("--- #{coil_heating.name} | indoor unit heating capacity before = #{coil_heating.ratedTotalHeatingCapacity} W")
+ # puts("--- #{coil_heating.name} | indoor unit heating capacity before = #{coil_heating.ratedTotalHeatingCapacity} W")
elsif coil_heating.autosizedRatedTotalHeatingCapacity.is_initialized
- puts("--- #{coil_heating.name} | indoor unit heating capacity before = #{coil_heating.autosizedRatedTotalHeatingCapacity} W")
+ # puts("--- #{coil_heating.name} | indoor unit heating capacity before = #{coil_heating.autosizedRatedTotalHeatingCapacity} W")
else
runner.registerError("Cannot find rated capacity for heating.")
end
coil_heating.setRatedTotalHeatingCapacity(capacity_final_rated)
- puts("--- #{coil_heating.name} | indoor unit heating capacity after = #{coil_heating.ratedTotalHeatingCapacity} W")
+ # puts("--- #{coil_heating.name} | indoor unit heating capacity after = #{coil_heating.ratedTotalHeatingCapacity} W")
# add final indoor unit capacity for calculating outdoor unit capacity
capacity_outdoor_unit_new += capacity_final_rated
end
# override outdoor unit capacity
- puts("### ------------------------------------")
- puts("### #{ou.name} | outdoor unit cooling capacity before = #{ou.autosizedGrossRatedTotalCoolingCapacity} W")
+ # puts("### ------------------------------------")
+ runner.registerInfo("### #{ou.name} | outdoor unit cooling capacity before = #{ou.autosizedGrossRatedTotalCoolingCapacity} W")
ou.setGrossRatedTotalCoolingCapacity(capacity_outdoor_unit_new)
- puts("### #{ou.name} | outdoor unit cooling capacity after = #{ou.grossRatedTotalCoolingCapacity} W")
- puts("### #{ou.name} | outdoor unit heating capacity before = #{ou.autosizedGrossRatedHeatingCapacity} W")
+ runner.registerInfo("### #{ou.name} | outdoor unit cooling capacity after = #{ou.grossRatedTotalCoolingCapacity} W")
+ runner.registerInfo("### #{ou.name} | outdoor unit heating capacity before = #{ou.autosizedGrossRatedHeatingCapacity} W")
ou.setGrossRatedHeatingCapacity(capacity_outdoor_unit_new)
- puts("### #{ou.name} | outdoor unit heating capacity after = #{ou.grossRatedHeatingCapacity} W")
+ runner.registerInfo("### #{ou.name} | outdoor unit heating capacity after = #{ou.grossRatedHeatingCapacity} W")
end
else
diff --git a/resources/measures/upgrade_hvac_vrf_hr_doas/measure.xml b/resources/measures/upgrade_hvac_vrf_hr_doas/measure.xml
index 06af1ed71..6bdd85963 100644
--- a/resources/measures/upgrade_hvac_vrf_hr_doas/measure.xml
+++ b/resources/measures/upgrade_hvac_vrf_hr_doas/measure.xml
@@ -3,8 +3,8 @@
3.1
hvac_vrf_hr_doas
95ea1937-6b29-4af5-8946-0e271c828d10
- c6351245-79ac-4b4d-af09-9ded50616075
- 2024-08-13T17:28:08Z
+ 4276d5b8-68a4-48d5-acdc-eb8aea713670
+ 2024-05-02T14:37:27Z
D8B5A9EA
HvacVrfHrDoas
hvac_vrf_hr_doas
@@ -166,7 +166,7 @@
measure.rb
rb
script
- 45EAFDAA
+ BAF9490F
performance_maps_Daikin_RELQ_100CR_120MBH.json