openstudio-standards 0.2.15 → 0.2.16.rc1

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