openstudio-standards 0.1.3 → 0.1.4

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