openstudio-standards 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards_chillers.json +5 -5
  4. data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
  5. data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
  6. data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
  7. data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
  8. data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
  9. data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
  10. data/data/standards/OpenStudio_Standards_schedules.json +262 -10
  11. data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
  12. data/data/standards/manage_OpenStudio_Standards.rb +19 -21
  13. data/data/weather/weather_info.csv +96 -0
  14. data/lib/openstudio-standards/btap/btap.rb +1 -1
  15. data/lib/openstudio-standards/btap/compliance.rb +135 -40
  16. data/lib/openstudio-standards/btap/envelope.rb +26 -5
  17. data/lib/openstudio-standards/btap/geometry.rb +11 -1
  18. data/lib/openstudio-standards/btap/hvac.rb +489 -56
  19. data/lib/openstudio-standards/btap/simmanager.rb +1 -1
  20. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
  21. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
  22. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
  23. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
  24. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
  25. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
  26. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
  27. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
  28. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
  29. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
  30. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
  31. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
  32. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
  33. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
  34. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
  35. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
  36. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
  37. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
  38. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
  39. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
  40. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
  41. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
  42. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
  43. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
  44. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
  45. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
  46. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
  47. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
  48. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
  49. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
  50. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
  51. data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
  52. data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
  53. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
  54. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
  55. data/lib/openstudio-standards/version.rb +1 -1
  56. data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
  57. data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
  58. metadata +8 -3
  59. data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -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,name = "opaque material", thickness = 0.1 , conductivity = 0.1 , density = 0.1, specific_heat = 0.1, roughness = "Smooth", thermal_absorptance = 0.9, solar_absorptance = 0.7, visible_absorptance = 0.7 )
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 <String>
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 customized ground constructionset") unless default_surface_construction_set.setDefaultExteriorSubSurfaceConstructions(new_ext_subsurface_set)
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 , conductance)
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
- self.add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
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
- chiller = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_chw_loop_with_components(model,chw_loop,chiller_type)
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,chiller)
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.add_sys3and8_single_zone_packaged_rooftop_unit_with_baseboard_heating( model, zones, boiler_fueltype, heating_coil_type, baseboard_type)
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.0)
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(13.0)
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 add_sys3_single_zone_packaged_rooftop_unit_with_baseboard_heating
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
- chiller = BTAP::Resources::HVAC::HVACTemplates::NECB2011::setup_chw_loop_with_components(model,chw_loop,chiller_type)
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,chiller)
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(13.0)
3068
- sizingSystem.setCentralHeatingDesignSupplyAirTemperature(13.0)
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 = 13.0
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
- boiler = OpenStudio::Model::BoilerHotWater.new(model)
3196
- boiler.setFuelType(boiler_fueltype)
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(boiler)
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
- chiller = OpenStudio::Model::ChillerElectricEIR.new(model)
3237
- chiller.setCondenserType("WaterCooled")
3238
- # update name so it's in agreement with method used in Standards file
3239
- chiller_name = chiller.name.to_s + " WaterCooled #{chiller_type}"
3240
- chiller.setName(chiller_name)
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(chiller)
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 chiller
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,chiller)
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(chiller)
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