openstudio-standards 0.2.15.pre.rc2 → 0.2.16.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAEHighriseApartment.osm +0 -27
  3. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  4. data/data/standards/OpenStudio_Standards-ashrae_90_1_28Jan2022.xlsx +0 -0
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1_28_Jan2022_2.xlsx +0 -0
  6. data/data/standards/export_OpenStudio_libraries.rb +2 -0
  7. data/data/standards/test_performance_expected_dd_results.csv +710 -710
  8. data/lib/openstudio-standards/btap/btap_result.rb +2 -2
  9. data/lib/openstudio-standards/btap/reporting.rb +2 -2
  10. data/lib/openstudio-standards/btap/simmanager.rb +2 -2
  11. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +0 -54
  12. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +11 -1
  13. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +1 -1
  14. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +2 -2
  15. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +26 -5
  16. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +14 -6
  17. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +12 -9
  18. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +35 -16
  19. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +23 -10
  20. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +36 -0
  21. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +6 -6
  22. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +24 -15
  23. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +2 -2
  24. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -3
  25. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +2 -0
  26. data/lib/openstudio-standards/standards/Standards.Construction.rb +12 -6
  27. data/lib/openstudio-standards/standards/Standards.Model.rb +42 -7
  28. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +15 -0
  29. data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
  30. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +7 -0
  31. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +5 -2
  32. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +32 -11
  33. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +22 -742
  34. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +2 -2
  35. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3 -3
  36. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +6 -6
  37. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +19 -559
  38. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +2 -2
  39. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3 -3
  40. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +6 -6
  41. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +19 -559
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +2 -2
  43. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +5 -5
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +7 -7
  45. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +19 -559
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +2 -2
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +5 -5
  48. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +7 -7
  49. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +370 -910
  50. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2 -2
  51. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +6 -6
  52. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +0 -8
  53. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +12 -12
  54. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +19 -6
  55. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +2380 -1300
  56. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2 -2
  57. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +6 -6
  58. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +0 -8
  59. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +12 -12
  60. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +140 -0
  61. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1176 -312
  62. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +172 -1132
  63. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_sets.json +14 -14
  64. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +2 -2
  65. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +9 -9
  66. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +180 -1140
  67. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_sets.json +14 -14
  68. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +2 -2
  69. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +10 -10
  70. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +9 -9
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +9 -9
  72. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +15 -0
  73. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +12 -6
  74. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +12 -6
  75. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +16 -8
  76. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +10 -20
  77. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +209 -37
  78. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +1 -0
  79. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +8 -6
  80. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +16 -9
  81. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartment.osm +1 -1
  82. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +1 -1
  83. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/MidriseApartment.osm +1 -1
  84. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +9 -5
  85. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +10 -6
  86. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +9 -5
  87. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -8
  88. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +14 -8
  89. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -6
  90. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -6
  91. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +4 -2
  92. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +38 -19
  93. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +2 -2
  94. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +15 -4
  95. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +10 -651
  96. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +8 -38
  97. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +159 -0
  98. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +41 -43
  99. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +7 -4
  100. data/lib/openstudio-standards/version.rb +1 -1
  101. data/lib/openstudio-standards.rb +1 -0
  102. metadata +5 -2
@@ -489,7 +489,7 @@ class Standard
489
489
  fan_pwr_limit_type = 'variable volume'
490
490
  elsif comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.is_initialized
491
491
  fan = comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.get.supplyAirFan
492
- if fan.to_FanConstantVolume.is_initialized || comp.to_FanOnOff.is_initialized
492
+ if fan.to_FanConstantVolume.is_initialized || fan.to_FanOnOff.is_initialized
493
493
  fan_pwr_limit_type = 'constant volume'
494
494
  elsif fan.to_FanVariableVolume.is_initialized
495
495
  fan_pwr_limit_type = 'variable volume'
@@ -1712,7 +1712,7 @@ class Standard
1712
1712
  heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
1713
1713
 
1714
1714
  # add economizer lockout
1715
- erv.setSupplyAirOutletTemperatureControl(false)
1715
+ erv.setSupplyAirOutletTemperatureControl(true)
1716
1716
  erv.setEconomizerLockout(true)
1717
1717
 
1718
1718
  # add defrost
@@ -103,7 +103,6 @@ class Standard
103
103
  # @param sql_db_vars_map [Hash] hash map
104
104
  # @return [Hash] hash of coil objects
105
105
  def coil_cooling_water_to_air_heat_pump_apply_efficiency_and_curves(coil_cooling_water_to_air_heat_pump, sql_db_vars_map)
106
- successfully_set_all_properties = true
107
106
 
108
107
  # Get the search criteria
109
108
  search_criteria = {}
@@ -116,8 +115,15 @@ class Standard
116
115
 
117
116
  # Check to make sure properties were found
118
117
  if coil_props.nil?
119
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "For #{coil_cooling_water_to_air_heat_pump.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
120
- successfully_set_all_properties = false
118
+ # search again without capacity
119
+ matching_objects = model_find_objects(standards_data['water_source_heat_pumps'], search_criteria, nil, Date.today)
120
+ if matching_objects.size.zero?
121
+ # This proves that the search_criteria has issue finding the correct coil prop
122
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "For #{coil_cooling_water_to_air_heat_pump.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
123
+ else
124
+ # Issue warning indicate the coil size is may be too large
125
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "The capacity of the coil: #{coil_cooling_water_to_air_heat_pump.name} maybe too large to be found in the efficiency standard. The coil capacity is #{capacity_btu_per_hr} Btu/hr.")
126
+ end
121
127
  return sql_db_vars_map
122
128
  end
123
129
 
@@ -22,6 +22,8 @@ class Standard
22
22
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
23
23
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
24
24
 
25
+ return false unless capacity_btu_per_hr > 0
26
+
25
27
  # Get the boiler properties, if it exists for this template
26
28
  return false unless standards_data.include?('furnaces')
27
29
 
@@ -83,16 +83,22 @@ class Standard
83
83
  # and the R-value of the non-insulation layers and air films.
84
84
  # This is the desired R-value of the insulation.
85
85
  ins_r_value_si = target_r_value_si - other_layer_r_value_si
86
- if ins_r_value_si <= 0.0
87
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Construction', "Requested U-value of #{target_u_value_ip} for #{construction.name} is too low given the other materials in the construction; insulation layer will not be modified.")
88
- return false
89
- end
90
- ins_r_value_ip = OpenStudio.convert(ins_r_value_si, 'm^2*K/W', 'ft^2*h*R/Btu').get
91
86
 
92
87
  # Set the R-value of the insulation layer
93
- construction.layers.each do |layer|
88
+ construction.layers.each_with_index do |layer, l|
94
89
  next unless layer.name.get == insulation_layer_name
95
90
 
91
+ # Remove insulation layer if requested R-value is lower than sum of non-insulation materials
92
+ if ins_r_value_si <= 0.0
93
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Construction', "Requested U-value of #{target_u_value_ip} for #{construction.name} is too low given the other materials in the construction; insulation layer will be removed.")
94
+ construction.eraseLayer(l)
95
+ # Set the target R-value to the sum of other layers to make name match properties
96
+ target_r_value_ip = OpenStudio.convert(other_layer_r_value_si, 'm^2*K/W', 'ft^2*hr*R/Btu').get
97
+ break # Don't modify the insulation layer since it has been removed
98
+ end
99
+
100
+ # Modify the insulation layer
101
+ ins_r_value_ip = OpenStudio.convert(ins_r_value_si, 'm^2*K/W', 'ft^2*h*R/Btu').get
96
102
  if layer.to_StandardOpaqueMaterial.is_initialized
97
103
  layer = layer.to_StandardOpaqueMaterial.get
98
104
  layer.setThickness(ins_r_value_si * layer.conductivity)
@@ -2524,12 +2524,28 @@ class Standard
2524
2524
  # which specifies properties by construction category by climate zone set.
2525
2525
  # AKA the info in Tables 5.5-1-5.5-8
2526
2526
 
2527
- props = model_find_object(standards_data['construction_properties'],
2528
- 'template' => template,
2529
- 'climate_zone_set' => climate_zone_set,
2530
- 'intended_surface_type' => intended_surface_type,
2531
- 'standards_construction_type' => standards_construction_type,
2532
- 'building_category' => building_category)
2527
+ wwr = model_get_percent_of_surface_range(model, intended_surface_type)
2528
+
2529
+ search_criteria = { 'template' => template,
2530
+ 'climate_zone_set' => climate_zone_set,
2531
+ 'intended_surface_type' => intended_surface_type,
2532
+ 'standards_construction_type' => standards_construction_type,
2533
+ 'building_category' => building_category }
2534
+
2535
+ if !wwr['minimum_percent_of_surface'].nil? && !wwr['maximum_percent_of_surface'].nil?
2536
+ search_criteria['minimum_percent_of_surface'] = wwr['minimum_percent_of_surface']
2537
+ search_criteria['maximum_percent_of_surface'] = wwr['maximum_percent_of_surface']
2538
+ end
2539
+
2540
+ # First search
2541
+ props = model_find_object(standards_data['construction_properties'], search_criteria)
2542
+
2543
+ if !props
2544
+ # Second search: In case need to use climate zone (e.g: 3) instead of sub-climate zone (e.g: 3A) for search
2545
+ climate_zone = climate_zone_set[0..-2]
2546
+ search_criteria['climate_zone_set'] = climate_zone
2547
+ props = model_find_object(standards_data['construction_properties'], search_criteria)
2548
+ end
2533
2549
 
2534
2550
  if !props
2535
2551
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find construction properties for: #{template}-#{climate_zone_set}-#{intended_surface_type}-#{standards_construction_type}-#{building_category}.")
@@ -3602,6 +3618,12 @@ class Standard
3602
3618
  # switch to use this but update test in standards and measures to load this outside of the method
3603
3619
  construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
3604
3620
 
3621
+ if !construction_properties
3622
+ # Search again use climate zone (e.g. 3) instead of sub-climate zone (3A)
3623
+ search_criteria['climate_zone_set'] = climate_zone_set[0..-2]
3624
+ construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
3625
+ end
3626
+
3605
3627
  return construction_properties
3606
3628
  end
3607
3629
 
@@ -3962,6 +3984,9 @@ class Standard
3962
3984
 
3963
3985
  # Air loops
3964
3986
  model.getAirLoopHVACs.each(&:remove)
3987
+ if model.version > OpenStudio::VersionString.new('3.1.0')
3988
+ model.getAirLoopHVACDedicatedOutdoorAirSystems.each(&:remove)
3989
+ end
3965
3990
 
3966
3991
  # Zone equipment
3967
3992
  model.getThermalZones.sort.each do |zone|
@@ -4290,7 +4315,7 @@ class Standard
4290
4315
  # @param possible_climate_zone_sets [Array] climate zone sets
4291
4316
  # @return [String] climate zone ses
4292
4317
  def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
4293
- climate_zone_set = possible_climate_zone_sets.min
4318
+ climate_zone_set = possible_climate_zone_sets.max
4294
4319
  return climate_zone_set
4295
4320
  end
4296
4321
 
@@ -5185,6 +5210,7 @@ class Standard
5185
5210
  electric = true
5186
5211
 
5187
5212
  if htg_fuels.include?('NaturalGas') ||
5213
+ htg_fuels.include?('Propane') ||
5188
5214
  htg_fuels.include?('PropaneGas') ||
5189
5215
  htg_fuels.include?('FuelOilNo1') ||
5190
5216
  htg_fuels.include?('FuelOilNo2') ||
@@ -5779,6 +5805,15 @@ class Standard
5779
5805
  return parametric_inputs
5780
5806
  end
5781
5807
 
5808
+ # Determine the surface range of a baseline model.
5809
+ # The method calculates the window to wall ratio (assuming all spaces are conditioned)
5810
+ # and select the range based on the calculated window to wall ratio
5811
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5812
+ # @param intended_surface_type [String] surface type
5813
+ def model_get_percent_of_surface_range(model, intended_surface_type)
5814
+ return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
5815
+ end
5816
+
5782
5817
  # Default SAT reset type
5783
5818
  #
5784
5819
  # @param air_loop_hvac [OpenStudio::Model::AirLoopHVAC] air loop
@@ -92,6 +92,21 @@ class Standard
92
92
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards fenestration type for #{planar_surface.name} from #{construction.name}. This surface will not have the standard applied.")
93
93
  return previous_construction_map
94
94
  end
95
+ # Exterior Doors
96
+ elsif surf_type == 'ExteriorDoor'
97
+ stds_type = standards_info.standardsConstructionType
98
+ if stds_type.is_initialized
99
+ stds_type = stds_type.get
100
+ case stds_type
101
+ when 'RollUp', 'Rollup', 'NonSwinging', 'Nonswinging'
102
+ stds_type = 'NonSwinging'
103
+ else
104
+ stds_type = 'Swinging'
105
+ end
106
+ else
107
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards construction type for exterior door #{planar_surface.name}. This door will not have the standard applied.")
108
+ return previous_construction_map
109
+ end
95
110
  # All other surface types
96
111
  else
97
112
  stds_type = standards_info.standardsConstructionType
@@ -321,7 +321,7 @@ class Standard
321
321
  min_y_val = vertex.y
322
322
  end
323
323
  # Max y value
324
- if vertex.y > max_x_val
324
+ if vertex.y > max_y_val
325
325
  max_y_val = vertex.y
326
326
  end
327
327
  end
@@ -599,6 +599,13 @@ class Standard
599
599
  # switch to use this but update test in standards and measures to load this outside of the method
600
600
  construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
601
601
 
602
+ if !construction_properties
603
+ # Search again use climate zone (e.g. 3) instead of sub-climate zone (3A)
604
+ search_criteria['climate_zone_set'] = climate_zone_set[0..-2]
605
+ construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
606
+ end
607
+
608
+
602
609
  return construction_properties
603
610
  end
604
611
  end
@@ -602,12 +602,13 @@ class Standard
602
602
 
603
603
  # Get an array of the heating fuels
604
604
  # used by the zone. Possible values are
605
- # Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2,
605
+ # Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
606
606
  # Coal, Diesel, Gasoline, DistrictHeating,
607
607
  # and SolarEnergy.
608
608
  htg_fuels = thermal_zone.heating_fuels
609
609
 
610
610
  if htg_fuels.include?('NaturalGas') ||
611
+ htg_fuels.include?('Propane') ||
611
612
  htg_fuels.include?('PropaneGas') ||
612
613
  htg_fuels.include?('FuelOilNo1') ||
613
614
  htg_fuels.include?('FuelOilNo2') ||
@@ -641,6 +642,7 @@ class Standard
641
642
  # Fossil heating
642
643
  htg_fuels = thermal_zone.heating_fuels
643
644
  if htg_fuels.include?('NaturalGas') ||
645
+ htg_fuels.include?('Propane') ||
644
646
  htg_fuels.include?('PropaneGas') ||
645
647
  htg_fuels.include?('FuelOilNo1') ||
646
648
  htg_fuels.include?('FuelOilNo2') ||
@@ -703,7 +705,7 @@ class Standard
703
705
 
704
706
  # Get an array of the heating fuels
705
707
  # used by the zone. Possible values are
706
- # Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2,
708
+ # Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
707
709
  # Coal, Diesel, Gasoline, DistrictHeating,
708
710
  # and SolarEnergy.
709
711
  htg_fuels = thermal_zone.heating_fuels
@@ -711,6 +713,7 @@ class Standard
711
713
  # Includes fossil
712
714
  fossil = false
713
715
  if htg_fuels.include?('NaturalGas') ||
716
+ htg_fuels.include?('Propane') ||
714
717
  htg_fuels.include?('PropaneGas') ||
715
718
  htg_fuels.include?('FuelOilNo1') ||
716
719
  htg_fuels.include?('FuelOilNo2') ||
@@ -1,16 +1,37 @@
1
1
  class ASHRAE9012004 < ASHRAE901
2
2
  # @!group Model
3
+ #
4
+ # Determine the surface range of a baseline model.
5
+ # The method calculates the window to wall ratio (assuming all spaces are conditioned)
6
+ # and select the range based on the calculated window to wall ratio
7
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
8
+ # @param intended_surface_type [String] intended surface type
9
+ def model_get_percent_of_surface_range(model, intended_surface_type)
10
+ wwr_range = {}
3
11
 
4
- # Determine which climate zone to use.
5
- # Uses the most specific climate zone set for most
6
- # climate zones, except for ClimateZone 3, which
7
- # uses the least specific climate zone.
8
- def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
9
- climate_zone_set = if possible_climate_zone_sets.include? 'ClimateZone 3'
10
- possible_climate_zone_sets.max
11
- else
12
- possible_climate_zone_sets.min
13
- end
14
- return climate_zone_set
12
+ # Do not process surfaces other than exterior windows and glass door for 2004 standard
13
+ if intended_surface_type != 'ExteriorWindow' && intended_surface_type != 'GlassDoor'
14
+ wwr_range['minimum_percent_of_surface'] = nil
15
+ wwr_range['maximum_percent_of_surface'] = nil
16
+ else
17
+ wwr = model_get_window_area_info(model, true)
18
+ if wwr <= 10
19
+ wwr_range['minimum_percent_of_surface'] = 1.0
20
+ wwr_range['maximum_percent_of_surface'] = 10.0
21
+ elsif wwr <= 20
22
+ wwr_range['minimum_percent_of_surface'] = 10.001
23
+ wwr_range['maximum_percent_of_surface'] = 20
24
+ elsif wwr <= 30
25
+ wwr_range['minimum_percent_of_surface'] = 20.001
26
+ wwr_range['maximum_percent_of_surface'] = 30
27
+ elsif wwr <= 40
28
+ wwr_range['minimum_percent_of_surface'] = 30.001
29
+ wwr_range['maximum_percent_of_surface'] = 40
30
+ else
31
+ wwr_range['minimum_percent_of_surface'] = 40.001
32
+ wwr_range['maximum_percent_of_surface'] = 100.0
33
+ end
34
+ end
35
+ return wwr_range
15
36
  end
16
37
  end