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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (102) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAEHighriseApartment.osm +0 -27
  3. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  4. data/data/standards/OpenStudio_Standards-ashrae_90_1_28Jan2022.xlsx +0 -0
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1_28_Jan2022_2.xlsx +0 -0
  6. data/data/standards/export_OpenStudio_libraries.rb +2 -0
  7. data/data/standards/test_performance_expected_dd_results.csv +710 -710
  8. data/lib/openstudio-standards/btap/btap_result.rb +2 -2
  9. data/lib/openstudio-standards/btap/reporting.rb +2 -2
  10. data/lib/openstudio-standards/btap/simmanager.rb +2 -2
  11. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +0 -54
  12. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +11 -1
  13. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +1 -1
  14. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +2 -2
  15. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +26 -5
  16. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +14 -6
  17. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +12 -9
  18. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +35 -16
  19. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +23 -10
  20. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +36 -0
  21. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +6 -6
  22. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +24 -15
  23. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +2 -2
  24. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -3
  25. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +2 -0
  26. data/lib/openstudio-standards/standards/Standards.Construction.rb +12 -6
  27. data/lib/openstudio-standards/standards/Standards.Model.rb +42 -7
  28. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +15 -0
  29. data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
  30. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +7 -0
  31. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +5 -2
  32. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +32 -11
  33. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +22 -742
  34. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +2 -2
  35. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3 -3
  36. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +6 -6
  37. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +19 -559
  38. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +2 -2
  39. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3 -3
  40. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +6 -6
  41. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +19 -559
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +2 -2
  43. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +5 -5
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +7 -7
  45. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +19 -559
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +2 -2
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +5 -5
  48. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +7 -7
  49. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +370 -910
  50. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2 -2
  51. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +6 -6
  52. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +0 -8
  53. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +12 -12
  54. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +19 -6
  55. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +2380 -1300
  56. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2 -2
  57. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +6 -6
  58. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +0 -8
  59. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +12 -12
  60. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +140 -0
  61. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1176 -312
  62. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +172 -1132
  63. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_sets.json +14 -14
  64. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +2 -2
  65. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +9 -9
  66. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +180 -1140
  67. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_sets.json +14 -14
  68. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +2 -2
  69. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +10 -10
  70. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +9 -9
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +9 -9
  72. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +15 -0
  73. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +12 -6
  74. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +12 -6
  75. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +16 -8
  76. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +10 -20
  77. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +209 -37
  78. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +1 -0
  79. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +8 -6
  80. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +16 -9
  81. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartment.osm +1 -1
  82. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +1 -1
  83. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/MidriseApartment.osm +1 -1
  84. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +9 -5
  85. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +10 -6
  86. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +9 -5
  87. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -8
  88. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +14 -8
  89. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -6
  90. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -6
  91. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +4 -2
  92. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +38 -19
  93. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +2 -2
  94. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +15 -4
  95. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +10 -651
  96. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +8 -38
  97. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +159 -0
  98. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +41 -43
  99. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +7 -4
  100. data/lib/openstudio-standards/version.rb +1 -1
  101. data/lib/openstudio-standards.rb +1 -0
  102. metadata +5 -2
@@ -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)