openstudio-standards 0.1.3 → 0.1.4

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 (59) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards_chillers.json +5 -5
  4. data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
  5. data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
  6. data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
  7. data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
  8. data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
  9. data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
  10. data/data/standards/OpenStudio_Standards_schedules.json +262 -10
  11. data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
  12. data/data/standards/manage_OpenStudio_Standards.rb +19 -21
  13. data/data/weather/weather_info.csv +96 -0
  14. data/lib/openstudio-standards/btap/btap.rb +1 -1
  15. data/lib/openstudio-standards/btap/compliance.rb +135 -40
  16. data/lib/openstudio-standards/btap/envelope.rb +26 -5
  17. data/lib/openstudio-standards/btap/geometry.rb +11 -1
  18. data/lib/openstudio-standards/btap/hvac.rb +489 -56
  19. data/lib/openstudio-standards/btap/simmanager.rb +1 -1
  20. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
  21. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
  22. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
  23. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
  24. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
  25. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
  26. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
  27. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
  28. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
  29. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
  30. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
  31. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
  32. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
  33. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
  34. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
  35. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
  36. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
  37. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
  38. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
  39. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
  40. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
  41. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
  42. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
  43. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
  44. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
  45. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
  46. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
  47. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
  48. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
  49. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
  50. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
  51. data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
  52. data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
  53. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
  54. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
  55. data/lib/openstudio-standards/version.rb +1 -1
  56. data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
  57. data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
  58. metadata +8 -3
  59. data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -8,11 +8,11 @@ class OpenStudio::Model::Model
8
8
  # and add it to the model.
9
9
  #
10
10
  # @param boiler_fuel_type [String] valid choices are Electricity, Gas, PropaneGas, FuelOil#1, FuelOil#2
11
- # @return [OpenStudio::Model::PlantLoop] the resulting hot water loop
11
+ # @return [OpenStudio::Model::PlantLoop] the resulting hot water loop
12
12
  def add_hw_loop(boiler_fuel_type, building_type=nil)
13
13
 
14
14
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding hot water loop.")
15
-
15
+
16
16
  #hot water loop
17
17
  hot_water_loop = OpenStudio::Model::PlantLoop.new(self)
18
18
  hot_water_loop.setName('Hot Water Loop')
@@ -119,10 +119,12 @@ class OpenStudio::Model::Model
119
119
  chiller_compressor_type,
120
120
  chiller_capacity_guess_tons,
121
121
  condenser_water_loop = nil,
122
- building_type=nil)
122
+ building_type=nil,
123
+ num_chillers=1)
123
124
 
124
125
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding chilled water loop.")
125
-
126
+
127
+
126
128
  # Chilled water loop
127
129
  chilled_water_loop = OpenStudio::Model::PlantLoop.new(self)
128
130
  chilled_water_loop.setName('Chilled Water Loop')
@@ -199,40 +201,47 @@ class OpenStudio::Model::Model
199
201
  chilled_water_loop.setCommonPipeSimulation('CommonPipe')
200
202
  end
201
203
 
202
- # Make the correct type of chiller based these properties
203
- chiller = OpenStudio::Model::ChillerElectricEIR.new(self)
204
- chiller.setName("#{standard} #{chiller_cooling_type} #{chiller_condenser_type} #{chiller_compressor_type} Chiller")
205
- chilled_water_loop.addSupplyBranchForComponent(chiller)
206
- chiller.setReferenceLeavingChilledWaterTemperature(chw_temp_c)
207
- ref_cond_wtr_temp_f = 95
208
- ref_cond_wtr_temp_c = OpenStudio.convert(ref_cond_wtr_temp_f,'F','C').get
209
- chiller.setReferenceEnteringCondenserFluidTemperature(ref_cond_wtr_temp_c)
210
- chiller.setMinimumPartLoadRatio(0.15)
211
- chiller.setMaximumPartLoadRatio(1.0)
212
- chiller.setOptimumPartLoadRatio(1.0)
213
- chiller.setMinimumUnloadingRatio(0.25)
214
- chiller.setCondenserType('AirCooled')
215
- chiller.setLeavingChilledWaterLowerTemperatureLimit(OpenStudio.convert(36,'F','C').get)
216
- chiller.setChillerFlowMode('ConstantFlow')
217
-
218
- #if building_type == "LargeHotel"
219
- # TODO: Yixing. Add the temperature setpoint and change the flow mode will cost the simulation with
220
- # thousands of Severe Errors. Need to figure this out later.
221
- #chiller.setChillerFlowMode('LeavingSetpointModulated')
222
- #chiller_stpt_manager = OpenStudio::Model::SetpointManagerScheduled.new(self,chw_temp_sch)
223
- #chiller_stpt_manager.setName("chiller outlet setpoint manager")
224
- #chiller_stpt_manager.addToNode(chiller.supplyOutletModelObject.get.to_Node.get)
225
- #end
226
-
227
- # Connect the chiller to the condenser loop if
228
- # one was supplied.
229
- if condenser_water_loop
230
- condenser_water_loop.addDemandBranchForComponent(chiller)
231
- chiller.setCondenserType('WaterCooled')
232
- end
233
-
234
-
235
- #chilled water loop pipes
204
+
205
+ num_chillers.times do |i|
206
+ # Make the correct type of chiller based these properties
207
+ chiller = OpenStudio::Model::ChillerElectricEIR.new(self)
208
+ chiller.setName("#{standard} #{chiller_cooling_type} #{chiller_condenser_type} #{chiller_compressor_type} Chiller #{i}")
209
+ chilled_water_loop.addSupplyBranchForComponent(chiller)
210
+ chiller.setReferenceLeavingChilledWaterTemperature(chw_temp_c)
211
+ ref_cond_wtr_temp_f = 95
212
+ ref_cond_wtr_temp_c = OpenStudio.convert(ref_cond_wtr_temp_f,'F','C').get
213
+ chiller.setReferenceEnteringCondenserFluidTemperature(ref_cond_wtr_temp_c)
214
+ chiller.setMinimumPartLoadRatio(0.15)
215
+ chiller.setMaximumPartLoadRatio(1.0)
216
+ chiller.setOptimumPartLoadRatio(1.0)
217
+ chiller.setMinimumUnloadingRatio(0.25)
218
+ chiller.setCondenserType('AirCooled')
219
+ chiller.setLeavingChilledWaterLowerTemperatureLimit(OpenStudio.convert(36,'F','C').get)
220
+ chiller.setChillerFlowMode('ConstantFlow')
221
+
222
+
223
+ if building_type == "LargeHotel" or building_type == "Hospital"
224
+ chiller.setSizingFactor(0.5)
225
+ end
226
+
227
+ #if building_type == "LargeHotel"
228
+ # TODO: Yixing. Add the temperature setpoint and change the flow mode will cost the simulation with
229
+ # thousands of Severe Errors. Need to figure this out later.
230
+ #chiller.setChillerFlowMode('LeavingSetpointModulated')
231
+ #chiller_stpt_manager = OpenStudio::Model::SetpointManagerScheduled.new(self,chw_temp_sch)
232
+ #chiller_stpt_manager.setName("chiller outlet setpoint manager")
233
+ #chiller_stpt_manager.addToNode(chiller.supplyOutletModelObject.get.to_Node.get)
234
+ #end
235
+
236
+ # Connect the chiller to the condenser loop if
237
+ # one was supplied.
238
+ if condenser_water_loop
239
+ condenser_water_loop.addDemandBranchForComponent(chiller)
240
+ chiller.setCondenserType('WaterCooled')
241
+ end
242
+ end
243
+
244
+ #chilled water loop pipes
236
245
  chiller_bypass_pipe = OpenStudio::Model::PipeAdiabatic.new(self)
237
246
  chilled_water_loop.addSupplyBranchForComponent(chiller_bypass_pipe)
238
247
  coil_bypass_pipe = OpenStudio::Model::PipeAdiabatic.new(self)
@@ -252,10 +261,13 @@ class OpenStudio::Model::Model
252
261
  #
253
262
  # @param number_cooling_towers [Integer] the number of cooling towers to be added (in parallel)
254
263
  # @return [OpenStudio::Model::PlantLoop] the resulting plant loop
255
- def add_cw_loop(number_cooling_towers = 1)
264
+
265
+
266
+ def add_cw_loop(building_type, building_vintage, number_cooling_towers = 1)
267
+
256
268
 
257
269
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding condenser water loop.")
258
-
270
+
259
271
  # Condenser water loop
260
272
  condenser_water_loop = OpenStudio::Model::PlantLoop.new(self)
261
273
  condenser_water_loop.setName('Condenser Water Loop')
@@ -282,22 +294,31 @@ class OpenStudio::Model::Model
282
294
  sizing_plant.setDesignLoopExitTemperature(cw_temp_sizing_c)
283
295
  sizing_plant.setLoopDesignTemperatureDifference(cw_delta_t_k)
284
296
 
285
- # Condenser water pump #TODO make this into a HeaderedPump:VariableSpeed
286
- cw_pump = OpenStudio::Model::PumpVariableSpeed.new(self)
287
- cw_pump.setName('Condenser Water Loop Pump')
288
- cw_pump_head_ft_h2o = 49.7
289
- cw_pump_head_press_pa = OpenStudio.convert(cw_pump_head_ft_h2o, 'ftH_{2}O','Pa').get
290
- cw_pump.setRatedPumpHead(cw_pump_head_press_pa)
291
- # Curve makes it perform like variable speed pump
292
- cw_pump.setFractionofMotorInefficienciestoFluidStream(0)
293
- cw_pump.setCoefficient1ofthePartLoadPerformanceCurve(0)
294
- cw_pump.setCoefficient2ofthePartLoadPerformanceCurve(0.0216)
295
- cw_pump.setCoefficient3ofthePartLoadPerformanceCurve(-0.0325)
296
- cw_pump.setCoefficient4ofthePartLoadPerformanceCurve(1.0095)
297
- cw_pump.setPumpControlType('Intermittent')
298
- cw_pump.addToNode(condenser_water_loop.supplyInletNode)
299
-
300
- # TODO move cooling tower curve to lookup from spreadsheet
297
+ if building_type == 'Hospital' && (building_vintage == 'DOE Ref 1980-2004' || building_vintage == 'DOE Ref Pre-1980')
298
+ cw_pump = OpenStudio::Model::PumpConstantSpeed.new(self)
299
+ cw_pump.setName('Condenser Water Loop Pump')
300
+ cw_pump_head_ft_h2o = 60.0
301
+ cw_pump_head_press_pa = OpenStudio.convert(cw_pump_head_ft_h2o, 'ftH_{2}O','Pa').get
302
+ cw_pump.setRatedPumpHead(cw_pump_head_press_pa)
303
+ cw_pump.addToNode(condenser_water_loop.supplyInletNode)
304
+ else
305
+ # Condenser water pump #TODO make this into a HeaderedPump:VariableSpeed
306
+ cw_pump = OpenStudio::Model::PumpVariableSpeed.new(self)
307
+ cw_pump.setName('Condenser Water Loop Pump')
308
+ cw_pump_head_ft_h2o = 49.7
309
+ cw_pump_head_press_pa = OpenStudio.convert(cw_pump_head_ft_h2o, 'ftH_{2}O','Pa').get
310
+ cw_pump.setRatedPumpHead(cw_pump_head_press_pa)
311
+ # Curve makes it perform like variable speed pump
312
+ cw_pump.setFractionofMotorInefficienciestoFluidStream(0)
313
+ cw_pump.setCoefficient1ofthePartLoadPerformanceCurve(0)
314
+ cw_pump.setCoefficient2ofthePartLoadPerformanceCurve(0.0216)
315
+ cw_pump.setCoefficient3ofthePartLoadPerformanceCurve(-0.0325)
316
+ cw_pump.setCoefficient4ofthePartLoadPerformanceCurve(1.0095)
317
+ cw_pump.setPumpControlType('Intermittent')
318
+ cw_pump.addToNode(condenser_water_loop.supplyInletNode)
319
+ end
320
+
321
+ # TODO move cooling tower curve to lookup from spreadsheet
301
322
  cooling_tower_fan_curve = OpenStudio::Model::CurveCubic.new(self)
302
323
  cooling_tower_fan_curve.setName('Cooling Tower Fan Curve')
303
324
  cooling_tower_fan_curve.setCoefficient1Constant(0)
@@ -309,16 +330,22 @@ class OpenStudio::Model::Model
309
330
 
310
331
  # Cooling towers
311
332
  number_cooling_towers.times do |i|
312
- cooling_tower = OpenStudio::Model::CoolingTowerVariableSpeed.new(self)
313
- cooling_tower.setName("#{condenser_water_loop.name} Cooling Tower #{i}")
314
- cooling_tower.setDesignApproachTemperature(cw_approach_delta_t_k)
315
- cooling_tower.setDesignRangeTemperature(cw_delta_t_k)
316
- cooling_tower.setFanPowerRatioFunctionofAirFlowRateRatioCurve(cooling_tower_fan_curve)
317
- cooling_tower.setMinimumAirFlowRateRatio(0.2)
318
- cooling_tower.setFractionofTowerCapacityinFreeConvectionRegime(0.125)
319
- cooling_tower.setNumberofCells(2)
320
- cooling_tower.setCellControl('MaximalCell')
321
- condenser_water_loop.addSupplyBranchForComponent(cooling_tower)
333
+ if building_type == 'Hospital' && (building_vintage == 'DOE Ref 1980-2004' || building_vintage == 'DOE Ref Pre-1980')
334
+ cooling_tower = OpenStudio::Model::CoolingTowerSingleSpeed.new(self)
335
+ cooling_tower.setName("#{condenser_water_loop.name} Cooling Tower #{i}")
336
+ condenser_water_loop.addSupplyBranchForComponent(cooling_tower)
337
+ else
338
+ cooling_tower = OpenStudio::Model::CoolingTowerVariableSpeed.new(self)
339
+ cooling_tower.setName("#{condenser_water_loop.name} Cooling Tower #{i}")
340
+ cooling_tower.setDesignApproachTemperature(cw_approach_delta_t_k)
341
+ cooling_tower.setDesignRangeTemperature(cw_delta_t_k)
342
+ cooling_tower.setFanPowerRatioFunctionofAirFlowRateRatioCurve(cooling_tower_fan_curve)
343
+ cooling_tower.setMinimumAirFlowRateRatio(0.2)
344
+ cooling_tower.setFractionofTowerCapacityinFreeConvectionRegime(0.125)
345
+ cooling_tower.setNumberofCells(2)
346
+ cooling_tower.setCellControl('MaximalCell')
347
+ condenser_water_loop.addSupplyBranchForComponent(cooling_tower)
348
+ end
322
349
  end
323
350
 
324
351
  # Condenser water loop pipes
@@ -344,8 +371,8 @@ class OpenStudio::Model::Model
344
371
  # @todo replace cooling tower with fluid cooler once added to OS 1.9.0
345
372
  def add_hp_loop(building_type=nil)
346
373
 
347
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding heat pump loop.")
348
-
374
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding heat pump loop.")
375
+
349
376
  # Heat Pump loop
350
377
  heat_pump_water_loop = OpenStudio::Model::PlantLoop.new(self)
351
378
  heat_pump_water_loop.setName('Heat Pump Loop')
@@ -471,7 +498,7 @@ class OpenStudio::Model::Model
471
498
  # @param thermal_zones [String] zones to connect to this system
472
499
  # @param hvac_op_sch [String] name of the HVAC operation schedule
473
500
  # or nil in which case will be defaulted to always on
474
- # @param oa_damper_sch [Double] name of the oa damper schedule,
501
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
475
502
  # or nil in which case will be defaulted to always open
476
503
  # @param vav_fan_efficiency [Double] fan total efficiency, including motor and impeller
477
504
  # @param vav_fan_motor_efficiency [Double] fan motor efficiency
@@ -480,9 +507,9 @@ class OpenStudio::Model::Model
480
507
  # the supply plenum, or nil, in which case no return plenum will be used.
481
508
  # @param building_type [String] the building type
482
509
  # @return [OpenStudio::Model::AirLoopHVAC] the resulting VAV air loop
483
- def add_vav_reheat(standard,
484
- sys_name,
485
- hot_water_loop,
510
+ def add_vav_reheat(standard,
511
+ sys_name,
512
+ hot_water_loop,
486
513
  chilled_water_loop,
487
514
  thermal_zones,
488
515
  hvac_op_sch,
@@ -497,7 +524,7 @@ class OpenStudio::Model::Model
497
524
  thermal_zones.each do |zone|
498
525
  OpenStudio::logFree(OpenStudio::Debug, 'openstudio.Model.Model', "---#{zone.name}")
499
526
  end
500
-
527
+
501
528
  hw_temp_f = 180 #HW setpoint 180F
502
529
  hw_delta_t_r = 20 #20F delta-T
503
530
  hw_temp_c = OpenStudio.convert(hw_temp_f,'F','C').get
@@ -517,7 +544,7 @@ class OpenStudio::Model::Model
517
544
  else
518
545
  hvac_op_sch = self.add_schedule(hvac_op_sch)
519
546
  end
520
-
547
+
521
548
  # oa damper schedule
522
549
  if oa_damper_sch.nil?
523
550
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -531,7 +558,7 @@ class OpenStudio::Model::Model
531
558
  preclg_sa_temp_f = 55.04 # Precool to 55F
532
559
  htg_sa_temp_f = 55.04 # Central deck htg temp 55F
533
560
  if building_type == "LargeHotel"
534
- htg_sa_temp_f = 62 # Central deck htg temp 55F
561
+ htg_sa_temp_f = 62 # Central deck htg temp 55F
535
562
  end
536
563
  rht_sa_temp_f = 104 # VAV box reheat to 104F
537
564
  clg_sa_temp_c = OpenStudio.convert(clg_sa_temp_f,'F','C').get
@@ -540,12 +567,23 @@ class OpenStudio::Model::Model
540
567
  htg_sa_temp_c = OpenStudio.convert(htg_sa_temp_f,'F','C').get
541
568
  rht_sa_temp_c = OpenStudio.convert(rht_sa_temp_f,'F','C').get
542
569
  zone_htg_sa_temp_c = OpenStudio.convert(zone_htg_sa_temp_f,'F','C').get
543
-
544
570
  sa_temp_sch = OpenStudio::Model::ScheduleRuleset.new(self)
545
571
  sa_temp_sch.setName("Supply Air Temp - #{clg_sa_temp_f}F")
546
572
  sa_temp_sch.defaultDaySchedule.setName("Supply Air Temp - #{clg_sa_temp_f}F Default")
547
573
  sa_temp_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0,24,0,0),clg_sa_temp_c)
548
574
 
575
+ if building_type == 'Hospital'
576
+ if sys_name == 'VAV_PATRMS'
577
+ air_flow_ratio = 0.5
578
+ elsif sys_name == 'VAV_1' || sys_name == 'VAV_2'
579
+ air_flow_ratio = 0.3
580
+ else
581
+ air_flow_ratio = 1
582
+ end
583
+ else
584
+ air_flow_ratio = 0.3
585
+ end
586
+
549
587
  #air handler
550
588
  air_loop = OpenStudio::Model::AirLoopHVAC.new(self)
551
589
  if sys_name.nil?
@@ -561,11 +599,20 @@ class OpenStudio::Model::Model
561
599
 
562
600
  #air handler controls
563
601
  sizing_system = air_loop.sizingSystem
602
+ sizing_system.setMinimumSystemAirFlowRatio(air_flow_ratio)
564
603
  sizing_system.setPreheatDesignTemperature(prehtg_sa_temp_c)
565
604
  sizing_system.setPrecoolDesignTemperature(preclg_sa_temp_c)
566
605
  sizing_system.setCentralCoolingDesignSupplyAirTemperature(clg_sa_temp_c)
567
606
  sizing_system.setCentralHeatingDesignSupplyAirTemperature(htg_sa_temp_c)
568
- sizing_system.setSizingOption('Coincident')
607
+ if building_type == "Hospital"
608
+ if sys_name == 'VAV_2'|| sys_name=='VAV_1'
609
+ sizing_system.setSizingOption('Coincident')
610
+ else
611
+ sizing_system.setSizingOption('NonCoincident')
612
+ end
613
+ else
614
+ sizing_system.setSizingOption('Coincident')
615
+ end
569
616
  sizing_system.setAllOutdoorAirinCooling(false)
570
617
  sizing_system.setAllOutdoorAirinHeating(false)
571
618
  sizing_system.setSystemOutdoorAirMethod('ZoneSum')
@@ -649,7 +696,6 @@ class OpenStudio::Model::Model
649
696
  terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(self,self.alwaysOnDiscreteSchedule,rht_coil)
650
697
  terminal.setName("#{zone.name} VAV Term")
651
698
  terminal.setZoneMinimumAirFlowMethod('Constant')
652
-
653
699
  terminal.set_initial_prototype_damper_position(building_type, standard, zone.outdoor_airflow_rate_per_area)
654
700
  terminal.setMaximumFlowPerZoneFloorAreaDuringReheat(0.0)
655
701
  terminal.setMaximumFlowFractionDuringReheat(0.5)
@@ -692,15 +738,15 @@ class OpenStudio::Model::Model
692
738
  # @param thermal_zones [String] zones to connect to this system
693
739
  # @param hvac_op_sch [String] name of the HVAC operation schedule
694
740
  # or nil in which case will be defaulted to always on
695
- # @param oa_damper_sch [Double] name of the oa damper schedule,
741
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
696
742
  # or nil in which case will be defaulted to always open
697
743
  # @param vav_fan_efficiency [Double] fan total efficiency, including motor and impeller
698
744
  # @param vav_fan_motor_efficiency [Double] fan motor efficiency
699
- # @param vav_fan_pressure_rise [Double] fan pressure rise, in Pa
745
+ # @param vav_fan_pressure_rise [Double] fan pressure rise, in Pa
700
746
  # @param building_type [String] the building type
701
- # @return [OpenStudio::Model::AirLoopHVAC] the resulting VAV air loop
702
- def add_vav_pfp_boxes(standard,
703
- sys_name,
747
+ # @return [OpenStudio::Model::AirLoopHVAC] the resulting VAV air loop
748
+ def add_vav_pfp_boxes(standard,
749
+ sys_name,
704
750
  chilled_water_loop,
705
751
  thermal_zones,
706
752
  hvac_op_sch,
@@ -721,7 +767,7 @@ class OpenStudio::Model::Model
721
767
  else
722
768
  hvac_op_sch = self.add_schedule(hvac_op_sch)
723
769
  end
724
-
770
+
725
771
  # oa damper schedule
726
772
  if oa_damper_sch.nil?
727
773
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -736,7 +782,7 @@ class OpenStudio::Model::Model
736
782
  htg_sa_temp_f = 55.04 # Central deck htg temp 55F
737
783
  rht_sa_temp_f = 104 # VAV box reheat to 104F
738
784
  zone_htg_sa_temp_f = 104 # Zone heating design supply air temperature to 104 F
739
-
785
+
740
786
  clg_sa_temp_c = OpenStudio.convert(clg_sa_temp_f,'F','C').get
741
787
  prehtg_sa_temp_c = OpenStudio.convert(prehtg_sa_temp_f,'F','C').get
742
788
  preclg_sa_temp_c = OpenStudio.convert(preclg_sa_temp_f,'F','C').get
@@ -826,7 +872,7 @@ class OpenStudio::Model::Model
826
872
  pfp_fan = OpenStudio::Model::FanConstantVolume.new(self,self.alwaysOnDiscreteSchedule)
827
873
  pfp_fan.setName("#{zone.name} PFP Term Fan")
828
874
  pfp_fan.setPressureRise(300)
829
-
875
+
830
876
  #parallel fan powered terminal
831
877
  pfp_terminal = OpenStudio::Model::AirTerminalSingleDuctParallelPIUReheat.new(self,
832
878
  self.alwaysOnDiscreteSchedule,
@@ -850,7 +896,7 @@ class OpenStudio::Model::Model
850
896
  return air_loop
851
897
 
852
898
  end
853
-
899
+
854
900
  # Creates a packaged VAV system and adds it to the model.
855
901
  #
856
902
  # @param standard [String] Valid choices are 90.1-2004,
@@ -861,16 +907,16 @@ class OpenStudio::Model::Model
861
907
  # @param thermal_zones [String] zones to connect to this system
862
908
  # @param hvac_op_sch [String] name of the HVAC operation schedule
863
909
  # or nil in which case will be defaulted to always on
864
- # @param oa_damper_sch [Double] name of the oa damper schedule,
910
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
865
911
  # or nil in which case will be defaulted to always open
866
912
  # @param building_type [String] the building type
867
- # @return [OpenStudio::Model::AirLoopHVAC] the resulting packaged VAV air loop
868
- def add_pvav(standard,
869
- sys_name,
870
- thermal_zones,
913
+ # @return [OpenStudio::Model::AirLoopHVAC] the resulting packaged VAV air loop
914
+ def add_pvav(standard,
915
+ sys_name,
916
+ thermal_zones,
871
917
  hvac_op_sch,
872
918
  oa_damper_sch,
873
- hot_water_loop = nil,
919
+ hot_water_loop = nil,
874
920
  return_plenum = nil,
875
921
  building_type = nil)
876
922
 
@@ -878,14 +924,14 @@ class OpenStudio::Model::Model
878
924
  thermal_zones.each do |zone|
879
925
  OpenStudio::logFree(OpenStudio::Debug, 'openstudio.Model.Model', "---#{zone.name}")
880
926
  end
881
-
927
+
882
928
  # hvac operation schedule
883
929
  if hvac_op_sch.nil?
884
930
  hvac_op_sch = self.alwaysOnDiscreteSchedule
885
931
  else
886
932
  hvac_op_sch = self.add_schedule(hvac_op_sch)
887
933
  end
888
-
934
+
889
935
  # oa damper schedule
890
936
  if oa_damper_sch.nil?
891
937
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -931,7 +977,7 @@ class OpenStudio::Model::Model
931
977
  if sys_name.nil?
932
978
  sys_name = "#{thermal_zones.size} Zone PVAV"
933
979
  air_loop.setName(sys_name)
934
- else
980
+ else
935
981
  air_loop.setName(sys_name)
936
982
  end
937
983
  air_loop.setAvailabilitySchedule(hvac_op_sch)
@@ -948,7 +994,7 @@ class OpenStudio::Model::Model
948
994
  sys_dsn_clg_sa_temp_f = 45
949
995
  end
950
996
  zn_dsn_clg_sa_temp_f = 52 # zone cooling design SAT
951
- zn_dsn_htg_sa_temp_f = 104 # zone heating design SAT
997
+ zn_dsn_htg_sa_temp_f = 104 # zone heating design SAT
952
998
  elsif sys_name.include? 'PVAV Outpatient F2 F3'
953
999
  hvac_op_sch = self.add_schedule('OutPatientHealthCare AHU2-Fan_Pre2004')
954
1000
  clg_sa_temp_f = 55 # for AHU2 in Outpatient, SAT is 55F
@@ -1060,13 +1106,14 @@ class OpenStudio::Model::Model
1060
1106
  # @param thermal_zones [String] zones to connect to this system
1061
1107
  # @param hvac_op_sch [String] name of the HVAC operation schedule
1062
1108
  # or nil in which case will be defaulted to always on
1063
- # @param oa_damper_sch [Double] name of the oa damper schedule,
1109
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
1064
1110
  # or nil in which case will be defaulted to always open
1065
1111
  # @param fan_efficiency [Double] fan total efficiency, including motor and impeller
1066
1112
  # @param fan_motor_efficiency [Double] fan motor efficiency
1067
- # @param fan_pressure_rise [Double] fan pressure rise, in Pa
1113
+ # @param fan_pressure_rise [Double] fan pressure rise, in Pa
1114
+ # @param chilled_water_loop [String] chilled water loop to connect cooling coil to.
1068
1115
  # @param building_type [String] the building type
1069
- # @return [OpenStudio::Model::AirLoopHVAC] the resulting packaged VAV air loop
1116
+ # @return [OpenStudio::Model::AirLoopHVAC] the resulting packaged VAV air loop
1070
1117
  def add_cav(standard,
1071
1118
  sys_name,
1072
1119
  hot_water_loop,
@@ -1075,7 +1122,8 @@ class OpenStudio::Model::Model
1075
1122
  oa_damper_sch,
1076
1123
  fan_efficiency,
1077
1124
  fan_motor_efficiency,
1078
- fan_pressure_rise,
1125
+ fan_pressure_rise,
1126
+ chilled_water_loop=nil,
1079
1127
  building_type=nil)
1080
1128
 
1081
1129
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding CAV for #{thermal_zones.size} zones.")
@@ -1089,27 +1137,40 @@ class OpenStudio::Model::Model
1089
1137
  else
1090
1138
  hvac_op_sch = self.add_schedule(hvac_op_sch)
1091
1139
  end
1092
-
1140
+
1093
1141
  # oa damper schedule
1094
1142
  if oa_damper_sch.nil?
1095
1143
  oa_damper_sch = self.alwaysOnDiscreteSchedule
1096
1144
  else
1097
1145
  oa_damper_sch = self.add_schedule(oa_damper_sch)
1098
- end
1099
-
1146
+ end
1147
+
1148
+
1100
1149
  # Hot water loop control temperatures
1101
1150
  hw_temp_f = 152.6 #HW setpoint 152.6F
1151
+ if building_type == 'Hospital'
1152
+ hw_temp_f = 180
1153
+ end
1102
1154
  hw_delta_t_r = 20 #20F delta-T
1103
1155
  hw_temp_c = OpenStudio.convert(hw_temp_f,'F','C').get
1104
1156
  hw_delta_t_k = OpenStudio.convert(hw_delta_t_r,'R','K').get
1157
+ air_flow_ratio = 1
1105
1158
 
1106
1159
  # Air handler control temperatures
1107
1160
  clg_sa_temp_f = 55.04 # Central deck clg temp 55F
1108
1161
  prehtg_sa_temp_f = 44.6 # Preheat to 44.6F
1162
+ if building_type == 'Hospital'
1163
+ prehtg_sa_temp_f = 55.04
1164
+ end
1109
1165
  preclg_sa_temp_f = 55.04 # Precool to 55F
1110
1166
  htg_sa_temp_f = 62.06 # Central deck htg temp 62.06F
1111
1167
  rht_sa_temp_f = 122 # VAV box reheat to 104F
1112
1168
  zone_htg_sa_temp_f = 122 # Zone heating design supply air temperature to 122F
1169
+ if building_type == 'Hospital'
1170
+ htg_sa_temp_f = 104 # Central deck htg temp 104F
1171
+ #rht_sa_temp_f = 122 # VAV box reheat to 104F
1172
+ zone_htg_sa_temp_f = 104 # Zone heating design supply air temperature to 122F
1173
+ end
1113
1174
  clg_sa_temp_c = OpenStudio.convert(clg_sa_temp_f,'F','C').get
1114
1175
  prehtg_sa_temp_c = OpenStudio.convert(prehtg_sa_temp_f,'F','C').get
1115
1176
  preclg_sa_temp_c = OpenStudio.convert(preclg_sa_temp_f,'F','C').get
@@ -1138,11 +1199,16 @@ class OpenStudio::Model::Model
1138
1199
 
1139
1200
  # Air handler sizing
1140
1201
  sizing_system = air_loop.sizingSystem
1202
+ sizing_system.setMinimumSystemAirFlowRatio(air_flow_ratio)
1141
1203
  sizing_system.setPreheatDesignTemperature(prehtg_sa_temp_c)
1142
1204
  sizing_system.setPrecoolDesignTemperature(preclg_sa_temp_c)
1143
1205
  sizing_system.setCentralCoolingDesignSupplyAirTemperature(clg_sa_temp_c)
1144
1206
  sizing_system.setCentralHeatingDesignSupplyAirTemperature(htg_sa_temp_c)
1145
- sizing_system.setSizingOption('Coincident')
1207
+ if building_type == 'Hospital'
1208
+ sizing_system.setSizingOption('NonCoincident')
1209
+ else
1210
+ sizing_system.setSizingOption('Coincident')
1211
+ end
1146
1212
  sizing_system.setAllOutdoorAirinCooling(false)
1147
1213
  sizing_system.setAllOutdoorAirinHeating(false)
1148
1214
  sizing_system.setSystemOutdoorAirMethod('ZoneSum')
@@ -1150,9 +1216,15 @@ class OpenStudio::Model::Model
1150
1216
  # Fan
1151
1217
  fan = OpenStudio::Model::FanConstantVolume.new(self,self.alwaysOnDiscreteSchedule)
1152
1218
  fan.setName("#{air_loop.name} Fan")
1153
- fan.setFanEfficiency(fan_efficiency)
1154
- fan.setMotorEfficiency(fan_motor_efficiency)
1155
- fan.setPressureRise(fan_pressure_rise)
1219
+ if building_type == 'Hospital'
1220
+ fan.setFanEfficiency(0.61425)
1221
+ fan.setMotorEfficiency(0.945)
1222
+ fan.setPressureRise(1018.41)
1223
+ else
1224
+ fan.setFanEfficiency(fan_efficiency)
1225
+ fan.setMotorEfficiency(fan_motor_efficiency)
1226
+ fan.setPressureRise(fan_pressure_rise)
1227
+ end
1156
1228
  fan.addToNode(air_loop.supplyInletNode)
1157
1229
  fan.setEndUseSubcategory("CAV system Fans")
1158
1230
 
@@ -1168,7 +1240,15 @@ class OpenStudio::Model::Model
1168
1240
  htg_coil.setRatedOutletAirTemperature(htg_sa_temp_c)
1169
1241
 
1170
1242
  # Air handler cooling coil
1171
- clg_coil = OpenStudio::Model::CoilCoolingDXTwoSpeed.new(self)
1243
+
1244
+ if chilled_water_loop.nil?
1245
+ clg_coil = OpenStudio::Model::CoilCoolingDXTwoSpeed.new(self)
1246
+ else
1247
+ clg_coil = OpenStudio::Model::CoilCoolingWater.new(self,self.alwaysOnDiscreteSchedule)
1248
+ clg_coil.setHeatExchangerConfiguration("CrossFlow")
1249
+ chilled_water_loop.addDemandBranchForComponent(clg_coil)
1250
+ clg_coil.controllerWaterCoil.get.setName("#{air_loop.name} Clg Coil Controller")
1251
+ end
1172
1252
  clg_coil.setName("#{air_loop.name} Clg Coil")
1173
1253
  clg_coil.addToNode(air_loop.supplyInletNode)
1174
1254
 
@@ -1194,23 +1274,29 @@ class OpenStudio::Model::Model
1194
1274
  # Connect the CAV system to each zone
1195
1275
  thermal_zones.each do |zone|
1196
1276
 
1197
- # Reheat coil
1198
- rht_coil = OpenStudio::Model::CoilHeatingWater.new(self,self.alwaysOnDiscreteSchedule)
1199
- rht_coil.setName("#{zone.name} Rht Coil")
1200
- rht_coil.setRatedInletWaterTemperature(hw_temp_c)
1201
- rht_coil.setRatedInletAirTemperature(htg_sa_temp_c)
1202
- rht_coil.setRatedOutletWaterTemperature(hw_temp_c - hw_delta_t_k)
1203
- rht_coil.setRatedOutletAirTemperature(rht_sa_temp_c)
1204
- hot_water_loop.addDemandBranchForComponent(rht_coil)
1277
+ if building_type == 'Hospital'
1278
+ # CAV terminal
1279
+ terminal = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(self,self.alwaysOnDiscreteSchedule)
1280
+ terminal.setName("#{zone.name} CAV Term")
1281
+ else
1282
+ # Reheat coil
1283
+ rht_coil = OpenStudio::Model::CoilHeatingWater.new(self,self.alwaysOnDiscreteSchedule)
1284
+ rht_coil.setName("#{zone.name} Rht Coil")
1285
+ rht_coil.setRatedInletWaterTemperature(hw_temp_c)
1286
+ rht_coil.setRatedInletAirTemperature(htg_sa_temp_c)
1287
+ rht_coil.setRatedOutletWaterTemperature(hw_temp_c - hw_delta_t_k)
1288
+ rht_coil.setRatedOutletAirTemperature(rht_sa_temp_c)
1289
+ hot_water_loop.addDemandBranchForComponent(rht_coil)
1205
1290
 
1206
- # VAV terminal
1207
- terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(self,self.alwaysOnDiscreteSchedule,rht_coil)
1208
- terminal.setName("#{zone.name} VAV Term")
1209
- terminal.setZoneMinimumAirFlowMethod('Constant')
1210
- terminal.set_initial_prototype_damper_position(building_type, standard, zone.outdoor_airflow_rate_per_area)
1211
- terminal.setMaximumFlowPerZoneFloorAreaDuringReheat(0.0)
1212
- terminal.setMaximumFlowFractionDuringReheat(0.5)
1213
- terminal.setMaximumReheatAirTemperature(rht_sa_temp_c)
1291
+ # VAV terminal
1292
+ terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(self,self.alwaysOnDiscreteSchedule,rht_coil)
1293
+ terminal.setName("#{zone.name} VAV Term")
1294
+ terminal.setZoneMinimumAirFlowMethod('Constant')
1295
+ terminal.set_initial_prototype_damper_position(building_type, standard, zone.outdoor_airflow_rate_per_area)
1296
+ terminal.setMaximumFlowPerZoneFloorAreaDuringReheat(0.0)
1297
+ terminal.setMaximumFlowFractionDuringReheat(0.5)
1298
+ terminal.setMaximumReheatAirTemperature(rht_sa_temp_c)
1299
+ end
1214
1300
  air_loop.addBranchForZone(zone,terminal.to_StraightComponent)
1215
1301
 
1216
1302
  # Zone sizing
@@ -1246,11 +1332,11 @@ class OpenStudio::Model::Model
1246
1332
  # @param thermal_zones [String] zones to connect to this system
1247
1333
  # @param hvac_op_sch [String] name of the HVAC operation schedule
1248
1334
  # or nil in which case will be defaulted to always on
1249
- # @param oa_damper_sch [Double] name of the oa damper schedule,
1335
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
1250
1336
  # or nil in which case will be defaulted to always open
1251
1337
  # @param fan_location [Double] valid choices are BlowThrough, DrawThrough
1252
1338
  # @param fan_type [Double] valid choices are ConstantVolume, Cycling
1253
- # @param heating_type [Double] valid choices are Gas, Water,
1339
+ # @param heating_type [Double] valid choices are Gas, Water,
1254
1340
  # Single Speed Heat Pump, Water To Air Heat Pump
1255
1341
  # @param supplemental_heating_type [Double] valid choices are Electric, Gas
1256
1342
  # @param cooling_type [String] valid choices are Water, Two Speed DX AC,
@@ -1259,14 +1345,14 @@ class OpenStudio::Model::Model
1259
1345
  # @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting PSZ-AC air loops
1260
1346
  # Todo: clarify where these default curves coefficients are coming from
1261
1347
  # Todo: I (jmarrec) believe it is the DOE Ref curves ("DOE Ref DX Clg Coil Cool-Cap-fT")
1262
- def add_psz_ac(standard,
1263
- sys_name,
1264
- hot_water_loop,
1348
+ def add_psz_ac(standard,
1349
+ sys_name,
1350
+ hot_water_loop,
1265
1351
  chilled_water_loop,
1266
- thermal_zones,
1352
+ thermal_zones,
1267
1353
  hvac_op_sch,
1268
1354
  oa_damper_sch,
1269
- fan_location,
1355
+ fan_location,
1270
1356
  fan_type,
1271
1357
  heating_type,
1272
1358
  supplemental_heating_type,
@@ -1297,7 +1383,7 @@ class OpenStudio::Model::Model
1297
1383
  else
1298
1384
  hvac_op_sch = self.add_schedule(hvac_op_sch)
1299
1385
  end
1300
-
1386
+
1301
1387
  # oa damper schedule
1302
1388
  if oa_damper_sch.nil?
1303
1389
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -1310,7 +1396,7 @@ class OpenStudio::Model::Model
1310
1396
  thermal_zones.each do |zone|
1311
1397
 
1312
1398
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding PSZ-AC for #{zone.name}.")
1313
-
1399
+
1314
1400
  air_loop = OpenStudio::Model::AirLoopHVAC.new(self)
1315
1401
  if sys_name.nil?
1316
1402
  air_loop.setName("#{zone.name} PSZ-AC")
@@ -1319,7 +1405,7 @@ class OpenStudio::Model::Model
1319
1405
  end
1320
1406
  air_loop.setAvailabilitySchedule(hvac_op_sch)
1321
1407
  air_loops << air_loop
1322
-
1408
+
1323
1409
  # When an air_loop is contructed, its constructor creates a sizing:system object
1324
1410
  # the default sizing:system contstructor makes a system:sizing object
1325
1411
  # appropriate for a multizone VAV system
@@ -1763,14 +1849,14 @@ class OpenStudio::Model::Model
1763
1849
  oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(self,oa_controller)
1764
1850
  oa_system.setName("#{air_loop.name} OA Sys")
1765
1851
  econ_eff_sch = self.add_schedule('RetailStandalone PSZ_Econ_MaxOAFrac_Sch')
1766
-
1852
+
1767
1853
  case standard
1768
1854
  when '90.1-2004','90.1-2007','90.1-2010','90.1-2013'
1769
1855
  oa_controller.setMaximumFractionofOutdoorAirSchedule(econ_eff_sch) if building_type == "RetailStandalone" || building_type == "RetailStripmall"
1770
1856
  when 'DOE Ref Pre-1980','DOE Ref 1980-2004'
1771
1857
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'No maximum fraction outdoor air schedule in PSZ for building types except RetailStandalone')
1772
1858
  end
1773
-
1859
+
1774
1860
  # Add the components to the air loop
1775
1861
  # in order from closest to zone to furthest from zone
1776
1862
  supply_inlet_node = air_loop.supplyInletNode
@@ -1881,7 +1967,7 @@ class OpenStudio::Model::Model
1881
1967
  return air_loops
1882
1968
 
1883
1969
  end
1884
-
1970
+
1885
1971
  # Adds a data center load to a given space.
1886
1972
  #
1887
1973
  # @param space [OpenStudio::Model::Space] which space to assign the data center loads to
@@ -1914,11 +2000,11 @@ class OpenStudio::Model::Model
1914
2000
  # @param thermal_zones [String] zones to connect to this system
1915
2001
  # @param hvac_op_sch [String] name of the HVAC operation schedule
1916
2002
  # or nil in which case will be defaulted to always on
1917
- # @param oa_damper_sch [Double] name of the oa damper schedule,
2003
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
1918
2004
  # or nil in which case will be defaulted to always open
1919
2005
  # @param main_data_center [Bool] whether or not this is the main data
1920
2006
  # center in the building.
1921
- # @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting air loops
2007
+ # @return [Array<OpenStudio::Model::AirLoopHVAC>] an array of the resulting air loops
1922
2008
  def add_data_center_hvac(standard,
1923
2009
  sys_name,
1924
2010
  hot_water_loop,
@@ -1932,7 +2018,7 @@ class OpenStudio::Model::Model
1932
2018
  thermal_zones.each do |zone|
1933
2019
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding data center HVAC for #{zone.name}.")
1934
2020
  end
1935
-
2021
+
1936
2022
  hw_temp_f = 180 #HW setpoint 180F
1937
2023
  hw_delta_t_r = 20 #20F delta-T
1938
2024
  hw_temp_c = OpenStudio.convert(hw_temp_f,'F','C').get
@@ -1955,7 +2041,7 @@ class OpenStudio::Model::Model
1955
2041
  else
1956
2042
  hvac_op_sch = self.add_schedule(hvac_op_sch)
1957
2043
  end
1958
-
2044
+
1959
2045
  # oa damper schedule
1960
2046
  if oa_damper_sch.nil?
1961
2047
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -2137,7 +2223,7 @@ class OpenStudio::Model::Model
2137
2223
  return air_loops
2138
2224
 
2139
2225
  end
2140
-
2226
+
2141
2227
  # Creates a split DX AC system for each zone and adds it to the model.
2142
2228
  #
2143
2229
  # @param standard [String] Valid choices are 90.1-2004,
@@ -2146,7 +2232,7 @@ class OpenStudio::Model::Model
2146
2232
  # @param thermal_zones [String] zones to connect to this system
2147
2233
  # @param hvac_op_sch [String] name of the HVAC operation schedule
2148
2234
  # or nil in which case will be defaulted to always on
2149
- # @param oa_damper_sch [Double] name of the oa damper schedule,
2235
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
2150
2236
  # or nil in which case will be defaulted to always open
2151
2237
  # @param fan_type [Double] valid choices are ConstantVolume, Cycling
2152
2238
  # @param heating_type [Double] valid choices are Gas, Single Speed Heat Pump
@@ -2155,9 +2241,9 @@ class OpenStudio::Model::Model
2155
2241
  # Single Speed DX AC, Single Speed Heat Pump
2156
2242
  # @param building_type [String] the building type
2157
2243
  # @return [OpenStudio::Model::AirLoopHVAC] the resulting split AC air loop.
2158
- def add_split_AC(standard,
2244
+ def add_split_AC(standard,
2159
2245
  sys_name,
2160
- thermal_zones,
2246
+ thermal_zones,
2161
2247
  hvac_op_sch,
2162
2248
  alt_hvac_op_sch,
2163
2249
  oa_damper_sch,
@@ -2169,8 +2255,8 @@ class OpenStudio::Model::Model
2169
2255
 
2170
2256
  thermal_zones.each do |zone|
2171
2257
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding split DX AC for #{zone.name}.")
2172
- end
2173
-
2258
+ end
2259
+
2174
2260
  # hvac operation schedule
2175
2261
  if hvac_op_sch.nil?
2176
2262
  hvac_op_sch = self.alwaysOnDiscreteSchedule
@@ -2184,7 +2270,7 @@ class OpenStudio::Model::Model
2184
2270
  else
2185
2271
  alt_hvac_op_sch = self.add_schedule(alt_hvac_op_sch)
2186
2272
  end
2187
-
2273
+
2188
2274
  # oa damper schedule
2189
2275
  if oa_damper_sch.nil?
2190
2276
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -2620,14 +2706,14 @@ class OpenStudio::Model::Model
2620
2706
  # Set to nil for heating types besides water.
2621
2707
  # @param thermal_zones [String] zones to connect to this system
2622
2708
  # @param fan_type [Double] valid choices are ConstantVolume, Cycling
2623
- # @param heating_type [Double] valid choices are
2709
+ # @param heating_type [Double] valid choices are
2624
2710
  # Gas, Electric, Water
2625
- # @param cooling_type [String] valid choices are
2711
+ # @param cooling_type [String] valid choices are
2626
2712
  # Two Speed DX AC, Single Speed DX AC
2627
2713
  # @param building_type [String] the building type
2628
- # @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an
2714
+ # @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an
2629
2715
  # array of the resulting PTACs.
2630
- def add_ptac(standard,
2716
+ def add_ptac(standard,
2631
2717
  sys_name,
2632
2718
  hot_water_loop,
2633
2719
  thermal_zones,
@@ -2638,7 +2724,7 @@ class OpenStudio::Model::Model
2638
2724
 
2639
2725
  thermal_zones.each do |zone|
2640
2726
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding PTAC for #{zone.name}.")
2641
- end
2727
+ end
2642
2728
 
2643
2729
  # schedule: always off
2644
2730
  always_off = OpenStudio::Model::ScheduleRuleset.new(self)
@@ -2885,7 +2971,7 @@ class OpenStudio::Model::Model
2885
2971
  ptac_system.addToThermalZone(zone)
2886
2972
 
2887
2973
  ptacs << ptac_system
2888
-
2974
+
2889
2975
  end
2890
2976
 
2891
2977
  return ptacs
@@ -2900,9 +2986,9 @@ class OpenStudio::Model::Model
2900
2986
  # @param thermal_zones [String] zones to connect to this system
2901
2987
  # @param fan_type [Double] valid choices are ConstantVolume, Cycling
2902
2988
  # @param building_type [String] the building type
2903
- # @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an
2989
+ # @return [Array<OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner>] an
2904
2990
  # array of the resulting PTACs.
2905
- def add_pthp(standard,
2991
+ def add_pthp(standard,
2906
2992
  sys_name,
2907
2993
  thermal_zones,
2908
2994
  fan_type,
@@ -2910,7 +2996,7 @@ class OpenStudio::Model::Model
2910
2996
 
2911
2997
  thermal_zones.each do |zone|
2912
2998
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding PTHP for #{zone.name}.")
2913
- end
2999
+ end
2914
3000
 
2915
3001
  # schedule: always off
2916
3002
  always_off = OpenStudio::Model::ScheduleRuleset.new(self)
@@ -3063,7 +3149,7 @@ class OpenStudio::Model::Model
3063
3149
 
3064
3150
  # Supplemental heating coil
3065
3151
  supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(self,self.alwaysOnDiscreteSchedule)
3066
-
3152
+
3067
3153
  # Wrap coils in a PTHP system
3068
3154
  pthp_system = OpenStudio::Model::ZoneHVACPackagedTerminalHeatPump.new(self,
3069
3155
  self.alwaysOnDiscreteSchedule,
@@ -3071,7 +3157,7 @@ class OpenStudio::Model::Model
3071
3157
  htg_coil,
3072
3158
  clg_coil,
3073
3159
  supplemental_htg_coil)
3074
-
3160
+
3075
3161
  pthp_system.setName("#{zone.name} PTHP")
3076
3162
  pthp_system.setFanPlacement("DrawThrough")
3077
3163
  if fan_type == "ConstantVolume"
@@ -3082,7 +3168,7 @@ class OpenStudio::Model::Model
3082
3168
  pthp_system.addToThermalZone(zone)
3083
3169
 
3084
3170
  pthps << pthp_system
3085
-
3171
+
3086
3172
  end
3087
3173
 
3088
3174
  return pthps
@@ -3096,18 +3182,18 @@ class OpenStudio::Model::Model
3096
3182
  # @param sys_name [String] the name of the system, or nil in which case it will be defaulted
3097
3183
  # @param thermal_zones [String] zones to connect to this system
3098
3184
  # @param hvac_op_sch [String] name of the HVAC operation schedule
3099
- # or nil in which case will be defaulted to always on
3185
+ # or nil in which case will be defaulted to always on
3100
3186
  # @param fan_control_type [Double] valid choices are Continuous, OnOff, Cycling
3101
3187
  # @param fan_pressure_rise [Double] fan pressure rise, in Pa
3102
- # @param heating_type [Double] valid choices are
3188
+ # @param heating_type [Double] valid choices are
3103
3189
  # Gas, Electric
3104
3190
  # @param building_type [String] the building type
3105
- # @return [Array<OpenStudio::Model::ZoneHVACUnitHeater>] an
3191
+ # @return [Array<OpenStudio::Model::ZoneHVACUnitHeater>] an
3106
3192
  # array of the resulting unit heaters.
3107
3193
  # Todo: to leverage this method for proposed model creation, might be useful to add 'Water' to heating type with an optional hot_water_loop to tie it to
3108
- def add_unitheater(standard,
3194
+ def add_unitheater(standard,
3109
3195
  sys_name,
3110
- thermal_zones,
3196
+ thermal_zones,
3111
3197
  hvac_op_sch,
3112
3198
  fan_control_type,
3113
3199
  fan_pressure_rise,
@@ -3116,8 +3202,8 @@ class OpenStudio::Model::Model
3116
3202
 
3117
3203
  thermal_zones.each do |zone|
3118
3204
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding split unit heater for #{zone.name}.")
3119
- end
3120
-
3205
+ end
3206
+
3121
3207
  # hvac operation schedule
3122
3208
  if hvac_op_sch.nil?
3123
3209
  hvac_op_sch = self.alwaysOnDiscreteSchedule
@@ -3169,30 +3255,30 @@ class OpenStudio::Model::Model
3169
3255
  unit_heater.addToThermalZone(zone)
3170
3256
  unit_heaters << unit_heater
3171
3257
  end
3172
-
3258
+
3173
3259
  return unit_heaters
3174
-
3260
+
3175
3261
  end
3176
-
3262
+
3177
3263
  # Creates a high temp radiant heater for each zone and adds it to the model.
3178
3264
  #
3179
3265
  # @param standard [String] Valid choices are 90.1-2004,
3180
3266
  # 90.1-2007, 90.1-2010, 90.1-2013
3181
3267
  # @param sys_name [String] the name of the system, or nil in which case it will be defaulted
3182
3268
  # @param thermal_zones [String] zones to connect to this system
3183
- # @param heating_type [Double] valid choices are
3184
- # Gas, Electric
3269
+ # @param heating_type [Double] valid choices are
3270
+ # Gas, Electric
3185
3271
  # @param combustion_efficiency [Double] combustion efficiency as decimal
3186
3272
  # @param building_type [String] the building type
3187
- # @return [Array<OpenStudio::Model::ZoneHVACHighTemperatureRadiant>] an
3188
- # array of the resulting radiant heaters.
3273
+ # @return [Array<OpenStudio::Model::ZoneHVACHighTemperatureRadiant>] an
3274
+ # array of the resulting radiant heaters.
3189
3275
  def add_high_temp_radiant(standard,
3190
3276
  sys_name,
3191
3277
  thermal_zones,
3192
3278
  heating_type,
3193
3279
  combustion_efficiency,
3194
3280
  building_type=nil)
3195
-
3281
+
3196
3282
  # Make a high temp radiant heater for each zone
3197
3283
  rad_heaters = []
3198
3284
  thermal_zones.each do |zone|
@@ -3206,7 +3292,7 @@ class OpenStudio::Model::Model
3206
3292
  high_temp_radiant.setHeatingThrottlingRange(2)
3207
3293
  high_temp_radiant.addToThermalZone(zone)
3208
3294
  rad_heaters << high_temp_radiant
3209
-
3295
+
3210
3296
  end
3211
3297
 
3212
3298
  return rad_heaters
@@ -3231,8 +3317,8 @@ class OpenStudio::Model::Model
3231
3317
  # @param parasitic_fuel_consumption_rate [Double] the parasitic fuel consumption
3232
3318
  # rate of the water heater, in W
3233
3319
  # @param building_type [String] the building type
3234
- # @return [OpenStudio::Model::PlantLoop]
3235
- # the resulting service water loop.
3320
+ # @return [OpenStudio::Model::PlantLoop]
3321
+ # the resulting service water loop.
3236
3322
  def add_swh_loop(standard,
3237
3323
  sys_name,
3238
3324
  water_heater_thermal_zone,
@@ -3245,8 +3331,8 @@ class OpenStudio::Model::Model
3245
3331
  parasitic_fuel_consumption_rate,
3246
3332
  building_type = nil)
3247
3333
 
3248
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding service water loop.")
3249
-
3334
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding service water loop.")
3335
+
3250
3336
  # Service water heating loop
3251
3337
  service_water_loop = OpenStudio::Model::PlantLoop.new(self)
3252
3338
  service_water_loop.setMinimumLoopTemperature(10)
@@ -3257,7 +3343,7 @@ class OpenStudio::Model::Model
3257
3343
  else
3258
3344
  service_water_loop.setName(sys_name)
3259
3345
  end
3260
-
3346
+
3261
3347
  # Temperature schedule type limits
3262
3348
  temp_sch_type_limits = OpenStudio::Model::ScheduleTypeLimits.new(self)
3263
3349
  temp_sch_type_limits.setName('Temperature Schedule Type Limits')
@@ -3345,7 +3431,7 @@ class OpenStudio::Model::Model
3345
3431
  # 90.1-2007, 90.1-2010, 90.1-2013
3346
3432
  # @param water_heater_capacity [Double] water heater capacity, in W
3347
3433
  # @param water_heater_volume [Double] water heater volume, in m^3
3348
- # @param water_heater_fuel [Double] valid choices are
3434
+ # @param water_heater_fuel [Double] valid choices are
3349
3435
  # Natural Gas, Electricity
3350
3436
  # @param service_water_temperature [Double] water heater temperature, in C
3351
3437
  # @param parasitic_fuel_consumption_rate [Double] water heater parasitic
@@ -3357,9 +3443,9 @@ class OpenStudio::Model::Model
3357
3443
  # @param peak_flowrate [Double] in m^3/s
3358
3444
  # @param flowrate_schedule [String] name of the flow rate schedule
3359
3445
  # @param water_heater_thermal_zone [OpenStudio::Model::ThermalZone]
3360
- # zones to place water heater in. If nil, will be assumed in 70F air for heat loss.
3446
+ # zones to place water heater in. If nil, will be assumed in 70F air for heat loss.
3361
3447
  # @param building_type [String] the building type
3362
- # @return [OpenStudio::Model::WaterHeaterMixed]
3448
+ # @return [OpenStudio::Model::WaterHeaterMixed]
3363
3449
  # the resulting water heater.
3364
3450
  def add_water_heater(standard,
3365
3451
  water_heater_capacity,
@@ -3373,9 +3459,9 @@ class OpenStudio::Model::Model
3373
3459
  flowrate_schedule,
3374
3460
  water_heater_thermal_zone,
3375
3461
  building_type = nil)
3376
-
3462
+
3377
3463
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding water heater.")
3378
-
3464
+
3379
3465
  # Water heater
3380
3466
  # TODO Standards - Change water heater methodology to follow
3381
3467
  # 'Model Enhancements Appendix A.'
@@ -3461,7 +3547,7 @@ class OpenStudio::Model::Model
3461
3547
  end
3462
3548
 
3463
3549
  return water_heater
3464
-
3550
+
3465
3551
  end
3466
3552
 
3467
3553
  # Creates a booster water heater and attaches it
@@ -3473,16 +3559,16 @@ class OpenStudio::Model::Model
3473
3559
  # the main service water loop that this booster assists.
3474
3560
  # @param water_heater_capacity [Double] water heater capacity, in W
3475
3561
  # @param water_heater_volume [Double] water heater volume, in m^3
3476
- # @param water_heater_fuel [Double] valid choices are
3562
+ # @param water_heater_fuel [Double] valid choices are
3477
3563
  # Gas, Electric
3478
3564
  # @param booster_water_temperature [Double] water heater temperature, in C
3479
3565
  # @param parasitic_fuel_consumption_rate [Double] water heater parasitic
3480
3566
  # fuel consumption rate, in W
3481
3567
  # @param booster_water_heater_thermal_zone [OpenStudio::Model::ThermalZone]
3482
- # zones to place water heater in. If nil, will be assumed in 70F air for heat loss.
3568
+ # zones to place water heater in. If nil, will be assumed in 70F air for heat loss.
3483
3569
  # @param building_type [String] the building type
3484
- # @return [OpenStudio::Model::PlantLoop]
3485
- # the resulting booster water loop.
3570
+ # @return [OpenStudio::Model::PlantLoop]
3571
+ # the resulting booster water loop.
3486
3572
  def add_swh_booster(standard,
3487
3573
  main_service_water_loop,
3488
3574
  water_heater_capacity,
@@ -3492,9 +3578,9 @@ class OpenStudio::Model::Model
3492
3578
  parasitic_fuel_consumption_rate,
3493
3579
  booster_water_heater_thermal_zone,
3494
3580
  building_type = nil)
3495
-
3581
+
3496
3582
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding booster water heater to #{main_service_water_loop.name}.")
3497
-
3583
+
3498
3584
  # Booster water heating loop
3499
3585
  booster_service_water_loop = OpenStudio::Model::PlantLoop.new(self)
3500
3586
  booster_service_water_loop.setName('Service Water Loop')
@@ -3639,13 +3725,13 @@ class OpenStudio::Model::Model
3639
3725
  # @param swh_loop [OpenStudio::Model::PlantLoop]
3640
3726
  # the main service water loop to add water fixtures to.
3641
3727
  # @param peak_flowrate [Double] in m^3/s
3642
- # @param flowrate_schedule [String] name of the flow rate schedule
3728
+ # @param flowrate_schedule [String] name of the flow rate schedule
3643
3729
  # @param water_use_temperature [Double] mixed water use temperature, in C
3644
3730
  # @param space_name [String] the name of the space to add the water fixture to,
3645
3731
  # or nil, in which case it will not be assigned to any particular space.
3646
3732
  # @param building_type [String] the building type
3647
- # @return [OpenStudio::Model::WaterUseEquipment]
3648
- # the resulting water fixture.
3733
+ # @return [OpenStudio::Model::WaterUseEquipment]
3734
+ # the resulting water fixture.
3649
3735
  def add_swh_end_uses(standard,
3650
3736
  use_name,
3651
3737
  swh_loop,
@@ -3656,7 +3742,7 @@ class OpenStudio::Model::Model
3656
3742
  building_type=nil)
3657
3743
 
3658
3744
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding water fixture to #{swh_loop.name}.")
3659
-
3745
+
3660
3746
  # Water use connection
3661
3747
  swh_connection = OpenStudio::Model::WaterUseConnections.new(self)
3662
3748
 
@@ -3697,7 +3783,7 @@ class OpenStudio::Model::Model
3697
3783
  else
3698
3784
  water_fixture.setName("#{space_name.capitalize} Service Water Use #{rated_flow_rate_gal_per_min.round(2)}gal/min")
3699
3785
  end
3700
-
3786
+
3701
3787
  unless space_name.nil?
3702
3788
  space = self.getSpaceByName(space_name)
3703
3789
  space = space.get
@@ -3708,7 +3794,7 @@ class OpenStudio::Model::Model
3708
3794
 
3709
3795
  # Connect the water use connection to the SWH loop
3710
3796
  swh_loop.addDemandBranchForComponent(swh_connection)
3711
-
3797
+
3712
3798
  return water_fixture
3713
3799
 
3714
3800
  end
@@ -3742,6 +3828,7 @@ class OpenStudio::Model::Model
3742
3828
  end
3743
3829
  rated_flow_rate_gal_per_min = rated_flow_rate_gal_per_hour/60 # gal/h to gal/min
3744
3830
  rated_flow_rate_m3_per_s = OpenStudio.convert(rated_flow_rate_gal_per_min,'gal/min','m^3/s').get
3831
+
3745
3832
  # water_use_sensible_frac_sch = OpenStudio::Model::ScheduleConstant.new(self)
3746
3833
  # water_use_sensible_frac_sch.setValue(0.2)
3747
3834
  # water_use_latent_frac_sch = OpenStudio::Model::ScheduleConstant.new(self)
@@ -3780,17 +3867,17 @@ class OpenStudio::Model::Model
3780
3867
  # @param swh_booster_loop [OpenStudio::Model::PlantLoop]
3781
3868
  # the booster water loop to add water fixtures to.
3782
3869
  # @param peak_flowrate [Double] in m^3/s
3783
- # @param flowrate_schedule [String] name of the flow rate schedule
3870
+ # @param flowrate_schedule [String] name of the flow rate schedule
3784
3871
  # @param water_use_temperature [Double] mixed water use temperature, in C
3785
3872
  # @param building_type [String] the building type
3786
- # @return [OpenStudio::Model::WaterUseEquipment]
3787
- # the resulting water fixture.
3873
+ # @return [OpenStudio::Model::WaterUseEquipment]
3874
+ # the resulting water fixture.
3788
3875
  def add_booster_swh_end_uses(standard,
3789
3876
  swh_booster_loop,
3790
3877
  peak_flowrate,
3791
3878
  flowrate_schedule,
3792
3879
  water_use_temperature,
3793
- building_type=nil)
3880
+ building_type=nil)
3794
3881
 
3795
3882
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding water fixture to #{swh_booster_loop.name}.")
3796
3883
 
@@ -3820,11 +3907,11 @@ class OpenStudio::Model::Model
3820
3907
  swh_booster_loop.addDemandBranchForComponent(swh_connection)
3821
3908
 
3822
3909
  return water_fixture
3823
-
3910
+
3824
3911
  end
3825
3912
 
3826
-
3827
-
3913
+
3914
+
3828
3915
  # Creates a DOAS system with fan coil units
3829
3916
  # for each zone.
3830
3917
  #
@@ -3836,25 +3923,25 @@ class OpenStudio::Model::Model
3836
3923
  # @param thermal_zones [String] zones to connect to this system
3837
3924
  # @param hvac_op_sch [String] name of the HVAC operation schedule
3838
3925
  # or nil in which case will be defaulted to always on
3839
- # @param oa_damper_sch [Double] name of the oa damper schedule,
3926
+ # @param oa_damper_sch [Double] name of the oa damper schedule,
3840
3927
  # or nil in which case will be defaulted to always open
3841
3928
  # @param fan_max_flow_rate [Double] fan maximum flow rate, in m^3/s.
3842
3929
  # if nil, this value will be autosized.
3843
3930
  # @param economizer_control_type [String] valid choices are
3844
- # FixedDryBulb,
3931
+ # FixedDryBulb,
3845
3932
  # @param building_type [String] the building type
3846
3933
  # @return [OpenStudio::Model::AirLoopHVAC] the resulting DOAS air loop
3847
- def add_doas(standard,
3848
- sys_name,
3849
- hot_water_loop,
3934
+ def add_doas(standard,
3935
+ sys_name,
3936
+ hot_water_loop,
3850
3937
  chilled_water_loop,
3851
3938
  thermal_zones,
3852
3939
  hvac_op_sch,
3853
3940
  oa_damper_sch,
3854
3941
  fan_max_flow_rate,
3855
3942
  economizer_control_type,
3856
- building_type=nil)
3857
-
3943
+ building_type=nil)
3944
+
3858
3945
  OpenStudio::logFree(OpenStudio::Info, 'openstudio.Model.Model', "Adding DOAS system for #{thermal_zones.size} zones.")
3859
3946
  thermal_zones.each do |zone|
3860
3947
  OpenStudio::logFree(OpenStudio::Debug, 'openstudio.Model.Model', "---#{zone.name}")
@@ -3866,7 +3953,7 @@ class OpenStudio::Model::Model
3866
3953
  else
3867
3954
  hvac_op_sch = self.add_schedule(hvac_op_sch)
3868
3955
  end
3869
-
3956
+
3870
3957
  # oa damper schedule
3871
3958
  if oa_damper_sch.nil?
3872
3959
  oa_damper_sch = self.alwaysOnDiscreteSchedule
@@ -4011,16 +4098,16 @@ class OpenStudio::Model::Model
4011
4098
  # attach new terminal to the zone and to the airloop
4012
4099
  air_loop.addBranchForZone(zone, air_terminal.to_StraightComponent)
4013
4100
  end
4014
-
4101
+
4015
4102
  return air_loop
4016
-
4103
+
4017
4104
  end
4018
4105
 
4019
4106
  # Add an elevator the the specified space
4020
4107
  #
4021
- # @param standard [String] Valid choices are
4108
+ # @param standard [String] Valid choices are
4022
4109
  # DOE Ref Pre-1980, DOE Ref 1980-2004,
4023
- # 90.1-2004, 90.1-2007, 90.1-2010, 90.1-2013,
4110
+ # 90.1-2004, 90.1-2007, 90.1-2010, 90.1-2013,
4024
4111
  # @param space [OpenStudio::Model::Space] the space
4025
4112
  # to assign the elevators to.
4026
4113
  # @param number_of_elevators [Integer] the number of elevators
@@ -4030,7 +4117,7 @@ class OpenStudio::Model::Model
4030
4117
  # @param elevator_fan_schedule [String] the name of the elevator fan schedule
4031
4118
  # @param elevator_lights_schedule [String] the name of the elevator lights schedule
4032
4119
  # @param building_type [String] the building type
4033
- # @return [OpenStudio::Model::ElectricEquipment] the resulting elevator
4120
+ # @return [OpenStudio::Model::ElectricEquipment] the resulting elevator
4034
4121
  def add_elevator(standard,
4035
4122
  space,
4036
4123
  number_of_elevators,
@@ -4142,7 +4229,7 @@ class OpenStudio::Model::Model
4142
4229
  #
4143
4230
  # @param availability_sch_name [String] the name of the fan availability schedule
4144
4231
  # @param flow_rate [Double] the exhaust fan flow rate in m^3/s
4145
- # @param balanced_exhaust_fraction_schedule_name [String] the name
4232
+ # @param balanced_exhaust_fraction_schedule_name [String] the name
4146
4233
  # of the balanced exhaust fraction schedule.
4147
4234
  # @param thermal_zones [Array<OpenStudio::Model::ThermalZone>] an array of thermal zones
4148
4235
  # @return [Array<OpenStudio::Model::FanZoneExhaust>] an array of exhaust fans created
@@ -4241,7 +4328,7 @@ class OpenStudio::Model::Model
4241
4328
  ventilation.setMinimumOutdoorTemperature(-30.0)
4242
4329
  ventilation.setMaximumOutdoorTemperature(50.0)
4243
4330
  ventilation.setMaximumWindSpeed(6.0)
4244
- end
4331
+ end
4245
4332
  ventilation.addToThermalZone(zone)
4246
4333
  zone_ventilations << ventilation
4247
4334
  end