openstudio-standards 0.1.3 → 0.1.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (59) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards_chillers.json +5 -5
  4. data/data/standards/OpenStudio_Standards_construction_sets.json +2 -2
  5. data/data/standards/OpenStudio_Standards_curve_cubics.json +12 -0
  6. data/data/standards/OpenStudio_Standards_heat_pumps.json +2126 -72
  7. data/data/standards/OpenStudio_Standards_heat_pumps_heating.json +766 -14
  8. data/data/standards/OpenStudio_Standards_heat_rejection.json +172 -0
  9. data/data/standards/OpenStudio_Standards_prototype_inputs.json +355 -267
  10. data/data/standards/OpenStudio_Standards_schedules.json +262 -10
  11. data/data/standards/OpenStudio_Standards_space_types.json +1466 -794
  12. data/data/standards/manage_OpenStudio_Standards.rb +19 -21
  13. data/data/weather/weather_info.csv +96 -0
  14. data/lib/openstudio-standards/btap/btap.rb +1 -1
  15. data/lib/openstudio-standards/btap/compliance.rb +135 -40
  16. data/lib/openstudio-standards/btap/envelope.rb +26 -5
  17. data/lib/openstudio-standards/btap/geometry.rb +11 -1
  18. data/lib/openstudio-standards/btap/hvac.rb +489 -56
  19. data/lib/openstudio-standards/btap/simmanager.rb +1 -1
  20. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingDXMultiSpeed.rb +120 -0
  21. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +151 -7
  22. data/lib/openstudio-standards/hvac_sizing/Siz.CoilHeatingGasMultiStage.rb +48 -7
  23. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +14 -12
  24. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -7
  25. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +123 -91
  26. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +130 -45
  27. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +13 -7
  28. data/lib/openstudio-standards/prototypes/Prototype.full_service_restaurant.rb +332 -324
  29. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +401 -99
  30. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +309 -222
  31. data/lib/openstudio-standards/prototypes/Prototype.large_hotel.rb +100 -80
  32. data/lib/openstudio-standards/prototypes/Prototype.large_office.rb +37 -22
  33. data/lib/openstudio-standards/prototypes/Prototype.medium_office.rb +68 -53
  34. data/lib/openstudio-standards/prototypes/Prototype.mid_rise_apartment.rb +109 -88
  35. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +52 -4
  36. data/lib/openstudio-standards/prototypes/Prototype.primary_school.rb +230 -213
  37. data/lib/openstudio-standards/prototypes/Prototype.quick_service_restaurant.rb +225 -218
  38. data/lib/openstudio-standards/prototypes/Prototype.retail_standalone.rb +29 -17
  39. data/lib/openstudio-standards/prototypes/Prototype.retail_stripmall.rb +42 -32
  40. data/lib/openstudio-standards/prototypes/Prototype.secondary_school.rb +331 -314
  41. data/lib/openstudio-standards/prototypes/Prototype.small_hotel.rb +233 -219
  42. data/lib/openstudio-standards/prototypes/Prototype.small_office.rb +40 -32
  43. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +19 -6
  44. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +576 -555
  45. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +3 -1
  46. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +35 -17
  47. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +51 -23
  48. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +255 -0
  49. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +192 -0
  50. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +65 -0
  51. data/lib/openstudio-standards/standards/Standards.Fan.rb +37 -6
  52. data/lib/openstudio-standards/standards/Standards.Model.rb +28 -3
  53. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +3 -1
  54. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +41 -15
  55. data/lib/openstudio-standards/version.rb +1 -1
  56. data/lib/openstudio-standards/weather/Weather.Model.rb +509 -5
  57. data/lib/openstudio-standards/weather/Weather.stat_file.rb +145 -5
  58. metadata +8 -3
  59. data/lib/openstudio-standards/btap/environment.rb +0 -718
@@ -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