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
@@ -190,7 +190,16 @@ module BTAP
|
|
190
190
|
# @param solar_absorptance [Float] range of 0 to 1.0
|
191
191
|
# @param visible_absorptance [Float] range of 0 to 1.0
|
192
192
|
# @return [OpenStudio::Model::StandardOpaqueMaterial] material {http://openstudio.nrel.gov/sites/openstudio.nrel.gov/files/nv_data/cpp_documentation_it/model/html/classopenstudio_1_1model_1_1_standard_opaque_material.html}
|
193
|
-
def self.create_opaque_material( model,
|
193
|
+
def self.create_opaque_material( model,
|
194
|
+
name = "opaque material",
|
195
|
+
thickness = 0.1 ,
|
196
|
+
conductivity = 0.1 ,
|
197
|
+
density = 0.1,
|
198
|
+
specific_heat = 0.1,
|
199
|
+
roughness = "Smooth",
|
200
|
+
thermal_absorptance = 0.9,
|
201
|
+
solar_absorptance = 0.7,
|
202
|
+
visible_absorptance = 0.7 )
|
194
203
|
# make sure the roughness value is acceptable.
|
195
204
|
raise("Roughness Value \"#{roughness}\" is not a part of accepted values such as: #{OpenStudio::Model::StandardOpaqueMaterial::roughnessValues.join(",")}") unless OpenStudio::Model::StandardOpaqueMaterial::roughnessValues.include?(roughness)
|
196
205
|
# I was thinking of adding a suffix to the name to make it more descriptive, but this can be confusing. Keeping it here if I need it later.
|
@@ -612,14 +621,14 @@ module BTAP
|
|
612
621
|
|
613
622
|
#Check if the requested resistance is smaller than the minimum
|
614
623
|
# resistance. If so, use the minimum resistance instead.
|
615
|
-
if minimum_resistance > 1 / conductance
|
624
|
+
if minimum_resistance > ( 1 / conductance )
|
616
625
|
#tell user why we are defaulting and set the conductance of the
|
617
626
|
# construction.
|
618
627
|
raise ("could not set conductance of construction #{new_construction.name.to_s} to because existing layers make this impossible. Change the construction to allow for this conductance to be set." + (conductance).to_s + "setting to closest value possible value:" + (1.0 / minimum_resistance).to_s )
|
619
628
|
# new_construction.setConductance((1.0/minimum_resistance))
|
620
629
|
else
|
621
630
|
unless new_construction.setConductance(conductance)
|
622
|
-
raise("could not set conductance of construction #{new_construction.name.to_s}")
|
631
|
+
raise("could not set conductance of construction #{new_construction.name.to_s}")
|
623
632
|
end
|
624
633
|
end
|
625
634
|
end
|
@@ -715,7 +724,7 @@ module BTAP
|
|
715
724
|
#@author Phylroy A. Lopez <plopez@nrcan.gc.ca>
|
716
725
|
#@param model [OpenStudio::Model::Model]
|
717
726
|
#@param name <String>
|
718
|
-
#@param materials <
|
727
|
+
#@param materials <Material>
|
719
728
|
#@param insulationLayer = nil
|
720
729
|
#@return [String] construction
|
721
730
|
def self.create_construction(model, name, materials, insulationLayer = nil)
|
@@ -835,6 +844,16 @@ module BTAP
|
|
835
844
|
puts new_materials_array.size
|
836
845
|
return self.create_construction(construction.model, cons_name, new_materials_array)
|
837
846
|
end
|
847
|
+
|
848
|
+
def self.create_default_construction(model, rsi)
|
849
|
+
|
850
|
+
end
|
851
|
+
|
852
|
+
def self.create_default_fenestration(model, rsi)
|
853
|
+
|
854
|
+
end
|
855
|
+
|
856
|
+
|
838
857
|
|
839
858
|
end #module Constructions
|
840
859
|
|
@@ -1040,6 +1059,7 @@ module BTAP
|
|
1040
1059
|
raise ("Could not customized exterior constructionset") unless default_surface_construction_set.setDefaultExteriorSurfaceConstructions(new_ext_surface_set)
|
1041
1060
|
|
1042
1061
|
ground_surface_set = default_surface_construction_set.defaultGroundContactSurfaceConstructions.get
|
1062
|
+
|
1043
1063
|
new_ground_surface_set = self.customize_default_surface_constructions_rsi(model, name, ground_surface_set, ground_wall_rsi, ground_floor_rsi, ground_roof_rsi)
|
1044
1064
|
raise ("Could not customized ground constructionset") unless default_surface_construction_set.setDefaultGroundContactSurfaceConstructions(new_ground_surface_set)
|
1045
1065
|
|
@@ -1057,7 +1077,7 @@ module BTAP
|
|
1057
1077
|
tubular_daylight_dome_rsi, tubular_daylight_dome_solar_trans, tubular_daylight_dome_vis_trans,
|
1058
1078
|
tubular_daylight_diffuser_rsi, tubular_daylight_diffuser_solar_trans, tubular_daylight_diffuser_vis_trans
|
1059
1079
|
)
|
1060
|
-
raise ("Could not
|
1080
|
+
raise ("Could not customize subsurface constructionset") unless default_surface_construction_set.setDefaultExteriorSubSurfaceConstructions(new_ext_subsurface_set)
|
1061
1081
|
end
|
1062
1082
|
|
1063
1083
|
|
@@ -1276,6 +1296,7 @@ module BTAP
|
|
1276
1296
|
#@param roof_conductance [Float] = nil
|
1277
1297
|
#@return [Object] set
|
1278
1298
|
def self.customize_default_surface_constructions_conductance(model,name,default_surface_constructions,wall_conductance = nil, floor_conductance = nil, roof_conductance = nil)
|
1299
|
+
|
1279
1300
|
set = OpenStudio::Model::DefaultSurfaceConstructions.new(model)
|
1280
1301
|
set.setName( name)
|
1281
1302
|
set.setFloorConstruction(Resources::Envelope::Constructions::customize_opaque_construction(model, default_surface_constructions.floorConstruction.get, floor_conductance)) unless floor_conductance.nil?
|
@@ -2112,6 +2112,16 @@ module BTAP
|
|
2112
2112
|
end
|
2113
2113
|
return model
|
2114
2114
|
end
|
2115
|
+
|
2116
|
+
def self.intersect_surfaces(model)
|
2117
|
+
model.getSpaces.each do |space1|
|
2118
|
+
model.getSpaces.each do |space2|
|
2119
|
+
space1.intersectSurfaces(space2)
|
2120
|
+
end
|
2121
|
+
end
|
2122
|
+
return model
|
2123
|
+
end
|
2124
|
+
|
2115
2125
|
# This method will scale the model
|
2116
2126
|
# @param model [OpenStudio::Model::Model] the model object.
|
2117
2127
|
# @param x [Float] x scalar multiplier.
|
@@ -2712,7 +2722,7 @@ module BTAP
|
|
2712
2722
|
|
2713
2723
|
#This method creates a new construction based on the current, changes the rsi and assign the construction to the current surface.
|
2714
2724
|
#Most of the meat of this method is in the construction class. Testing is done there.
|
2715
|
-
def self.set_surfaces_construction_conductance(surfaces
|
2725
|
+
def self.set_surfaces_construction_conductance(surfaces,conductance)
|
2716
2726
|
surfaces.each do |surface|
|
2717
2727
|
#a bit of acrobatics to get the construction object from the ConstrustionBase object's name.
|
2718
2728
|
construction = OpenStudio::Model::getConstructionByName(surface.model,surface.construction.get.name.to_s).get
|
@@ -1,5 +1,5 @@
|
|
1
1
|
require "#{File.dirname(__FILE__)}/btap"
|
2
|
-
|
2
|
+
|
3
3
|
module BTAP
|
4
4
|
module Resources #Resources
|
5
5
|
|
@@ -2310,7 +2310,11 @@ module BTAP
|
|
2310
2310
|
end
|
2311
2311
|
|
2312
2312
|
def self.assign_zones_sys3(model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
2313
|
-
|
2313
|
+
#if(heating_coil_type == "DX")
|
2314
|
+
self.add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_single_speed( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
2315
|
+
#else
|
2316
|
+
#self.add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
2317
|
+
#end
|
2314
2318
|
end
|
2315
2319
|
|
2316
2320
|
def self.assign_zones_sys4( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
@@ -2325,6 +2329,7 @@ module BTAP
|
|
2325
2329
|
#To do: must unravel story vav assignment.
|
2326
2330
|
def self.assign_zones_sys6( model ,zones, boiler_fueltype, heating_coil_type, baseboard_type, chiller_type, fan_type )
|
2327
2331
|
self.add_sys6_multi_zone_built_up_system_with_baseboard_heating( model ,zones, boiler_fueltype, heating_coil_type, baseboard_type, chiller_type, fan_type )
|
2332
|
+
puts "end assign_zones_sys6"
|
2328
2333
|
end
|
2329
2334
|
|
2330
2335
|
def self.assign_zones_sys7(model, zones, boiler_fueltype,chiller_type,mua_cooling_type)
|
@@ -2449,8 +2454,250 @@ module BTAP
|
|
2449
2454
|
|
2450
2455
|
|
2451
2456
|
end # Create MAU
|
2457
|
+
|
2458
|
+
|
2459
|
+
|
2460
|
+
# Create a PTAC for each zone:
|
2461
|
+
# PTAC DX Cooling with electric heating coil; electric heating coil is always off
|
2462
|
+
|
2463
|
+
|
2464
|
+
# TO DO: need to apply this system to space types:
|
2465
|
+
#(1) data processing area: control room, data centre
|
2466
|
+
# when cooling capacity <= 20kW and
|
2467
|
+
#(2) residential/accommodation: murb, hotel/motel guest room
|
2468
|
+
# when building/space heated only (this as per NECB; apply to
|
2469
|
+
# all for initial work? CAN-QUEST limitation)
|
2470
|
+
|
2471
|
+
#TO DO: PTAC characteristics: sizing, fan schedules, temperature setpoints, interaction with MAU
|
2472
|
+
|
2473
|
+
|
2474
|
+
zones.each do |zone|
|
2475
|
+
|
2476
|
+
# Set up PTAC heating coil; apply always off schedule
|
2477
|
+
|
2478
|
+
# htg_coil_elec = OpenStudio::Model::CoilHeatingElectric.new(model,always_on)
|
2479
|
+
htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model,always_off)
|
2480
|
+
|
2481
|
+
|
2482
|
+
|
2483
|
+
# Set up PTAC DX coil with NECB performance curve characteristics;
|
2484
|
+
clg_coil = BTAP::Resources::HVAC::Plant::add_onespeed_DX_coil(model,always_on)
|
2485
|
+
|
2486
|
+
|
2487
|
+
# Set up PTAC constant volume supply fan
|
2488
|
+
fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
2489
|
+
fan.setPressureRise(640)
|
2490
|
+
|
2491
|
+
|
2492
|
+
|
2493
|
+
ptac = OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner.new(model,
|
2494
|
+
always_on,
|
2495
|
+
fan,
|
2496
|
+
htg_coil,
|
2497
|
+
clg_coil)
|
2498
|
+
ptac.setName("#{zone.name} PTAC")
|
2499
|
+
ptac.addToThermalZone(zone)
|
2500
|
+
|
2501
|
+
# add zone baseboards
|
2502
|
+
if ( baseboard_type == "Electric") then
|
2503
|
+
|
2504
|
+
# zone_elec_baseboard = OpenStudio::Model::ZoneHVACBaseboardConvectiveElectric.new(model)
|
2505
|
+
zone_elec_baseboard = BTAP::Resources::HVAC::Plant::add_elec_baseboard(model)
|
2506
|
+
zone_elec_baseboard.addToThermalZone(zone)
|
2507
|
+
|
2508
|
+
end
|
2509
|
+
|
2510
|
+
if ( baseboard_type == "Hot Water") then
|
2511
|
+
baseboard_coil = BTAP::Resources::HVAC::Plant::add_hw_baseboard_coil(model)
|
2512
|
+
#Connect baseboard coil to hot water loop
|
2513
|
+
hw_loop.addDemandBranchForComponent(baseboard_coil)
|
2514
|
+
|
2515
|
+
|
2516
|
+
zone_baseboard = BTAP::Resources::HVAC::ZoneEquipment::add_zone_baseboard_convective_water(model, always_on, baseboard_coil)
|
2517
|
+
#add zone_baseboard to zone
|
2518
|
+
zone_baseboard.addToThermalZone(zone)
|
2519
|
+
|
2520
|
+
end
|
2521
|
+
|
2522
|
+
|
2523
|
+
# # Create a diffuser and attach the zone/diffuser pair to the MAU air loop, if applicable
|
2524
|
+
if (mau == true) then
|
2525
|
+
|
2526
|
+
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
2527
|
+
mau_air_loop.addBranchForZone(zone,diffuser.to_StraightComponent)
|
2528
|
+
|
2529
|
+
end #components for MAU
|
2530
|
+
|
2531
|
+
end # of zone loop
|
2452
2532
|
|
2453
2533
|
|
2534
|
+
return true
|
2535
|
+
|
2536
|
+
end #sys1_unitary_ac_baseboard_heating
|
2537
|
+
|
2538
|
+
def self.add_sys1_unitary_ac_baseboard_heating_multi_speed(model,zones, boiler_fueltype, mau ,mau_heating_coil_type,baseboard_type)
|
2539
|
+
|
2540
|
+
# System Type 1: PTAC with no heating (unitary AC)
|
2541
|
+
# Zone baseboards, electric or hot water depending on argument baseboard_type
|
2542
|
+
# baseboard_type choices are "Hot Water" or "Electric"
|
2543
|
+
# PSZ to represent make-up air unit (if present)
|
2544
|
+
# This measure creates:
|
2545
|
+
# a PTAC unit for each zone in the building; DX cooling coil
|
2546
|
+
# and heating coil that is always off
|
2547
|
+
# Baseboards ("Hot Water or "Electric") in zones connected to hot water loop
|
2548
|
+
# MAU is present if argument mau == true, not present if argument mau == false
|
2549
|
+
# MAU is PSZ; DX cooling
|
2550
|
+
# MAU heating coil: hot water coil or electric, depending on argument mau_heating_coil_type
|
2551
|
+
# mau_heating_coil_type choices are "Hot Water", "Electric"
|
2552
|
+
# boiler_fueltype choices match OS choices for Boiler component fuel type, i.e.
|
2553
|
+
# "NaturalGas","Electricity","PropaneGas","FuelOil#1","FuelOil#2","Coal","Diesel","Gasoline","OtherFuel1"
|
2554
|
+
|
2555
|
+
# Some system parameters are set after system is set up; by applying method 'applyHVACEfficiencyStandard'
|
2556
|
+
|
2557
|
+
|
2558
|
+
always_on = model.alwaysOnDiscreteSchedule
|
2559
|
+
|
2560
|
+
# define always off schedule for ptac heating coil
|
2561
|
+
always_off = BTAP::Resources::Schedules::StandardSchedules::ON_OFF::always_off(model)
|
2562
|
+
|
2563
|
+
#TODO: Heating and cooling temperature set point schedules are set somewhere else
|
2564
|
+
#TODO: For now fetch the schedules and use them in setting up the heat pump system
|
2565
|
+
#TODO: Later on these schedules need to be passed on to this method
|
2566
|
+
htg_temp_sch,clg_temp_sch = nil,nil
|
2567
|
+
zones.each do |izone|
|
2568
|
+
if(izone.thermostat.is_initialized)
|
2569
|
+
zone_thermostat = izone.thermostat.get
|
2570
|
+
if zone_thermostat.to_ThermostatSetpointDualSetpoint.is_initialized
|
2571
|
+
dual_thermostat = zone_thermostat.to_ThermostatSetpointDualSetpoint.get
|
2572
|
+
htg_temp_sch = dual_thermostat.heatingSetpointTemperatureSchedule.get
|
2573
|
+
clg_temp_sch = dual_thermostat.coolingSetpointTemperatureSchedule.get
|
2574
|
+
break
|
2575
|
+
end
|
2576
|
+
end
|
2577
|
+
end
|
2578
|
+
|
2579
|
+
# Create a hot water loop; MAU hydronic heating coil and hot water baseboards will be
|
2580
|
+
# connected to this loop (if MAU and its heating coil is hydronic or if baseboard type is hydronic)
|
2581
|
+
|
2582
|
+
if ( (mau == true and mau_heating_coil_type == "Hot Water") or baseboard_type == "Hot Water" ) then
|
2583
|
+
|
2584
|
+
hw_loop = OpenStudio::Model::PlantLoop.new(model)
|
2585
|
+
BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_hw_loop_with_components(model,hw_loop,boiler_fueltype, always_on)
|
2586
|
+
|
2587
|
+
end #of if statement
|
2588
|
+
|
2589
|
+
#Create MAU
|
2590
|
+
# TO DO: MAU sizing, characteristics (fan operation schedules, temperature setpoints, outdoor air, etc)
|
2591
|
+
|
2592
|
+
if ( mau == true) then
|
2593
|
+
|
2594
|
+
staged_thermostat = OpenStudio::Model::ZoneControlThermostatStagedDualSetpoint.new(model)
|
2595
|
+
staged_thermostat.setHeatingTemperatureSetpointSchedule(htg_temp_sch)
|
2596
|
+
staged_thermostat.setNumberofHeatingStages(4)
|
2597
|
+
staged_thermostat.setCoolingTemperatureSetpointBaseSchedule(clg_temp_sch)
|
2598
|
+
staged_thermostat.setNumberofCoolingStages(4)
|
2599
|
+
|
2600
|
+
mau_air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
|
2601
|
+
|
2602
|
+
mau_air_loop.setName("Make-up air unit")
|
2603
|
+
|
2604
|
+
# When an air_loop is constructed, its constructor creates a sizing:system object
|
2605
|
+
# the default sizing:system constructor makes a system:sizing object
|
2606
|
+
# appropriate for a multizone VAV system
|
2607
|
+
# this systems is a constant volume system with no VAV terminals,
|
2608
|
+
# and therfore needs different default settings
|
2609
|
+
air_loop_sizing = mau_air_loop.sizingSystem # TODO units
|
2610
|
+
air_loop_sizing.setTypeofLoadtoSizeOn("Sensible")
|
2611
|
+
air_loop_sizing.autosizeDesignOutdoorAirFlowRate
|
2612
|
+
air_loop_sizing.setMinimumSystemAirFlowRatio(1.0)
|
2613
|
+
air_loop_sizing.setPreheatDesignTemperature(7.0)
|
2614
|
+
air_loop_sizing.setPreheatDesignHumidityRatio(0.008)
|
2615
|
+
air_loop_sizing.setPrecoolDesignTemperature(12.8)
|
2616
|
+
air_loop_sizing.setPrecoolDesignHumidityRatio(0.008)
|
2617
|
+
air_loop_sizing.setCentralCoolingDesignSupplyAirTemperature(12.8)
|
2618
|
+
air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(40.0)
|
2619
|
+
air_loop_sizing.setSizingOption("NonCoincident")
|
2620
|
+
air_loop_sizing.setAllOutdoorAirinCooling(false)
|
2621
|
+
air_loop_sizing.setAllOutdoorAirinHeating(false)
|
2622
|
+
air_loop_sizing.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
|
2623
|
+
air_loop_sizing.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
|
2624
|
+
air_loop_sizing.setCoolingDesignAirFlowMethod("DesignDay")
|
2625
|
+
air_loop_sizing.setCoolingDesignAirFlowRate(0.0)
|
2626
|
+
air_loop_sizing.setHeatingDesignAirFlowMethod("DesignDay")
|
2627
|
+
air_loop_sizing.setHeatingDesignAirFlowRate(0.0)
|
2628
|
+
air_loop_sizing.setSystemOutdoorAirMethod("ZoneSum")
|
2629
|
+
|
2630
|
+
mau_fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
2631
|
+
|
2632
|
+
# Multi-stage gas heating coil
|
2633
|
+
if(mau_heating_coil_type == "Electric" || mau_heating_coil_type == "Hot Water")
|
2634
|
+
|
2635
|
+
mau_htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
|
2636
|
+
mau_htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
2637
|
+
mau_htg_stage_2 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
2638
|
+
mau_htg_stage_3 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
2639
|
+
mau_htg_stage_4 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
2640
|
+
|
2641
|
+
if(mau_heating_coil_type == "Electric")
|
2642
|
+
|
2643
|
+
mau_supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model,always_on)
|
2644
|
+
|
2645
|
+
elsif(mau_heating_coil_type == "Hot Water")
|
2646
|
+
|
2647
|
+
mau_supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model,always_on)
|
2648
|
+
hw_loop.addDemandBranchForComponent(mau_supplemental_htg_coil)
|
2649
|
+
|
2650
|
+
end
|
2651
|
+
|
2652
|
+
mau_htg_stage_1.setNominalCapacity(0.1)
|
2653
|
+
mau_htg_stage_2.setNominalCapacity(0.2)
|
2654
|
+
mau_htg_stage_3.setNominalCapacity(0.3)
|
2655
|
+
mau_htg_stage_4.setNominalCapacity(0.4)
|
2656
|
+
|
2657
|
+
end
|
2658
|
+
|
2659
|
+
# Add stages to heating coil
|
2660
|
+
mau_htg_coil.addStage(mau_htg_stage_1)
|
2661
|
+
mau_htg_coil.addStage(mau_htg_stage_2)
|
2662
|
+
mau_htg_coil.addStage(mau_htg_stage_3)
|
2663
|
+
mau_htg_coil.addStage(mau_htg_stage_4)
|
2664
|
+
|
2665
|
+
#TODO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
|
2666
|
+
|
2667
|
+
# Set up DX cooling coil
|
2668
|
+
mau_clg_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
|
2669
|
+
mau_clg_coil.setFuelType('Electricity')
|
2670
|
+
mau_clg_stage_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
2671
|
+
mau_clg_stage_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
2672
|
+
mau_clg_stage_3 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
2673
|
+
mau_clg_stage_4 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
2674
|
+
mau_clg_coil.addStage(mau_clg_stage_1)
|
2675
|
+
mau_clg_coil.addStage(mau_clg_stage_2)
|
2676
|
+
mau_clg_coil.addStage(mau_clg_stage_3)
|
2677
|
+
mau_clg_coil.addStage(mau_clg_stage_4)
|
2678
|
+
|
2679
|
+
air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.new(model,mau_fan,mau_htg_coil,mau_clg_coil,mau_supplemental_htg_coil)
|
2680
|
+
# air_to_air_heatpump.setName("#{zone.name} ASHP")
|
2681
|
+
air_to_air_heatpump.setControllingZoneorThermostatLocation(zones[1])
|
2682
|
+
air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
2683
|
+
air_to_air_heatpump.setNumberofSpeedsforHeating(4)
|
2684
|
+
air_to_air_heatpump.setNumberofSpeedsforCooling(4)
|
2685
|
+
|
2686
|
+
#oa_controller
|
2687
|
+
oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
2688
|
+
#oa_controller.setEconomizerControlType("DifferentialEnthalpy")
|
2689
|
+
|
2690
|
+
#oa_system
|
2691
|
+
oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
|
2692
|
+
|
2693
|
+
# Add the components to the air loop
|
2694
|
+
# in order from closest to zone to furthest from zone
|
2695
|
+
supply_inlet_node = mau_air_loop.supplyInletNode
|
2696
|
+
air_to_air_heatpump.addToNode(supply_inlet_node)
|
2697
|
+
oa_system.addToNode(supply_inlet_node)
|
2698
|
+
|
2699
|
+
end # Create MAU
|
2700
|
+
|
2454
2701
|
# Create a PTAC for each zone:
|
2455
2702
|
# PTAC DX Cooling with electric heating coil; electric heating coil is always off
|
2456
2703
|
|
@@ -2528,7 +2775,7 @@ module BTAP
|
|
2528
2775
|
return true
|
2529
2776
|
|
2530
2777
|
end #sys1_unitary_ac_baseboard_heating
|
2531
|
-
|
2778
|
+
|
2532
2779
|
def self.add_sys2_FPFC_sys5_TPFC( model,zones, boiler_fueltype,chiller_type,fan_coil_type,mua_cooling_type )
|
2533
2780
|
|
2534
2781
|
# System Type 2: FPFC or System 5: TPFC
|
@@ -2604,12 +2851,12 @@ module BTAP
|
|
2604
2851
|
# Create a chilled water loop
|
2605
2852
|
|
2606
2853
|
chw_loop = OpenStudio::Model::PlantLoop.new(model)
|
2607
|
-
|
2854
|
+
chiller1,chiller2 = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_chw_loop_with_components(model,chw_loop,chiller_type)
|
2608
2855
|
|
2609
2856
|
# Create a condenser Loop
|
2610
2857
|
|
2611
2858
|
cw_loop = OpenStudio::Model::PlantLoop.new(model)
|
2612
|
-
ctower = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_cw_loop_with_components(model,cw_loop,
|
2859
|
+
ctower = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_cw_loop_with_components(model,cw_loop,chiller1,chiller2)
|
2613
2860
|
|
2614
2861
|
# Set up make-up air unit for ventilation
|
2615
2862
|
# TO DO: Need to investigate characteristics of make-up air unit for NECB reference
|
@@ -2653,7 +2900,6 @@ module BTAP
|
|
2653
2900
|
htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
|
2654
2901
|
|
2655
2902
|
# Add DX or hydronic cooling coil
|
2656
|
-
# TODO: set proper cooling DX COP when sizing data is available
|
2657
2903
|
if(mua_cooling_type == "DX")
|
2658
2904
|
clg_coil = BTAP::Resources::HVAC::Plant::add_onespeed_DX_coil(model,tpfc_clg_availability_sch)
|
2659
2905
|
elsif(mua_cooling_type == "Hydronic")
|
@@ -2721,7 +2967,7 @@ module BTAP
|
|
2721
2967
|
|
2722
2968
|
end # add_sys2_FPFC_sys5_TPFC
|
2723
2969
|
|
2724
|
-
def self.
|
2970
|
+
def self.add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_single_speed( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
2725
2971
|
# System Type 3: PSZ-AC
|
2726
2972
|
# This measure creates:
|
2727
2973
|
# -a constant volume packaged single-zone A/C unit
|
@@ -2764,7 +3010,7 @@ module BTAP
|
|
2764
3010
|
air_loop_sizing.setPrecoolDesignTemperature(12.8)
|
2765
3011
|
air_loop_sizing.setPrecoolDesignHumidityRatio(0.008)
|
2766
3012
|
air_loop_sizing.setCentralCoolingDesignSupplyAirTemperature(12.8)
|
2767
|
-
air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(40
|
3013
|
+
air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(40)
|
2768
3014
|
air_loop_sizing.setSizingOption("NonCoincident")
|
2769
3015
|
air_loop_sizing.setAllOutdoorAirinCooling(false)
|
2770
3016
|
air_loop_sizing.setAllOutdoorAirinHeating(false)
|
@@ -2788,6 +3034,8 @@ module BTAP
|
|
2788
3034
|
when "DX"
|
2789
3035
|
htg_coil = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
|
2790
3036
|
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model,always_on)
|
3037
|
+
htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-10.0)
|
3038
|
+
|
2791
3039
|
else
|
2792
3040
|
raise("#{heating_coil_type} is not a valid heating coil type.)")
|
2793
3041
|
end
|
@@ -2819,7 +3067,6 @@ module BTAP
|
|
2819
3067
|
air_to_air_heatpump.addToNode(supply_inlet_node)
|
2820
3068
|
else
|
2821
3069
|
fan.addToNode(supply_inlet_node)
|
2822
|
-
supplemental_htg_coil.addToNode(supply_inlet_node) if heating_coil_type == "DX"
|
2823
3070
|
htg_coil.addToNode(supply_inlet_node)
|
2824
3071
|
clg_coil.addToNode(supply_inlet_node)
|
2825
3072
|
end
|
@@ -2829,7 +3076,8 @@ module BTAP
|
|
2829
3076
|
# supply air temperature based on the needs of this zone
|
2830
3077
|
setpoint_mgr_single_zone_reheat = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
|
2831
3078
|
setpoint_mgr_single_zone_reheat.setControlZone(zone)
|
2832
|
-
setpoint_mgr_single_zone_reheat.setMinimumSupplyAirTemperature(
|
3079
|
+
setpoint_mgr_single_zone_reheat.setMinimumSupplyAirTemperature(12.8)
|
3080
|
+
setpoint_mgr_single_zone_reheat.setMaximumSupplyAirTemperature(13.0)
|
2833
3081
|
setpoint_mgr_single_zone_reheat.addToNode(air_loop.supplyOutletNode)
|
2834
3082
|
|
2835
3083
|
# Create a diffuser and attach the zone/diffuser pair to the air loop
|
@@ -2857,8 +3105,187 @@ module BTAP
|
|
2857
3105
|
|
2858
3106
|
end #zone loop
|
2859
3107
|
|
3108
|
+
|
2860
3109
|
return true
|
2861
|
-
end #end
|
3110
|
+
end #end add_sys3_single_zone_packaged_rooftop_unit_with_baseboard_heating_single_speed
|
3111
|
+
|
3112
|
+
def self.add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
3113
|
+
# System Type 3: PSZ-AC
|
3114
|
+
# This measure creates:
|
3115
|
+
# -a constant volume packaged single-zone A/C unit
|
3116
|
+
# for each zone in the building; DX cooling with
|
3117
|
+
# heating coil: fuel-fired or electric, depending on argument heating_coil_type
|
3118
|
+
# heating_coil_type choices are "Electric", "Gas", "DX"
|
3119
|
+
# zone baseboards: hot water or electric, depending on argument baseboard_type
|
3120
|
+
# baseboard_type choices are "Hot Water" or "Electric"
|
3121
|
+
# boiler_fueltype choices match OS choices for Boiler component fuel type, i.e.
|
3122
|
+
# "NaturalGas","Electricity","PropaneGas","FuelOil#1","FuelOil#2","Coal","Diesel","Gasoline","OtherFuel1"
|
3123
|
+
|
3124
|
+
always_on = model.alwaysOnDiscreteSchedule
|
3125
|
+
|
3126
|
+
# Create a hot water loop (if baseboard type is hydronic); hot water baseboards will be connected to this loop
|
3127
|
+
|
3128
|
+
if ( baseboard_type == "Hot Water" ) then
|
3129
|
+
|
3130
|
+
hw_loop = OpenStudio::Model::PlantLoop.new(model)
|
3131
|
+
BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_hw_loop_with_components(model,hw_loop,boiler_fueltype, always_on)
|
3132
|
+
|
3133
|
+
end #of if statement
|
3134
|
+
|
3135
|
+
#TODO: Heating and cooling temperature set point schedules are set somewhere else
|
3136
|
+
#TODO: For now fetch the schedules and use them in setting up the heat pump system
|
3137
|
+
#TODO: Later on these schedules need to be passed on to this method
|
3138
|
+
htg_temp_sch,clg_temp_sch = nil,nil
|
3139
|
+
zones.each do |izone|
|
3140
|
+
if(izone.thermostat.is_initialized)
|
3141
|
+
zone_thermostat = izone.thermostat.get
|
3142
|
+
if zone_thermostat.to_ThermostatSetpointDualSetpoint.is_initialized
|
3143
|
+
dual_thermostat = zone_thermostat.to_ThermostatSetpointDualSetpoint.get
|
3144
|
+
htg_temp_sch = dual_thermostat.heatingSetpointTemperatureSchedule.get
|
3145
|
+
clg_temp_sch = dual_thermostat.coolingSetpointTemperatureSchedule.get
|
3146
|
+
break
|
3147
|
+
end
|
3148
|
+
end
|
3149
|
+
end
|
3150
|
+
|
3151
|
+
zones.each do |zone|
|
3152
|
+
|
3153
|
+
air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
|
3154
|
+
|
3155
|
+
air_loop.setName("#{zone.name} NECB System 3 PSZ")
|
3156
|
+
|
3157
|
+
# When an air_loop is constructed, its constructor creates a sizing:system object
|
3158
|
+
# the default sizing:system constructor makes a system:sizing object
|
3159
|
+
# appropriate for a multizone VAV system
|
3160
|
+
# this systems is a constant volume system with no VAV terminals,
|
3161
|
+
# and therfore needs different default settings
|
3162
|
+
air_loop_sizing = air_loop.sizingSystem # TODO units
|
3163
|
+
air_loop_sizing.setTypeofLoadtoSizeOn("Sensible")
|
3164
|
+
air_loop_sizing.autosizeDesignOutdoorAirFlowRate
|
3165
|
+
air_loop_sizing.setMinimumSystemAirFlowRatio(1.0)
|
3166
|
+
air_loop_sizing.setPreheatDesignTemperature(7.0)
|
3167
|
+
air_loop_sizing.setPreheatDesignHumidityRatio(0.008)
|
3168
|
+
air_loop_sizing.setPrecoolDesignTemperature(12.8)
|
3169
|
+
air_loop_sizing.setPrecoolDesignHumidityRatio(0.008)
|
3170
|
+
air_loop_sizing.setCentralCoolingDesignSupplyAirTemperature(12.8)
|
3171
|
+
air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(40.0)
|
3172
|
+
air_loop_sizing.setSizingOption("NonCoincident")
|
3173
|
+
air_loop_sizing.setAllOutdoorAirinCooling(false)
|
3174
|
+
air_loop_sizing.setAllOutdoorAirinHeating(false)
|
3175
|
+
air_loop_sizing.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
|
3176
|
+
air_loop_sizing.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
|
3177
|
+
air_loop_sizing.setCoolingDesignAirFlowMethod("DesignDay")
|
3178
|
+
air_loop_sizing.setCoolingDesignAirFlowRate(0.0)
|
3179
|
+
air_loop_sizing.setHeatingDesignAirFlowMethod("DesignDay")
|
3180
|
+
air_loop_sizing.setHeatingDesignAirFlowRate(0.0)
|
3181
|
+
air_loop_sizing.setSystemOutdoorAirMethod("ZoneSum")
|
3182
|
+
|
3183
|
+
fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
|
3184
|
+
|
3185
|
+
staged_thermostat = OpenStudio::Model::ZoneControlThermostatStagedDualSetpoint.new(model)
|
3186
|
+
staged_thermostat.setHeatingTemperatureSetpointSchedule(htg_temp_sch)
|
3187
|
+
staged_thermostat.setNumberofHeatingStages(4)
|
3188
|
+
staged_thermostat.setCoolingTemperatureSetpointBaseSchedule(clg_temp_sch)
|
3189
|
+
staged_thermostat.setNumberofCoolingStages(4)
|
3190
|
+
zone.setThermostat(staged_thermostat)
|
3191
|
+
|
3192
|
+
# Multi-stage gas heating coil
|
3193
|
+
if(heating_coil_type == "Gas" || heating_coil_type == "Electric")
|
3194
|
+
htg_coil = OpenStudio::Model::CoilHeatingGasMultiStage.new(model)
|
3195
|
+
htg_stage_1 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
3196
|
+
htg_stage_2 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
3197
|
+
htg_stage_3 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
3198
|
+
htg_stage_4 = OpenStudio::Model::CoilHeatingGasMultiStageStageData.new(model)
|
3199
|
+
if(heating_coil_type == "Gas")
|
3200
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model,always_on)
|
3201
|
+
elsif(heating_coil_type == "Electric")
|
3202
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model,always_on)
|
3203
|
+
htg_stage_1.setNominalCapacity(0.1)
|
3204
|
+
htg_stage_2.setNominalCapacity(0.2)
|
3205
|
+
htg_stage_3.setNominalCapacity(0.3)
|
3206
|
+
htg_stage_4.setNominalCapacity(0.4)
|
3207
|
+
end
|
3208
|
+
|
3209
|
+
# Multi-Stage DX or Electric heating coil
|
3210
|
+
elsif(heating_coil_type == "DX")
|
3211
|
+
htg_coil = OpenStudio::Model::CoilHeatingDXMultiSpeed.new(model)
|
3212
|
+
htg_stage_1 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
|
3213
|
+
htg_stage_2 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
|
3214
|
+
htg_stage_3 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
|
3215
|
+
htg_stage_4 = OpenStudio::Model::CoilHeatingDXMultiSpeedStageData.new(model)
|
3216
|
+
supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model,always_on)
|
3217
|
+
|
3218
|
+
else
|
3219
|
+
raise("#{heating_coil_type} is not a valid heating coil type.)")
|
3220
|
+
end
|
3221
|
+
|
3222
|
+
# Add stages to heating coil
|
3223
|
+
htg_coil.addStage(htg_stage_1)
|
3224
|
+
htg_coil.addStage(htg_stage_2)
|
3225
|
+
htg_coil.addStage(htg_stage_3)
|
3226
|
+
htg_coil.addStage(htg_stage_4)
|
3227
|
+
|
3228
|
+
#TODO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
|
3229
|
+
|
3230
|
+
# Set up DX cooling coil
|
3231
|
+
clg_coil = OpenStudio::Model::CoilCoolingDXMultiSpeed.new(model)
|
3232
|
+
clg_coil.setFuelType('Electricity')
|
3233
|
+
clg_stage_1 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
3234
|
+
clg_stage_2 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
3235
|
+
clg_stage_3 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
3236
|
+
clg_stage_4 = OpenStudio::Model::CoilCoolingDXMultiSpeedStageData.new(model)
|
3237
|
+
clg_coil.addStage(clg_stage_1)
|
3238
|
+
clg_coil.addStage(clg_stage_2)
|
3239
|
+
clg_coil.addStage(clg_stage_3)
|
3240
|
+
clg_coil.addStage(clg_stage_4)
|
3241
|
+
|
3242
|
+
#oa_controller
|
3243
|
+
oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
|
3244
|
+
|
3245
|
+
#oa_system
|
3246
|
+
oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
|
3247
|
+
|
3248
|
+
# Add the components to the air loop
|
3249
|
+
# in order from closest to zone to furthest from zone
|
3250
|
+
supply_inlet_node = air_loop.supplyInletNode
|
3251
|
+
|
3252
|
+
air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.new(model,fan,htg_coil,clg_coil,supplemental_htg_coil)
|
3253
|
+
air_to_air_heatpump.setName("#{zone.name} ASHP")
|
3254
|
+
air_to_air_heatpump.setControllingZoneorThermostatLocation(zone)
|
3255
|
+
air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
|
3256
|
+
air_to_air_heatpump.addToNode(supply_inlet_node)
|
3257
|
+
air_to_air_heatpump.setNumberofSpeedsforHeating(4)
|
3258
|
+
air_to_air_heatpump.setNumberofSpeedsforCooling(4)
|
3259
|
+
|
3260
|
+
oa_system.addToNode(supply_inlet_node)
|
3261
|
+
|
3262
|
+
# Create a diffuser and attach the zone/diffuser pair to the air loop
|
3263
|
+
#diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model,always_on)
|
3264
|
+
diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
|
3265
|
+
air_loop.addBranchForZone(zone,diffuser.to_StraightComponent)
|
3266
|
+
|
3267
|
+
if ( baseboard_type == "Electric") then
|
3268
|
+
|
3269
|
+
# zone_elec_baseboard = OpenStudio::Model::ZoneHVACBaseboardConvectiveElectric.new(model)
|
3270
|
+
zone_elec_baseboard = BTAP::Resources::HVAC::Plant::add_elec_baseboard(model)
|
3271
|
+
zone_elec_baseboard.addToThermalZone(zone)
|
3272
|
+
|
3273
|
+
end
|
3274
|
+
|
3275
|
+
if ( baseboard_type == "Hot Water") then
|
3276
|
+
baseboard_coil = BTAP::Resources::HVAC::Plant::add_hw_baseboard_coil(model)
|
3277
|
+
#Connect baseboard coil to hot water loop
|
3278
|
+
hw_loop.addDemandBranchForComponent(baseboard_coil)
|
3279
|
+
|
3280
|
+
zone_baseboard = BTAP::Resources::HVAC::ZoneEquipment::add_zone_baseboard_convective_water(model, always_on, baseboard_coil)
|
3281
|
+
#add zone_baseboard to zone
|
3282
|
+
zone_baseboard.addToThermalZone(zone)
|
3283
|
+
end
|
3284
|
+
|
3285
|
+
end #zone loop
|
3286
|
+
|
3287
|
+
return true
|
3288
|
+
end #end add_sys3_single_zone_packaged_rooftop_unit_with_baseboard_heating_multi_speed
|
2862
3289
|
|
2863
3290
|
def self.add_sys4_single_zone_make_up_air_unit_with_baseboard_heating( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
|
2864
3291
|
# System Type 4: PSZ-AC
|
@@ -3035,7 +3462,7 @@ module BTAP
|
|
3035
3462
|
# "baseboard_type": "Electric" and "Hot Water"
|
3036
3463
|
# "chiller_type": "Scroll";"Centrifugal";""Screw";"Reciprocating"
|
3037
3464
|
# "fan_type": "AF_or_BI_rdg_fancurve";"AF_or_BI_inletvanes";"fc_inletvanes";"var_speed_drive"
|
3038
|
-
|
3465
|
+
|
3039
3466
|
always_on = model.alwaysOnDiscreteSchedule
|
3040
3467
|
|
3041
3468
|
#Create hot water loop if baseboard or heating coil type is hydronic
|
@@ -3050,12 +3477,12 @@ module BTAP
|
|
3050
3477
|
# Chilled Water Plant
|
3051
3478
|
|
3052
3479
|
chw_loop = OpenStudio::Model::PlantLoop.new(model)
|
3053
|
-
|
3480
|
+
chiller1,chiller2 = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_chw_loop_with_components(model,chw_loop,chiller_type)
|
3054
3481
|
|
3055
3482
|
# Condenser System
|
3056
3483
|
|
3057
3484
|
cw_loop = OpenStudio::Model::PlantLoop.new(model)
|
3058
|
-
ctower = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_cw_loop_with_components(model,cw_loop,
|
3485
|
+
ctower = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_cw_loop_with_components(model,cw_loop,chiller1,chiller2)
|
3059
3486
|
|
3060
3487
|
# Make a Packaged VAV w/ PFP Boxes for each story of the building
|
3061
3488
|
model.getBuildingStorys.sort.each do |story|
|
@@ -3064,34 +3491,26 @@ module BTAP
|
|
3064
3491
|
air_loop = OpenStudio::Model::AirLoopHVAC.new(model)
|
3065
3492
|
air_loop.setName("VAV with Reheat")
|
3066
3493
|
sizingSystem = air_loop.sizingSystem
|
3067
|
-
sizingSystem.setCentralCoolingDesignSupplyAirTemperature(
|
3068
|
-
sizingSystem.setCentralHeatingDesignSupplyAirTemperature(
|
3069
|
-
|
3494
|
+
sizingSystem.setCentralCoolingDesignSupplyAirTemperature(14.0)
|
3495
|
+
sizingSystem.setCentralHeatingDesignSupplyAirTemperature(14.0)
|
3496
|
+
sizingSystem.autosizeDesignOutdoorAirFlowRate
|
3497
|
+
sizingSystem.setMinimumSystemAirFlowRatio(0.3)
|
3498
|
+
sizingSystem.setPreheatDesignTemperature(7.0)
|
3499
|
+
sizingSystem.setPreheatDesignHumidityRatio(0.008)
|
3500
|
+
sizingSystem.setPrecoolDesignTemperature(14.0)
|
3501
|
+
sizingSystem.setPrecoolDesignHumidityRatio(0.008)
|
3502
|
+
sizingSystem.setSizingOption("NonCoincident")
|
3503
|
+
sizingSystem.setAllOutdoorAirinCooling(false)
|
3504
|
+
sizingSystem.setAllOutdoorAirinHeating(false)
|
3505
|
+
sizingSystem.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
|
3506
|
+
sizingSystem.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
|
3507
|
+
sizingSystem.setCoolingDesignAirFlowMethod("DesignDay")
|
3508
|
+
sizingSystem.setCoolingDesignAirFlowRate(0.0)
|
3509
|
+
sizingSystem.setHeatingDesignAirFlowMethod("DesignDay")
|
3510
|
+
sizingSystem.setHeatingDesignAirFlowRate(0.0)
|
3511
|
+
sizingSystem.setSystemOutdoorAirMethod("ZoneSum")
|
3512
|
+
|
3070
3513
|
fan = OpenStudio::Model::FanVariableVolume.new(model,always_on)
|
3071
|
-
fan.setFanPowerMinimumFlowRateInputMethod("Fraction")
|
3072
|
-
fan.setFanPowerCoefficient4(0.0)
|
3073
|
-
fan.setFanPowerCoefficient5(0.0)
|
3074
|
-
if(fan_type == "AF_or_BI_rdg_fancurve")
|
3075
|
-
fan.setFanPowerMinimumFlowFraction(0.47)
|
3076
|
-
fan.setFanPowerCoefficient1(0.227143)
|
3077
|
-
fan.setFanPowerCoefficient2(1.178929)
|
3078
|
-
fan.setFanPowerCoefficient3(-0.41071)
|
3079
|
-
elsif(fan_type == "AF_or_BI_inletvanes")
|
3080
|
-
fan.setFanPowerMinimumFlowFraction(0.35)
|
3081
|
-
fan.setFanPowerCoefficient1(0.584345)
|
3082
|
-
fan.setFanPowerCoefficient2(-0.57917)
|
3083
|
-
fan.setFanPowerCoefficient3(0.970238)
|
3084
|
-
elsif(fan_type == "fc_inletvanes")
|
3085
|
-
fan.setFanPowerMinimumFlowFraction(0.25)
|
3086
|
-
fan.setFanPowerCoefficient1(0.339619)
|
3087
|
-
fan.setFanPowerCoefficient2(-0.84814)
|
3088
|
-
fan.setFanPowerCoefficient3(1.495671)
|
3089
|
-
elsif(fan_type == "var_speed_drive")
|
3090
|
-
fan.setFanPowerMinimumFlowFraction(0.20)
|
3091
|
-
fan.setFanPowerCoefficient1(0.00153028)
|
3092
|
-
fan.setFanPowerCoefficient2(0.00520806)
|
3093
|
-
fan.setFanPowerCoefficient3(1.0086242)
|
3094
|
-
end
|
3095
3514
|
|
3096
3515
|
if(heating_coil_type == "Hot Water")
|
3097
3516
|
htg_coil = OpenStudio::Model::CoilHeatingWater.new(model,always_on)
|
@@ -3124,7 +3543,7 @@ module BTAP
|
|
3124
3543
|
|
3125
3544
|
# Add a setpoint manager to control the
|
3126
3545
|
# supply air to a constant temperature
|
3127
|
-
sat_c =
|
3546
|
+
sat_c = 14.0
|
3128
3547
|
sat_sch = OpenStudio::Model::ScheduleRuleset.new(model)
|
3129
3548
|
sat_sch.setName("Supply Air Temp")
|
3130
3549
|
sat_sch.defaultDaySchedule().setName("Supply Air Temp Default")
|
@@ -3151,6 +3570,7 @@ module BTAP
|
|
3151
3570
|
#TODO: schedule based on whether the zone is occupied or not as stipulated in 8.4.4.22 of NECB2011
|
3152
3571
|
min_flow_rate = 0.002*zone.floorArea
|
3153
3572
|
vav_terminal.setFixedMinimumAirFlowRate(min_flow_rate)
|
3573
|
+
vav_terminal.setMaximumReheatAirTemperature(40)
|
3154
3574
|
|
3155
3575
|
#Set zone baseboards
|
3156
3576
|
if ( baseboard_type == "Electric") then
|
@@ -3170,6 +3590,9 @@ module BTAP
|
|
3170
3590
|
end
|
3171
3591
|
end # next story
|
3172
3592
|
|
3593
|
+
#for debugging
|
3594
|
+
puts "end add_sys6_multi_zone_built_up_with_baseboard_heating"
|
3595
|
+
|
3173
3596
|
return true
|
3174
3597
|
|
3175
3598
|
end
|
@@ -3192,9 +3615,13 @@ module BTAP
|
|
3192
3615
|
# pump.setPumpFlowRateSchedule(pump_flow_sch)
|
3193
3616
|
|
3194
3617
|
#boiler
|
3195
|
-
|
3196
|
-
|
3197
|
-
|
3618
|
+
boiler1 = OpenStudio::Model::BoilerHotWater.new(model)
|
3619
|
+
boiler2 = OpenStudio::Model::BoilerHotWater.new(model)
|
3620
|
+
boiler1.setFuelType(boiler_fueltype)
|
3621
|
+
boiler2.setFuelType(boiler_fueltype)
|
3622
|
+
boiler1.setName("Primary Boiler")
|
3623
|
+
boiler2.setName("Secondary Boiler")
|
3624
|
+
|
3198
3625
|
#boiler_bypass_pipe
|
3199
3626
|
boiler_bypass_pipe = OpenStudio::Model::PipeAdiabatic.new(model)
|
3200
3627
|
|
@@ -3206,7 +3633,8 @@ module BTAP
|
|
3206
3633
|
hw_supply_outlet_node = hw_loop.supplyOutletNode
|
3207
3634
|
pump.addToNode(hw_supply_inlet_node)
|
3208
3635
|
|
3209
|
-
hw_loop.addSupplyBranchForComponent(
|
3636
|
+
hw_loop.addSupplyBranchForComponent(boiler1)
|
3637
|
+
hw_loop.addSupplyBranchForComponent(boiler2)
|
3210
3638
|
hw_loop.addSupplyBranchForComponent(boiler_bypass_pipe)
|
3211
3639
|
supply_outlet_pipe.addToNode(hw_supply_outlet_node)
|
3212
3640
|
|
@@ -3233,12 +3661,15 @@ module BTAP
|
|
3233
3661
|
#pump = OpenStudio::Model::PumpConstantSpeed.new(model)
|
3234
3662
|
chw_pump = OpenStudio::Model::PumpConstantSpeed.new(model)
|
3235
3663
|
|
3236
|
-
|
3237
|
-
|
3238
|
-
|
3239
|
-
|
3240
|
-
|
3241
|
-
|
3664
|
+
chiller1 = OpenStudio::Model::ChillerElectricEIR.new(model)
|
3665
|
+
chiller2 = OpenStudio::Model::ChillerElectricEIR.new(model)
|
3666
|
+
chiller1.setCondenserType("WaterCooled")
|
3667
|
+
chiller2.setCondenserType("WaterCooled")
|
3668
|
+
chiller1_name = "Primary Chiller WaterCooled #{chiller_type}"
|
3669
|
+
chiller1.setName(chiller1_name)
|
3670
|
+
chiller2_name = "Secondary Chiller WaterCooled #{chiller_type}"
|
3671
|
+
chiller2.setName(chiller2_name)
|
3672
|
+
|
3242
3673
|
chiller_bypass_pipe = OpenStudio::Model::PipeAdiabatic.new(model)
|
3243
3674
|
|
3244
3675
|
chw_supply_outlet_pipe = OpenStudio::Model::PipeAdiabatic.new(model)
|
@@ -3247,7 +3678,8 @@ module BTAP
|
|
3247
3678
|
chw_supply_inlet_node = chw_loop.supplyInletNode
|
3248
3679
|
chw_supply_outlet_node = chw_loop.supplyOutletNode
|
3249
3680
|
chw_pump.addToNode(chw_supply_inlet_node)
|
3250
|
-
chw_loop.addSupplyBranchForComponent(
|
3681
|
+
chw_loop.addSupplyBranchForComponent(chiller1)
|
3682
|
+
chw_loop.addSupplyBranchForComponent(chiller2)
|
3251
3683
|
chw_loop.addSupplyBranchForComponent(chiller_bypass_pipe)
|
3252
3684
|
chw_supply_outlet_pipe.addToNode(chw_supply_outlet_node)
|
3253
3685
|
|
@@ -3258,11 +3690,11 @@ module BTAP
|
|
3258
3690
|
chw_t_stpt_manager = OpenStudio::Model::SetpointManagerScheduled.new(model,chw_t_sch)
|
3259
3691
|
chw_t_stpt_manager.addToNode(chw_supply_outlet_node)
|
3260
3692
|
|
3261
|
-
return
|
3693
|
+
return chiller1,chiller2
|
3262
3694
|
|
3263
3695
|
end #of setup_chw_loop_with_components
|
3264
3696
|
|
3265
|
-
def self.setup_cw_loop_with_components(model,cw_loop,
|
3697
|
+
def self.setup_cw_loop_with_components(model,cw_loop,chiller1,chiller2)
|
3266
3698
|
|
3267
3699
|
cw_loop.setName("Condenser Water Loop")
|
3268
3700
|
cw_sizing_plant = cw_loop.sizingPlant
|
@@ -3287,7 +3719,8 @@ module BTAP
|
|
3287
3719
|
cw_loop.addSupplyBranchForComponent(clg_tower)
|
3288
3720
|
cw_loop.addSupplyBranchForComponent(clg_tower_bypass_pipe)
|
3289
3721
|
cw_supply_outlet_pipe.addToNode(cw_supply_outlet_node)
|
3290
|
-
cw_loop.addDemandBranchForComponent(
|
3722
|
+
cw_loop.addDemandBranchForComponent(chiller1)
|
3723
|
+
cw_loop.addDemandBranchForComponent(chiller2)
|
3291
3724
|
|
3292
3725
|
# Add a setpoint manager to control the
|
3293
3726
|
# condenser water to constant temperature
|