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

Sign up to get free protection for your applications and to get access to all the features.
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