Skip to content

Commit

Permalink
Merge pull request #1927 from NREL/bugfix_glass_block
Browse files Browse the repository at this point in the history
Fix possible glass block error
  • Loading branch information
shorowit authored Feb 11, 2025
2 parents 5673cc7 + 1a3d1d9 commit 5c1f30d
Show file tree
Hide file tree
Showing 5 changed files with 106 additions and 55 deletions.
1 change: 1 addition & 0 deletions Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ __Bugfixes__
- Fixes using detailed schedules with higher resolution (e.g., 10-min data) than the simulation timestep (e.g., 60-min).
- Fixes possible heating/cooling spikes when using maximum power ratio detailed schedule for variable-speed HVAC systems.
- Fixes unavailable periods for two consecutive, but partial, days.
- Fixes error when specifying a glass block window without interior shading coefficients.

## OpenStudio-HPXML v1.9.1

Expand Down
8 changes: 4 additions & 4 deletions HPXMLtoOpenStudio/measure.xml
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,8 @@
<schema_version>3.1</schema_version>
<name>hpxm_lto_openstudio</name>
<uid>b1543b30-9465-45ff-ba04-1d1f85e763bc</uid>
<version_id>7452cd4f-7f20-4f03-9918-bed9f646f613</version_id>
<version_modified>2025-02-07T14:07:06Z</version_modified>
<version_id>d930ef4f-94ac-4929-b28b-1ea686827c40</version_id>
<version_modified>2025-02-10T23:12:49Z</version_modified>
<xml_checksum>D8922A73</xml_checksum>
<class_name>HPXMLtoOpenStudio</class_name>
<display_name>HPXML to OpenStudio Translator</display_name>
Expand Down Expand Up @@ -327,7 +327,7 @@
<filename>defaults.rb</filename>
<filetype>rb</filetype>
<usage_type>resource</usage_type>
<checksum>CF7C5504</checksum>
<checksum>95DC8E59</checksum>
</file>
<file>
<filename>energyplus.rb</filename>
Expand Down Expand Up @@ -669,7 +669,7 @@
<filename>test_defaults.rb</filename>
<filetype>rb</filetype>
<usage_type>test</usage_type>
<checksum>45AEFA27</checksum>
<checksum>14188CF9</checksum>
</file>
<file>
<filename>test_enclosure.rb</filename>
Expand Down
108 changes: 58 additions & 50 deletions HPXMLtoOpenStudio/resources/defaults.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1512,34 +1512,36 @@ def self.apply_windows(hpxml_bldg, eri_version)

hpxml_bldg.windows.each do |window|
if window.ufactor.nil? || window.shgc.nil?
# Frame/Glass provided instead, fill in more defaults as needed
if window.glass_type.nil?
window.glass_type = HPXML::WindowGlassTypeClear
window.glass_type_isdefaulted = true
end
if window.thermal_break.nil? && [HPXML::WindowFrameTypeAluminum, HPXML::WindowFrameTypeMetal].include?(window.frame_type)
if window.glass_layers == HPXML::WindowLayersSinglePane
window.thermal_break = false
window.thermal_break_isdefaulted = true
elsif window.glass_layers == HPXML::WindowLayersDoublePane
window.thermal_break = true
window.thermal_break_isdefaulted = true
if window.glass_layers != HPXML::WindowLayersGlassBlock
# Frame/Glass provided instead, fill in more defaults as needed
if window.glass_type.nil?
window.glass_type = HPXML::WindowGlassTypeClear
window.glass_type_isdefaulted = true
end
end
if window.gas_fill.nil?
if window.glass_layers == HPXML::WindowLayersDoublePane
if [HPXML::WindowGlassTypeLowE,
HPXML::WindowGlassTypeLowEHighSolarGain,
HPXML::WindowGlassTypeLowELowSolarGain].include? window.glass_type
if window.thermal_break.nil? && [HPXML::WindowFrameTypeAluminum, HPXML::WindowFrameTypeMetal].include?(window.frame_type)
if window.glass_layers == HPXML::WindowLayersSinglePane
window.thermal_break = false
window.thermal_break_isdefaulted = true
elsif window.glass_layers == HPXML::WindowLayersDoublePane
window.thermal_break = true
window.thermal_break_isdefaulted = true
end
end
if window.gas_fill.nil?
if window.glass_layers == HPXML::WindowLayersDoublePane
if [HPXML::WindowGlassTypeLowE,
HPXML::WindowGlassTypeLowEHighSolarGain,
HPXML::WindowGlassTypeLowELowSolarGain].include? window.glass_type
window.gas_fill = HPXML::WindowGasArgon
window.gas_fill_isdefaulted = true
else
window.gas_fill = HPXML::WindowGasAir
window.gas_fill_isdefaulted = true
end
elsif window.glass_layers == HPXML::WindowLayersTriplePane
window.gas_fill = HPXML::WindowGasArgon
window.gas_fill_isdefaulted = true
else
window.gas_fill = HPXML::WindowGasAir
window.gas_fill_isdefaulted = true
end
elsif window.glass_layers == HPXML::WindowLayersTriplePane
window.gas_fill = HPXML::WindowGasArgon
window.gas_fill_isdefaulted = true
end
end
# Now lookup U/SHGC based on properties
Expand All @@ -1563,7 +1565,11 @@ def self.apply_windows(hpxml_bldg, eri_version)
end
if window.interior_shading_factor_winter.nil? || window.interior_shading_factor_summer.nil?
if window.interior_shading_type.nil?
window.interior_shading_type = HPXML::InteriorShadingTypeLightCurtains # ANSI/RESNET/ICC 301-2022
if window.glass_layers == HPXML::WindowLayersGlassBlock
window.interior_shading_type = HPXML::InteriorShadingTypeNone
else
window.interior_shading_type = HPXML::InteriorShadingTypeLightCurtains # ANSI/RESNET/ICC 301-2022
end
window.interior_shading_type_isdefaulted = true
end
if window.interior_shading_coverage_summer.nil? && window.interior_shading_type != HPXML::InteriorShadingTypeNone
Expand Down Expand Up @@ -1713,34 +1719,36 @@ def self.apply_skylights(hpxml_bldg)
end
next unless skylight.ufactor.nil? || skylight.shgc.nil?

# Frame/Glass provided instead, fill in more defaults as needed
if skylight.glass_type.nil?
skylight.glass_type = HPXML::WindowGlassTypeClear
skylight.glass_type_isdefaulted = true
end
if skylight.thermal_break.nil? && [HPXML::WindowFrameTypeAluminum, HPXML::WindowFrameTypeMetal].include?(skylight.frame_type)
if skylight.glass_layers == HPXML::WindowLayersSinglePane
skylight.thermal_break = false
skylight.thermal_break_isdefaulted = true
elsif skylight.glass_layers == HPXML::WindowLayersDoublePane
skylight.thermal_break = true
skylight.thermal_break_isdefaulted = true
end
end
if skylight.gas_fill.nil?
if skylight.glass_layers == HPXML::WindowLayersDoublePane
if [HPXML::WindowGlassTypeLowE,
HPXML::WindowGlassTypeLowEHighSolarGain,
HPXML::WindowGlassTypeLowELowSolarGain].include? skylight.glass_type
if skylight.glass_layers != HPXML::WindowLayersGlassBlock
# Frame/Glass provided instead, fill in more defaults as needed
if skylight.glass_type.nil?
skylight.glass_type = HPXML::WindowGlassTypeClear
skylight.glass_type_isdefaulted = true
end
if skylight.thermal_break.nil? && [HPXML::WindowFrameTypeAluminum, HPXML::WindowFrameTypeMetal].include?(skylight.frame_type)
if skylight.glass_layers == HPXML::WindowLayersSinglePane
skylight.thermal_break = false
skylight.thermal_break_isdefaulted = true
elsif skylight.glass_layers == HPXML::WindowLayersDoublePane
skylight.thermal_break = true
skylight.thermal_break_isdefaulted = true
end
end
if skylight.gas_fill.nil?
if skylight.glass_layers == HPXML::WindowLayersDoublePane
if [HPXML::WindowGlassTypeLowE,
HPXML::WindowGlassTypeLowEHighSolarGain,
HPXML::WindowGlassTypeLowELowSolarGain].include? skylight.glass_type
skylight.gas_fill = HPXML::WindowGasArgon
skylight.gas_fill_isdefaulted = true
else
skylight.gas_fill = HPXML::WindowGasAir
skylight.gas_fill_isdefaulted = true
end
elsif skylight.glass_layers == HPXML::WindowLayersTriplePane
skylight.gas_fill = HPXML::WindowGasArgon
skylight.gas_fill_isdefaulted = true
else
skylight.gas_fill = HPXML::WindowGasAir
skylight.gas_fill_isdefaulted = true
end
elsif skylight.glass_layers == HPXML::WindowLayersTriplePane
skylight.gas_fill = HPXML::WindowGasArgon
skylight.gas_fill_isdefaulted = true
end
end
# Now lookup U/SHGC based on properties
Expand Down
42 changes: 42 additions & 0 deletions HPXMLtoOpenStudio/tests/test_defaults.rb
Original file line number Diff line number Diff line change
Expand Up @@ -1166,6 +1166,27 @@ def test_windows_physical_properties
assert_equal(HPXML::WindowGlassTypeLowE, default_hpxml_bldg.windows[0].glass_type)
assert_equal(HPXML::WindowGasArgon, default_hpxml_bldg.windows[0].gas_fill)

# Test defaults w/ glass block
hpxml, hpxml_bldg = _create_hpxml('base.xml')
hpxml_bldg.windows[0].ufactor = nil
hpxml_bldg.windows[0].shgc = nil
hpxml_bldg.windows[0].glass_layers = HPXML::WindowLayersGlassBlock
hpxml_bldg.windows[0].interior_shading_factor_summer = nil
hpxml_bldg.windows[0].interior_shading_factor_winter = nil
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
assert_nil(default_hpxml_bldg.windows[0].thermal_break)
assert_nil(default_hpxml_bldg.windows[0].glass_type)
assert_nil(default_hpxml_bldg.windows[0].gas_fill)

# Test defaults w/ glass block and interior shading type
hpxml_bldg.windows[0].interior_shading_type = HPXML::InteriorShadingTypeDarkShades
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
assert_nil(default_hpxml_bldg.windows[0].thermal_break)
assert_nil(default_hpxml_bldg.windows[0].glass_type)
assert_nil(default_hpxml_bldg.windows[0].gas_fill)

# Test U/SHGC lookups [frame_type, thermal_break, glass_layers, glass_type, gas_fill] => [ufactor, shgc]
tests = { [HPXML::WindowFrameTypeAluminum, false, HPXML::WindowLayersSinglePane, nil, nil] => [1.27, 0.75],
[HPXML::WindowFrameTypeWood, nil, HPXML::WindowLayersSinglePane, HPXML::WindowGlassTypeReflective, nil] => [0.89, 0.64],
Expand Down Expand Up @@ -1414,6 +1435,27 @@ def test_skylights_physical_properties
assert_equal(HPXML::WindowGlassTypeLowE, default_hpxml_bldg.skylights[0].glass_type)
assert_equal(HPXML::WindowGasArgon, default_hpxml_bldg.skylights[0].gas_fill)

# Test defaults w/ glass block
hpxml, hpxml_bldg = _create_hpxml('base-enclosure-skylights.xml')
hpxml_bldg.skylights[0].ufactor = nil
hpxml_bldg.skylights[0].shgc = nil
hpxml_bldg.skylights[0].glass_layers = HPXML::WindowLayersGlassBlock
hpxml_bldg.skylights[0].interior_shading_factor_summer = nil
hpxml_bldg.skylights[0].interior_shading_factor_winter = nil
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
assert_nil(default_hpxml_bldg.skylights[0].thermal_break)
assert_nil(default_hpxml_bldg.skylights[0].glass_type)
assert_nil(default_hpxml_bldg.skylights[0].gas_fill)

# Test defaults w/ glass block and interior shading type
hpxml_bldg.skylights[0].interior_shading_type = HPXML::InteriorShadingTypeDarkShades
XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
_default_hpxml, default_hpxml_bldg = _test_measure()
assert_nil(default_hpxml_bldg.skylights[0].thermal_break)
assert_nil(default_hpxml_bldg.skylights[0].glass_type)
assert_nil(default_hpxml_bldg.skylights[0].gas_fill)

# Test U/SHGC lookups [frame_type, thermal_break, glass_layers, glass_type, gas_fill] => [ufactor, shgc]
tests = { [HPXML::WindowFrameTypeAluminum, false, HPXML::WindowLayersSinglePane, nil, nil] => [1.98, 0.75],
[HPXML::WindowFrameTypeWood, nil, HPXML::WindowLayersSinglePane, HPXML::WindowGlassTypeReflective, nil] => [1.47, 0.64],
Expand Down
2 changes: 1 addition & 1 deletion docs/source/workflow_inputs.rst
Original file line number Diff line number Diff line change
Expand Up @@ -1679,7 +1679,7 @@ Either winter/summer shading coefficients can be directly provided, or they can
============================ ====== ===== =========== ======== ========= =============================================================

.. [#] Type choices are "light blinds", "medium blinds", "dark blinds", "light shades", "medium shades", "dark shades", "light curtains", "medium curtains", "dark curtains", "other", or "none".
.. [#] If Type not provided, and either SummerShadingCoefficient or WinterShadingCoefficient not provided, defaults to "light curtains".
.. [#] If Type not provided, and either SummerShadingCoefficient or WinterShadingCoefficient not provided, defaults to "light curtains" if not glass block windows and "none" for glass block windows.
.. [#] BlindsSummerClosedOrOpen choices are "closed", "open", or "half open".
.. [#] BlindsWinterClosedOrOpen choices are "closed", "open", or "half open".
.. [#] If SummerFractionCovered not provided, defaults to 1.0 for blinds and 0.5 for shades/curtains/other.
Expand Down

0 comments on commit 5c1f30d

Please sign in to comment.