Skip to content

Commit 3ef4b61

Browse files
authored
Merge pull request #2167 from NatLabRockies/release_1_11_1_performance_curve_bugfix
Backport #2164
2 parents d64c6c9 + 690af36 commit 3ef4b61

10 files changed

Lines changed: 321 additions & 267 deletions

File tree

Changelog.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
## OpenStudio-HPXML v1.11.1
2+
3+
__Bugfixes__
4+
- Fixes heat pump heating performance sensitivity to indoor temperatures.
5+
16
## OpenStudio-HPXML v1.11.0
27

38
__New Features__

HPXMLtoOpenStudio/measure.xml

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,8 @@
33
<schema_version>3.1</schema_version>
44
<name>hpxm_lto_openstudio</name>
55
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
6-
<version_id>da8d965b-0724-4490-b122-9d66b3542626</version_id>
7-
<version_modified>2026-01-12T21:15:28Z</version_modified>
6+
<version_id>19c3380e-d71c-4ce1-bd4e-eb57b21a0082</version_id>
7+
<version_modified>2026-02-27T19:49:00Z</version_modified>
88
<xml_checksum>D8922A73</xml_checksum>
99
<class_name>HPXMLtoOpenStudio</class_name>
1010
<display_name>HPXML to OpenStudio Translator</display_name>
@@ -414,7 +414,7 @@
414414
<filename>hvac.rb</filename>
415415
<filetype>rb</filetype>
416416
<usage_type>resource</usage_type>
417-
<checksum>B9F10E14</checksum>
417+
<checksum>D51A5C31</checksum>
418418
</file>
419419
<file>
420420
<filename>hvac_sizing.rb</filename>
@@ -690,7 +690,7 @@
690690
<filename>version.rb</filename>
691691
<filetype>rb</filetype>
692692
<usage_type>resource</usage_type>
693-
<checksum>AE55BE28</checksum>
693+
<checksum>D9E226AF</checksum>
694694
</file>
695695
<file>
696696
<filename>waterheater.rb</filename>
@@ -762,7 +762,7 @@
762762
<filename>test_hvac.rb</filename>
763763
<filetype>rb</filetype>
764764
<usage_type>test</usage_type>
765-
<checksum>E70D77B1</checksum>
765+
<checksum>0825014B</checksum>
766766
</file>
767767
<file>
768768
<filename>test_hvac_sizing.rb</filename>

HPXMLtoOpenStudio/resources/hvac.rb

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2853,12 +2853,14 @@ def self.correct_ft_cap_eir(hvac_system, datapoints_by_speed, mode)
28532853
if mode == :clg
28542854
rated_t_i = HVAC::AirSourceCoolRatedIWB
28552855
indoor_t = [57.0, rated_t_i, 72.0]
2856+
cap_ft_spec_ss = hvac_ap.cool_cap_ft_spec
2857+
eir_ft_spec_ss = hvac_ap.cool_eir_ft_spec
28562858
else
28572859
rated_t_i = HVAC::AirSourceHeatRatedIDB
28582860
indoor_t = [60.0, rated_t_i, 80.0]
2861+
cap_ft_spec_ss = hvac_ap.heat_cap_ft_spec
2862+
eir_ft_spec_ss = hvac_ap.heat_eir_ft_spec
28592863
end
2860-
cap_ft_spec_ss = hvac_ap.cool_cap_ft_spec
2861-
eir_ft_spec_ss = hvac_ap.cool_eir_ft_spec
28622864

28632865
datapoints_by_speed.each do |_capacity_description, datapoints|
28642866
datapoints.each do |dp|

HPXMLtoOpenStudio/resources/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22

33
# Collection of methods related to software versions.
44
module Version
5-
OS_HPXML_Version = '1.11.0' # Version of the OS-HPXML workflow
5+
OS_HPXML_Version = '1.11.1' # Version of the OS-HPXML workflow
66
OS_Version = '3.11.0' # Required version of OpenStudio (can be 'X.X' or 'X.X.X')
77
HPXML_Version = '5.0' # HPXML schemaVersion
88

HPXMLtoOpenStudio/tests/test_hvac.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,16 @@ def test_resnet_dx_ac_and_hp
105105
5 => [2541.1, 7535.3, 7531.5],
106106
-20 => [1585.7, 4536.7, 4496.8],
107107
}
108+
# Cooling indoor temps
109+
indoor_t_clg = [57.0, HVAC::AirSourceCoolRatedIWB, 72.0]
110+
# Heating coefficients to introduce indoor sensitivity
111+
cool_cap_ft_spec = [3.717717741, -0.09918866, 0.000964488, 0.005887776, -0.000012808, -0.000132822]
112+
cool_eir_ft_spec = [-3.400341169, 0.135184783, -0.001037932, -0.007852322, 0.000183438, -0.000142548]
113+
# Heating indoor temps
114+
indoor_t_htg = [60.0, HVAC::AirSourceHeatRatedIDB, 80.0]
115+
# Heating coefficients to introduce indoor sensitivity
116+
heat_cap_ft_spec = [0.568706266, -0.000747282, -0.0000103432, 0.00945408, 0.000050812, -0.00000677828]
117+
heat_eir_ft_spec = [0.722917608, 0.003520184, 0.000143097, -0.005760341, 0.000141736, -0.000216676]
108118

109119
# Check cooling coil
110120
assert_equal(1, model.getCoilCoolingDXMultiSpeeds.size)
@@ -117,12 +127,32 @@ def test_resnet_dx_ac_and_hp
117127
cops.each_with_index do |cop, i|
118128
eir_adj = _get_table_lookup_factor(clg_coil.stages[i].energyInputRatioFunctionofTemperatureCurve, HVAC::AirSourceCoolRatedIWB, odb)
119129
assert_in_epsilon(cop, 1.0 / eir_adj * clg_coil.stages[i].grossRatedCoolingCOP, tol)
130+
# Indoor sensitivity test
131+
indoor_t_clg.each do |indoor_t|
132+
# Indoor + outdoor impact from table lookup
133+
eir_adj_indoor = _get_table_lookup_factor(clg_coil.stages[i].energyInputRatioFunctionofTemperatureCurve, indoor_t, odb)
134+
# Indoor impact
135+
odb_indoor = [odb, 75.0].max
136+
eir_correction_factor = MathTools.biquadratic(indoor_t, odb_indoor, cool_eir_ft_spec) / MathTools.biquadratic(HVAC::AirSourceCoolRatedIWB, odb_indoor, cool_eir_ft_spec)
137+
# eir_correction_factor * eir_adj = eir_adj_indoor
138+
assert_in_epsilon(cop / eir_correction_factor, 1.0 / eir_adj_indoor * clg_coil.stages[i].grossRatedCoolingCOP, tol)
139+
end
120140
end
121141
end
122142
expected_clg_capacities.each do |odb, capacities|
123143
capacities.each_with_index do |capacity, i|
124144
cap_adj = _get_table_lookup_factor(clg_coil.stages[i].totalCoolingCapacityFunctionofTemperatureCurve, HVAC::AirSourceCoolRatedIWB, odb)
125145
assert_in_epsilon(capacity, cap_adj * UnitConversions.convert(clg_coil.stages[i].grossRatedTotalCoolingCapacity.get, 'W', 'Btu/hr'), tol)
146+
# Indoor sensitivity test
147+
indoor_t_clg.each do |indoor_t|
148+
# Indoor + outdoor impact from table lookup
149+
cap_adj_indoor = _get_table_lookup_factor(clg_coil.stages[i].totalCoolingCapacityFunctionofTemperatureCurve, indoor_t, odb)
150+
# Indoor impact
151+
odb_indoor = [odb, 75.0].max
152+
cap_correction_factor = MathTools.biquadratic(indoor_t, odb_indoor, cool_cap_ft_spec) / MathTools.biquadratic(HVAC::AirSourceCoolRatedIWB, odb_indoor, cool_cap_ft_spec)
153+
# cap_correction_factor * cap_adj = cap_adj_indoor
154+
assert_in_epsilon(capacity * cap_correction_factor, cap_adj_indoor * UnitConversions.convert(clg_coil.stages[i].grossRatedTotalCoolingCapacity.get, 'W', 'Btu/hr'), tol)
155+
end
126156
end
127157
end
128158
clg_coil.stages.each do |stage|
@@ -140,12 +170,29 @@ def test_resnet_dx_ac_and_hp
140170
cops.each_with_index do |cop, i|
141171
eir_adj = _get_table_lookup_factor(htg_coil.stages[i].energyInputRatioFunctionofTemperatureCurve, HVAC::AirSourceHeatRatedIDB, odb)
142172
assert_in_epsilon(cop, 1.0 / eir_adj * htg_coil.stages[i].grossRatedHeatingCOP, tol)
173+
# Indoor sensitivity test
174+
indoor_t_htg.each do |indoor_t|
175+
# Indoor + outdoor impact from table lookup
176+
eir_adj_indoor = _get_table_lookup_factor(htg_coil.stages[i].energyInputRatioFunctionofTemperatureCurve, indoor_t, odb)
177+
eir_correction_factor = MathTools.biquadratic(indoor_t, odb, heat_eir_ft_spec) / MathTools.biquadratic(HVAC::AirSourceHeatRatedIDB, odb, heat_eir_ft_spec)
178+
# eir_correction_factor * eir_adj = eir_adj_indoor
179+
assert_in_epsilon(cop / eir_correction_factor, 1.0 / eir_adj_indoor * htg_coil.stages[i].grossRatedHeatingCOP, tol)
180+
end
143181
end
144182
end
145183
expected_htg_capacities.each do |odb, capacities|
146184
capacities.each_with_index do |capacity, i|
147185
cap_adj = _get_table_lookup_factor(htg_coil.stages[i].heatingCapacityFunctionofTemperatureCurve, HVAC::AirSourceHeatRatedIDB, odb)
148186
assert_in_epsilon(capacity, cap_adj * UnitConversions.convert(htg_coil.stages[i].grossRatedHeatingCapacity.get, 'W', 'Btu/hr'), tol)
187+
# Indoor sensitivity test
188+
indoor_t_htg.each do |indoor_t|
189+
# Indoor + outdoor impact from table lookup
190+
cap_adj_indoor = _get_table_lookup_factor(htg_coil.stages[i].heatingCapacityFunctionofTemperatureCurve, indoor_t, odb)
191+
# Indoor impact
192+
cap_correction_factor = MathTools.biquadratic(indoor_t, odb, heat_cap_ft_spec) / MathTools.biquadratic(HVAC::AirSourceHeatRatedIDB, odb, heat_cap_ft_spec)
193+
# cap_correction_factor * cap_adj = cap_adj_indoor
194+
assert_in_epsilon(capacity * cap_correction_factor, cap_adj_indoor * UnitConversions.convert(htg_coil.stages[i].grossRatedHeatingCapacity.get, 'W', 'Btu/hr'), tol)
195+
end
149196
end
150197
end
151198

workflow/tests/base_results/results_hers_hvac.csv

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,5 @@ HVAC1b.xml,15.81,2.93
44
HVAC2a.xml,63.15,1.67
55
HVAC2b.xml,54.73,1.67
66
HVAC2c.xml,27.78,3.76
7-
HVAC2d.xml,16.08,3.76
7+
HVAC2d.xml,16.07,3.76
88
HVAC2e.xml,49.26,1.67

0 commit comments

Comments
 (0)