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.
- 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
|