openstudio-standards 0.1.3 → 0.1.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_chillers.json +5 -5
- data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
- data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
- data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
- data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
- data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
- data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
- data/data/standards/OpenStudio_Standards_schedules.json +262 -10
- data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
- data/data/standards/manage_OpenStudio_Standards.rb +19 -21
- data/data/weather/weather_info.csv +96 -0
- data/lib/openstudio-standards/btap/btap.rb +1 -1
- data/lib/openstudio-standards/btap/compliance.rb +135 -40
- data/lib/openstudio-standards/btap/envelope.rb +26 -5
- data/lib/openstudio-standards/btap/geometry.rb +11 -1
- data/lib/openstudio-standards/btap/hvac.rb +489 -56
- data/lib/openstudio-standards/btap/simmanager.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
- data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
- data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
- data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
- data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
- data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
- data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
- data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
- data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
- data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
- data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
- data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
- data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
- data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
- data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
- data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
- data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
- data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
- data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
- data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
- data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
- data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
- data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
- data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
- metadata +8 -3
- data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -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
|