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