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
@@ -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
 
@@ -236,7 +236,7 @@ class OpenStudio::Model::ThermalZone
236
236
  # serving those air loops.
237
237
  #
238
238
  # return [Array<String>] An array. Possible values are
239
- # Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2,
239
+ # Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
240
240
  # Coal, Diesel, Gasoline, DistrictCooling, DistrictHeating,
241
241
  # and SolarEnergy.
242
242
  def heating_fuels
@@ -278,7 +278,7 @@ class OpenStudio::Model::ThermalZone
278
278
  # serving those air loops.
279
279
  #
280
280
  # return [Array<String>] An array. Possible values are
281
- # Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2,
281
+ # Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
282
282
  # Coal, Diesel, Gasoline, DistrictCooling, DistrictHeating,
283
283
  # and SolarEnergy.
284
284
  def cooling_fuels
@@ -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
@@ -11,6 +11,15 @@ module Laboratory
11
11
  def model_custom_hvac_tweaks(model, building_type, climate_zone, prototype_input)
12
12
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
13
13
 
14
+ # get the fume hood space type and exhaust ACH
15
+ fume_hood_exhaust_ach = nil
16
+ model.getSpaceTypes.each do |spc_type|
17
+ next unless spc_type.name.get.to_s.downcase.include? 'fume hood'
18
+
19
+ spc_type_properties = space_type_get_standards_data(spc_type)
20
+ fume_hood_exhaust_ach = spc_type_properties['ventilation_air_changes'].to_f
21
+ end
22
+
14
23
  # For fume hood, the OA rate varies with the fume hood schedule
15
24
  # So add "Proportional Control Minimum Outdoor Air Flow Rate Schedule"
16
25
  # at the mean time, modify "Outdoor Air Method" to "ProportionalControlBasedOnDesignOARate" in Controller:MechanicalVentilation of the DOAS
@@ -19,6 +28,11 @@ module Laboratory
19
28
 
20
29
  ventilation = space.designSpecificationOutdoorAir.get
21
30
  ventilation.setOutdoorAirFlowRateFractionSchedule(model_add_schedule(model, 'Lab_FumeHood_Sch'))
31
+
32
+ # add exhaust fan to fume hood zone
33
+ fume_hood_zone_volume = space.volume
34
+ flow_rate_fume_hood = fume_hood_zone_volume * fume_hood_exhaust_ach / 3600.0
35
+ model_add_exhaust_fan(model, [space.thermalZone.get], flow_rate: flow_rate_fume_hood, flow_fraction_schedule_name: 'Lab_FumeHood_Sch')
22
36
  end
23
37
 
24
38
  # adjust doas sizing
@@ -38,12 +52,6 @@ module Laboratory
38
52
  end
39
53
  end
40
54
 
41
- # @todo add exhaust fan to fume hood zone
42
- # search_criteria = ...
43
- # fume_hood_space = model_find_object(standards_data['Space Types'], search_criteria)
44
- # fume_hood_zone_volume = fume_hood_space.getVolume...
45
- # flow_rate_fume_hood = fume_hood_zone_volume * fume_hood_space['Ventilation_Air_Changes...']
46
- # model_add_exhaust_fan(model, thermal_zones, flow_rate=flow_rate_fume_hood, flow_fraction_schedule_name='Lab_FumeHood_Sch')
47
55
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
48
56
  return true
49
57
  end
@@ -11,9 +11,9 @@ class Standard
11
11
  # @param nominal_thermal_efficiency [Double] boiler nominal thermal efficiency
12
12
  # @param eff_curve_temp_eval_var [String] LeavingBoiler or EnteringBoiler temperature for the boiler efficiency curve
13
13
  # @param flow_mode [String] boiler flow mode
14
- # @param lvg_temp_dsgn [Double] boiler leaving design temperature, degrees Fahrenheit
14
+ # @param lvg_temp_dsgn_f [Double] boiler leaving design temperature in degrees Fahrenheit
15
15
  # note that this field is deprecated in OS versions 3.0+
16
- # @param out_temp_lmt [Double] boiler outlet temperature limit, degrees Fahrenheit
16
+ # @param out_temp_lmt_f [Double] boiler outlet temperature limit in degrees Fahrenheit
17
17
  # @param min_plr [Double] boiler minimum part load ratio
18
18
  # @param max_plr [Double] boiler maximum part load ratio
19
19
  # @param opt_plr [Double] boiler optimum part load ratio
@@ -27,8 +27,8 @@ class Standard
27
27
  nominal_thermal_efficiency: 0.80,
28
28
  eff_curve_temp_eval_var: 'LeavingBoiler',
29
29
  flow_mode: 'LeavingSetpointModulated',
30
- lvg_temp_dsgn: 180.0,
31
- out_temp_lmt: 203.0, # 95C
30
+ lvg_temp_dsgn_f: 180.0, # 82.22 degrees Celsius
31
+ out_temp_lmt_f: 203.0, # 95.0 degrees Celsius
32
32
  min_plr: 0.0,
33
33
  max_plr: 1.2,
34
34
  opt_plr: 1.0,
@@ -48,6 +48,8 @@ class Standard
48
48
 
49
49
  if fuel_type.nil? || fuel_type == 'Gas'
50
50
  boiler.setFuelType('NaturalGas')
51
+ elsif fuel_type == 'Propane' || fuel_type == 'PropaneGas'
52
+ boiler.setFuelType('Propane')
51
53
  else
52
54
  boiler.setFuelType(fuel_type)
53
55
  end
@@ -71,23 +73,24 @@ class Standard
71
73
  end
72
74
 
73
75
  if model.version < OpenStudio::VersionString.new('3.0.0')
74
- if lvg_temp_dsgn.nil?
76
+ if lvg_temp_dsgn_f.nil?
75
77
  boiler.setDesignWaterOutletTemperature(OpenStudio.convert(180.0, 'F', 'C').get)
76
78
  else
77
- boiler.setDesignWaterOutletTemperature(OpenStudio.convert(lvg_temp_dsgn, 'F', 'C').get)
79
+ boiler.setDesignWaterOutletTemperature(OpenStudio.convert(lvg_temp_dsgn_f, 'F', 'C').get)
78
80
  end
79
81
  end
80
82
 
81
- if !out_temp_lmt.nil?
83
+ if out_temp_lmt_f.nil?
82
84
  boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(203.0, 'F', 'C').get)
83
85
  else
84
- boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(out_temp_lmt, 'F', 'C').get)
86
+ boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(out_temp_lmt_f, 'F', 'C').get)
85
87
  end
86
88
 
87
89
  # logic to set different defaults for condensing boilers if not specified
88
90
  if draft_type == 'Condensing'
89
91
  if model.version < OpenStudio::VersionString.new('3.0.0')
90
- boiler.setDesignWaterOutletTemperature(OpenStudio.convert(120.0, 'F', 'C').get) if lvg_temp_dsgn.nil?
92
+ # default to 120 degrees Fahrenheit (48.49 degrees Celsius)
93
+ boiler.setDesignWaterOutletTemperature(OpenStudio.convert(120.0, 'F', 'C').get) if lvg_temp_dsgn_f.nil?
91
94
  end
92
95
  boiler.setNominalThermalEfficiency(0.96) if nominal_thermal_efficiency.nil?
93
96
  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)
@@ -24,7 +24,7 @@ class Standard
24
24
  # Creates a hot water loop with a boiler, district heating, or a water-to-water heat pump and adds it to the model.
25
25
  #
26
26
  # @param model [OpenStudio::Model::Model] OpenStudio model object
27
- # @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2, DistrictHeating, HeatPump
27
+ # @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2, DistrictHeating, HeatPump
28
28
  # @param ambient_loop [OpenStudio::Model::PlantLoop] The condenser loop for the heat pump. Only used when boiler_fuel_type is HeatPump.
29
29
  # @param system_name [String] the name of the system, or nil in which case it will be defaulted
30
30
  # @param dsgn_sup_wtr_temp [Double] design supply water temperature in degrees Fahrenheit, default 180F
@@ -128,17 +128,17 @@ class Standard
128
128
  when 'AirSourceHeatPump', 'ASHP'
129
129
  create_central_air_source_heat_pump(model, hot_water_loop)
130
130
  # Boiler
131
- when 'Electricity', 'Gas', 'NaturalGas', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
131
+ when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
132
132
  if boiler_lvg_temp_dsgn.nil?
133
- lvg_temp_dsgn = dsgn_sup_wtr_temp
133
+ lvg_temp_dsgn_f = dsgn_sup_wtr_temp
134
134
  else
135
- lvg_temp_dsgn = boiler_lvg_temp_dsgn
135
+ lvg_temp_dsgn_f = boiler_lvg_temp_dsgn
136
136
  end
137
137
 
138
138
  if boiler_out_temp_lmt.nil?
139
- out_temp_lmt = OpenStudio.convert(203.0, 'F', 'C').get
139
+ out_temp_lmt_f = 203.0
140
140
  else
141
- out_temp_lmt = boiler_out_temp_lmt
141
+ out_temp_lmt_f = boiler_out_temp_lmt
142
142
  end
143
143
 
144
144
  boiler = create_boiler_hot_water(model,
@@ -147,8 +147,8 @@ class Standard
147
147
  draft_type: boiler_draft_type,
148
148
  nominal_thermal_efficiency: 0.78,
149
149
  eff_curve_temp_eval_var: boiler_eff_curve_temp_eval_var,
150
- lvg_temp_dsgn: lvg_temp_dsgn,
151
- out_temp_lmt: out_temp_lmt,
150
+ lvg_temp_dsgn_f: lvg_temp_dsgn_f,
151
+ out_temp_lmt_f: out_temp_lmt_f,
152
152
  max_plr: boiler_max_plr,
153
153
  sizing_factor: boiler_sizing_factor)
154
154
 
@@ -803,13 +803,13 @@ class Standard
803
803
  when 'AirSourceHeatPump', 'ASHP'
804
804
  heating_equipment = create_central_air_source_heat_pump(model, heat_pump_water_loop)
805
805
  heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} ASHP Scheduled Dual Setpoint")
806
- when 'Electricity', 'Gas', 'NaturalGas', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
806
+ when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
807
807
  heating_equipment = create_boiler_hot_water(model,
808
808
  hot_water_loop: heat_pump_water_loop,
809
809
  name: "#{heat_pump_water_loop.name} Supplemental Boiler",
810
810
  fuel_type: heating_fuel,
811
811
  flow_mode: 'ConstantFlow',
812
- lvg_temp_dsgn: 86.0,
812
+ lvg_temp_dsgn_f: 86.0, # 30.0 degrees Celsius
813
813
  min_plr: 0.0,
814
814
  max_plr: 1.2,
815
815
  opt_plr: 1.0)
@@ -4031,7 +4031,7 @@ class Standard
4031
4031
  high_temp_radiant = OpenStudio::Model::ZoneHVACHighTemperatureRadiant.new(model)
4032
4032
  high_temp_radiant.setName("#{zone.name} High Temp Radiant")
4033
4033
 
4034
- if heating_type.nil? || heating_type == 'Gas'
4034
+ if heating_type.nil? || heating_type == 'NaturalGas' || heating_type == 'Gas'
4035
4035
  high_temp_radiant.setFuelType('NaturalGas')
4036
4036
  else
4037
4037
  high_temp_radiant.setFuelType(heating_type)
@@ -4410,7 +4410,14 @@ class Standard
4410
4410
  # @param radiant_type [String] type of radiant system, floor or ceiling, to create in zone.
4411
4411
  # @param include_carpet [Bool] boolean to include thin carpet tile over radiant slab, default to true
4412
4412
  # @param carpet_thickness_in [Double] thickness of carpet in inches
4413
- # @param control_strategy [String] name of control strategy
4413
+ # @param model_occ_hr_start [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4414
+ # Starting hour of building occupancy.
4415
+ # @param model_occ_hr_end [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4416
+ # Ending hour of building occupancy.
4417
+ # @param control_strategy [String] name of control strategy. Options are 'proportional_control' and 'none'.
4418
+ # If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
4419
+ # detailed in Raftery et al. (2017), “A new control strategy for high thermal mass radiant systems”.
4420
+ # Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
4414
4421
  # @param proportional_gain [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4415
4422
  # Proportional gain constant (recommended 0.3 or less).
4416
4423
  # @param minimum_operation [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
@@ -4427,6 +4434,7 @@ class Standard
4427
4434
  # Only used if radiant_lockout is true
4428
4435
  # @return [Array<OpenStudio::Model::ZoneHVACLowTemperatureRadiantVariableFlow>] array of radiant objects.
4429
4436
  # @todo Once the OpenStudio API supports it, make chilled water loops optional for heating only systems
4437
+ # @todo Lookup occupany start and end hours from zone occupancy schedule
4430
4438
  def model_add_low_temp_radiant(model,
4431
4439
  thermal_zones,
4432
4440
  hot_water_loop,
@@ -4434,6 +4442,8 @@ class Standard
4434
4442
  radiant_type: 'floor',
4435
4443
  include_carpet: true,
4436
4444
  carpet_thickness_in: 0.25,
4445
+ model_occ_hr_start: 6.0,
4446
+ model_occ_hr_end: 18.0,
4437
4447
  control_strategy: 'proportional_control',
4438
4448
  proportional_gain: 0.3,
4439
4449
  minimum_operation: 1,
@@ -4743,6 +4753,8 @@ class Standard
4743
4753
  if control_strategy == 'proportional_control'
4744
4754
  model_add_radiant_proportional_controls(model, zone, radiant_loop,
4745
4755
  radiant_type: radiant_type,
4756
+ model_occ_hr_start: model_occ_hr_start,
4757
+ model_occ_hr_end: model_occ_hr_end,
4746
4758
  proportional_gain: proportional_gain,
4747
4759
  minimum_operation: minimum_operation,
4748
4760
  weekend_temperature_reset: weekend_temperature_reset,
@@ -5480,7 +5492,6 @@ class Standard
5480
5492
  ventilation.setSchedule(availability_schedule)
5481
5493
 
5482
5494
  if ventilation_type == 'Exhaust'
5483
- ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
5484
5495
  ventilation.setDesignFlowRate(flow_rate)
5485
5496
  ventilation.setFanPressureRise(31.1361206455786)
5486
5497
  ventilation.setFanTotalEfficiency(0.51)
@@ -5491,7 +5502,6 @@ class Standard
5491
5502
  ventilation.setMaximumIndoorTemperature(100.0)
5492
5503
  ventilation.setDeltaTemperature(-100.0)
5493
5504
  elsif ventilation_type == 'Natural'
5494
- ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
5495
5505
  ventilation.setDesignFlowRate(flow_rate)
5496
5506
  ventilation.setFanPressureRise(0.0)
5497
5507
  ventilation.setFanTotalEfficiency(1.0)
@@ -5502,7 +5512,6 @@ class Standard
5502
5512
  ventilation.setMaximumIndoorTemperature(29.4444452244559)
5503
5513
  ventilation.setDeltaTemperature(-100.0)
5504
5514
  elsif ventilation_type == 'Intake'
5505
- ventilation.setDesignFlowRateCalculationMethod('Flow/Area')
5506
5515
  ventilation.setFlowRateperZoneFloorArea(flow_rate)
5507
5516
  ventilation.setFanPressureRise(49.8)
5508
5517
  ventilation.setFanTotalEfficiency(0.53625)