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.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_chillers.json +5 -5
- data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
- data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
- data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
- data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
- data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
- data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
- data/data/standards/OpenStudio_Standards_schedules.json +262 -10
- data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
- data/data/standards/manage_OpenStudio_Standards.rb +19 -21
- data/data/weather/weather_info.csv +96 -0
- data/lib/openstudio-standards/btap/btap.rb +1 -1
- data/lib/openstudio-standards/btap/compliance.rb +135 -40
- data/lib/openstudio-standards/btap/envelope.rb +26 -5
- data/lib/openstudio-standards/btap/geometry.rb +11 -1
- data/lib/openstudio-standards/btap/hvac.rb +489 -56
- data/lib/openstudio-standards/btap/simmanager.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
- data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
- data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
- data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
- data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
- data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
- data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
- data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
- data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
- data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
- data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
- data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
- data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
- data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
- data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
- data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
- data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
- data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
- data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
- data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
- data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
- data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
- data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
- metadata +8 -3
- 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
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
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
|
-
|
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
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
289
|
-
|
290
|
-
|
291
|
-
|
292
|
-
|
293
|
-
|
294
|
-
|
295
|
-
|
296
|
-
|
297
|
-
|
298
|
-
|
299
|
-
|
300
|
-
|
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
|
-
|
313
|
-
|
314
|
-
|
315
|
-
|
316
|
-
|
317
|
-
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
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
|
-
|
1154
|
-
|
1155
|
-
|
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
|
-
|
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
|
-
|
1198
|
-
|
1199
|
-
|
1200
|
-
|
1201
|
-
|
1202
|
-
|
1203
|
-
|
1204
|
-
|
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
|
-
|
1207
|
-
|
1208
|
-
|
1209
|
-
|
1210
|
-
|
1211
|
-
|
1212
|
-
|
1213
|
-
|
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
|