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,78 +1,60 @@
1
1
 
2
2
  # Extend the class to add Large Hotel specific stuff
3
3
  class OpenStudio::Model::Model
4
-
5
- def define_space_type_map(building_type, building_vintage, climate_zone)
4
+ def define_space_type_map(building_type, template, climate_zone)
6
5
  space_type_map = nil
7
- case building_vintage
6
+ case template
8
7
  when 'NECB 2011'
9
- space_type_map ={
10
- "Hotel/Motel - dining" => ["Banquet_Flr_6", "Dining_Flr_6"],
11
- "Storage area" => ["Basement", "Storage_Flr_1"],
12
- "Retail - mall concourse" => ["Cafe_Flr_1"],
13
- "Corr. >= 2.4m wide" => ["Corridor_Flr_3", "Corridor_Flr_6"],
14
- "Food preparation" => ["Kitchen_Flr_6"],
15
- "Hospital - laundry/washing" => ["Laundry_Flr_1"],
16
- "Hotel/Motel - lobby" => ["Lobby_Flr_1"],
17
- "Electrical/Mechanical" => ["Mech_Flr_1"],
18
- "Retail - sales" => ["Retail_1_Flr_1", "Retail_2_Flr_1"],
19
- "Hotel/Motel - rooms" => ["Room_1_Flr_3", "Room_1_Flr_6", "Room_2_Flr_3", "Room_2_Flr_6", "Room_3_Mult19_Flr_3", "Room_3_Mult9_Flr_6", "Room_4_Mult19_Flr_3", "Room_5_Flr_3", "Room_6_Flr_3"]
8
+ # Building Schedule
9
+ sch = 'E'
10
+ space_type_map = {
11
+ 'Hotel/Motel - dining' => ['Banquet_Flr_6', 'Dining_Flr_6'],
12
+ 'Storage area' => ['Basement', 'Storage_Flr_1'],
13
+ 'Retail - mall concourse' => ['Cafe_Flr_1'],
14
+ "Corr. >= 2.4m wide-sch-#{sch}" => ['Corridor_Flr_3', 'Corridor_Flr_6'],
15
+ 'Food preparation' => ['Kitchen_Flr_6'],
16
+ 'Hospital - laundry/washing' => ['Laundry_Flr_1'],
17
+ 'Hotel/Motel - lobby' => ['Lobby_Flr_1'],
18
+ "Electrical/Mechanical-sch-#{sch}" => ['Mech_Flr_1'],
19
+ 'Retail - sales' => ['Retail_1_Flr_1', 'Retail_2_Flr_1'],
20
+ 'Hotel/Motel - rooms' => ['Room_1_Flr_3', 'Room_1_Flr_6', 'Room_2_Flr_3', 'Room_2_Flr_6', 'Room_3_Mult19_Flr_3', 'Room_3_Mult9_Flr_6', 'Room_4_Mult19_Flr_3', 'Room_5_Flr_3', 'Room_6_Flr_3']
20
21
  }
21
22
  else
22
23
  space_type_map = {
23
- 'Banquet' => ['Banquet_Flr_6','Dining_Flr_6'],
24
- 'Basement'=>['Basement'],
24
+ 'Banquet' => ['Banquet_Flr_6', 'Dining_Flr_6'],
25
+ 'Basement' => ['Basement'],
25
26
  'Cafe' => ['Cafe_Flr_1'],
26
- 'Corridor'=> ['Corridor_Flr_6'],
27
- 'Corridor2'=> ['Corridor_Flr_3'],
28
- 'GuestRoom'=> ['Room_1_Flr_3','Room_2_Flr_3','Room_5_Flr_3','Room_6_Flr_3'],
29
- 'GuestRoom2'=> ['Room_3_Mult19_Flr_3','Room_4_Mult19_Flr_3'],
30
- 'GuestRoom3'=> ['Room_1_Flr_6','Room_2_Flr_6'],
31
- 'GuestRoom4'=> ['Room_3_Mult9_Flr_6'],
32
- 'Kitchen'=> ['Kitchen_Flr_6'],
33
- 'Laundry'=> ['Laundry_Flr_1'],
34
- 'Lobby'=> ['Lobby_Flr_1'],
35
- 'Mechanical'=> ['Mech_Flr_1'],
36
- 'Retail'=> ['Retail_1_Flr_1'],
37
- 'Retail2'=> ['Retail_2_Flr_1'],
38
- 'Storage'=> ['Storage_Flr_1']
27
+ 'Corridor' => ['Corridor_Flr_6'],
28
+ 'Corridor2' => ['Corridor_Flr_3'],
29
+ 'GuestRoom' => ['Room_1_Flr_3', 'Room_2_Flr_3', 'Room_5_Flr_3', 'Room_6_Flr_3'],
30
+ 'GuestRoom2' => ['Room_3_Mult19_Flr_3', 'Room_4_Mult19_Flr_3'],
31
+ 'GuestRoom3' => ['Room_1_Flr_6', 'Room_2_Flr_6'],
32
+ 'GuestRoom4' => ['Room_3_Mult9_Flr_6'],
33
+ 'Kitchen' => ['Kitchen_Flr_6'],
34
+ 'Laundry' => ['Laundry_Flr_1'],
35
+ 'Lobby' => ['Lobby_Flr_1'],
36
+ 'Mechanical' => ['Mech_Flr_1'],
37
+ 'Retail' => ['Retail_1_Flr_1'],
38
+ 'Retail2' => ['Retail_2_Flr_1'],
39
+ 'Storage' => ['Storage_Flr_1']
39
40
  }
40
41
  end
41
-
42
-
43
-
44
42
 
45
43
  return space_type_map
46
44
  end
47
45
 
48
- def define_hvac_system_map(building_type, building_vintage, climate_zone)
46
+ def define_hvac_system_map(building_type, template, climate_zone)
49
47
  system_to_space_map = [
50
48
  {
51
49
  'type' => 'VAV',
52
50
  'name' => 'VAV WITH REHEAT',
53
51
  'space_names' =>
54
- [
55
- 'Basement',
56
- 'Retail_1_Flr_1',
57
- 'Retail_2_Flr_1',
58
- 'Mech_Flr_1',
59
- 'Storage_Flr_1',
60
- 'Laundry_Flr_1',
61
- 'Cafe_Flr_1',
62
- 'Lobby_Flr_1',
63
- 'Corridor_Flr_3',
64
- 'Banquet_Flr_6',
65
- 'Dining_Flr_6',
66
- 'Corridor_Flr_6',
67
- 'Kitchen_Flr_6'
68
- ]
52
+ ['Basement', 'Retail_1_Flr_1', 'Retail_2_Flr_1', 'Mech_Flr_1', 'Storage_Flr_1', 'Laundry_Flr_1', 'Cafe_Flr_1', 'Lobby_Flr_1', 'Corridor_Flr_3', 'Banquet_Flr_6', 'Dining_Flr_6', 'Corridor_Flr_6', 'Kitchen_Flr_6']
69
53
  },
70
54
  {
71
55
  'type' => 'DOAS',
72
56
  'space_names' =>
73
- [
74
- 'Room_1_Flr_3','Room_2_Flr_3','Room_3_Mult19_Flr_3','Room_4_Mult19_Flr_3','Room_5_Flr_3','Room_6_Flr_3','Room_1_Flr_6','Room_2_Flr_6','Room_3_Mult9_Flr_6'
75
- ]
57
+ ['Room_1_Flr_3', 'Room_2_Flr_3', 'Room_3_Mult19_Flr_3', 'Room_4_Mult19_Flr_3', 'Room_5_Flr_3', 'Room_6_Flr_3', 'Room_1_Flr_6', 'Room_2_Flr_6', 'Room_3_Mult9_Flr_6']
76
58
  },
77
59
  {
78
60
  'type' => 'Refrigeration',
@@ -90,8 +72,8 @@ class OpenStudio::Model::Model
90
72
  'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
91
73
  'space_names' =>
92
74
  [
93
- 'Kitchen_Flr_6'
94
- ]
75
+ 'Kitchen_Flr_6'
76
+ ]
95
77
  },
96
78
  {
97
79
  'type' => 'Refrigeration',
@@ -109,8 +91,8 @@ class OpenStudio::Model::Model
109
91
  'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
110
92
  'space_names' =>
111
93
  [
112
- 'Kitchen_Flr_6'
113
- ]
94
+ 'Kitchen_Flr_6'
95
+ ]
114
96
  }
115
97
  ]
116
98
  return system_to_space_map
@@ -131,30 +113,29 @@ class OpenStudio::Model::Model
131
113
  return space_multiplier_map
132
114
  end
133
115
 
134
- def custom_hvac_tweaks(building_type, building_vintage, climate_zone, prototype_input)
135
-
136
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
137
-
116
+ def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
117
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
118
+
138
119
  # Add Exhaust Fan
139
- space_type_map = define_space_type_map(building_type, building_vintage, climate_zone)
120
+ space_type_map = define_space_type_map(building_type, template, climate_zone)
140
121
  exhaust_fan_space_types = []
141
- case building_vintage
142
- when '90.1-2004','90.1-2007'
143
- exhaust_fan_space_types =['Kitchen','Laundry']
122
+ case template
123
+ when '90.1-2004', '90.1-2007'
124
+ exhaust_fan_space_types = ['Kitchen', 'Laundry']
144
125
  else
145
- exhaust_fan_space_types =['Banquet', 'Kitchen','Laundry']
126
+ exhaust_fan_space_types = ['Banquet', 'Kitchen', 'Laundry']
146
127
  end
147
128
 
148
129
  exhaust_fan_space_types.each do |space_type_name|
149
- space_type_data = self.find_object($os_standards['space_types'], {'template'=>building_vintage, 'building_type'=>building_type, 'space_type'=>space_type_name})
150
- if space_type_data == nil
151
- OpenStudio::logFree(OpenStudio::Error, 'openstudio.model.Model', "Unable to find space type #{building_vintage}-#{building_type}-#{space_type_name}")
130
+ space_type_data = find_object($os_standards['space_types'], 'template' => template, 'building_type' => building_type, 'space_type' => space_type_name)
131
+ if space_type_data.nil?
132
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Unable to find space type #{template}-#{building_type}-#{space_type_name}")
152
133
  return false
153
134
  end
154
135
 
155
136
  exhaust_schedule = add_schedule(space_type_data['exhaust_schedule'])
156
- if exhaust_schedule.class.to_s == "NilClass"
157
- OpenStudio::logFree(OpenStudio::Error, 'openstudio.model.Model', "Unable to find Exhaust Schedule for space type #{building_vintage}-#{building_type}-#{space_type_name}")
137
+ if exhaust_schedule.class.to_s == 'NilClass'
138
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Unable to find Exhaust Schedule for space type #{template}-#{building_type}-#{space_type_name}")
158
139
  return false
159
140
  end
160
141
 
@@ -162,24 +143,24 @@ class OpenStudio::Model::Model
162
143
 
163
144
  space_names = space_type_map[space_type_name]
164
145
  space_names.each do |space_name|
165
- space = self.getSpaceByName(space_name).get
146
+ space = getSpaceByName(space_name).get
166
147
  thermal_zone = space.thermalZone.get
167
148
 
168
149
  zone_exhaust_fan = OpenStudio::Model::FanZoneExhaust.new(self)
169
- zone_exhaust_fan.setName(space.name.to_s + " Exhaust Fan")
150
+ zone_exhaust_fan.setName(space.name.to_s + ' Exhaust Fan')
170
151
  zone_exhaust_fan.setAvailabilitySchedule(exhaust_schedule)
171
152
  zone_exhaust_fan.setFanEfficiency(space_type_data['exhaust_fan_efficiency'])
172
153
  zone_exhaust_fan.setPressureRise(space_type_data['exhaust_fan_pressure_rise'])
173
154
  maximum_flow_rate = OpenStudio.convert(space_type_data['exhaust_fan_maximum_flow_rate'], 'cfm', 'm^3/s').get
174
155
 
175
156
  zone_exhaust_fan.setMaximumFlowRate(maximum_flow_rate)
176
- if balanced_exhaust_schedule.class.to_s != "NilClass"
157
+ if balanced_exhaust_schedule.class.to_s != 'NilClass'
177
158
  zone_exhaust_fan.setBalancedExhaustFractionSchedule(balanced_exhaust_schedule)
178
159
  end
179
- zone_exhaust_fan.setEndUseSubcategory("Zone Exhaust Fans")
160
+ zone_exhaust_fan.setEndUseSubcategory('Zone Exhaust Fans')
180
161
  zone_exhaust_fan.addToThermalZone(thermal_zone)
181
162
 
182
- if space_type_data['exhaust_fan_power'] != nil and space_type_data['exhaust_fan_power'].to_f != 0
163
+ if !space_type_data['exhaust_fan_power'].nil? && space_type_data['exhaust_fan_power'].to_f.nonzero?
183
164
  # Create the electric equipment definition
184
165
  exhaust_fan_equip_def = OpenStudio::Model::ElectricEquipmentDefinition.new(self)
185
166
  exhaust_fan_equip_def.setName("#{space_name} Electric Equipment Definition")
@@ -198,31 +179,27 @@ class OpenStudio::Model::Model
198
179
  end
199
180
 
200
181
  # Update Sizing Zone
201
- zone_sizing = self.getSpaceByName('Kitchen_Flr_6').get.thermalZone.get.sizingZone
182
+ zone_sizing = getSpaceByName('Kitchen_Flr_6').get.thermalZone.get.sizingZone
202
183
  zone_sizing.setCoolingMinimumAirFlowFraction(0.7)
203
184
 
204
- zone_sizing = self.getSpaceByName('Laundry_Flr_1').get.thermalZone.get.sizingZone
185
+ zone_sizing = getSpaceByName('Laundry_Flr_1').get.thermalZone.get.sizingZone
205
186
  zone_sizing.setCoolingMinimumAirFlow(0.23567919336)
206
187
 
207
- OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
208
-
188
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
189
+
209
190
  return true
210
-
211
- end #add hvac
191
+ end # add hvac
212
192
 
213
193
  # Add the daylighting controls for lobby, cafe, dinning and banquet
214
- def add_daylighting_controls(building_vintage)
215
- space_names = ['Banquet_Flr_6','Dining_Flr_6','Cafe_Flr_1','Lobby_Flr_1']
194
+ def large_hotel_add_daylighting_controls(template)
195
+ space_names = ['Banquet_Flr_6', 'Dining_Flr_6', 'Cafe_Flr_1', 'Lobby_Flr_1']
216
196
  space_names.each do |space_name|
217
- space = self.getSpaceByName(space_name).get
218
- space.addDaylightingControls(building_vintage, false, false)
197
+ space = getSpaceByName(space_name).get
198
+ space.add_daylighting_controls(template, false, false)
219
199
  end
220
200
  end
221
201
 
222
- def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
223
-
202
+ def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
224
203
  return true
225
-
226
204
  end
227
-
228
205
  end
@@ -1,195 +1,148 @@
1
1
  # Extend the class to add Medium Office specific stuff
2
2
  class OpenStudio::Model::Model
3
-
4
- def define_space_type_map(building_type, building_vintage, climate_zone)
5
- case building_vintage
3
+ def define_space_type_map(building_type, template, climate_zone)
4
+ case template
6
5
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
7
6
  space_type_map = {
8
- 'WholeBuilding - Lg Office' => [
9
- 'Basement', 'Core_bottom', 'Core_mid', 'Core_top', #'GroundFloor_Plenum', 'MidFloor_Plenum', 'TopFloor_Plenum',
10
- 'Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4',
11
- 'Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4',
12
- 'Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4'
13
- ]
14
- }
15
- when '90.1-2004','90.1-2007','90.1-2010','90.1-2013'
7
+ 'WholeBuilding - Lg Office' => [
8
+ 'Basement', 'Core_bottom', 'Core_mid', 'Core_top', # 'GroundFloor_Plenum', 'MidFloor_Plenum', 'TopFloor_Plenum',
9
+ 'Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4',
10
+ 'Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4',
11
+ 'Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4'
12
+ ]
13
+ }
14
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
16
15
  space_type_map = {
17
- 'WholeBuilding - Lg Office' => [
18
- 'Basement', 'Core_bottom', 'Core_mid', 'Core_top', #'GroundFloor_Plenum', 'MidFloor_Plenum', 'TopFloor_Plenum',
19
- 'Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4',
20
- 'Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4',
21
- 'Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4'
22
- ],
23
- 'OfficeLarge Data Center' => [
24
- 'DataCenter_bot_ZN_6', 'DataCenter_mid_ZN_6', 'DataCenter_top_ZN_6'
25
- ],
26
- 'OfficeLarge Main Data Center' => [
27
- 'DataCenter_basement_ZN_6'
28
- ]
29
- }
30
- when 'NECB 2011'
16
+ 'WholeBuilding - Lg Office' => [
17
+ 'Basement', 'Core_bottom', 'Core_mid', 'Core_top', # 'GroundFloor_Plenum', 'MidFloor_Plenum', 'TopFloor_Plenum',
18
+ 'Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4',
19
+ 'Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4',
20
+ 'Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4'
21
+ ],
22
+ 'OfficeLarge Data Center' => ['DataCenter_bot_ZN_6', 'DataCenter_mid_ZN_6', 'DataCenter_top_ZN_6'],
23
+ 'OfficeLarge Main Data Center' => [
24
+ 'DataCenter_basement_ZN_6'
25
+ ]
26
+ }
27
+ when 'NECB 2011'
28
+ # Dom is A
31
29
  space_type_map = {
32
- "Electrical/Mechanical" => ["Basement"],
30
+ 'Electrical/Mechanical' => ['Basement'],
33
31
 
34
- "Office - open plan" => [ "Core_bottom", "Core_mid", "Core_top", "MidFloor_Plenum",
35
- "Perimeter_bot_ZN_1", "Perimeter_bot_ZN_2", "Perimeter_bot_ZN_3",
36
- "Perimeter_bot_ZN_4", "Perimeter_mid_ZN_1", "Perimeter_mid_ZN_2",
37
- "Perimeter_mid_ZN_3", "Perimeter_mid_ZN_4", "Perimeter_top_ZN_1",
38
- "Perimeter_top_ZN_2", "Perimeter_top_ZN_3", "Perimeter_top_ZN_4",
39
- "DataCenter_basement_ZN_6", "DataCenter_bot_ZN_6", "DataCenter_mid_ZN_6",
40
- "DataCenter_top_ZN_6"],
41
-
42
- "- undefined -" => ["GroundFloor_Plenum", "TopFloor_Plenum"]
32
+ 'Office - open plan' => ['Core_bottom', 'Core_mid', 'Core_top', 'Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4', 'Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4', 'Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4', 'DataCenter_basement_ZN_6', 'DataCenter_bot_ZN_6', 'DataCenter_mid_ZN_6', 'DataCenter_top_ZN_6'],
33
+ '- undefined -' => ['GroundFloor_Plenum', 'TopFloor_Plenum', 'MidFloor_Plenum']
43
34
  }
44
35
  end
45
36
  return space_type_map
46
37
  end
47
38
 
48
- def define_hvac_system_map(building_type, building_vintage, climate_zone)
49
-
50
- case building_vintage
39
+ def define_hvac_system_map(building_type, template, climate_zone)
40
+ case template
51
41
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
52
42
  system_to_space_map = [
53
43
  {
54
- 'type' => 'VAV',
55
- 'name' => 'VAV_1',
56
- 'space_names' =>
57
- [
58
- 'Perimeter_bot_ZN_1',
59
- 'Perimeter_bot_ZN_2',
60
- 'Perimeter_bot_ZN_3',
61
- 'Perimeter_bot_ZN_4',
62
- 'Core_bottom'
63
- ],
64
- 'return_plenum' => 'GroundFloor_Plenum'
44
+ 'type' => 'VAV',
45
+ 'name' => 'VAV_1',
46
+ 'space_names' =>
47
+ ['Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4', 'Core_bottom'],
48
+ 'return_plenum' => 'GroundFloor_Plenum'
65
49
  },
66
50
  {
67
- 'type' => 'VAV',
68
- 'name' => 'VAV_2',
69
- 'space_names' =>
70
- [
71
- 'Perimeter_mid_ZN_1',
72
- 'Perimeter_mid_ZN_2',
73
- 'Perimeter_mid_ZN_3',
74
- 'Perimeter_mid_ZN_4',
75
- 'Core_mid'
76
- ],
77
- 'return_plenum' => 'MidFloor_Plenum'
51
+ 'type' => 'VAV',
52
+ 'name' => 'VAV_2',
53
+ 'space_names' =>
54
+ ['Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4', 'Core_mid'],
55
+ 'return_plenum' => 'MidFloor_Plenum'
78
56
  },
79
57
  {
80
- 'type' => 'VAV',
81
- 'name' => 'VAV_3',
82
- 'space_names' =>
83
- [
84
- 'Perimeter_top_ZN_1',
85
- 'Perimeter_top_ZN_2',
86
- 'Perimeter_top_ZN_3',
87
- 'Perimeter_top_ZN_4',
88
- 'Core_top'
89
- ],
90
- 'return_plenum' => 'TopFloor_Plenum'
58
+ 'type' => 'VAV',
59
+ 'name' => 'VAV_3',
60
+ 'space_names' =>
61
+ ['Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4', 'Core_top'],
62
+ 'return_plenum' => 'TopFloor_Plenum'
91
63
  },
92
64
  {
93
- 'type' => 'VAV',
94
- 'name' => 'VAV_5',
95
- 'space_names' =>
65
+ 'type' => 'VAV',
66
+ 'name' => 'VAV_5',
67
+ 'space_names' =>
96
68
  [
97
- 'Basement'
69
+ 'Basement'
98
70
  ]
99
71
  }
100
72
  ]
101
- when '90.1-2004','90.1-2007','90.1-2010','90.1-2013'
73
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
102
74
  system_to_space_map = [
103
75
  {
104
76
  'type' => 'VAV',
105
77
  'name' => 'VAV_bot WITH REHEAT',
106
78
  'space_names' =>
107
- [
108
- 'Perimeter_bot_ZN_1',
109
- 'Perimeter_bot_ZN_2',
110
- 'Perimeter_bot_ZN_3',
111
- 'Perimeter_bot_ZN_4',
112
- 'Core_bottom'
113
- ],
79
+ ['Perimeter_bot_ZN_1', 'Perimeter_bot_ZN_2', 'Perimeter_bot_ZN_3', 'Perimeter_bot_ZN_4', 'Core_bottom'],
114
80
  'return_plenum' => 'GroundFloor_Plenum'
115
- },
116
- {
81
+ },
82
+ {
117
83
  'type' => 'VAV',
118
84
  'name' => 'VAV_mid WITH REHEAT',
119
85
  'space_names' =>
120
- [
121
- 'Perimeter_mid_ZN_1',
122
- 'Perimeter_mid_ZN_2',
123
- 'Perimeter_mid_ZN_3',
124
- 'Perimeter_mid_ZN_4',
125
- 'Core_mid'
126
- ],
86
+ ['Perimeter_mid_ZN_1', 'Perimeter_mid_ZN_2', 'Perimeter_mid_ZN_3', 'Perimeter_mid_ZN_4', 'Core_mid'],
127
87
  'return_plenum' => 'MidFloor_Plenum'
128
- },
129
- {
88
+ },
89
+ {
130
90
  'type' => 'VAV',
131
91
  'name' => 'VAV_top WITH REHEAT',
132
92
  'space_names' =>
133
- [
134
- 'Perimeter_top_ZN_1',
135
- 'Perimeter_top_ZN_2',
136
- 'Perimeter_top_ZN_3',
137
- 'Perimeter_top_ZN_4',
138
- 'Core_top'
139
- ],
93
+ ['Perimeter_top_ZN_1', 'Perimeter_top_ZN_2', 'Perimeter_top_ZN_3', 'Perimeter_top_ZN_4', 'Core_top'],
140
94
  'return_plenum' => 'TopFloor_Plenum'
141
- },
142
- {
95
+ },
96
+ {
143
97
 
144
98
  'type' => 'CAV',
145
99
  'name' => 'CAV_bas',
146
100
  'space_names' =>
147
- [
148
- 'Basement'
149
- ]
150
- },
151
- {
101
+ [
102
+ 'Basement'
103
+ ]
104
+ },
105
+ {
152
106
  'type' => 'DC',
153
107
  'space_names' =>
154
- [
108
+ [
155
109
  'DataCenter_basement_ZN_6'
156
- ],
110
+ ],
157
111
  'load' => 484.423246742185,
158
112
  'main_data_center' => true
159
- },
160
- {
113
+ },
114
+ {
161
115
  'type' => 'DC',
162
116
  'space_names' =>
163
- [
117
+ [
164
118
  'DataCenter_bot_ZN_6'
165
- ],
119
+ ],
166
120
  'load' => 215.299220774304,
167
121
  'main_data_center' => false
168
- },
169
- {
122
+ },
123
+ {
170
124
  'type' => 'DC',
171
125
  'space_names' =>
172
- [
126
+ [
173
127
  'DataCenter_mid_ZN_6'
174
- ],
128
+ ],
175
129
  'load' => 215.299220774304,
176
130
  'main_data_center' => false
177
- },
178
- {
131
+ },
132
+ {
179
133
  'type' => 'DC',
180
134
  'space_names' =>
181
- [
135
+ [
182
136
  'DataCenter_top_ZN_6'
183
- ],
137
+ ],
184
138
  'load' => 215.299220774304,
185
139
  'main_data_center' => false
186
- }
187
- ]
140
+ }
141
+ ]
188
142
 
189
143
  end
190
144
 
191
145
  return system_to_space_map
192
-
193
146
  end
194
147
 
195
148
  def define_space_multiplier
@@ -206,67 +159,59 @@ class OpenStudio::Model::Model
206
159
  return space_multiplier_map
207
160
  end
208
161
 
209
- def custom_hvac_tweaks(building_type, building_vintage, climate_zone, prototype_input)
210
-
211
-
212
- system_to_space_map = define_hvac_system_map(building_type, building_vintage, climate_zone)
162
+ def custom_hvac_tweaks(building_type, template, climate_zone, prototype_input)
163
+ system_to_space_map = define_hvac_system_map(building_type, template, climate_zone)
213
164
 
214
165
  system_to_space_map.each do |system|
215
-
216
- #find all zones associated with these spaces
166
+ # find all zones associated with these spaces
217
167
  thermal_zones = []
218
168
  system['space_names'].each do |space_name|
219
- space = self.getSpaceByName(space_name)
220
- if space.empty?
221
- OpenStudio::logFree(OpenStudio::Error, 'openstudio.model.Model', "No space called #{space_name} was found in the model")
222
- return false
223
- end
224
- space = space.get
225
- zone = space.thermalZone
226
- if zone.empty?
227
- OpenStudio::logFree(OpenStudio::Error, 'openstudio.model.Model', "No thermal zone was created for the space called #{space_name}")
228
- return false
169
+ space = getSpaceByName(space_name)
170
+ if space.empty?
171
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No space called #{space_name} was found in the model")
172
+ return false
173
+ end
174
+ space = space.get
175
+ zone = space.thermalZone
176
+ if zone.empty?
177
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No thermal zone was created for the space called #{space_name}")
178
+ return false
179
+ end
180
+ thermal_zones << zone.get
229
181
  end
230
- thermal_zones << zone.get
231
- end
232
182
 
233
183
  return_plenum = nil
234
184
  unless system['return_plenum'].nil?
235
- return_plenum_space = self.getSpaceByName(system['return_plenum'])
185
+ return_plenum_space = getSpaceByName(system['return_plenum'])
236
186
  if return_plenum_space.empty?
237
- OpenStudio::logFree(OpenStudio::Error, 'openstudio.model.Model', "No space called #{system['return_plenum']} was found in the model")
187
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No space called #{system['return_plenum']} was found in the model")
238
188
  return false
239
189
  end
240
190
  return_plenum_space = return_plenum_space.get
241
191
  return_plenum = return_plenum_space.thermalZone
242
192
  if return_plenum.empty?
243
- OpenStudio::logFree(OpenStudio::Error, 'openstudio.model.Model', "No thermal zone was created for the space called #{system['return_plenum']}")
193
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "No thermal zone was created for the space called #{system['return_plenum']}")
244
194
  return false
245
195
  end
246
196
  return_plenum = return_plenum.get
247
197
  end
248
-
249
198
  end
250
199
 
251
200
  return true
252
-
253
201
  end
254
202
 
255
- def update_waterheater_loss_coefficient(building_vintage)
256
- case building_vintage
203
+ def update_waterheater_loss_coefficient(template)
204
+ case template
257
205
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NECB 2011'
258
- self.getWaterHeaterMixeds.sort.each do |water_heater|
206
+ getWaterHeaterMixeds.sort.each do |water_heater|
259
207
  water_heater.setOffCycleLossCoefficienttoAmbientTemperature(11.25413987)
260
208
  water_heater.setOnCycleLossCoefficienttoAmbientTemperature(11.25413987)
261
209
  end
262
210
  end
263
211
  end
264
212
 
265
- def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
266
-
267
- self.update_waterheater_loss_coefficient(building_vintage)
213
+ def custom_swh_tweaks(building_type, template, climate_zone, prototype_input)
214
+ update_waterheater_loss_coefficient(template)
268
215
  return true
269
-
270
216
  end
271
-
272
217
  end