openstudio-standards 0.1.4 → 0.1.5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (120) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards_boilers.json +62 -4
  4. data/data/standards/OpenStudio_Standards_chillers.json +778 -68
  5. data/data/standards/OpenStudio_Standards_construction_sets.json +52 -93
  6. data/data/standards/OpenStudio_Standards_curve_biquadratics.json +36 -36
  7. data/data/standards/OpenStudio_Standards_curve_quadratics.json +3 -3
  8. data/data/standards/OpenStudio_Standards_heat_pumps.json +840 -0
  9. data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +352 -0
  10. data/data/standards/OpenStudio_Standards_heat_rejection.json +48 -0
  11. data/data/standards/OpenStudio_Standards_motors.json +270 -0
  12. data/data/standards/OpenStudio_Standards_space_types.json +10390 -2824
  13. data/data/standards/OpenStudio_Standards_unitary_acs.json +794 -18
  14. data/data/weather/USA_CO_Boulder-Broomfield-Jefferson.County.AP.724699_TMY3.ddy +538 -0
  15. data/data/weather/USA_CO_Boulder-Broomfield-Jefferson.County.AP.724699_TMY3.epw +8768 -0
  16. data/data/weather/USA_CO_Boulder-Broomfield-Jefferson.County.AP.724699_TMY3.stat +493 -0
  17. data/data/weather/USA_CO_Denver.Intl.AP.725650_TMY3.ddy +536 -0
  18. data/data/weather/USA_CO_Denver.Intl.AP.725650_TMY3.epw +8768 -0
  19. data/data/weather/USA_CO_Denver.Intl.AP.725650_TMY3.stat +554 -0
  20. data/data/weather/USA_CO_Fort.Collins.AWOS.724769_TMY3.ddy +536 -0
  21. data/data/weather/USA_CO_Fort.Collins.AWOS.724769_TMY3.epw +8768 -0
  22. data/data/weather/USA_CO_Fort.Collins.AWOS.724769_TMY3.stat +554 -0
  23. data/data/weather/envelope_info.csv +6 -0
  24. data/lib/openstudio-standards.rb +10 -11
  25. data/lib/openstudio-standards/btap/compliance.rb +251 -969
  26. data/lib/openstudio-standards/btap/envelope.rb +1 -1
  27. data/lib/openstudio-standards/btap/fileio.rb +37 -5
  28. data/lib/openstudio-standards/btap/geometry.rb +27 -17
  29. data/lib/openstudio-standards/btap/hvac.rb +80 -27
  30. data/lib/openstudio-standards/hvac_sizing/{HVACSizing.CoilHeatingDXMultiSpeed.rb → Siz.CoilHeatingDXMultiSpeed.rb} +0 -0
  31. data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +30 -4
  32. data/lib/openstudio-standards/hvac_sizing/Siz.CoolingTowerTwoSpeed.rb +61 -5
  33. data/lib/openstudio-standards/hvac_sizing/Siz.CoolingTowerVariableSpeed.rb +37 -7
  34. data/lib/openstudio-standards/hvac_sizing/Siz.DistrictCooling.rb +27 -0
  35. data/lib/openstudio-standards/hvac_sizing/Siz.DistrictHeating.rb +27 -0
  36. data/lib/openstudio-standards/hvac_sizing/Siz.HeaderedPumpsConstantSpeed.rb +55 -0
  37. data/lib/openstudio-standards/hvac_sizing/Siz.HeaderedPumpsVariableSpeed.rb +55 -0
  38. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +51 -9
  39. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +99 -17
  40. data/lib/openstudio-standards/hvac_sizing/Siz.PumpConstantSpeed.rb +1 -1
  41. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +29 -6
  42. data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +16 -0
  43. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +43 -48
  44. data/lib/openstudio-standards/prototypes/Prototype.ControllerWaterCoil.rb +5 -9
  45. data/lib/openstudio-standards/prototypes/Prototype.Fan.rb +68 -0
  46. data/lib/openstudio-standards/prototypes/Prototype.FanConstantVolume.rb +39 -43
  47. data/lib/openstudio-standards/prototypes/Prototype.FanOnOff.rb +49 -51
  48. data/lib/openstudio-standards/prototypes/Prototype.FanVariableVolume.rb +55 -61
  49. data/lib/openstudio-standards/prototypes/Prototype.FanZoneExhaust.rb +8 -10
  50. data/lib/openstudio-standards/prototypes/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +15 -20
  51. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +330 -322
  52. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +501 -446
  53. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +221 -230
  54. data/lib/openstudio-standards/prototypes/Prototype.add_objects.rb +0 -2
  55. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +130 -137
  56. data/lib/openstudio-standards/prototypes/Prototype.high_rise_apartment.rb +374 -291
  57. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +146 -193
  58. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +1315 -1113
  59. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +65 -88
  60. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +101 -156
  61. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +46 -96
  62. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +113 -123
  63. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +356 -345
  64. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +48 -103
  65. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +115 -123
  66. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +30 -39
  67. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +32 -45
  68. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +98 -258
  69. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +429 -474
  70. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +28 -36
  71. data/lib/openstudio-standards/prototypes/Prototype.strip_model.rb +7 -7
  72. data/lib/openstudio-standards/prototypes/Prototype.utilities.rb +172 -146
  73. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +46 -53
  74. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +885 -707
  75. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +48 -57
  76. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +24 -31
  77. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +80 -93
  78. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +69 -0
  79. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +60 -72
  80. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +104 -108
  81. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +190 -198
  82. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +134 -146
  83. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +56 -60
  84. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +151 -161
  85. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +30 -34
  86. data/lib/openstudio-standards/standards/Standards.Construction.rb +116 -132
  87. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +138 -0
  88. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +11 -0
  89. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +11 -0
  90. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +16 -0
  91. data/lib/openstudio-standards/standards/Standards.Fan.rb +190 -236
  92. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -2
  93. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -2
  94. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +168 -14
  95. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -2
  96. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +33 -0
  97. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +83 -0
  98. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +22 -0
  99. data/lib/openstudio-standards/standards/Standards.Model.rb +2385 -1622
  100. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +83 -35
  101. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +805 -395
  102. data/lib/openstudio-standards/standards/Standards.Pump.rb +139 -119
  103. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -2
  104. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +16 -15
  105. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +35 -0
  106. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +7 -13
  107. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +144 -59
  108. data/lib/openstudio-standards/standards/Standards.Space.rb +1509 -1326
  109. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +254 -262
  110. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +105 -105
  111. data/lib/openstudio-standards/standards/Standards.Surface.rb +27 -31
  112. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +882 -157
  113. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +179 -69
  114. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +75 -0
  115. data/lib/openstudio-standards/utilities/logging.rb +31 -38
  116. data/lib/openstudio-standards/utilities/simulation.rb +118 -82
  117. data/lib/openstudio-standards/version.rb +1 -1
  118. data/lib/openstudio-standards/weather/Weather.Model.rb +382 -390
  119. data/lib/openstudio-standards/weather/Weather.stat_file.rb +159 -78
  120. metadata +59 -6
@@ -1,159 +1,182 @@
1
1
 
2
2
  # Extend the class to add Medium Office specific stuff
3
3
  class OpenStudio::Model::Model
4
-
5
- def define_space_type_map(building_type, building_vintage, climate_zone)
6
-
7
-
4
+ def define_space_type_map(building_type, template, climate_zone)
8
5
  space_type_map = nil
9
- case building_vintage
6
+ case template
10
7
  when 'NECB 2011'
11
- space_type_map ={
12
- "Dormitory - living quarters" => ["Floor 1 Anesthesia", "Floor 1 Bio Haz", "Floor 1 Cafe",
13
- "Floor 1 Clean", "Floor 1 Clean Work", "Floor 1 Dictation",
14
- "Floor 1 Dressing Room", "Floor 1 Electrical Room", "Floor 1 Elevator Pump Room",
15
- "Floor 1 Operating Room 1", "Floor 1 Operating Room 2", "Floor 1 Operating Room 3",
16
- "Floor 1 Humid", "Floor 1 IT Hall", "Floor 1 IT Room", "Floor 1 Lobby Hall",
17
- "Floor 1 Lobby", "Floor 1 Lobby Toilet", "Floor 1 Locker Room Hall",
18
- "Floor 1 Locker Room", "Floor 1 Lounge", "Floor 1 Med Gas",
19
- "Floor 1 MRI Control Room", "Floor 1 MRI Hall", "Floor 1 MRI Room", "Floor 1 MRI Toilet",
20
- "Floor 1 Nourishment", "Floor 1 Nurse Hall", "Floor 1 Nurse Janitor",
21
- "Floor 1 Nurse Station", "Floor 1 Nurse Toilet", "Floor 1 Office",
22
- "Floor 1 PACU", "Floor 1 Pre-Op Hall", "Floor 1 Pre-Op Room 1", "Floor 1 Pre-Op Room 2",
23
- "Floor 1 Pre-Op Toilet", "Floor 1 Procedure Room", "Floor 1 Reception Hall",
24
- "Floor 1 Reception", "Floor 1 Recovery Room", "Floor 1 Scheduling", "Floor 1 Scrub",
25
- "Floor 1 Soil Hold", "Floor 1 Soil", "Floor 1 Soil Work", "Floor 1 Step Down",
26
- "Floor 1 Sterile Hall", "Floor 1 Sterile Storage", "Floor 1 Storage",
27
- "Floor 1 Sub-Sterile", "Floor 1 Utility Hall", "Floor 1 Utility Janitor",
28
- "Floor 1 Utility Room", "Floor 1 Vestibule", "Floor 2 Conference",
29
- "Floor 2 Conference Toilet", "Floor 2 Dictation", "Floor 2 Exam 1", "Floor 2 Exam 2",
30
- "Floor 2 Exam 3", "Floor 2 Exam 4", "Floor 2 Exam 5", "Floor 2 Exam 6", "Floor 2 Exam 7",
31
- "Floor 2 Exam 8", "Floor 2 Exam 9", "Floor 2 Exam Hall 1", "Floor 2 Exam Hall 2",
32
- "Floor 2 Exam Hall 3", "Floor 2 Exam Hall 4", "Floor 2 Exam Hall 5",
33
- "Floor 2 Exam Hall 6", "Floor 2 Janitor", "Floor 2 Lounge", "Floor 2 Nurse Station 1",
34
- "Floor 2 Nurse Station 2", "Floor 2 Office Hall", "Floor 2 Office", "Floor 2 Reception Hall",
35
- "Floor 2 Reception", "Floor 2 Reception Toilet", "Floor 2 Scheduling 1",
36
- "Floor 2 Scheduling 2", "Floor 2 Storage 1", "Floor 2 Storage 2",
37
- "Floor 2 Storage 3", "Floor 2 Utility", "Floor 2 Work Hall",
38
- "Floor 2 Work", "Floor 2 Work Toilet", "Floor 2 X-Ray", "Floor 3 Dressing Room",
39
- "Floor 3 Elevator Hall", "Floor 3 Humid", "Floor 3 Janitor", "Floor 3 Locker",
40
- "Floor 3 Lounge", "Floor 3 Lounge Toilet", "Floor 3 Mechanical Hall",
41
- "Floor 3 Mechanical", "Floor 3 Office Hall", "Floor 3 Office", "Floor 3 Office Toilet",
42
- "Floor 3 Physical Therapy 1", "Floor 3 Physical Therapy 2", "Floor 3 Physical Therapy Toilet",
43
- "Floor 3 Storage 1", "Floor 3 Storage 2", "Floor 3 Treatment",
44
- "Floor 3 Undeveloped 1", "Floor 3 Undeveloped 2",
45
- "Floor 3 Utility", "Floor 3 Work", "NE Stair", "NW Elevator", "NW Stair", "SW Stair"]
8
+ # Dom is G
9
+ space_type_map = {
10
+ 'Dormitory - living quarters' => ['Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe',
11
+ 'Floor 1 Clean', 'Floor 1 Clean Work', 'Floor 1 Dictation',
12
+ 'Floor 1 Dressing Room', 'Floor 1 Electrical Room', 'Floor 1 Elevator Pump Room',
13
+ 'Floor 1 Operating Room 1', 'Floor 1 Operating Room 2', 'Floor 1 Operating Room 3',
14
+ 'Floor 1 Humid', 'Floor 1 IT Hall', 'Floor 1 IT Room', 'Floor 1 Lobby Hall',
15
+ 'Floor 1 Lobby', 'Floor 1 Lobby Toilet', 'Floor 1 Locker Room Hall',
16
+ 'Floor 1 Locker Room', 'Floor 1 Lounge', 'Floor 1 Med Gas',
17
+ 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall', 'Floor 1 MRI Room', 'Floor 1 MRI Toilet',
18
+ 'Floor 1 Nourishment', 'Floor 1 Nurse Hall', 'Floor 1 Nurse Janitor',
19
+ 'Floor 1 Nurse Station', 'Floor 1 Nurse Toilet', 'Floor 1 Office',
20
+ 'Floor 1 PACU', 'Floor 1 Pre-Op Hall', 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2',
21
+ 'Floor 1 Pre-Op Toilet', 'Floor 1 Procedure Room', 'Floor 1 Reception Hall',
22
+ 'Floor 1 Reception', 'Floor 1 Recovery Room', 'Floor 1 Scheduling', 'Floor 1 Scrub',
23
+ 'Floor 1 Soil Hold', 'Floor 1 Soil', 'Floor 1 Soil Work', 'Floor 1 Step Down',
24
+ 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Storage',
25
+ 'Floor 1 Sub-Sterile', 'Floor 1 Utility Hall', 'Floor 1 Utility Janitor',
26
+ 'Floor 1 Utility Room', 'Floor 1 Vestibule', 'Floor 2 Conference',
27
+ 'Floor 2 Conference Toilet', 'Floor 2 Dictation', 'Floor 2 Exam 1', 'Floor 2 Exam 2',
28
+ 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7',
29
+ 'Floor 2 Exam 8', 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2',
30
+ 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4', 'Floor 2 Exam Hall 5',
31
+ 'Floor 2 Exam Hall 6', 'Floor 2 Janitor', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1',
32
+ 'Floor 2 Nurse Station 2', 'Floor 2 Office Hall', 'Floor 2 Office', 'Floor 2 Reception Hall',
33
+ 'Floor 2 Reception', 'Floor 2 Reception Toilet', 'Floor 2 Scheduling 1',
34
+ 'Floor 2 Scheduling 2', 'Floor 2 Storage 1', 'Floor 2 Storage 2',
35
+ 'Floor 2 Storage 3', 'Floor 2 Utility', 'Floor 2 Work Hall',
36
+ 'Floor 2 Work', 'Floor 2 Work Toilet', 'Floor 2 X-Ray', 'Floor 3 Dressing Room',
37
+ 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Janitor', 'Floor 3 Locker',
38
+ 'Floor 3 Lounge', 'Floor 3 Lounge Toilet', 'Floor 3 Mechanical Hall',
39
+ 'Floor 3 Mechanical', 'Floor 3 Office Hall', 'Floor 3 Office', 'Floor 3 Office Toilet',
40
+ 'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2', 'Floor 3 Physical Therapy Toilet',
41
+ 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Treatment',
42
+ 'Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2',
43
+ 'Floor 3 Utility', 'Floor 3 Work', 'NE Stair', 'NW Elevator', 'NW Stair', 'SW Stair']
46
44
  }
47
45
  else
48
46
  space_type_map = {
49
- # 'Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe', 'Floor 1 Clean', 'Floor 1 Clean Work', 'Floor 1 Dictation', 'Floor 1 Dressing Room', 'Floor 1 Electrical Room', 'Floor 1 Elevator Pump Room', 'Floor 1 Humid', 'Floor 1 IT Hall', 'Floor 1 IT Room', 'Floor 1 Lobby', 'Floor 1 Lobby Hall', 'Floor 1 Lobby Toilet', 'Floor 1 Locker Room', 'Floor 1 Locker Room Hall', 'Floor 1 Lounge', 'Floor 1 Med Gas', 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall', 'Floor 1 MRI Room', 'Floor 1 MRI Toilet', 'Floor 1 Nourishment', 'Floor 1 Nurse Hall', 'Floor 1 Nurse Janitor', 'Floor 1 Nurse Station', 'Floor 1 Nurse Toilet', 'Floor 1 Office', 'Floor 1 Operating Room 1', 'Floor 1 Operating Room 2', 'Floor 1 Operating Room 3', 'Floor 1 PACU', 'Floor 1 Pre-Op Hall', 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2', 'Floor 1 Pre-Op Toilet', 'Floor 1 Procedure Room', 'Floor 1 Reception', 'Floor 1 Reception Hall', 'Floor 1 Recovery Room', 'Floor 1 Scheduling', 'Floor 1 Scrub', 'Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work', 'Floor 1 Step Down', 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Storage', 'Floor 1 Sub-Sterile', 'Floor 1 Utility Hall', 'Floor 1 Utility Janitor', 'Floor 1 Utility Room', 'Floor 1 Vestibule', 'Floor 2 Conference', 'Floor 2 Conference Toilet', 'Floor 2 Dictation', 'Floor 2 Exam 1', 'Floor 2 Exam 2', 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7', 'Floor 2 Exam 8', 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4', 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Janitor', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1', 'Floor 2 Nurse Station 2', 'Floor 2 Office', 'Floor 2 Office Hall', 'Floor 2 Reception', 'Floor 2 Reception Hall', 'Floor 2 Reception Toilet', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', 'Floor 2 Storage 1', 'Floor 2 Storage 2', 'Floor 2 Storage 3', 'Floor 2 Utility', 'Floor 2 Work', 'Floor 2 Work Hall', 'Floor 2 Work Toilet', 'Floor 2 X-Ray', 'Floor 3 Dressing Room', 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Janitor', 'Floor 3 Locker', 'Floor 3 Lounge', 'Floor 3 Lounge Toilet', 'Floor 3 Mechanical', 'Floor 3 Mechanical Hall', 'Floor 3 Office', 'Floor 3 Office Hall', 'Floor 3 Office Toilet', 'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2', 'Floor 3 Physical Therapy Toilet', 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Treatment', 'Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2', 'Floor 3 Utility', 'Floor 3 Work', 'NE Stair', 'NW Elevator', 'NW Stair', 'SW Stair'
50
-
51
- # TODO: still need to put these into their space types...
52
- # all zones mapped
53
-
54
- 'Anesthesia' => ['Floor 1 Anesthesia'],
55
- 'BioHazard' => ['Floor 1 Bio Haz'],
56
- 'Cafe' => ['Floor 1 Cafe'],
57
- 'CleanWork' => ['Floor 1 Clean', 'Floor 1 Clean Work', ],
58
- 'Conference' => ['Floor 2 Conference'],
59
- 'DressingRoom' => ['Floor 1 Dressing Room', 'Floor 3 Dressing Room'],
60
- 'Elec/MechRoom' => ['Floor 1 Electrical Room', 'Floor 3 Mechanical'],
61
- 'ElevatorPumpRoom' => ['Floor 1 Elevator Pump Room'],
62
- # 'Floor 3 Treatment' same as 'Exam'
63
- 'Exam' => ['Floor 2 Exam 1', 'Floor 2 Exam 2', 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7',
64
- 'Floor 2 Exam 8', 'Floor 2 Exam 9', 'Floor 3 Treatment'],
65
- # 'Floor 1 Scrub', 'Floor 1 Sub-Sterile', 'Floor 1 Vestibule' same as 'Hall'
66
- 'Hall' => ['Floor 1 IT Hall', 'Floor 1 Lobby Hall', 'Floor 1 Locker Room Hall', 'Floor 1 MRI Hall', 'Floor 1 Nurse Hall', 'Floor 1 Pre-Op Hall',
67
- 'Floor 1 Reception Hall', 'Floor 1 Sterile Hall', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3',
68
- 'Floor 2 Exam Hall 4', 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Office Hall', 'Floor 2 Reception Hall', 'Floor 2 Work Hall',
69
- 'Floor 3 Mechanical Hall', 'Floor 1 Scrub'],
70
- 'Hall_infil' => ['Floor 1 Utility Hall', 'Floor 1 Sub-Sterile', 'Floor 1 Vestibule', 'Floor 3 Elevator Hall', 'Floor 3 Office Hall'],
71
- 'IT_Room' => ['Floor 1 IT Room'],
72
- # ['Floor 1 Sterile Storage', 'Floor 1 Storage', 'Floor 1 Utility Room', 'Floor 2 Storage 1', 'Floor 2 Storage 2', 'Floor 2 Storage 3', ...
73
- # 'Floor 2 Utility', 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Utility'] same as 'Janitor'
74
- 'Janitor' => ['Floor 1 Nurse Janitor', 'Floor 1 Utility Janitor', 'Floor 2 Janitor', 'Floor 3 Janitor', 'Floor 1 Sterile Storage',
75
- 'Floor 1 Storage', 'Floor 1 Utility Room', 'Floor 2 Storage 1', 'Floor 2 Storage 2', 'Floor 2 Storage 3', 'Floor 2 Utility',
76
- 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Utility'],
77
- 'Lobby' => ['Floor 1 Lobby'],
78
- 'LockerRoom' => ['Floor 1 Locker Room', 'Floor 3 Locker'],
79
- 'Lounge' => ['Floor 1 Lounge', 'Floor 2 Lounge', 'Floor 3 Lounge'],
80
- 'MRI' => ['Floor 1 MRI Room'],
81
- 'MRI_Control' => ['Floor 1 MRI Control Room'],
82
- 'MedGas' => ['Floor 1 Med Gas'],
83
- # 'Floor 1 Nourishment' same as 'NurseStation'
84
- 'NurseStation' => ['Floor 1 Nurse Station', 'Floor 1 Nourishment', 'Floor 2 Nurse Station 1', 'Floor 2 Nurse Station 2'],
85
- 'OR' => ['Floor 1 Operating Room 1', 'Floor 1 Operating Room 2', 'Floor 1 Operating Room 3'],
86
- # ['Floor 1 Dictation', 'Floor 1 Humid','Floor 1 Scheduling', 'Floor 2 Dictation', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', ...
87
- # 'Floor 2 Work', 'Floor 3 Humid', 'Floor 3 Work'] same as 'Office', 'IT Room' and 'Dressing Room'
88
- # TODO 'Floor 2 Work' has slightly different equipment density
89
- 'Office' => ['Floor 1 Office', 'Floor 2 Office', 'Floor 3 Office', 'Floor 1 Dictation', 'Floor 1 Humid', 'Floor 1 Scheduling',
90
- 'Floor 2 Dictation', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', 'Floor 2 Work', 'Floor 3 Humid', 'Floor 3 Work'],
91
- # 'Floor 1 Recovery Room' and 'Floor 1 Step Down' same as 'PACU'
92
- 'PACU' => ['Floor 1 PACU', 'Floor 1 Recovery Room', 'Floor 1 Step Down'],
93
- 'PhysicalTherapy' => ['Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2'],
94
- 'PreOp' => ['Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2'],
95
- 'ProcedureRoom' => ['Floor 1 Procedure Room'],
96
- 'Soil Work' => ['Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work'],
97
- 'Stair' => ['NE Stair', 'NW Stair', 'SW Stair', 'NW Elevator'],
98
- 'Toilet' => ['Floor 1 Nurse Toilet', 'Floor 1 Pre-Op Toilet', 'Floor 1 Lobby Toilet', 'Floor 1 MRI Toilet', 'Floor 2 Conference Toilet',
99
- 'Floor 2 Reception Toilet', 'Floor 2 Work Toilet', 'Floor 3 Lounge Toilet', 'Floor 3 Office Toilet', 'Floor 3 Physical Therapy Toilet'],
100
- 'Xray' => ['Floor 2 X-Ray'],
101
- # Add new space type 'Reception'
102
- 'Reception' => ['Floor 1 Reception', 'Floor 2 Reception'],
103
- # Add new space type 'Undeveloped'
104
- 'Undeveloped' => ['Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2']
105
- }
47
+ # 'Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe', 'Floor 1 Clean', 'Floor 1 Clean Work',
48
+ # 'Floor 1 Dictation', 'Floor 1 Dressing Room', 'Floor 1 Electrical Room', 'Floor 1 Elevator Pump Room',
49
+ # 'Floor 1 Humid', 'Floor 1 IT Hall', 'Floor 1 IT Room', 'Floor 1 Lobby', 'Floor 1 Lobby Hall',
50
+ # 'Floor 1 Lobby Toilet', 'Floor 1 Locker Room', 'Floor 1 Locker Room Hall', 'Floor 1 Lounge',
51
+ # 'Floor 1 Med Gas', 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall', 'Floor 1 MRI Room',
52
+ # 'Floor 1 MRI Toilet', 'Floor 1 Nourishment', 'Floor 1 Nurse Hall', 'Floor 1 Nurse Janitor',
53
+ # 'Floor 1 Nurse Station', 'Floor 1 Nurse Toilet', 'Floor 1 Office', 'Floor 1 Operating Room 1',
54
+ # 'Floor 1 Operating Room 2', 'Floor 1 Operating Room 3', 'Floor 1 PACU', 'Floor 1 Pre-Op Hall',
55
+ # 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2', 'Floor 1 Pre-Op Toilet', 'Floor 1 Procedure Room',
56
+ # 'Floor 1 Reception', 'Floor 1 Reception Hall', 'Floor 1 Recovery Room', 'Floor 1 Scheduling',
57
+ # 'Floor 1 Scrub', 'Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work', 'Floor 1 Step Down',
58
+ # 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Storage', 'Floor 1 Sub-Sterile',
59
+ # 'Floor 1 Utility Hall', 'Floor 1 Utility Janitor', 'Floor 1 Utility Room', 'Floor 1 Vestibule',
60
+ # 'Floor 2 Conference', 'Floor 2 Conference Toilet', 'Floor 2 Dictation', 'Floor 2 Exam 1',
61
+ # 'Floor 2 Exam 2', 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6',
62
+ # 'Floor 2 Exam 7', 'Floor 2 Exam 8', 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1',
63
+ # 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4', 'Floor 2 Exam Hall 5',
64
+ # 'Floor 2 Exam Hall 6', 'Floor 2 Janitor', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1',
65
+ # 'Floor 2 Nurse Station 2', 'Floor 2 Office', 'Floor 2 Office Hall', 'Floor 2 Reception',
66
+ # 'Floor 2 Reception Hall', 'Floor 2 Reception Toilet', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2',
67
+ # 'Floor 2 Storage 1', 'Floor 2 Storage 2', 'Floor 2 Storage 3', 'Floor 2 Utility', 'Floor 2 Work',
68
+ # 'Floor 2 Work Hall', 'Floor 2 Work Toilet', 'Floor 2 X-Ray', 'Floor 3 Dressing Room',
69
+ # 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Janitor', 'Floor 3 Locker',
70
+ # 'Floor 3 Lounge', 'Floor 3 Lounge Toilet', 'Floor 3 Mechanical', 'Floor 3 Mechanical Hall',
71
+ # 'Floor 3 Office', 'Floor 3 Office Hall', 'Floor 3 Office Toilet', 'Floor 3 Physical Therapy 1',
72
+ # 'Floor 3 Physical Therapy 2', 'Floor 3 Physical Therapy Toilet', 'Floor 3 Storage 1',
73
+ # 'Floor 3 Storage 2', 'Floor 3 Treatment', 'Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2',
74
+ # 'Floor 3 Utility', 'Floor 3 Work', 'NE Stair', 'NW Elevator', 'NW Stair', 'SW Stair'
75
+
76
+ # TODO: still need to put these into their space types...
77
+ # all zones mapped
78
+
79
+ 'Anesthesia' => ['Floor 1 Anesthesia'],
80
+ 'BioHazard' => ['Floor 1 Bio Haz'],
81
+ 'Cafe' => ['Floor 1 Cafe'],
82
+ 'CleanWork' => ['Floor 1 Clean', 'Floor 1 Clean Work'],
83
+ 'Conference' => ['Floor 2 Conference'],
84
+ 'DressingRoom' => ['Floor 1 Dressing Room', 'Floor 3 Dressing Room'],
85
+ 'Elec/MechRoom' => ['Floor 1 Electrical Room', 'Floor 3 Mechanical'],
86
+ 'ElevatorPumpRoom' => ['Floor 1 Elevator Pump Room'],
87
+ # 'Floor 3 Treatment' same as 'Exam'
88
+ 'Exam' => ['Floor 2 Exam 1', 'Floor 2 Exam 2', 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7',
89
+ 'Floor 2 Exam 8', 'Floor 2 Exam 9', 'Floor 3 Treatment'],
90
+ # 'Floor 1 Scrub', 'Floor 1 Sub-Sterile', 'Floor 1 Vestibule' same as 'Hall'
91
+ 'Hall' => ['Floor 1 IT Hall', 'Floor 1 Lobby Hall', 'Floor 1 Locker Room Hall', 'Floor 1 MRI Hall', 'Floor 1 Nurse Hall', 'Floor 1 Pre-Op Hall',
92
+ 'Floor 1 Reception Hall', 'Floor 1 Sterile Hall', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3',
93
+ 'Floor 2 Exam Hall 4', 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Office Hall', 'Floor 2 Reception Hall', 'Floor 2 Work Hall',
94
+ 'Floor 3 Mechanical Hall', 'Floor 1 Scrub'],
95
+ 'Hall_infil' => ['Floor 1 Utility Hall', 'Floor 1 Sub-Sterile', 'Floor 1 Vestibule', 'Floor 3 Elevator Hall', 'Floor 3 Office Hall'],
96
+ 'IT_Room' => ['Floor 1 IT Room'],
97
+ # ['Floor 1 Sterile Storage', 'Floor 1 Storage', 'Floor 1 Utility Room', 'Floor 2 Storage 1', 'Floor 2 Storage 2', 'Floor 2 Storage 3', ...
98
+ # 'Floor 2 Utility', 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Utility'] same as 'Janitor'
99
+ 'Janitor' => ['Floor 1 Nurse Janitor', 'Floor 1 Utility Janitor', 'Floor 2 Janitor', 'Floor 3 Janitor', 'Floor 1 Sterile Storage',
100
+ 'Floor 1 Storage', 'Floor 1 Utility Room', 'Floor 2 Storage 1', 'Floor 2 Storage 2', 'Floor 2 Storage 3', 'Floor 2 Utility',
101
+ 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Utility'],
102
+ 'Lobby' => ['Floor 1 Lobby'],
103
+ 'LockerRoom' => ['Floor 1 Locker Room', 'Floor 3 Locker'],
104
+ 'Lounge' => ['Floor 1 Lounge', 'Floor 2 Lounge', 'Floor 3 Lounge'],
105
+ 'MRI' => ['Floor 1 MRI Room'],
106
+ 'MRI_Control' => ['Floor 1 MRI Control Room'],
107
+ 'MedGas' => ['Floor 1 Med Gas'],
108
+ # 'Floor 1 Nourishment' same as 'NurseStation'
109
+ 'NurseStation' => ['Floor 1 Nurse Station', 'Floor 1 Nourishment', 'Floor 2 Nurse Station 1', 'Floor 2 Nurse Station 2'],
110
+ 'OR' => ['Floor 1 Operating Room 1', 'Floor 1 Operating Room 2', 'Floor 1 Operating Room 3'],
111
+ # ['Floor 1 Dictation', 'Floor 1 Humid','Floor 1 Scheduling', 'Floor 2 Dictation', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', ...
112
+ # 'Floor 2 Work', 'Floor 3 Humid', 'Floor 3 Work'] same as 'Office', 'IT Room' and 'Dressing Room'
113
+ # TODO 'Floor 2 Work' has slightly different equipment density
114
+ 'Office' => ['Floor 1 Office', 'Floor 2 Office', 'Floor 3 Office', 'Floor 1 Dictation', 'Floor 1 Humid', 'Floor 1 Scheduling',
115
+ 'Floor 2 Dictation', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', 'Floor 2 Work', 'Floor 3 Humid', 'Floor 3 Work'],
116
+ # 'Floor 1 Recovery Room' and 'Floor 1 Step Down' same as 'PACU'
117
+ 'PACU' => ['Floor 1 PACU', 'Floor 1 Recovery Room', 'Floor 1 Step Down'],
118
+ 'PhysicalTherapy' => ['Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2'],
119
+ 'PreOp' => ['Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2'],
120
+ 'ProcedureRoom' => ['Floor 1 Procedure Room'],
121
+ 'Soil Work' => ['Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work'],
122
+ 'Stair' => ['NE Stair', 'NW Stair', 'SW Stair', 'NW Elevator'],
123
+ 'Toilet' => ['Floor 1 Nurse Toilet', 'Floor 1 Pre-Op Toilet', 'Floor 1 Lobby Toilet', 'Floor 1 MRI Toilet', 'Floor 2 Conference Toilet',
124
+ 'Floor 2 Reception Toilet', 'Floor 2 Work Toilet', 'Floor 3 Lounge Toilet', 'Floor 3 Office Toilet', 'Floor 3 Physical Therapy Toilet'],
125
+ 'Xray' => ['Floor 2 X-Ray'],
126
+ # Add new space type 'Reception'
127
+ 'Reception' => ['Floor 1 Reception', 'Floor 2 Reception'],
128
+ # Add new space type 'Undeveloped'
129
+ 'Undeveloped' => ['Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2']
130
+ }
106
131
  end
107
-
132
+
108
133
  return space_type_map
109
-
110
134
  end
111
135
 
112
- def define_hvac_system_map(building_type, building_vintage, climate_zone)
113
-
114
- case building_vintage
136
+ def define_hvac_system_map(building_type, template, climate_zone)
137
+ case template
115
138
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
116
139
  system_to_space_map = [
117
140
  {
118
- 'type' => 'PVAV',
119
- 'name' => 'PVAV Outpatient F1',
120
- 'space_names' => [
121
- 'Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe', 'Floor 1 Clean', 'Floor 1 Clean Work', 'Floor 1 Dictation',
122
- 'Floor 1 Dressing Room', 'Floor 1 Electrical Room', 'Floor 1 Elevator Pump Room', 'Floor 1 Humid', 'Floor 1 IT Hall',
123
- 'Floor 1 IT Room', 'Floor 1 Lobby', 'Floor 1 Lobby Hall', 'Floor 1 Lobby Toilet', 'Floor 1 Locker Room',
124
- 'Floor 1 Locker Room Hall', 'Floor 1 Lounge', 'Floor 1 Med Gas', 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall',
125
- 'Floor 1 MRI Room', 'Floor 1 MRI Toilet', 'Floor 1 Nourishment', 'Floor 1 Nurse Hall', 'Floor 1 Nurse Janitor',
126
- 'Floor 1 Nurse Station', 'Floor 1 Nurse Toilet', 'Floor 1 Office', 'Floor 1 Operating Room 1', 'Floor 1 Operating Room 2',
127
- 'Floor 1 Operating Room 3', 'Floor 1 PACU', 'Floor 1 Pre-Op Hall', 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2',
128
- 'Floor 1 Pre-Op Toilet', 'Floor 1 Procedure Room', 'Floor 1 Reception', 'Floor 1 Reception Hall', 'Floor 1 Recovery Room',
129
- 'Floor 1 Scheduling', 'Floor 1 Scrub', 'Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work', 'Floor 1 Step Down',
130
- 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Storage', 'Floor 1 Sub-Sterile', 'Floor 1 Utility Hall',
131
- 'Floor 1 Utility Janitor', 'Floor 1 Utility Room', 'Floor 1 Vestibule'
132
- ]
141
+ 'type' => 'PVAV',
142
+ 'name' => 'PVAV Outpatient F1',
143
+ 'space_names' => [
144
+ 'Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe', 'Floor 1 Clean', 'Floor 1 Clean Work', 'Floor 1 Dictation',
145
+ 'Floor 1 Dressing Room', 'Floor 1 Electrical Room', 'Floor 1 Elevator Pump Room', 'Floor 1 Humid', 'Floor 1 IT Hall',
146
+ 'Floor 1 IT Room', 'Floor 1 Lobby', 'Floor 1 Lobby Hall', 'Floor 1 Lobby Toilet', 'Floor 1 Locker Room',
147
+ 'Floor 1 Locker Room Hall', 'Floor 1 Lounge', 'Floor 1 Med Gas', 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall',
148
+ 'Floor 1 MRI Room', 'Floor 1 MRI Toilet', 'Floor 1 Nourishment', 'Floor 1 Nurse Hall', 'Floor 1 Nurse Janitor',
149
+ 'Floor 1 Nurse Station', 'Floor 1 Nurse Toilet', 'Floor 1 Office', 'Floor 1 Operating Room 1', 'Floor 1 Operating Room 2',
150
+ 'Floor 1 Operating Room 3', 'Floor 1 PACU', 'Floor 1 Pre-Op Hall', 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2',
151
+ 'Floor 1 Pre-Op Toilet', 'Floor 1 Procedure Room', 'Floor 1 Reception', 'Floor 1 Reception Hall', 'Floor 1 Recovery Room',
152
+ 'Floor 1 Scheduling', 'Floor 1 Scrub', 'Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work', 'Floor 1 Step Down',
153
+ 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Storage', 'Floor 1 Sub-Sterile', 'Floor 1 Utility Hall',
154
+ 'Floor 1 Utility Janitor', 'Floor 1 Utility Room', 'Floor 1 Vestibule'
155
+ ]
133
156
  },
134
157
  {
135
- 'type' => 'PVAV',
136
- 'name' => 'PVAV Outpatient F2 F3',
137
- 'space_names' => [
138
- 'Floor 2 Conference', 'Floor 2 Conference Toilet', 'Floor 2 Dictation', 'Floor 2 Exam 1', 'Floor 2 Exam 2',
139
- 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7', 'Floor 2 Exam 8',
140
- 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4',
141
- 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Janitor', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1',
142
- 'Floor 2 Nurse Station 2', 'Floor 2 Office', 'Floor 2 Office Hall', 'Floor 2 Reception', 'Floor 2 Reception Hall',
143
- 'Floor 2 Reception Toilet', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', 'Floor 2 Storage 1', 'Floor 2 Storage 2',
144
- 'Floor 2 Storage 3', 'Floor 2 Utility', 'Floor 2 Work', 'Floor 2 Work Hall', 'Floor 2 Work Toilet', 'Floor 2 X-Ray',
145
- 'Floor 3 Dressing Room', 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Janitor', 'Floor 3 Locker', 'Floor 3 Lounge',
146
- 'Floor 3 Lounge Toilet', 'Floor 3 Mechanical', 'Floor 3 Mechanical Hall', 'Floor 3 Office', 'Floor 3 Office Hall',
147
- 'Floor 3 Office Toilet', 'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2', 'Floor 3 Physical Therapy Toilet',
148
- 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Treatment', 'Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2',
149
- 'Floor 3 Utility', 'Floor 3 Work', 'NE Stair', 'NW Elevator', 'NW Stair', 'SW Stair'
150
- ]
158
+ 'type' => 'PVAV',
159
+ 'name' => 'PVAV Outpatient F2 F3',
160
+ 'space_names' => [
161
+ 'Floor 2 Conference', 'Floor 2 Conference Toilet', 'Floor 2 Dictation', 'Floor 2 Exam 1', 'Floor 2 Exam 2',
162
+ 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7', 'Floor 2 Exam 8',
163
+ 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4',
164
+ 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Janitor', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1',
165
+ 'Floor 2 Nurse Station 2', 'Floor 2 Office', 'Floor 2 Office Hall', 'Floor 2 Reception', 'Floor 2 Reception Hall',
166
+ 'Floor 2 Reception Toilet', 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2', 'Floor 2 Storage 1', 'Floor 2 Storage 2',
167
+ 'Floor 2 Storage 3', 'Floor 2 Utility', 'Floor 2 Work', 'Floor 2 Work Hall', 'Floor 2 Work Toilet', 'Floor 2 X-Ray',
168
+ 'Floor 3 Dressing Room', 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Janitor', 'Floor 3 Locker', 'Floor 3 Lounge',
169
+ 'Floor 3 Lounge Toilet', 'Floor 3 Mechanical', 'Floor 3 Mechanical Hall', 'Floor 3 Office', 'Floor 3 Office Hall',
170
+ 'Floor 3 Office Toilet', 'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2', 'Floor 3 Physical Therapy Toilet',
171
+ 'Floor 3 Storage 1', 'Floor 3 Storage 2', 'Floor 3 Treatment', 'Floor 3 Undeveloped 1', 'Floor 3 Undeveloped 2',
172
+ 'Floor 3 Utility', 'Floor 3 Work', 'NE Stair', 'NW Elevator', 'NW Stair', 'SW Stair'
173
+ ]
151
174
  },
152
175
  {
153
- 'type' => 'Exhaust Fan',
154
- 'name' => 'Outpatient AHU1 Exhaust Fans',
155
- 'availability_sch_name' => 'OutPatientHealthCare Hours_of_operation',
156
- 'flow_rate' =>
176
+ 'type' => 'Exhaust Fan',
177
+ 'name' => 'Outpatient AHU1 Exhaust Fans',
178
+ 'availability_sch_name' => 'OutPatientHealthCare Hours_of_operation',
179
+ 'flow_rate' =>
157
180
  [
158
181
  6.79561743E-02, # Floor 1 Anesthesia
159
182
  4.24726077E-02, # Floor 1 Lobby Toilet
@@ -164,29 +187,29 @@ class OpenStudio::Model::Model
164
187
  4.24726077E-02, # Floor 1 Pre-Op Toilet
165
188
  9.91027512E-02, # Floor 1 Soil
166
189
  4.40456672E-02, # Floor 1 Soil Hold
167
- 1.41575359E-01, # Floor 1 Soil Work
168
- ],
169
- 'flow_fraction_schedule_name' => nil,
170
- 'balanced_exhaust_fraction_schedule_name' => nil,
171
- 'space_names' =>
190
+ 1.41575359E-01, # Floor 1 Soil Work
191
+ ],
192
+ 'flow_fraction_schedule_name' => nil,
193
+ 'balanced_exhaust_fraction_schedule_name' => nil,
194
+ 'space_names' =>
172
195
  [
173
- 'Floor 1 Anesthesia',
174
- 'Floor 1 Lobby Toilet',
175
- 'Floor 1 MRI Control Room',
176
- 'Floor 1 MRI Room',
177
- 'Floor 1 MRI Toilet',
178
- 'Floor 1 Nurse Toilet',
179
- 'Floor 1 Pre-Op Toilet',
180
- 'Floor 1 Soil',
181
- 'Floor 1 Soil Hold',
182
- 'Floor 1 Soil Work'
196
+ 'Floor 1 Anesthesia',
197
+ 'Floor 1 Lobby Toilet',
198
+ 'Floor 1 MRI Control Room',
199
+ 'Floor 1 MRI Room',
200
+ 'Floor 1 MRI Toilet',
201
+ 'Floor 1 Nurse Toilet',
202
+ 'Floor 1 Pre-Op Toilet',
203
+ 'Floor 1 Soil',
204
+ 'Floor 1 Soil Hold',
205
+ 'Floor 1 Soil Work'
183
206
  ]
184
207
  },
185
208
  {
186
- 'type' => 'Exhaust Fan',
187
- 'name' => 'Outpatient AHU2&3 Exhaust Fans',
188
- 'availability_sch_name' => 'OutPatientHealthCare BLDG_OA_SCH',
189
- 'flow_rate' =>
209
+ 'type' => 'Exhaust Fan',
210
+ 'name' => 'Outpatient AHU2&3 Exhaust Fans',
211
+ 'availability_sch_name' => 'OutPatientHealthCare BLDG_OA_SCH',
212
+ 'flow_rate' =>
190
213
  [
191
214
  5.03379054E-02, # Floor 2 Conference Toilet
192
215
  9.91027512E-02, # Floor 2 Reception Toilet
@@ -196,217 +219,209 @@ class OpenStudio::Model::Model
196
219
  4.24726077E-02, # Floor 3 Office Toilet
197
220
  6.60685008E-02, # Floor 3 Physical Therapy Toilet
198
221
  ],
199
- 'flow_fraction_schedule_name' => nil,
200
- 'balanced_exhaust_fraction_schedule_name' => nil,
201
- 'space_names' =>
222
+ 'flow_fraction_schedule_name' => nil,
223
+ 'balanced_exhaust_fraction_schedule_name' => nil,
224
+ 'space_names' =>
202
225
  [
203
- 'Floor 2 Conference Toilet',
204
- 'Floor 2 Reception Toilet',
205
- 'Floor 2 Work Toilet',
206
- 'Floor 2 X-Ray',
207
- 'Floor 3 Lounge Toilet',
208
- 'Floor 3 Office Toilet',
209
- 'Floor 3 Physical Therapy Toilet',
226
+ 'Floor 2 Conference Toilet',
227
+ 'Floor 2 Reception Toilet',
228
+ 'Floor 2 Work Toilet',
229
+ 'Floor 2 X-Ray',
230
+ 'Floor 3 Lounge Toilet',
231
+ 'Floor 3 Office Toilet',
232
+ 'Floor 3 Physical Therapy Toilet'
210
233
  ]
211
234
  }
212
-
235
+
213
236
  ]
214
-
237
+
215
238
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
216
239
  system_to_space_map = [
217
240
  {
218
- 'type' => 'PVAV',
219
- 'name' => 'PVAV Outpatient F1',
220
- 'space_names' => [
221
- 'Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe', 'Floor 1 Clean', 'Floor 1 Clean Work', 'Floor 1 Dictation',
222
- 'Floor 1 Dressing Room', 'Floor 1 Humid', 'Floor 1 IT Hall',
223
- 'Floor 1 IT Room', 'Floor 1 Lobby', 'Floor 1 Lobby Hall', 'Floor 1 Locker Room',
224
- 'Floor 1 Locker Room Hall', 'Floor 1 Lounge', 'Floor 1 Med Gas', 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall',
225
- 'Floor 1 MRI Room', 'Floor 1 Nourishment', 'Floor 1 Nurse Hall',
226
- 'Floor 1 Nurse Station', 'Floor 1 Office', 'Floor 1 Operating Room 1', 'Floor 1 Operating Room 2',
227
- 'Floor 1 Operating Room 3', 'Floor 1 PACU', 'Floor 1 Pre-Op Hall', 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2',
228
- 'Floor 1 Procedure Room', 'Floor 1 Reception', 'Floor 1 Reception Hall', 'Floor 1 Recovery Room',
229
- 'Floor 1 Scheduling', 'Floor 1 Scrub', 'Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work', 'Floor 1 Step Down',
230
- 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Sub-Sterile', 'Floor 1 Utility Hall',
231
- 'Floor 1 Vestibule'
232
- ]
241
+ 'type' => 'PVAV',
242
+ 'name' => 'PVAV Outpatient F1',
243
+ 'space_names' => [
244
+ 'Floor 1 Anesthesia', 'Floor 1 Bio Haz', 'Floor 1 Cafe', 'Floor 1 Clean', 'Floor 1 Clean Work', 'Floor 1 Dictation',
245
+ 'Floor 1 Dressing Room', 'Floor 1 Humid', 'Floor 1 IT Hall',
246
+ 'Floor 1 IT Room', 'Floor 1 Lobby', 'Floor 1 Lobby Hall', 'Floor 1 Locker Room',
247
+ 'Floor 1 Locker Room Hall', 'Floor 1 Lounge', 'Floor 1 Med Gas', 'Floor 1 MRI Control Room', 'Floor 1 MRI Hall',
248
+ 'Floor 1 MRI Room', 'Floor 1 Nourishment', 'Floor 1 Nurse Hall',
249
+ 'Floor 1 Nurse Station', 'Floor 1 Office', 'Floor 1 Operating Room 1', 'Floor 1 Operating Room 2',
250
+ 'Floor 1 Operating Room 3', 'Floor 1 PACU', 'Floor 1 Pre-Op Hall', 'Floor 1 Pre-Op Room 1', 'Floor 1 Pre-Op Room 2',
251
+ 'Floor 1 Procedure Room', 'Floor 1 Reception', 'Floor 1 Reception Hall', 'Floor 1 Recovery Room',
252
+ 'Floor 1 Scheduling', 'Floor 1 Scrub', 'Floor 1 Soil', 'Floor 1 Soil Hold', 'Floor 1 Soil Work', 'Floor 1 Step Down',
253
+ 'Floor 1 Sterile Hall', 'Floor 1 Sterile Storage', 'Floor 1 Sub-Sterile', 'Floor 1 Utility Hall',
254
+ 'Floor 1 Vestibule'
255
+ ]
233
256
  },
234
257
  {
235
- 'type' => 'PVAV',
236
- 'name' => 'PVAV Outpatient F2 F3',
237
- 'space_names' => [
238
- 'Floor 2 Conference', 'Floor 2 Dictation', 'Floor 2 Exam 1', 'Floor 2 Exam 2',
239
- 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7', 'Floor 2 Exam 8',
240
- 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4',
241
- 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1',
242
- 'Floor 2 Nurse Station 2', 'Floor 2 Office', 'Floor 2 Office Hall', 'Floor 2 Reception', 'Floor 2 Reception Hall',
243
- 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2',
244
- 'Floor 2 Work', 'Floor 2 Work Hall', 'Floor 2 X-Ray',
245
- 'Floor 3 Dressing Room', 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Locker', 'Floor 3 Lounge',
246
- 'Floor 3 Mechanical Hall', 'Floor 3 Office', 'Floor 3 Office Hall',
247
- 'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2',
248
- 'Floor 3 Treatment', 'Floor 3 Work'
249
- ]
258
+ 'type' => 'PVAV',
259
+ 'name' => 'PVAV Outpatient F2 F3',
260
+ 'space_names' => [
261
+ 'Floor 2 Conference', 'Floor 2 Dictation', 'Floor 2 Exam 1', 'Floor 2 Exam 2',
262
+ 'Floor 2 Exam 3', 'Floor 2 Exam 4', 'Floor 2 Exam 5', 'Floor 2 Exam 6', 'Floor 2 Exam 7', 'Floor 2 Exam 8',
263
+ 'Floor 2 Exam 9', 'Floor 2 Exam Hall 1', 'Floor 2 Exam Hall 2', 'Floor 2 Exam Hall 3', 'Floor 2 Exam Hall 4',
264
+ 'Floor 2 Exam Hall 5', 'Floor 2 Exam Hall 6', 'Floor 2 Lounge', 'Floor 2 Nurse Station 1',
265
+ 'Floor 2 Nurse Station 2', 'Floor 2 Office', 'Floor 2 Office Hall', 'Floor 2 Reception', 'Floor 2 Reception Hall',
266
+ 'Floor 2 Scheduling 1', 'Floor 2 Scheduling 2',
267
+ 'Floor 2 Work', 'Floor 2 Work Hall', 'Floor 2 X-Ray',
268
+ 'Floor 3 Dressing Room', 'Floor 3 Elevator Hall', 'Floor 3 Humid', 'Floor 3 Locker', 'Floor 3 Lounge',
269
+ 'Floor 3 Mechanical Hall', 'Floor 3 Office', 'Floor 3 Office Hall',
270
+ 'Floor 3 Physical Therapy 1', 'Floor 3 Physical Therapy 2',
271
+ 'Floor 3 Treatment', 'Floor 3 Work'
272
+ ]
250
273
  },
251
274
  {
252
- 'type' => 'Exhaust Fan',
253
- 'name' => 'Outpatient AHU1 Exhaust Fans',
254
- 'availability_sch_name' => 'OutPatientHealthCare AHU1-Fan_Pre2004',
255
- 'flow_rate' =>
275
+ 'type' => 'Exhaust Fan',
276
+ 'name' => 'Outpatient AHU1 Exhaust Fans',
277
+ 'availability_sch_name' => 'OutPatientHealthCare AHU1-Fan_Pre2004',
278
+ 'flow_rate' =>
256
279
  [
257
280
  0.068, # Floor 1 Anesthesia
258
281
  0.0793, # Floor 1 MRI Control Room
259
282
  0.2077, # Floor 1 MRI Room
260
283
  0.0991, # Floor 1 Soil
261
284
  0.044, # Floor 1 Soil Hold
262
- 0.1416, # Floor 1 Soil Work
263
- ],
264
- 'flow_fraction_schedule_name' => nil,
265
- 'balanced_exhaust_fraction_schedule_name' => nil,
266
- 'space_names' =>
285
+ 0.1416, # Floor 1 Soil Work
286
+ ],
287
+ 'flow_fraction_schedule_name' => nil,
288
+ 'balanced_exhaust_fraction_schedule_name' => nil,
289
+ 'space_names' =>
267
290
  [
268
- 'Floor 1 Anesthesia',
269
- 'Floor 1 MRI Control Room',
270
- 'Floor 1 MRI Room',
271
- 'Floor 1 Soil',
272
- 'Floor 1 Soil Hold',
273
- 'Floor 1 Soil Work'
291
+ 'Floor 1 Anesthesia',
292
+ 'Floor 1 MRI Control Room',
293
+ 'Floor 1 MRI Room',
294
+ 'Floor 1 Soil',
295
+ 'Floor 1 Soil Hold',
296
+ 'Floor 1 Soil Work'
274
297
  ]
275
298
  }
276
- ]
299
+ ]
277
300
  end
278
-
301
+
279
302
  return system_to_space_map
280
303
  end
281
-
282
- def custom_hvac_tweaks(building_type, building_vintage, climate_zone, prototype_input)
283
-
284
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding HVAC')
285
-
286
- system_to_space_map = define_hvac_system_map(building_type, building_vintage, climate_zone)
304
+
305
+ def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
306
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding HVAC')
307
+
308
+ system_to_space_map = define_hvac_system_map(building_type, template, climate_zone)
287
309
 
288
310
  # add elevator for the elevator pump room (the fan&lights are already added via standard spreadsheet)
289
- self.add_extra_equip_elevator_pump_room(building_vintage)
311
+ add_extra_equip_elevator_pump_room(template)
290
312
  # adjust cooling setpoint at vintages 1B,2B,3B
291
- self.adjust_clg_setpoint(building_vintage,climate_zone)
313
+ adjust_clg_setpoint(template, climate_zone)
292
314
  # Get the hot water loop
293
315
  hot_water_loop = nil
294
- self.getPlantLoops.each do |loop|
316
+ getPlantLoops.each do |loop|
295
317
  # If it has a boiler:hotwater, it is the correct loop
296
- if loop.supplyComponents(OpenStudio::Model::BoilerHotWater::iddObjectType).size > 0
297
- # if loop.supplyComponents('OS_Boiler_HotWater'.to_IddObjectType).size > 0 # Another feasible expression way
318
+ unless loop.supplyComponents('OS:Boiler:HotWater'.to_IddObjectType).empty?
298
319
  hot_water_loop = loop
299
320
  end
300
321
  end
301
322
  # add humidifier to AHU1 (contains operating room 1)
302
323
  if hot_water_loop
303
- self.add_humidifier(building_vintage, hot_water_loop)
324
+ add_humidifier(template, hot_water_loop)
304
325
  else
305
- OpenStudio::logFree(OpenStudio::Warn, 'openstudio.model.Model', 'Could not find hot water loop to attach humidifier to.')
326
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', 'Could not find hot water loop to attach humidifier to.')
306
327
  end
307
328
  # adjust infiltration for vintages 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
308
- self.adjust_infiltration(building_vintage)
329
+ adjust_infiltration(template)
309
330
  # add door infiltration for vertibule
310
- self.add_door_infiltration(building_vintage,climate_zone)
331
+ add_door_infiltration(template, climate_zone)
311
332
  # reset boiler sizing factor to 0.3 (default 1)
312
- self.reset_boiler_sizing_factor
333
+ reset_boiler_sizing_factor
313
334
  # assign the minimum total air changes to the cooling minimum air flow in Sizing:Zone
314
- self.apply_minimum_total_ach(building_type,building_vintage)
315
-
316
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished adding HVAC')
317
-
335
+ apply_minimum_total_ach(building_type, template)
336
+
337
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished adding HVAC')
338
+
318
339
  return true
319
-
320
340
  end
321
341
 
322
- def add_extra_equip_elevator_pump_room(building_vintage)
323
- elevator_pump_room = self.getSpaceByName('Floor 1 Elevator Pump Room').get
342
+ def add_extra_equip_elevator_pump_room(template)
343
+ elevator_pump_room = getSpaceByName('Floor 1 Elevator Pump Room').get
324
344
  elec_equip_def = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
325
- elec_equip_def.setName("Elevator Pump Room Electric Equipment Definition")
345
+ elec_equip_def.setName('Elevator Pump Room Electric Equipment Definition')
326
346
  elec_equip_def.setFractionLatent(0)
327
347
  elec_equip_def.setFractionRadiant(0.1)
328
348
  elec_equip_def.setFractionLost(0.9)
329
- elec_equip_def.setDesignLevel(48165)
349
+ elec_equip_def.setDesignLevel(48_165)
330
350
  elec_equip = OpenStudio::Model::ElectricEquipment.new(elec_equip_def)
331
- elec_equip.setName("Elevator Pump Room Elevator Equipment")
351
+ elec_equip.setName('Elevator Pump Room Elevator Equipment')
332
352
  elec_equip.setSpace(elevator_pump_room)
333
- case building_vintage
353
+ case template
334
354
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
335
- elec_equip.setSchedule(add_schedule("OutPatientHealthCare BLDG_ELEVATORS"))
355
+ elec_equip.setSchedule(add_schedule('OutPatientHealthCare BLDG_ELEVATORS'))
336
356
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
337
- elec_equip.setSchedule(add_schedule("OutPatientHealthCare BLDG_ELEVATORS_Pre2004"))
357
+ elec_equip.setSchedule(add_schedule('OutPatientHealthCare BLDG_ELEVATORS_Pre2004'))
338
358
  end
339
359
  return true
340
360
  end
341
361
 
342
-
343
- def adjust_clg_setpoint(building_vintage,climate_zone)
344
- self.getSpaceTypes.sort.each do |space_type|
362
+ def adjust_clg_setpoint(template, climate_zone)
363
+ getSpaceTypes.sort.each do |space_type|
345
364
  space_type_name = space_type.name.get
346
365
  thermostat_name = space_type_name + ' Thermostat'
347
- thermostat = self.getThermostatSetpointDualSetpointByName(thermostat_name).get
348
- case building_vintage
366
+ thermostat = getThermostatSetpointDualSetpointByName(thermostat_name).get
367
+ case template
349
368
  when '90.1-2004', '90.1-2007', '90.1-2010'
350
369
  case climate_zone
351
370
  when 'ASHRAE 169-2006-2B', 'ASHRAE 169-2006-1B', 'ASHRAE 169-2006-3B'
352
- thermostat.setCoolingSetpointTemperatureSchedule(add_schedule("OutPatientHealthCare CLGSETP_SCH_YES_OPTIMUM"))
371
+ thermostat.setCoolingSetpointTemperatureSchedule(add_schedule('OutPatientHealthCare CLGSETP_SCH_YES_OPTIMUM'))
353
372
  end
354
373
  end
355
374
  end
356
375
  return true
357
376
  end
358
-
359
- def adjust_infiltration(building_vintage)
360
- case building_vintage
377
+
378
+ def adjust_infiltration(template)
379
+ case template
361
380
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
362
- self.getSpaces.sort.each do |space|
381
+ getSpaces.sort.each do |space|
363
382
  space_type = space.spaceType.get
364
- if space.exterior_wall_and_window_area <= 0
365
- next
366
- elsif space_type.spaceInfiltrationDesignFlowRates.size <= 0
367
- next
368
- else
369
- # get the infiltration information from the space type infiltration
370
- infiltration_space_type = space_type.spaceInfiltrationDesignFlowRates[0]
371
- infil_sch = infiltration_space_type.schedule.get
372
- infil_rate = nil
373
- infil_ach = nil
374
- if infiltration_space_type.flowperExteriorWallArea.is_initialized
375
- infil_rate = infiltration_space_type.flowperExteriorWallArea.get
376
- elsif infiltration_space_type.airChangesperHour.is_initialized
377
- infil_ach = infiltration_space_type.airChangesperHour.get
378
- end
379
- # Create an infiltration rate object for this space
380
- infiltration = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
381
- infiltration.setName("#{space.name} Infiltration")
382
- infiltration.setFlowperExteriorSurfaceArea(infil_rate) unless infil_rate.nil? || infil_rate.to_f == 0
383
- infiltration.setAirChangesperHour(infil_ach) unless infil_ach.nil? || infil_ach.to_f == 0
384
- infiltration.setSchedule(infil_sch)
385
- infiltration.setSpace(space)
383
+ # Skip interior spaces
384
+ next if space.exterior_wall_and_window_area <= 0
385
+ # Skip spaces that have no infiltration objects to adjust
386
+ next if space_type.spaceInfiltrationDesignFlowRates.size <= 0
387
+
388
+ # get the infiltration information from the space type infiltration
389
+ infiltration_space_type = space_type.spaceInfiltrationDesignFlowRates[0]
390
+ infil_sch = infiltration_space_type.schedule.get
391
+ infil_rate = nil
392
+ infil_ach = nil
393
+ if infiltration_space_type.flowperExteriorWallArea.is_initialized
394
+ infil_rate = infiltration_space_type.flowperExteriorWallArea.get
395
+ elsif infiltration_space_type.airChangesperHour.is_initialized
396
+ infil_ach = infiltration_space_type.airChangesperHour.get
386
397
  end
398
+ # Create an infiltration rate object for this space
399
+ infiltration = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
400
+ infiltration.setName("#{space.name} Infiltration")
401
+ infiltration.setFlowperExteriorSurfaceArea(infil_rate) unless infil_rate.nil? || infil_rate.to_f.zero?
402
+ infiltration.setAirChangesperHour(infil_ach) unless infil_ach.nil? || infil_ach.to_f.zero?
403
+ infiltration.setSchedule(infil_sch)
404
+ infiltration.setSpace(space)
387
405
  end
388
- self.getSpaceTypes.each do |space_type|
389
- space_type.spaceInfiltrationDesignFlowRates.each do |infil|
390
- infil.remove
391
- end
406
+ getSpaceTypes.each do |space_type|
407
+ space_type.spaceInfiltrationDesignFlowRates.each(&:remove)
392
408
  end
393
409
  else
394
410
  return true
395
411
  end
396
- end
397
-
412
+ end
398
413
 
399
- def add_door_infiltration(building_vintage,climate_zone)
414
+ def add_door_infiltration(template, climate_zone)
400
415
  # add extra infiltration for vestibule door
401
- case building_vintage
416
+ case template
402
417
  when 'DOE Ref 1980-2004', 'DOE Ref Pre-1980'
403
418
  return true
404
419
  else
405
- vestibule_space = self.getSpaceByName('Floor 1 Vestibule').get
420
+ vestibule_space = getSpaceByName('Floor 1 Vestibule').get
406
421
  infiltration_vestibule_door = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(self)
407
- infiltration_vestibule_door.setName("Vestibule door Infiltration")
422
+ infiltration_vestibule_door.setName('Vestibule door Infiltration')
408
423
  infiltration_rate_vestibule_door = 0
409
- case building_vintage
424
+ case template
410
425
  when '90.1-2004'
411
426
  infiltration_rate_vestibule_door = 1.186002811
412
427
  infiltration_vestibule_door.setSchedule(add_schedule('OutPatientHealthCare INFIL_Door_Opening_SCH_0.144'))
@@ -425,11 +440,11 @@ class OpenStudio::Model::Model
425
440
  end
426
441
  end
427
442
 
428
- def update_waterheater_loss_coefficient(building_vintage)
429
- case building_vintage
443
+ def update_waterheater_loss_coefficient(template)
444
+ case template
430
445
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
431
- self.getWaterHeaterMixeds.sort.each do |water_heater|
432
- if water_heater.name.to_s.include?("Booster")
446
+ getWaterHeaterMixeds.sort.each do |water_heater|
447
+ if water_heater.name.to_s.include?('Booster')
433
448
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(1.053159296)
434
449
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(1.053159296)
435
450
  else
@@ -437,22 +452,22 @@ class OpenStudio::Model::Model
437
452
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(9.643286505)
438
453
  end
439
454
  end
440
- end
455
+ end
441
456
  end
442
-
457
+
443
458
  # add humidifier to AHU1 (contains operating room1)
444
- def add_humidifier(building_vintage, hot_water_loop)
445
- operatingroom1_space = self.getSpaceByName('Floor 1 Operating Room 1').get
459
+ def add_humidifier(template, hot_water_loop)
460
+ operatingroom1_space = getSpaceByName('Floor 1 Operating Room 1').get
446
461
  operatingroom1_zone = operatingroom1_space.thermalZone.get
447
462
  humidistat = OpenStudio::Model::ZoneControlHumidistat.new(self)
448
- humidistat.setHumidifyingRelativeHumiditySetpointSchedule(self.add_schedule('OutPatientHealthCare MinRelHumSetSch'))
449
- humidistat.setDehumidifyingRelativeHumiditySetpointSchedule(self.add_schedule('OutPatientHealthCare MaxRelHumSetSch'))
463
+ humidistat.setHumidifyingRelativeHumiditySetpointSchedule(add_schedule('OutPatientHealthCare MinRelHumSetSch'))
464
+ humidistat.setDehumidifyingRelativeHumiditySetpointSchedule(add_schedule('OutPatientHealthCare MaxRelHumSetSch'))
450
465
  operatingroom1_zone.setZoneControlHumidistat(humidistat)
451
- self.getAirLoopHVACs.each do |air_loop|
466
+ getAirLoopHVACs.each do |air_loop|
452
467
  if air_loop.thermalZones.include? operatingroom1_zone
453
468
  humidifier = OpenStudio::Model::HumidifierSteamElectric.new(self)
454
469
  humidifier.setRatedCapacity(3.72E-5)
455
- humidifier.setRatedPower(100000)
470
+ humidifier.setRatedPower(100_000)
456
471
  humidifier.setName("#{air_loop.name.get} Electric Steam Humidifier")
457
472
  # get the water heating coil and add humidifier to the outlet of heating coil (right before fan)
458
473
  htg_coil = nil
@@ -461,77 +476,77 @@ class OpenStudio::Model::Model
461
476
  htg_coil = equip.to_CoilHeatingWater.get
462
477
  end
463
478
  end
464
- heating_coil_outlet_node = htg_coil.airOutletModelObject().get.to_Node.get
479
+ heating_coil_outlet_node = htg_coil.airOutletModelObject.get.to_Node.get
465
480
  supply_outlet_node = air_loop.supplyOutletNode
466
481
  humidifier.addToNode(heating_coil_outlet_node)
467
482
  humidity_spm = OpenStudio::Model::SetpointManagerSingleZoneHumidityMinimum.new(self)
468
- case building_vintage
483
+ case template
469
484
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
470
- extra_elec_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(self,self.alwaysOnDiscreteSchedule)
471
- extra_elec_htg_coil.setName("AHU1 extra Electric Htg Coil")
472
- extra_water_htg_coil = OpenStudio::Model::CoilHeatingWater.new(self,self.alwaysOnDiscreteSchedule)
473
- extra_water_htg_coil.setName("AHU1 extra Water Htg Coil")
485
+ extra_elec_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(self, alwaysOnDiscreteSchedule)
486
+ extra_elec_htg_coil.setName('AHU1 extra Electric Htg Coil')
487
+ extra_water_htg_coil = OpenStudio::Model::CoilHeatingWater.new(self, alwaysOnDiscreteSchedule)
488
+ extra_water_htg_coil.setName('AHU1 extra Water Htg Coil')
474
489
  hot_water_loop.addDemandBranchForComponent(extra_water_htg_coil)
475
490
  extra_elec_htg_coil.addToNode(supply_outlet_node)
476
491
  extra_water_htg_coil.addToNode(supply_outlet_node)
477
492
  end
478
493
  # humidity_spm.addToNode(supply_outlet_node)
479
- humidity_spm.addToNode(humidifier.outletModelObject().get.to_Node.get)
494
+ humidity_spm.addToNode(humidifier.outletModelObject.get.to_Node.get)
480
495
  humidity_spm.setControlZone(operatingroom1_zone)
481
496
  end
482
497
  end
483
498
  end
484
-
499
+
485
500
  # for 90.1-2010 Outpatient, AHU2 set minimum outdoor air flow rate as 0
486
501
  # AHU1 doesn't have economizer
487
- def modify_OAcontroller(building_vintage)
488
- self.getAirLoopHVACs.each do |air_loop|
502
+ def modify_oa_controller(template)
503
+ getAirLoopHVACs.each do |air_loop|
489
504
  oa_system = air_loop.airLoopHVACOutdoorAirSystem.get
490
505
  controller_oa = oa_system.getControllerOutdoorAir
491
506
  controller_mv = controller_oa.controllerMechanicalVentilation
492
507
  # AHU1 OA doesn't have controller:mechanicalventilation
493
- if air_loop.name.to_s.include? "Outpatient F1"
494
- controller_mv.setAvailabilitySchedule(self.alwaysOffDiscreteSchedule)
508
+ if air_loop.name.to_s.include? 'Outpatient F1'
509
+ controller_mv.setAvailabilitySchedule(alwaysOffDiscreteSchedule)
495
510
  # add minimum fraction of outdoor air schedule to AHU1
496
- controller_oa.setMinimumFractionofOutdoorAirSchedule(self.add_schedule('OutPatientHealthCare AHU-1_OAminOAFracSchedule'))
511
+ controller_oa.setMinimumFractionofOutdoorAirSchedule(add_schedule('OutPatientHealthCare AHU-1_OAminOAFracSchedule'))
497
512
  # for AHU2, at vintages '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', the minimum OA schedule is not the same as
498
513
  # airloop availability schedule, but separately assigned.
499
- elsif building_vintage=='90.1-2004' || building_vintage=='90.1-2007' || building_vintage=='90.1-2010' || building_vintage=='90.1-2013'
500
- controller_oa.setMinimumOutdoorAirSchedule(self.add_schedule('OutPatientHealthCare BLDG_OA_SCH'))
514
+ elsif template == '90.1-2004' || template == '90.1-2007' || template == '90.1-2010' || template == '90.1-2013'
515
+ controller_oa.setMinimumOutdoorAirSchedule(add_schedule('OutPatientHealthCare BLDG_OA_SCH'))
501
516
  # add minimum fraction of outdoor air schedule to AHU2
502
- controller_oa.setMinimumFractionofOutdoorAirSchedule(self.add_schedule('OutPatientHealthCare BLDG_OA_FRAC_SCH'))
517
+ controller_oa.setMinimumFractionofOutdoorAirSchedule(add_schedule('OutPatientHealthCare BLDG_OA_FRAC_SCH'))
503
518
  end
504
519
  end
505
520
  end
506
-
521
+
507
522
  # For operating room 1&2 in 2010 and 2013, VAV minimum air flow is set by schedule
508
- def reset_or_room_vav_minimum_damper(prototype_input, building_vintage)
509
- case building_vintage
523
+ def reset_or_room_vav_minimum_damper(prototype_input, template)
524
+ case template
510
525
  when '90.1-2004', '90.1-2007'
511
526
  return true
512
527
  when '90.1-2010', '90.1-2013'
513
- self.getAirTerminalSingleDuctVAVReheats.sort.each do |airterminal|
528
+ getAirTerminalSingleDuctVAVReheats.sort.each do |airterminal|
514
529
  airterminal_name = airterminal.name.get
515
- if airterminal_name.include? "Floor 1 Operating Room 1" or airterminal_name.include? "Floor 1 Operating Room 2"
530
+ if airterminal_name.include?('Floor 1 Operating Room 1') || airterminal_name.include?('Floor 1 Operating Room 2')
516
531
  airterminal.setZoneMinimumAirFlowMethod('Scheduled')
517
- airterminal.setMinimumAirFlowFractionSchedule(add_schedule("OutPatientHealthCare OR_MinSA_Sched"))
532
+ airterminal.setMinimumAirFlowFractionSchedule(add_schedule('OutPatientHealthCare OR_MinSA_Sched'))
518
533
  end
519
534
  end
520
535
  end
521
536
  end
522
-
537
+
523
538
  def reset_boiler_sizing_factor
524
- self.getBoilerHotWaters.sort.each do |boiler|
539
+ getBoilerHotWaters.sort.each do |boiler|
525
540
  boiler.setSizingFactor(0.3)
526
541
  end
527
- end
528
-
529
- def update_exhaust_fan_efficiency(building_vintage)
530
- case building_vintage
542
+ end
543
+
544
+ def update_exhaust_fan_efficiency(template)
545
+ case template
531
546
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
532
- self.getFanZoneExhausts.sort.each do |exhaust_fan|
547
+ getFanZoneExhausts.sort.each do |exhaust_fan|
533
548
  fan_name = exhaust_fan.name.to_s
534
- if (fan_name.include? "X-Ray") || (fan_name.include? "MRI Room")
549
+ if (fan_name.include? 'X-Ray') || (fan_name.include? 'MRI Room')
535
550
  exhaust_fan.setFanEfficiency(0.16)
536
551
  exhaust_fan.setPressureRise(125)
537
552
  else
@@ -540,27 +555,27 @@ class OpenStudio::Model::Model
540
555
  end
541
556
  end
542
557
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
543
- self.getFanZoneExhausts.sort.each do |exhaust_fan|
558
+ getFanZoneExhausts.sort.each do |exhaust_fan|
544
559
  exhaust_fan.setFanEfficiency(0.338)
545
560
  exhaust_fan.setPressureRise(125)
546
561
  end
547
562
  end
548
563
  end
549
-
564
+
550
565
  # assign the minimum total air changes to the cooling minimum air flow in Sizing:Zone
551
- def apply_minimum_total_ach(building_type,building_vintage)
552
- self.getSpaces.each do |space|
566
+ def apply_minimum_total_ach(building_type, template)
567
+ getSpaces.each do |space|
553
568
  space_type_name = space.spaceType.get.standardsSpaceType.get
554
569
  search_criteria = {
555
- 'template' => building_vintage,
570
+ 'template' => template,
556
571
  'building_type' => building_type,
557
572
  'space_type' => space_type_name
558
573
  }
559
- data = find_object($os_standards['space_types'],search_criteria)
560
-
574
+ data = find_object($os_standards['space_types'], search_criteria)
575
+
561
576
  # skip space type without minimum total air changes
562
577
  next if data['minimum_total_air_changes'].nil?
563
-
578
+
564
579
  # calculate the minimum total air flow
565
580
  minimum_total_ach = data['minimum_total_air_changes'].to_f
566
581
  space_volume = space.volume
@@ -571,7 +586,7 @@ class OpenStudio::Model::Model
571
586
  zone = space.thermalZone.get
572
587
  sizingzone = zone.sizingZone
573
588
  sizingzone.setCoolingDesignAirFlowMethod('DesignDayWithLimit')
574
- case building_vintage
589
+ case template
575
590
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
576
591
  sizingzone.setCoolingMinimumAirFlow(minimum_airflow_per_zone)
577
592
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
@@ -580,13 +595,9 @@ class OpenStudio::Model::Model
580
595
  end
581
596
  end
582
597
 
583
- def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
584
-
585
- self.update_waterheater_loss_coefficient(building_vintage)
586
-
598
+ def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
599
+ update_waterheater_loss_coefficient(template)
600
+
587
601
  return true
588
-
589
602
  end
590
-
591
603
  end
592
-