openstudio-standards 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards_chillers.json +5 -5
  4. data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
  5. data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
  6. data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
  7. data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
  8. data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
  9. data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
  10. data/data/standards/OpenStudio_Standards_schedules.json +262 -10
  11. data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
  12. data/data/standards/manage_OpenStudio_Standards.rb +19 -21
  13. data/data/weather/weather_info.csv +96 -0
  14. data/lib/openstudio-standards/btap/btap.rb +1 -1
  15. data/lib/openstudio-standards/btap/compliance.rb +135 -40
  16. data/lib/openstudio-standards/btap/envelope.rb +26 -5
  17. data/lib/openstudio-standards/btap/geometry.rb +11 -1
  18. data/lib/openstudio-standards/btap/hvac.rb +489 -56
  19. data/lib/openstudio-standards/btap/simmanager.rb +1 -1
  20. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
  21. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
  22. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
  23. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
  24. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
  25. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
  26. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
  27. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
  28. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
  29. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
  30. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
  31. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
  32. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
  33. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
  34. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
  35. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
  36. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
  37. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
  38. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
  39. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
  40. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
  41. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
  42. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
  43. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
  44. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
  45. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
  46. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
  47. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
  48. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
  49. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
  50. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
  51. data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
  52. data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
  53. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
  54. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
  55. data/lib/openstudio-standards/version.rb +1 -1
  56. data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
  57. data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
  58. metadata +8 -3
  59. data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -1,9 +1,29 @@
1
1
 
2
2
  # Extend the class to add Medium Office specific stuff
3
3
  class OpenStudio::Model::Model
4
-
4
+
5
5
  def define_space_type_map(building_type, building_vintage, climate_zone)
6
- space_type_map = {
6
+ space_type_map = nil
7
+ case building_vintage
8
+ when 'NECB 2011'
9
+ space_type_map ={
10
+ "Electrical/Mechanical" => ["Basement"],
11
+ "Corr. >= 2.4m wide" => ["Corridor_Flr_1", "Corridor_Flr_2", "Corridor_Flr_5", "Corridor_NW_Flr_3", "Corridor_NW_Flr_4", "Corridor_SE_Flr_3", "Corridor_SE_Flr_4"],
12
+ "Dining - bar lounge/leisure" => ["Dining_Flr_5"],
13
+ "Hospital - emergency" => ["ER_Exam1_Mult4_Flr_1", "ER_Exam3_Mult4_Flr_1", "ER_Trauma1_Flr_1", "ER_Trauma2_Flr_1", "ER_Triage_Mult4_Flr_1"],
14
+ "Hospital - nurses' station" => ["ER_NurseStn_Lobby_Flr_1", "ICU_NurseStn_Lobby_Flr_2", "NurseStn_Lobby_Flr_3", "NurseStn_Lobby_Flr_4", "NurseStn_Lobby_Flr_5", "OR_NurseStn_Lobby_Flr_2"],
15
+ "Hospital - patient room" => ["IC_PatRoom1_Mult5_Flr_2", "IC_PatRoom2_Flr_2", "IC_PatRoom3_Mult6_Flr_2", "PatRoom1_Mult10_Flr_3", "PatRoom1_Mult10_Flr_4", "PatRoom2_Flr_3", "PatRoom2_Flr_4", "PatRoom3_Mult10_Flr_3", "PatRoom3_Mult10_Flr_4", "PatRoom4_Flr_3", "PatRoom4_Flr_4", "PatRoom5_Mult10_Flr_3", "PatRoom5_Mult10_Flr_4", "PatRoom6_Flr_3", "PatRoom6_Flr_4", "PatRoom7_Mult10_Flr_3", "PatRoom7_Mult10_Flr_4", "PatRoom8_Flr_3", "PatRoom8_Flr_4"],
16
+ "Hospital - recovery" => ["ICU_Flr_2"],
17
+ "Food preparation" => ["Kitchen_Flr_5"],
18
+ "Lab - research" => ["Lab_Flr_3", "Lab_Flr_4"],
19
+ "Office - enclosed" => ["Lobby_Records_Flr_1", "Office1_Flr_5", "Office1_Mult4_Flr_1", "Office2_Mult5_Flr_5", "Office3_Flr_5", "Office4_Mult6_Flr_5"],
20
+ "Hospital - operating room" => ["OR1_Flr_2", "OR2_Mult5_Flr_2", "OR3_Flr_2", "OR4_Flr_2"],
21
+ "Hospital - physical therapy" => ["PhysTherapy_Flr_3"],
22
+ "Hospital - radiology/imaging" => ["Radiology_Flr_4"]
23
+ }
24
+
25
+ else
26
+ space_type_map = {
7
27
  # 'Basement', 'ER_Exam1_Mult4_Flr_1', 'ER_Trauma1_Flr_1', 'ER_Exam3_Mult4_Flr_1', 'ER_Trauma2_Flr_1', 'ER_Triage_Mult4_Flr_1', 'Office1_Mult4_Flr_1', 'Lobby_Records_Flr_1', 'Corridor_Flr_1', 'ER_NurseStn_Lobby_Flr_1', 'OR1_Flr_2', 'OR2_Mult5_Flr_2', 'OR3_Flr_2', 'OR4_Flr_2', 'IC_PatRoom1_Mult5_Flr_2', 'IC_PatRoom2_Flr_2', 'IC_PatRoom3_Mult6_Flr_2', 'ICU_Flr_2', 'ICU_NurseStn_Lobby_Flr_2', 'Corridor_Flr_2', 'OR_NurseStn_Lobby_Flr_2', 'PatRoom1_Mult10_Flr_3', 'PatRoom2_Flr_3', 'PatRoom3_Mult10_Flr_3', 'PatRoom4_Flr_3', 'PatRoom5_Mult10_Flr_3', 'PhysTherapy_Flr_3', 'PatRoom6_Flr_3', 'PatRoom7_Mult10_Flr_3', 'PatRoom8_Flr_3', 'NurseStn_Lobby_Flr_3', 'Lab_Flr_3', 'Corridor_SE_Flr_3', 'Corridor_NW_Flr_3', 'PatRoom1_Mult10_Flr_4', 'PatRoom2_Flr_4', 'PatRoom3_Mult10_Flr_4', 'PatRoom4_Flr_4', 'PatRoom5_Mult10_Flr_4', 'Radiology_Flr_4', 'PatRoom6_Flr_4', 'PatRoom7_Mult10_Flr_4', 'PatRoom8_Flr_4', 'NurseStn_Lobby_Flr_4', 'Lab_Flr_4', 'Corridor_SE_Flr_4', 'Corridor_NW_Flr_4', 'Dining_Flr_5', 'NurseStn_Lobby_Flr_5', 'Kitchen_Flr_5', 'Office1_Flr_5', 'Office2_Mult5_Flr_5', 'Office3_Flr_5', 'Office4_Mult6_Flr_5', 'Corridor_Flr_5'
8
28
  'Corridor' => ['Corridor_Flr_1', 'Corridor_Flr_2', 'Corridor_SE_Flr_3', 'Corridor_NW_Flr_3', 'Corridor_SE_Flr_4', 'Corridor_NW_Flr_4', 'Corridor_Flr_5'],
9
29
  'Dining' => ['Dining_Flr_5', ],
@@ -19,116 +39,262 @@ class OpenStudio::Model::Model
19
39
  'Lobby' => ['Lobby_Records_Flr_1', ],
20
40
  'NurseStn' => ['OR_NurseStn_Lobby_Flr_2', 'NurseStn_Lobby_Flr_3', 'NurseStn_Lobby_Flr_4', 'NurseStn_Lobby_Flr_5', ],
21
41
  'OR' => ['OR1_Flr_2', 'OR2_Mult5_Flr_2', 'OR3_Flr_2', 'OR4_Flr_2', ],
22
- 'Office' => ['Office1_Mult4_Flr_1', 'Office1_Flr_5', 'Office2_Mult5_Flr_5', 'Office3_Flr_5', 'Office4_Mult6_Flr_5', 'Basement', ], # I don't know where to put Basement
23
- # 'PatCorridor' => [],
24
- 'PatRoom' => ['PatRoom1_Mult10_Flr_3', 'PatRoom2_Flr_3', 'PatRoom3_Mult10_Flr_3', 'PatRoom4_Flr_3', 'PatRoom5_Mult10_Flr_3', 'PatRoom6_Flr_3',
25
- 'PatRoom7_Mult10_Flr_3', 'PatRoom8_Flr_3', 'PatRoom1_Mult10_Flr_4', 'PatRoom2_Flr_4', 'PatRoom3_Mult10_Flr_4', 'PatRoom4_Flr_4', 'PatRoom5_Mult10_Flr_4',
26
- 'PatRoom6_Flr_4', 'PatRoom7_Mult10_Flr_4', 'PatRoom8_Flr_4', ],
42
+ 'Office' => ['Office1_Mult4_Flr_1', 'Office1_Flr_5', 'Office2_Mult5_Flr_5', 'Office3_Flr_5', 'Office4_Mult6_Flr_5', ],
43
+ 'Basement' => ['Basement',], # 'PatCorridor' => [],
44
+ 'PatRoom' => ['PatRoom1_Mult10_Flr_3', 'PatRoom2_Flr_3', 'PatRoom3_Mult10_Flr_3', 'PatRoom4_Flr_3', 'PatRoom5_Mult10_Flr_3', 'PatRoom6_Flr_3',
45
+ 'PatRoom7_Mult10_Flr_3', 'PatRoom8_Flr_3', 'PatRoom1_Mult10_Flr_4', 'PatRoom2_Flr_4', 'PatRoom3_Mult10_Flr_4', 'PatRoom4_Flr_4', 'PatRoom5_Mult10_Flr_4',
46
+ 'PatRoom6_Flr_4', 'PatRoom7_Mult10_Flr_4', 'PatRoom8_Flr_4', ],
27
47
  'PhysTherapy' => ['PhysTherapy_Flr_3', ],
28
- 'Radiology' => ['Radiology_Flr_4', ] # total number of zones: 55 - equals to the IDF
48
+ 'Radiology' => ['Radiology_Flr_4', ] # total number of zones: 55 - equals to the IDF
29
49
  }
50
+ end
30
51
  return space_type_map
31
52
  end
32
53
 
33
54
  def define_hvac_system_map(building_type, building_vintage, climate_zone)
34
- system_to_space_map = [
35
- {
55
+
56
+ case building_vintage
57
+ when '90.1-2010', '90.1-2013'
58
+ exhaust_flow = 7200
59
+ when '90.1-2004', '90.1-2007'
60
+ exhaust_flow = 8000
61
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
62
+ exhaust_flow = 3710
63
+ exhaust_flow_dining = 1589
64
+ end
65
+
66
+ case building_vintage
67
+ when '90.1-2010', '90.1-2013','90.1-2004', '90.1-2007'
68
+ system_to_space_map = [
69
+ {
36
70
  'type' => 'VAV',
71
+ 'name' => 'VAV_1',
37
72
  'space_names' => [
38
- 'Basement', 'Office1_Mult4_Flr_1', 'Lobby_Records_Flr_1', 'Corridor_Flr_1', 'ER_NurseStn_Lobby_Flr_1',
73
+ 'Basement', 'Office1_Mult4_Flr_1', 'Lobby_Records_Flr_1', 'Corridor_Flr_1', 'ER_NurseStn_Lobby_Flr_1',
39
74
  'ICU_NurseStn_Lobby_Flr_2', 'Corridor_Flr_2', 'OR_NurseStn_Lobby_Flr_2'
40
75
  ]
41
- },
42
- {
76
+ },
77
+ {
43
78
  'type' => 'VAV',
79
+ 'name' => 'VAV_ER',
44
80
  'space_names' => [
45
81
  'ER_Exam1_Mult4_Flr_1', 'ER_Trauma1_Flr_1', 'ER_Exam3_Mult4_Flr_1', 'ER_Trauma2_Flr_1', 'ER_Triage_Mult4_Flr_1'
46
82
  ]
47
- },
48
- {
83
+ },
84
+ {
49
85
  'type' => 'VAV',
86
+ 'name' => 'VAV_OR',
50
87
  'space_names' => [
51
88
  'OR1_Flr_2', 'OR2_Mult5_Flr_2', 'OR3_Flr_2', 'OR4_Flr_2'
52
89
  ]
53
- },
54
- {
90
+ },
91
+ {
55
92
  'type' => 'VAV',
93
+ 'name' => 'VAV_ICU',
56
94
  'space_names' => [
57
95
  'IC_PatRoom1_Mult5_Flr_2', 'IC_PatRoom2_Flr_2', 'IC_PatRoom3_Mult6_Flr_2', 'ICU_Flr_2'
58
96
  ]
59
- },
60
- {
97
+ },
98
+ {
61
99
  'type' => 'VAV',
100
+ 'name' => 'VAV_PATRMS',
62
101
  'space_names' => [
63
- 'PatRoom1_Mult10_Flr_3', 'PatRoom2_Flr_3', 'PatRoom3_Mult10_Flr_3', 'PatRoom4_Flr_3', 'PatRoom5_Mult10_Flr_3', 'PatRoom6_Flr_3',
64
- 'PatRoom7_Mult10_Flr_3', 'PatRoom8_Flr_3', 'PatRoom1_Mult10_Flr_4', 'PatRoom2_Flr_4', 'PatRoom3_Mult10_Flr_4', 'PatRoom4_Flr_4',
102
+ 'PatRoom1_Mult10_Flr_3', 'PatRoom2_Flr_3', 'PatRoom3_Mult10_Flr_3', 'PatRoom4_Flr_3', 'PatRoom5_Mult10_Flr_3', 'PatRoom6_Flr_3',
103
+ 'PatRoom7_Mult10_Flr_3', 'PatRoom8_Flr_3', 'PatRoom1_Mult10_Flr_4', 'PatRoom2_Flr_4', 'PatRoom3_Mult10_Flr_4', 'PatRoom4_Flr_4',
65
104
  'PatRoom5_Mult10_Flr_4', 'PatRoom6_Flr_4', 'PatRoom7_Mult10_Flr_4', 'PatRoom8_Flr_4'
66
105
  ]
67
- },
68
- {
106
+ },
107
+ {
69
108
  'type' => 'VAV',
70
- 'space_names' => [
71
- 'PhysTherapy_Flr_3', 'NurseStn_Lobby_Flr_3', 'Corridor_SE_Flr_3', 'Corridor_NW_Flr_3', 'Radiology_Flr_4',
72
- 'NurseStn_Lobby_Flr_4', 'Corridor_SE_Flr_4', 'Corridor_NW_Flr_4', 'Dining_Flr_5', 'NurseStn_Lobby_Flr_5',
73
- 'Office1_Flr_5', 'Office2_Mult5_Flr_5', 'Office3_Flr_5', 'Office4_Mult6_Flr_5', 'Corridor_Flr_5'
74
- ]
75
- },
76
- {
109
+ 'name' => 'VAV_2',
110
+ 'space_names' => [
111
+ 'PhysTherapy_Flr_3', 'NurseStn_Lobby_Flr_3', 'Corridor_SE_Flr_3', 'Corridor_NW_Flr_3', 'Radiology_Flr_4',
112
+ 'NurseStn_Lobby_Flr_4', 'Corridor_SE_Flr_4', 'Corridor_NW_Flr_4', 'Dining_Flr_5', 'NurseStn_Lobby_Flr_5',
113
+ 'Office1_Flr_5', 'Office2_Mult5_Flr_5', 'Office3_Flr_5', 'Office4_Mult6_Flr_5', 'Corridor_Flr_5'
114
+ ]
115
+ },
116
+ {
77
117
  'type' => 'VAV',
118
+ 'name' => 'VAV_LABS',
78
119
  'space_names' => [
79
120
  'Lab_Flr_3', 'Lab_Flr_4'
80
121
  ]
81
- },
82
- {
122
+ },
123
+ {
83
124
  'type' => 'CAV',
125
+ 'name' => 'CAV_KITCHEN',
84
126
  'space_names' => [
85
127
  'Kitchen_Flr_5'
86
128
  ] # 55 spaces assigned.
87
- },
88
- {
89
- 'type' => 'Refrigeration',
90
- 'case_type' => 'Walkin Freezer',
91
- 'cooling_capacity_per_length' => 734,
92
- 'length' => 10.98,
93
- 'evaporator_fan_pwr_per_length' => 69,
94
- 'lighting_per_length' => 33,
95
- 'lighting_sch_name' => 'Hospital BLDG_LIGHT_SCH',
96
- 'defrost_pwr_per_length' => 364,
97
- 'restocking_sch_name' => 'Hospital Kitchen_Flr_5_Case:1_WALKINFREEZER_WalkInStockingSched',
98
- 'cop' => 1.5,
99
- 'cop_f_of_t_curve_name' => 'RACK1_RackCOPfTCurve',
100
- 'condenser_fan_pwr' => 1000,
101
- 'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
102
- 'space_names' =>
103
- [
104
- 'Kitchen_Flr_5'
105
- ]
106
129
  },
107
- {
108
- 'type' => 'Refrigeration',
109
- 'case_type' => 'Display Case',
110
- 'cooling_capacity_per_length' => 886.5,
111
- 'length' => 8.93,
112
- 'evaporator_fan_pwr_per_length' => 67,
113
- 'lighting_per_length' => 40,
114
- 'lighting_sch_name' => 'Hospital BLDG_LIGHT_SCH',
115
- 'defrost_pwr_per_length' => 0.0,
116
- 'restocking_sch_name' => 'Hospital Kitchen_Flr_5_Case:2_SELFCONTAINEDDISPLAYCASE_CaseStockingSched',
117
- 'cop' => 3.0,
118
- 'cop_f_of_t_curve_name' => 'RACK2_RackCOPfTCurve',
119
- 'condenser_fan_pwr' => 1000,
120
- 'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
121
- 'space_names' =>
122
- [
123
- 'Kitchen_Flr_5'
124
- ]
130
+ {
131
+ 'type' => 'Exhaust Fan',
132
+ 'name' => 'Kitchen_Flr_5 Exhaust Fan',
133
+ 'availability_sch_name' => 'Hospital Kitchen_Exhaust_SCH',
134
+ 'flow_rate' => OpenStudio.convert(exhaust_flow,'cfm','m^3/s').get,
135
+ 'balanced_exhaust_fraction_schedule_name' => 'Hospital Kitchen Exhaust Fan Balanced Exhaust Fraction Schedule',
136
+ 'space_names' =>
137
+ [
138
+ 'Kitchen_Flr_5'
139
+ ]
140
+ },
141
+ {
142
+ 'type' => 'Refrigeration',
143
+ 'case_type' => 'Walkin Freezer',
144
+ 'cooling_capacity_per_length' => 734,
145
+ 'length' => 10.98,
146
+ 'evaporator_fan_pwr_per_length' => 69,
147
+ 'lighting_per_length' => 33,
148
+ 'lighting_sch_name' => 'Hospital BLDG_LIGHT_SCH',
149
+ 'defrost_pwr_per_length' => 364,
150
+ 'restocking_sch_name' => 'Hospital Kitchen_Flr_5_Case:1_WALKINFREEZER_WalkInStockingSched',
151
+ 'cop' => 1.5,
152
+ 'cop_f_of_t_curve_name' => 'RACK1_RackCOPfTCurve',
153
+ 'condenser_fan_pwr' => 1000,
154
+ 'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
155
+ 'space_names' =>
156
+ [
157
+ 'Kitchen_Flr_5'
158
+ ]
159
+ },
160
+ {
161
+ 'type' => 'Refrigeration',
162
+ 'case_type' => 'Display Case',
163
+ 'cooling_capacity_per_length' => 886.5,
164
+ 'length' => 8.93,
165
+ 'evaporator_fan_pwr_per_length' => 67,
166
+ 'lighting_per_length' => 40,
167
+ 'lighting_sch_name' => 'Hospital BLDG_LIGHT_SCH',
168
+ 'defrost_pwr_per_length' => 0.0,
169
+ 'restocking_sch_name' => 'Hospital Kitchen_Flr_5_Case:2_SELFCONTAINEDDISPLAYCASE_CaseStockingSched',
170
+ 'cop' => 3.0,
171
+ 'cop_f_of_t_curve_name' => 'RACK2_RackCOPfTCurve',
172
+ 'condenser_fan_pwr' => 1000,
173
+ 'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
174
+ 'space_names' =>
175
+ [
176
+ 'Kitchen_Flr_5'
177
+ ]
178
+ }
179
+ ]
180
+ return system_to_space_map
181
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
182
+ system_to_space_map = [
183
+ {
184
+ 'type' => 'VAV',
185
+ 'name' => 'CAV_1',
186
+ 'space_names' => [
187
+ 'ER_Exam1_Mult4_Flr_1', 'ER_Trauma1_Flr_1', 'ER_Exam3_Mult4_Flr_1', 'ER_Trauma2_Flr_1', 'ER_Triage_Mult4_Flr_1','IC_PatRoom1_Mult5_Flr_2',
188
+ 'PatRoom1_Mult10_Flr_3','PatRoom5_Mult10_Flr_3', 'PatRoom7_Mult10_Flr_3', 'PatRoom3_Mult10_Flr_4', 'PatRoom5_Mult10_Flr_4',
189
+ 'PatRoom6_Flr_4', 'PatRoom7_Mult10_Flr_4'
190
+ ]
191
+ },
192
+ {
193
+ 'type' => 'VAV',
194
+ 'name' => 'CAV_2',
195
+ 'space_names' => [
196
+ 'OR1_Flr_2','OR2_Mult5_Flr_2','OR3_Flr_2','OR4_Flr_2','IC_PatRoom2_Flr_2','PatRoom2_Flr_3','PatRoom6_Flr_3','PatRoom8_Flr_3','PatRoom4_Flr_4'
197
+ ]
198
+ },
199
+ {
200
+ 'type' => 'VAV',
201
+ 'name' => 'VAV_1',
202
+ 'space_names' => [
203
+ 'Office1_Mult4_Flr_1','Lobby_Records_Flr_1','Corridor_Flr_1','ER_NurseStn_Lobby_Flr_1','IC_PatRoom3_Mult6_Flr_2','ICU_NurseStn_Lobby_Flr_2',
204
+ 'Corridor_Flr_2','OR_NurseStn_Lobby_Flr_2','PatRoom3_Mult10_Flr_3','Lab_Flr_3','PatRoom1_Mult10_Flr_4','PatRoom8_Flr_4'
205
+ ]
206
+ },
207
+ {
208
+ 'type' => 'VAV',
209
+ 'name' => 'VAV_2',
210
+ 'space_names' => [
211
+ 'ICU_Flr_2',
212
+ 'PatRoom4_Flr_3',
213
+ 'PhysTherapy_Flr_3',
214
+ 'NurseStn_Lobby_Flr_3',
215
+ 'Corridor_SE_Flr_3',
216
+ 'Corridor_NW_Flr_3',
217
+ 'PatRoom2_Flr_4',
218
+ 'Radiology_Flr_4',
219
+ 'NurseStn_Lobby_Flr_4',
220
+ 'Lab_Flr_4',
221
+ 'Corridor_SE_Flr_4',
222
+ 'Corridor_NW_Flr_4',
223
+ 'Dining_Flr_5',
224
+ 'NurseStn_Lobby_Flr_5',
225
+ 'Kitchen_Flr_5',
226
+ 'Office1_Flr_5',
227
+ 'Office2_Mult5_Flr_5',
228
+ 'Office3_Flr_5',
229
+ 'Office4_Mult6_Flr_5',
230
+ 'Corridor_Flr_5'
231
+ ]
232
+ },
233
+ {
234
+ 'type' => 'Exhaust Fan',
235
+ 'name' => 'Kitchen_Flr_5 Exhaust Fan',
236
+ 'availability_sch_name' => 'Hospital HVACOperationSchd',
237
+ 'flow_rate' => OpenStudio.convert(exhaust_flow,'cfm','m^3/s').get,
238
+ 'space_names' =>
239
+ [
240
+ 'Kitchen_Flr_5'
241
+ ]
242
+ },
243
+ {
244
+ 'type' => 'Exhaust Fan',
245
+ 'name' => 'Dining_Flr_5 Exhaust Fan',
246
+ 'availability_sch_name' => 'Hospital HVACOperationSchd',
247
+ 'flow_rate' => OpenStudio.convert(exhaust_flow_dining,'cfm','m^3/s').get,
248
+ 'space_names' =>
249
+ [
250
+ 'Dining_Flr_5'
251
+ ]
252
+ },
253
+ {
254
+ 'type' => 'Refrigeration',
255
+ 'case_type' => 'Walkin Freezer',
256
+ 'cooling_capacity_per_length' => 734,
257
+ 'length' => 10.98,
258
+ 'evaporator_fan_pwr_per_length' => 69,
259
+ 'lighting_per_length' => 33,
260
+ 'lighting_sch_name' => 'Hospital BLDG_LIGHT_SCH',
261
+ 'defrost_pwr_per_length' => 364,
262
+ 'restocking_sch_name' => 'Hospital Kitchen_Flr_5_Case:1_WALKINFREEZER_WalkInStockingSched',
263
+ 'cop' => 1.5,
264
+ 'cop_f_of_t_curve_name' => 'RACK1_RackCOPfTCurve',
265
+ 'condenser_fan_pwr' => 1000,
266
+ 'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
267
+ 'space_names' =>
268
+ [
269
+ 'Kitchen_Flr_5'
270
+ ]
271
+ },
272
+ {
273
+ 'type' => 'Refrigeration',
274
+ 'case_type' => 'Display Case',
275
+ 'cooling_capacity_per_length' => 886.5,
276
+ 'length' => 8.93,
277
+ 'evaporator_fan_pwr_per_length' => 67,
278
+ 'lighting_per_length' => 40,
279
+ 'lighting_sch_name' => 'Hospital BLDG_LIGHT_SCH',
280
+ 'defrost_pwr_per_length' => 0.0,
281
+ 'restocking_sch_name' => 'Hospital Kitchen_Flr_5_Case:2_SELFCONTAINEDDISPLAYCASE_CaseStockingSched',
282
+ 'cop' => 3.0,
283
+ 'cop_f_of_t_curve_name' => 'RACK2_RackCOPfTCurve',
284
+ 'condenser_fan_pwr' => 1000,
285
+ 'condenser_fan_pwr_curve_name' => 'RACK1_RackCondFanCurve2',
286
+ 'space_names' =>
287
+ [
288
+ 'Kitchen_Flr_5'
289
+ ]
125
290
  }
126
- ]
127
- return system_to_space_map
291
+ ]
292
+ return system_to_space_map
293
+ end
128
294
  end
129
-
295
+
130
296
  def define_space_multiplier
131
- # This map define the multipliers for spaces with multipliers not equals to 1
297
+
132
298
  space_multiplier_map = {
133
299
  'ER_Exam1_Mult4_Flr_1' => 4,
134
300
  'ER_Exam3_Mult4_Flr_1' => 4,
@@ -137,47 +303,183 @@ class OpenStudio::Model::Model
137
303
  'OR2_Mult5_Flr_2' => 5,
138
304
  'IC_PatRoom1_Mult5_Flr_2' => 5,
139
305
  'IC_PatRoom3_Mult6_Flr_2' => 6,
140
- 'PatRoom1_Mult10_Flr_3' => 10,
141
- 'PatRoom3_Mult10_Flr_3' => 10,
142
- 'PatRoom5_Mult10_Flr_3' => 10,
143
- 'PatRoom7_Mult10_Flr_3' => 10,
144
- 'PatRoom1_Mult10_Flr_4' => 10,
145
- 'PatRoom3_Mult10_Flr_4' => 10,
146
- 'PatRoom5_Mult10_Flr_4' => 10,
147
- 'PatRoom7_Mult10_Flr_4' => 10,
148
- 'Office2_Mult5_Flr_5' => 5,
149
- 'Office4_Mult6_Flr_5' => 6
306
+ 'PatRoom1_Mult10_Flr_3' => 10,
307
+ 'PatRoom3_Mult10_Flr_3' => 10,
308
+ 'PatRoom5_Mult10_Flr_3' => 10,
309
+ 'PatRoom7_Mult10_Flr_3' => 10,
310
+ 'PatRoom1_Mult10_Flr_4' => 10,
311
+ 'PatRoom3_Mult10_Flr_4' => 10,
312
+ 'PatRoom5_Mult10_Flr_4' => 10,
313
+ 'PatRoom7_Mult10_Flr_4' => 10,
314
+ 'Office2_Mult5_Flr_5' => 5,
315
+ 'Office4_Mult6_Flr_5' => 6
150
316
  }
151
317
  return space_multiplier_map
152
318
  end
153
-
154
-
155
-
319
+
320
+
156
321
  def custom_hvac_tweaks(building_type, building_vintage, climate_zone, prototype_input)
157
-
322
+
323
+ OpenStudio::logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding HVAC')
324
+
325
+ system_to_space_map = define_hvac_system_map(building_type, building_vintage, climate_zone)
326
+
327
+ hot_water_loop = nil
328
+ self.getPlantLoops.each do |loop|
329
+ # If it has a boiler:hotwater, it is the correct loop
330
+ if loop.supplyComponents('OS:Boiler:HotWater'.to_IddObjectType).size > 0
331
+ hot_water_loop = loop
332
+ end
333
+ end
334
+ if hot_water_loop
335
+ case building_vintage
336
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
337
+ space_names = ['ER_Exam3_Mult4_Flr_1','OR2_Mult5_Flr_2','ICU_Flr_2','PatRoom5_Mult10_Flr_4','Lab_Flr_3']
338
+ space_names.each do |space_name|
339
+ self.add_humidifier(space_name, building_vintage, hot_water_loop)
340
+ end
341
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
342
+ space_names = ['ER_Exam3_Mult4_Flr_1','OR2_Mult5_Flr_2']
343
+ space_names.each do |space_name|
344
+ self.add_humidifier(space_name, building_vintage, hot_water_loop)
345
+ end
346
+ end
347
+ else
348
+ OpenStudio::logFree(OpenStudio::Warn, 'openstudio.model.Model', 'Could not find hot water loop to attach humidifier to.')
349
+ end
350
+
351
+ self.reset_kitchen_OA(building_vintage)
352
+ self.update_exhaust_fan_efficiency(building_vintage)
353
+ self.reset_or_room_vav_minimum_damper(prototype_input, building_vintage)
354
+
158
355
  return true
159
-
160
356
  end
161
-
357
+
162
358
  def update_waterheater_loss_coefficient(building_vintage)
163
359
  case building_vintage
164
360
  when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
165
361
  self.getWaterHeaterMixeds.sort.each do |water_heater|
166
- water_heater.setOffCycleLossCoefficienttoAmbientTemperature(0.798542707)
167
- water_heater.setOnCycleLossCoefficienttoAmbientTemperature(0.798542707)
362
+ if water_heater.name.to_s.include?("Booster")
363
+ water_heater.setOffCycleLossCoefficienttoAmbientTemperature(1.053159296)
364
+ water_heater.setOnCycleLossCoefficienttoAmbientTemperature(1.053159296)
365
+ else
366
+ water_heater.setOffCycleLossCoefficienttoAmbientTemperature(15.60100708)
367
+ water_heater.setOnCycleLossCoefficienttoAmbientTemperature(15.60100708)
368
+ end
168
369
  end
169
- end
170
- end
171
-
370
+ end
371
+ end
372
+
172
373
  def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
173
-
374
+
174
375
  self.update_waterheater_loss_coefficient(building_vintage)
175
-
176
376
  return true
177
-
377
+
178
378
  end
179
379
 
180
- end
181
-
380
+ def reset_kitchen_OA(building_vintage)
381
+ space_kitchen = self.getSpaceByName('Kitchen_Flr_5').get
382
+ ventilation = space_kitchen.designSpecificationOutdoorAir.get
383
+ ventilation.setOutdoorAirFlowperPerson(0)
384
+ ventilation.setOutdoorAirFlowperFloorArea(0)
385
+ case building_vintage
386
+ when '90.1-2010', '90.1-2013'
387
+ ventilation.setOutdoorAirFlowRate(3.398)
388
+ when '90.1-2004', '90.1-2007', 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
389
+ ventilation.setOutdoorAirFlowRate(3.776)
390
+ end
391
+ end
392
+
393
+ def update_exhaust_fan_efficiency(building_vintage)
394
+ case building_vintage
395
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
396
+ self.getFanZoneExhausts.sort.each do |exhaust_fan|
397
+ exhaust_fan.setFanEfficiency(0.16)
398
+ exhaust_fan.setPressureRise(125)
399
+ end
400
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
401
+ self.getFanZoneExhausts.sort.each do |exhaust_fan|
402
+ exhaust_fan.setFanEfficiency(0.338)
403
+ exhaust_fan.setPressureRise(125)
404
+ end
405
+ end
406
+ end
407
+
408
+ def add_humidifier(space_name, building_vintage, hot_water_loop)
409
+ space = self.getSpaceByName(space_name).get
410
+ zone = space.thermalZone.get
411
+ humidistat = OpenStudio::Model::ZoneControlHumidistat.new(self)
412
+ humidistat.setHumidifyingRelativeHumiditySetpointSchedule(self.add_schedule('Hospital MinRelHumSetSch'))
413
+ humidistat.setDehumidifyingRelativeHumiditySetpointSchedule(self.add_schedule('Hospital MaxRelHumSetSch'))
414
+ zone.setZoneControlHumidistat(humidistat)
415
+
416
+ self.getAirLoopHVACs.each do |air_loop|
417
+ if air_loop.thermalZones.include? zone
418
+ humidifier = OpenStudio::Model::HumidifierSteamElectric.new(self)
419
+ humidifier.setRatedCapacity(3.72E-5)
420
+ humidifier.setRatedPower(100000)
421
+ humidifier.setName("#{air_loop.name.get} Electric Steam Humidifier")
422
+ # get the water heating coil and add humidifier to the outlet of heating coil (right before fan)
423
+ htg_coil = nil
424
+ air_loop.supplyComponents.each do |equip|
425
+ if equip.to_CoilHeatingWater.is_initialized
426
+ htg_coil = equip.to_CoilHeatingWater.get
427
+ end
428
+ end
429
+ heating_coil_outlet_node = htg_coil.airOutletModelObject().get.to_Node.get
430
+ supply_outlet_node = air_loop.supplyOutletNode
431
+ humidifier.addToNode(heating_coil_outlet_node)
432
+ humidity_spm = OpenStudio::Model::SetpointManagerSingleZoneHumidityMinimum.new(self)
433
+ case building_vintage
434
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
435
+ extra_elec_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(self,self.alwaysOnDiscreteSchedule)
436
+ extra_elec_htg_coil.setName("#{space_name} Electric Htg Coil")
437
+ extra_water_htg_coil = OpenStudio::Model::CoilHeatingWater.new(self,self.alwaysOnDiscreteSchedule)
438
+ extra_water_htg_coil.setName("#{space_name} Water Htg Coil")
439
+ hot_water_loop.addDemandBranchForComponent(extra_water_htg_coil)
440
+ extra_elec_htg_coil.addToNode(supply_outlet_node)
441
+ extra_water_htg_coil.addToNode(supply_outlet_node)
442
+ end
443
+ # humidity_spm.addToNode(supply_outlet_node)
444
+ humidity_spm.addToNode(humidifier.outletModelObject().get.to_Node.get)
445
+ humidity_spm.setControlZone(zone)
446
+ end
447
+ end
448
+ end
449
+
450
+ def hospital_add_daylighting_controls(building_vintage)
451
+ space_names = ['Office1_Flr_5','Office3_Flr_5','Lobby_Records_Flr_1']
452
+ space_names.each do |space_name|
453
+ space = self.getSpaceByName(space_name).get
454
+ space.addDaylightingControls(building_vintage, false, false)
455
+ end
456
+ end
182
457
 
458
+ def reset_or_room_vav_minimum_damper(prototype_input, building_vintage)
459
+ case building_vintage
460
+ when '90.1-2004', '90.1-2007'
461
+ return true
462
+ when '90.1-2010', '90.1-2013'
463
+ self.getAirTerminalSingleDuctVAVReheats.sort.each do |airterminal|
464
+ airterminal_name = airterminal.name.get
465
+ if airterminal_name.include? "OR1" or airterminal_name.include? "OR2" or airterminal_name.include? "OR3" or airterminal_name.include? "OR4"
466
+ airterminal.setZoneMinimumAirFlowMethod('Scheduled')
467
+ airterminal.setMinimumAirFlowFractionSchedule(add_schedule("Hospital OR_MinSA_Sched"))
468
+ end
469
+ end
470
+ end
471
+ end
472
+
473
+ def modify_hospital_OAcontroller(building_vintage)
474
+ self.getAirLoopHVACs.each do |air_loop|
475
+ oa_sys = air_loop.airLoopHVACOutdoorAirSystem.get
476
+ oa_control = oa_sys.getControllerOutdoorAir
477
+ case air_loop.name.get
478
+ when 'VAV_ER', 'VAV_ICU', 'VAV_LABS', 'VAV_OR', 'VAV_PATRMS', 'CAV_1', 'CAV_2'
479
+ oa_control.setEconomizerControlType('NoEconomizer')
480
+ end
481
+ end
482
+ end
483
+
484
+ end
183
485