openstudio-standards 0.2.15 → 0.2.16.rc1

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 (94) 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/test_performance_expected_dd_results.csv +710 -710
  6. data/lib/openstudio-standards/btap/btap_result.rb +2 -2
  7. data/lib/openstudio-standards/btap/reporting.rb +2 -2
  8. data/lib/openstudio-standards/btap/simmanager.rb +2 -2
  9. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +0 -54
  10. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +11 -1
  11. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +1 -1
  12. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +26 -5
  13. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +35 -16
  14. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +23 -10
  15. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +36 -0
  16. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +6 -6
  17. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +0 -3
  18. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +2 -2
  19. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -3
  20. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +2 -0
  21. data/lib/openstudio-standards/standards/Standards.Construction.rb +12 -6
  22. data/lib/openstudio-standards/standards/Standards.Model.rb +38 -7
  23. data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
  24. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +7 -0
  25. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +32 -11
  26. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +22 -742
  27. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +2 -2
  28. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3 -3
  29. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +6 -6
  30. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +19 -559
  31. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +2 -2
  32. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3 -3
  33. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +6 -6
  34. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +19 -559
  35. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +2 -2
  36. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +5 -5
  37. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +7 -7
  38. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +19 -559
  39. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +2 -2
  40. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +5 -5
  41. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +7 -7
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +370 -910
  43. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2 -2
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +6 -6
  45. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +0 -8
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +12 -12
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +19 -6
  48. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +2380 -1300
  49. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2 -2
  50. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +6 -6
  51. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +0 -8
  52. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +12 -12
  53. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +140 -0
  54. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1176 -312
  55. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +172 -1132
  56. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_sets.json +14 -14
  57. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +2 -2
  58. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +9 -9
  59. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +180 -1140
  60. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_sets.json +14 -14
  61. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +2 -2
  62. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +10 -10
  63. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +9 -9
  64. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +9 -9
  65. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +12 -6
  66. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +12 -6
  67. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +16 -8
  68. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +10 -20
  69. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +209 -37
  70. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +1 -0
  71. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +8 -6
  72. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +16 -9
  73. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartment.osm +1 -1
  74. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +1 -1
  75. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/MidriseApartment.osm +1 -1
  76. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +9 -5
  77. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +10 -6
  78. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +9 -5
  79. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -8
  80. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +14 -8
  81. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -6
  82. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -6
  83. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +4 -2
  84. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +38 -19
  85. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +2 -2
  86. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +15 -4
  87. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +10 -651
  88. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +8 -38
  89. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +159 -0
  90. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +41 -43
  91. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +7 -4
  92. data/lib/openstudio-standards/version.rb +1 -1
  93. data/lib/openstudio-standards.rb +1 -0
  94. metadata +4 -2
@@ -20,8 +20,8 @@ module BTAP
20
20
  " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Electricity' AND RowName='Electricity:Facility'" +
21
21
  " AND ColumnName='Electricity Maximum Value' AND Units='W'")
22
22
  natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
23
- " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='Gas:Facility'" +
24
- " AND ColumnName='Gas Maximum Value' AND Units='W'")
23
+ " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Natural Gas' AND RowName='NaturalGas:Facility'" +
24
+ " AND ColumnName='Natural Gas Maximum Value' AND Units='W'")
25
25
 
26
26
  # Create hash to store all the collected data.
27
27
  qaqc = {}
@@ -215,8 +215,8 @@ module BTAP
215
215
  end
216
216
 
217
217
  natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
218
- " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='Gas:Facility'" +
219
- " AND ColumnName='Gas Maximum Value' AND Units='W'")
218
+ " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Natural Gas' AND RowName='NaturalGas:Facility'" +
219
+ " AND ColumnName='Natural Gas Maximum Value' AND Units='W'")
220
220
  if natural_gas_peak.empty?
221
221
  natural_gas_peak = 0.0
222
222
  end
@@ -472,8 +472,8 @@ module BTAP
472
472
  end
473
473
 
474
474
  natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
475
- " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='Gas:Facility'" +
476
- " AND ColumnName='Gas Maximum Value' AND Units='W'")
475
+ " AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Natural Gas' AND RowName='NaturalGas:Facility'" +
476
+ " AND ColumnName='Natural Gas Maximum Value' AND Units='W'")
477
477
  if natural_gas_peak.empty?
478
478
  natural_gas_peak = 0.0
479
479
  end
@@ -54,60 +54,6 @@ class OpenStudio::Model::ControllerOutdoorAir
54
54
  end
55
55
  air_loop = oa_sys.airLoop.get
56
56
 
57
- # Determine if the system is multizone
58
- multizone = false
59
- if air_loop.thermalZones.size > 1
60
- multizone = true
61
- end
62
-
63
- # Determine if the system is variable volume
64
- vav = false
65
- air_loop.supplyComponents.reverse.each do |comp|
66
- if comp.to_FanVariableVolume.is_initialized
67
- vav = true
68
- elsif comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.is_initialized
69
- fan = comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.get.supplyAirFan
70
- if fan.to_FanVariableVolume.is_initialized
71
- vav = true
72
- end
73
- elsif comp.to_AirLoopHVACUnitarySystem.is_initialized
74
- fan = comp.to_AirLoopHVACUnitarySystem.get.supplyFan
75
- if fan.is_initialized
76
- if fan.get.to_FanVariableVolume.is_initialized
77
- vav = true
78
- end
79
- end
80
- end
81
- end
82
-
83
- # If it is a multizone VAV system, get the system multiplier
84
- # to work around the bug in EnergyPlus.
85
- if multizone && vav
86
- if oa.is_initialized
87
- oa_val = oa.get
88
-
89
- # Get the system multiplier
90
- mult = 1
91
-
92
- # Get all the zone multipliers
93
- zn_mults = []
94
- air_loop.thermalZones.each do |zone|
95
- zn_mults << zone.multiplier
96
- end
97
-
98
- # Warn if there are different multipliers
99
- uniq_mults = zn_mults.uniq
100
- if uniq_mults.size > 1
101
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop.name}: not all zones on the system have an identical zone multiplier. Multipliers are: #{uniq_mults.join(', ')}.")
102
- else
103
- mult = uniq_mults[0]
104
- end
105
-
106
- oa_val = oa_val * mult
107
- oa = OpenStudio::OptionalDouble.new(oa_val)
108
- end
109
- end
110
-
111
57
  return oa
112
58
  end
113
59
  end
@@ -263,6 +263,11 @@ class OpenStudio::Model::Model
263
263
  # Get the object type
264
264
  obj_type = equipment.iddObjectType.valueName.to_s
265
265
  case obj_type
266
+ when 'OS_AirLooHVAC_UnitarySystem'
267
+ equipment = equipment.to_AirLoopHVACUnitarySystem.get
268
+ if equipment.heatingCoil.is_initialized
269
+ fuels += self.coil_heating_fuels(equipment.heatingCoil.get)
270
+ end
266
271
  when 'OS_AirTerminal_SingleDuct_ConstantVolume_FourPipeInduction'
267
272
  equipment = equipment.to_AirTerminalSingleDuctConstantVolumeFourPipeInduction.get
268
273
  fuels += self.coil_heating_fuels(equipment.heatingCoil)
@@ -350,7 +355,12 @@ class OpenStudio::Model::Model
350
355
  zone.equipment.each do |equipment|
351
356
  # Get the object type
352
357
  obj_type = equipment.iddObjectType.valueName.to_s
353
- case obj_type
358
+ case obj_type
359
+ when 'OS_AirLoopHVAC_UnitarySystem'
360
+ equipment = equipment.to_AirLoopHVACUnitarySystem.get
361
+ if equipment.coolingCoil.is_initialized
362
+ fuels += self.coil_cooling_fuels(equipment.coolingCoil.get)
363
+ end
354
364
  when 'OS_AirTerminal_SingleDuct_ConstantVolume_CooledBeam'
355
365
  equipment = equipment.to_AirTerminalSingleDuctConstantVolumeCooledBeam.get
356
366
  fuels += self.coil_cooling_fuels(equipment.coilCoolingCooledBeam)
@@ -281,7 +281,7 @@ class OpenStudio::Model::Model
281
281
 
282
282
  result = OpenStudio::OptionalDouble.new
283
283
 
284
- name = object.name.get.upcase
284
+ name = object.name.get.upcase.strip
285
285
 
286
286
  object_type = object.iddObject.type.valueDescription.gsub('OS:','')
287
287
 
@@ -9,6 +9,27 @@ module College
9
9
  # @param prototype_input [Hash] hash of prototype inputs
10
10
  # @return [Bool] returns true if successful, false if not
11
11
  def model_custom_hvac_tweaks(model, building_type, climate_zone, prototype_input)
12
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
13
+
14
+ model.getSpaces.each do |space|
15
+ if space.name.get.to_s == 'CB_PUBLIC_ELEVATORS_F1'
16
+ model_add_elevator(model,
17
+ space,
18
+ prototype_input['number_of_elevators'],
19
+ prototype_input['elevator_type'],
20
+ prototype_input['elevator_schedule'],
21
+ prototype_input['elevator_fan_schedule'],
22
+ prototype_input['elevator_fan_schedule'],
23
+ building_type)
24
+ end
25
+ end
26
+
27
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
28
+
29
+ # add extra infiltration for entry door
30
+ add_door_infiltration(climate_zone, model)
31
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Added door infiltration')
32
+
12
33
  return true
13
34
  end
14
35
 
@@ -25,7 +46,7 @@ module College
25
46
  infiltration_entrydoor.setName('entry door Infiltration')
26
47
  infiltration_per_zone_entrydoor = 0
27
48
  if template == '90.1-2004'
28
- infiltration_per_zone_entrydoor = 7.678585
49
+ infiltration_per_zone_entrydoor = 4.566024
29
50
  infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
30
51
  elsif template == '90.1-2007'
31
52
  case climate_zone
@@ -35,10 +56,10 @@ module College
35
56
  'ASHRAE 169-2006-4A',
36
57
  'ASHRAE 169-2006-4B',
37
58
  'ASHRAE 169-2006-4C'
38
- infiltration_per_zone_entrydoor = 5.600600
59
+ infiltration_per_zone_entrydoor = 3.204085
39
60
  infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
40
61
  else
41
- infiltration_per_zone_entrydoor = 7.678585
62
+ infiltration_per_zone_entrydoor = 4.566024
42
63
  infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
43
64
  end
44
65
  elsif template == '90.1-2010' || template == '90.1-2013'
@@ -46,10 +67,10 @@ module College
46
67
  when 'ASHRAE 169-2006-3A',
47
68
  'ASHRAE 169-2006-3B',
48
69
  'ASHRAE 169-2006-3C'
49
- infiltration_per_zone_entrydoor = 5.600600
70
+ infiltration_per_zone_entrydoor = 3.204085
50
71
  infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
51
72
  else
52
- infiltration_per_zone_entrydoor = 7.678585
73
+ infiltration_per_zone_entrydoor = 4.566024
53
74
  infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
54
75
  end
55
76
  end
@@ -44,22 +44,41 @@ class Standard
44
44
  if type == 'OS default'
45
45
  # use OS default curves
46
46
  else # default curve set
47
- clg_coil.setTotalCoolingCapacityCoefficient1(-4.30266987344639)
48
- clg_coil.setTotalCoolingCapacityCoefficient2(7.18536990534372)
49
- clg_coil.setTotalCoolingCapacityCoefficient3(-2.23946714486189)
50
- clg_coil.setTotalCoolingCapacityCoefficient4(0.139995928440879)
51
- clg_coil.setTotalCoolingCapacityCoefficient5(0.102660179888915)
52
- clg_coil.setSensibleCoolingCapacityCoefficient1(6.0019444814887)
53
- clg_coil.setSensibleCoolingCapacityCoefficient2(22.6300677244073)
54
- clg_coil.setSensibleCoolingCapacityCoefficient3(-26.7960783730934)
55
- clg_coil.setSensibleCoolingCapacityCoefficient4(-1.72374720346819)
56
- clg_coil.setSensibleCoolingCapacityCoefficient5(0.490644802367817)
57
- clg_coil.setSensibleCoolingCapacityCoefficient6(0.0693119353468141)
58
- clg_coil.setCoolingPowerConsumptionCoefficient1(-5.67775976415698)
59
- clg_coil.setCoolingPowerConsumptionCoefficient2(0.438988156976704)
60
- clg_coil.setCoolingPowerConsumptionCoefficient3(5.845277342193)
61
- clg_coil.setCoolingPowerConsumptionCoefficient4(0.141605667000125)
62
- clg_coil.setCoolingPowerConsumptionCoefficient5(-0.168727936032429)
47
+ if model.version < OpenStudio::VersionString.new('3.2.0')
48
+ clg_coil.setTotalCoolingCapacityCoefficient1(-4.30266987344639)
49
+ clg_coil.setTotalCoolingCapacityCoefficient2(7.18536990534372)
50
+ clg_coil.setTotalCoolingCapacityCoefficient3(-2.23946714486189)
51
+ clg_coil.setTotalCoolingCapacityCoefficient4(0.139995928440879)
52
+ clg_coil.setTotalCoolingCapacityCoefficient5(0.102660179888915)
53
+ clg_coil.setSensibleCoolingCapacityCoefficient1(6.0019444814887)
54
+ clg_coil.setSensibleCoolingCapacityCoefficient2(22.6300677244073)
55
+ clg_coil.setSensibleCoolingCapacityCoefficient3(-26.7960783730934)
56
+ clg_coil.setSensibleCoolingCapacityCoefficient4(-1.72374720346819)
57
+ clg_coil.setSensibleCoolingCapacityCoefficient5(0.490644802367817)
58
+ clg_coil.setSensibleCoolingCapacityCoefficient6(0.0693119353468141)
59
+ clg_coil.setCoolingPowerConsumptionCoefficient1(-5.67775976415698)
60
+ clg_coil.setCoolingPowerConsumptionCoefficient2(0.438988156976704)
61
+ clg_coil.setCoolingPowerConsumptionCoefficient3(5.845277342193)
62
+ clg_coil.setCoolingPowerConsumptionCoefficient4(0.141605667000125)
63
+ clg_coil.setCoolingPowerConsumptionCoefficient5(-0.168727936032429)
64
+ else
65
+ clg_coil.totalCoolingCapacityCurve.setCoefficient1Constant(-4.30266987344639)
66
+ clg_coil.totalCoolingCapacityCurve.setCoefficient2w(7.18536990534372)
67
+ clg_coil.totalCoolingCapacityCurve.setCoefficient3x(-2.23946714486189)
68
+ clg_coil.totalCoolingCapacityCurve.setCoefficient4y(0.139995928440879)
69
+ clg_coil.totalCoolingCapacityCurve.setCoefficient5z(0.102660179888915)
70
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient1Constant(6.0019444814887)
71
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient2v(22.6300677244073)
72
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient3w(-26.7960783730934)
73
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient4x(-1.72374720346819)
74
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient5y(0.490644802367817)
75
+ clg_coil.sensibleCoolingCapacityCurve.setCoefficient6z(0.0693119353468141)
76
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient1Constant(-5.67775976415698)
77
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient2w(0.438988156976704)
78
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient3x(5.845277342193)
79
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient4y(0.141605667000125)
80
+ clg_coil.coolingPowerConsumptionCurve.setCoefficient5z(-0.168727936032429)
81
+ end
63
82
  end
64
83
 
65
84
  return clg_coil
@@ -44,16 +44,29 @@ class Standard
44
44
  if type == 'OS default'
45
45
  # use OS default curves
46
46
  else # default curve set
47
- htg_coil.setHeatingCapacityCoefficient1(0.237847462869254)
48
- htg_coil.setHeatingCapacityCoefficient2(-3.35823796081626)
49
- htg_coil.setHeatingCapacityCoefficient3(3.80640467406376)
50
- htg_coil.setHeatingCapacityCoefficient4(0.179200417311554)
51
- htg_coil.setHeatingCapacityCoefficient5(0.12860719846082)
52
- htg_coil.setHeatingPowerConsumptionCoefficient1(-3.79175529243238)
53
- htg_coil.setHeatingPowerConsumptionCoefficient2(3.38799239505527)
54
- htg_coil.setHeatingPowerConsumptionCoefficient3(1.5022612076303)
55
- htg_coil.setHeatingPowerConsumptionCoefficient4(-0.177653510577989)
56
- htg_coil.setHeatingPowerConsumptionCoefficient5(-0.103079864171839)
47
+ if model.version < OpenStudio::VersionString.new('3.2.0')
48
+ htg_coil.setHeatingCapacityCoefficient1(0.237847462869254)
49
+ htg_coil.setHeatingCapacityCoefficient2(-3.35823796081626)
50
+ htg_coil.setHeatingCapacityCoefficient3(3.80640467406376)
51
+ htg_coil.setHeatingCapacityCoefficient4(0.179200417311554)
52
+ htg_coil.setHeatingCapacityCoefficient5(0.12860719846082)
53
+ htg_coil.setHeatingPowerConsumptionCoefficient1(-3.79175529243238)
54
+ htg_coil.setHeatingPowerConsumptionCoefficient2(3.38799239505527)
55
+ htg_coil.setHeatingPowerConsumptionCoefficient3(1.5022612076303)
56
+ htg_coil.setHeatingPowerConsumptionCoefficient4(-0.177653510577989)
57
+ htg_coil.setHeatingPowerConsumptionCoefficient5(-0.103079864171839)
58
+ else
59
+ htg_coil.heatingCapacityCurve.setCoefficient1Constant(0.237847462869254)
60
+ htg_coil.heatingCapacityCurve.setCoefficient2w(-3.35823796081626)
61
+ htg_coil.heatingCapacityCurve.setCoefficient3x(3.80640467406376)
62
+ htg_coil.heatingCapacityCurve.setCoefficient4y(0.179200417311554)
63
+ htg_coil.heatingCapacityCurve.setCoefficient5z(0.12860719846082)
64
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient1Constant(-3.79175529243238)
65
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient2w(3.38799239505527)
66
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient3x(1.5022612076303)
67
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient4y(-0.177653510577989)
68
+ htg_coil.heatingPowerConsumptionCurve.setCoefficient5z(-0.103079864171839)
69
+ end
57
70
  end
58
71
 
59
72
  return htg_coil
@@ -2692,6 +2692,42 @@ Standard.class_eval do
2692
2692
  return true
2693
2693
  end
2694
2694
 
2695
+ # Calculate a model's window or WWR
2696
+ # Disregard space conditioning (assume all spaces are conditioned)
2697
+ # which is true for most of not all prototypes
2698
+ #
2699
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
2700
+ # @param wwr [Boolean]
2701
+ # @return [Numeric] Returns window to wall ratio (percentage) or window area.
2702
+ def model_get_window_area_info(model, wwr = true)
2703
+
2704
+ window_area = 0
2705
+ wall_area = 0
2706
+
2707
+ model.getSpaces.each do |space|
2708
+ # Get zone multipler
2709
+ multiplier = space.thermalZone.get.multiplier
2710
+ space.surfaces.each do |surface|
2711
+ next if surface.surfaceType != 'Wall'
2712
+ next if surface.outsideBoundaryCondition != 'Outdoors'
2713
+
2714
+ # Get wall and window area
2715
+ wall_area += surface.grossArea * multiplier
2716
+ surface.subSurfaces.each do |subsurface|
2717
+ subsurface_type = subsurface.subSurfaceType.to_s.downcase
2718
+ # Do not count doors
2719
+ next unless (subsurface_type.include? 'window') || (subsurface_type.include? 'glass')
2720
+
2721
+ window_area += subsurface.grossArea * subsurface.multiplier * multiplier
2722
+ end
2723
+ end
2724
+ end
2725
+ return window_area / wall_area * 100 if wwr
2726
+
2727
+ # else
2728
+ return window_area
2729
+ end
2730
+
2695
2731
  # Calculate a model's window or WWR for a specific orientation
2696
2732
  # Disregard space conditioning (assume all spaces are conditioned)
2697
2733
  # which is true for most of not all prototypes
@@ -381,12 +381,13 @@ class Standard
381
381
  hpwh.setCondenserBottomLocation(h_condbot)
382
382
  hpwh.setCondenserTopLocation(h_condtop)
383
383
  hpwh.setTankElementControlLogic('MutuallyExclusive')
384
+ hpwh.autocalculateEvaporatorAirFlowRate
384
385
  elsif type == 'PumpedCondenser'
385
386
  hpwh.setDeadBandTemperatureDifference(3.89)
387
+ hpwh.autosizeEvaporatorAirFlowRate
386
388
  end
387
389
 
388
390
  # set heat pump water heater properties
389
- hpwh.setEvaporatorAirFlowRate(OpenStudio.convert(181.0, 'ft^3/min', 'm^3/s').get)
390
391
  hpwh.setFanPlacement('DrawThrough')
391
392
  hpwh.setOnCycleParasiticElectricLoad(0.0)
392
393
  hpwh.setOffCycleParasiticElectricLoad(0.0)
@@ -445,9 +446,10 @@ class Standard
445
446
  if type == 'WrappedCondenser'
446
447
  coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPumpWrapped.get
447
448
  coil.setRatedCondenserWaterTemperature(48.89)
449
+ coil.autocalculateRatedEvaporatorAirFlowRate
448
450
  elsif type == 'PumpedCondenser'
449
- coil = OpenStudio::Model::CoilWaterHeatingAirToWaterHeatPump.new(model)
450
- hpwh.setDXCoil(coil)
451
+ coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPump.get
452
+ coil.autosizeRatedEvaporatorAirFlowRate
451
453
  end
452
454
 
453
455
  # set coil properties
@@ -457,7 +459,6 @@ class Standard
457
459
  coil.setRatedSensibleHeatRatio(shr)
458
460
  coil.setRatedEvaporatorInletAirDryBulbTemperature(OpenStudio.convert(67.5, 'F', 'C').get)
459
461
  coil.setRatedEvaporatorInletAirWetBulbTemperature(OpenStudio.convert(56.426, 'F', 'C').get)
460
- coil.setRatedEvaporatorAirFlowRate(OpenStudio.convert(181.0, 'ft^3/min', 'm^3/s').get)
461
462
  coil.setEvaporatorFanPowerIncludedinRatedCOP(true)
462
463
  coil.setEvaporatorAirTemperatureTypeforCurveObjects('WetBulbTemperature')
463
464
  coil.setHeatingCapacityFunctionofTemperatureCurve(hpwh_cap)
@@ -507,8 +508,7 @@ class Standard
507
508
  tank.setSourceSideInletHeight(0)
508
509
  tank.setSourceSideOutletHeight(0)
509
510
  elsif type == 'PumpedCondenser'
510
- tank = OpenStudio::Model::WaterHeaterMixed.new(model)
511
- hpwh.setTank(tank)
511
+ tank = hpwh.tank.to_WaterHeaterMixed.get
512
512
  tank.setDeadbandTemperatureDifference(3.89)
513
513
  tank.setHeaterControlType('Cycle')
514
514
  tank.setHeaterMaximumCapacity(electric_backup_capacity)
@@ -5480,7 +5480,6 @@ class Standard
5480
5480
  ventilation.setSchedule(availability_schedule)
5481
5481
 
5482
5482
  if ventilation_type == 'Exhaust'
5483
- ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
5484
5483
  ventilation.setDesignFlowRate(flow_rate)
5485
5484
  ventilation.setFanPressureRise(31.1361206455786)
5486
5485
  ventilation.setFanTotalEfficiency(0.51)
@@ -5491,7 +5490,6 @@ class Standard
5491
5490
  ventilation.setMaximumIndoorTemperature(100.0)
5492
5491
  ventilation.setDeltaTemperature(-100.0)
5493
5492
  elsif ventilation_type == 'Natural'
5494
- ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
5495
5493
  ventilation.setDesignFlowRate(flow_rate)
5496
5494
  ventilation.setFanPressureRise(0.0)
5497
5495
  ventilation.setFanTotalEfficiency(1.0)
@@ -5502,7 +5500,6 @@ class Standard
5502
5500
  ventilation.setMaximumIndoorTemperature(29.4444452244559)
5503
5501
  ventilation.setDeltaTemperature(-100.0)
5504
5502
  elsif ventilation_type == 'Intake'
5505
- ventilation.setDesignFlowRateCalculationMethod('Flow/Area')
5506
5503
  ventilation.setFlowRateperZoneFloorArea(flow_rate)
5507
5504
  ventilation.setFanPressureRise(49.8)
5508
5505
  ventilation.setFanTotalEfficiency(0.53625)
@@ -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
 
@@ -4290,7 +4312,7 @@ class Standard
4290
4312
  # @param possible_climate_zone_sets [Array] climate zone sets
4291
4313
  # @return [String] climate zone ses
4292
4314
  def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
4293
- climate_zone_set = possible_climate_zone_sets.min
4315
+ climate_zone_set = possible_climate_zone_sets.max
4294
4316
  return climate_zone_set
4295
4317
  end
4296
4318
 
@@ -5779,6 +5801,15 @@ class Standard
5779
5801
  return parametric_inputs
5780
5802
  end
5781
5803
 
5804
+ # Determine the surface range of a baseline model.
5805
+ # The method calculates the window to wall ratio (assuming all spaces are conditioned)
5806
+ # and select the range based on the calculated window to wall ratio
5807
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
5808
+ # @param intended_surface_type [String] surface type
5809
+ def model_get_percent_of_surface_range(model, intended_surface_type)
5810
+ return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
5811
+ end
5812
+
5782
5813
  # Default SAT reset type
5783
5814
  #
5784
5815
  # @param air_loop_hvac [OpenStudio::Model::AirLoopHVAC] air loop
@@ -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