openstudio-standards 0.1.0 → 0.1.1

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 (32) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/Geometry.hospital.osm +118 -109
  3. data/data/geometry/Geometry.hospital_original.osm +8947 -0
  4. data/data/geometry/Geometry.large_office_2010.osm +118 -102
  5. data/data/standards/OpenStudio_Standards.xlsx +0 -0
  6. data/data/standards/OpenStudio_Standards_construction_properties.json +1993 -1959
  7. data/data/standards/OpenStudio_Standards_construction_sets.json +18 -18
  8. data/data/standards/OpenStudio_Standards_constructions.json +28 -0
  9. data/data/standards/OpenStudio_Standards_ground_temperatures.json +561 -1071
  10. data/data/standards/OpenStudio_Standards_materials.json +2 -2
  11. data/data/standards/OpenStudio_Standards_prototype_inputs.json +32 -32
  12. data/data/standards/OpenStudio_Standards_schedules.json +435 -20
  13. data/data/standards/OpenStudio_Standards_space_types.json +2005 -614
  14. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilCoolingWaterToAirHeatPumpEquationFit.rb +49 -7
  15. data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingWaterToAirHeatPumpEquationFit.rb +37 -7
  16. data/lib/openstudio-standards/hvac_sizing/HVACSizing.Model.rb +7 -0
  17. data/lib/openstudio-standards/hvac_sizing/HVACSizing.PumpVariableSpeed.rb +1 -1
  18. data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +14 -5
  19. data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +15 -5
  20. data/lib/openstudio-standards/prototypes/Prototype.Model.rb +59 -37
  21. data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +5 -3
  22. data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +86 -26
  23. data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +97 -16
  24. data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +217 -6
  25. data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +48 -1
  26. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +126 -27
  27. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +1 -1
  28. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +14 -1
  29. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +40 -1
  30. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +4 -2
  31. data/lib/openstudio-standards/version.rb +1 -1
  32. metadata +3 -2
@@ -4,7 +4,10 @@ class OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit
4
4
 
5
5
  # Sets all auto-sizeable fields to autosize
6
6
  def autosize
7
- OpenStudio::logFree(OpenStudio::Warn, "openstudio.sizing.CoilCoolingWaterToAirHeatPumpEquationFit", ".autosize not yet implemented for #{self.iddObject.type.valueDescription}.")
7
+ self.autosizeRatedAirFlowRate
8
+ self.autosizeRatedTotalCoolingCapacity
9
+ self.autosizeRatedSensibleCoolingCapacity
10
+ self.autosizeRatedWaterFlowRate
8
11
  end
9
12
 
10
13
  # Takes the values calculated by the EnergyPlus sizing routines
@@ -12,16 +15,55 @@ class OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit
12
15
  # Must have previously completed a run with sql output for this to work.
13
16
  def applySizingValues
14
17
 
15
- OpenStudio::logFree(OpenStudio::Warn, "openstudio.sizing.CoilCoolingWaterToAirHeatPumpEquationFit", ".applySizingValues not yet implemented for #{self.iddObject.type.valueDescription}.")
16
-
18
+ rated_air_flow_rate = self.autosizedRatedAirFlowRate
19
+ if rated_air_flow_rate.is_initialized
20
+ self.setRatedAirFlowRate(rated_air_flow_rate.get)
21
+ end
22
+
23
+ rated_total_cooling_capacity = self.autosizedRatedTotalCoolingCapacity
24
+ if rated_total_cooling_capacity.is_initialized
25
+ self.setRatedTotalCoolingCapacity(rated_total_cooling_capacity.get)
26
+ end
27
+
28
+ rated_sensible_cooling_capacity = self.autosizedRatedSensibleCoolingCapacity
29
+ if rated_sensible_cooling_capacity.is_initialized
30
+ self.setRatedSensibleCoolingCapacity(rated_sensible_cooling_capacity.get)
31
+ end
32
+
33
+ rated_water_flow_rate = self.autosizedRatedWaterFlowRate
34
+ if rated_water_flow_rate.is_initialized
35
+ self.setRatedWaterFlowRate(rated_water_flow_rate.get)
36
+ end
37
+
38
+ end
39
+
40
+ # returns the autosized rated air flow rate as an optional double
41
+ def autosizedRatedAirFlowRate
42
+
43
+ return self.model.getAutosizedValue(self, 'Design Size Rated Air Flow Rate', 'm3/s')
44
+
17
45
  end
18
46
 
19
- # returns the autosized design supply air flow rate as an optional double
20
- # def autosizedDesignSupplyAirFlowRate
47
+ # returns the autosized rated total cooling capacity as an optional double
48
+ def autosizedRatedTotalCoolingCapacity
21
49
 
22
- # return self.model.getAutosizedValue(self, 'Design Supply Air Flow Rate', 'm3/s')
50
+ return self.model.getAutosizedValue(self, 'Design Size Rated Total Cooling Capacity', 'W')
23
51
 
24
- # end
52
+ end
53
+
54
+ # returns the autosized rated sensible cooling capacity as an optional double
55
+ def autosizedRatedSensibleCoolingCapacity
56
+
57
+ return self.model.getAutosizedValue(self, 'Design Size Rated Sensible Cooling Capacity', 'W')
58
+
59
+ end
25
60
 
61
+ # returns the autosized rated water flow rate as an optional double
62
+ def autosizedRatedWaterFlowRate
63
+
64
+ return self.model.getAutosizedValue(self, 'Design Size Rated Water Flow Rate', 'm3/s')
65
+
66
+ end
67
+
26
68
 
27
69
  end
@@ -4,7 +4,9 @@ class OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit
4
4
 
5
5
  # Sets all auto-sizeable fields to autosize
6
6
  def autosize
7
- OpenStudio::logFree(OpenStudio::Warn, "openstudio.sizing.CoilHeatingWaterToAirHeatPumpEquationFit", ".autosize not yet implemented for #{self.iddObject.type.valueDescription}.")
7
+ self.autosizeRatedAirFlowRate
8
+ self.autosizeRatedHeatingCapacity
9
+ self.autosizeRatedWaterFlowRate
8
10
  end
9
11
 
10
12
  # Takes the values calculated by the EnergyPlus sizing routines
@@ -12,16 +14,44 @@ class OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit
12
14
  # Must have previously completed a run with sql output for this to work.
13
15
  def applySizingValues
14
16
 
15
- OpenStudio::logFree(OpenStudio::Warn, "openstudio.sizing.CoilHeatingWaterToAirHeatPumpEquationFit", ".applySizingValues not yet implemented for #{self.iddObject.type.valueDescription}.")
16
-
17
+ rated_air_flow_rate = self.autosizedRatedAirFlowRate
18
+ if rated_air_flow_rate.is_initialized
19
+ self.setRatedAirFlowRate(rated_air_flow_rate.get)
20
+ end
21
+
22
+ rated_total_heating_capacity = self.autosizedRatedHeatingCapacity
23
+ if rated_total_heating_capacity.is_initialized
24
+ self.setRatedTotalHeatingCapacity(rated_total_heating_capacity.get)
25
+ end
26
+
27
+ rated_water_flow_rate = self.autosizedRatedWaterFlowRate
28
+ if rated_water_flow_rate.is_initialized
29
+ self.setRatedWaterFlowRate(rated_water_flow_rate.get)
30
+ end
31
+
32
+ end
33
+
34
+ # returns the autosized rated air flow rate as an optional double
35
+ def autosizedRatedAirFlowRate
36
+
37
+ return self.model.getAutosizedValue(self, 'Design Size Rated Air Flow Rate', 'm3/s')
38
+
17
39
  end
18
40
 
19
- # returns the autosized design supply air flow rate as an optional double
20
- # def autosizedDesignSupplyAirFlowRate
41
+ # returns the autosized rated total Heating capacity as an optional double
42
+ def autosizedRatedHeatingCapacity
21
43
 
22
- # return self.model.getAutosizedValue(self, 'Design Supply Air Flow Rate', 'm3/s')
44
+ return self.model.getAutosizedValue(self, 'Design Size Rated Heating Capacity', 'W')
23
45
 
24
- # end
46
+ end
25
47
 
48
+ # returns the autosized rated water flow rate as an optional double
49
+ def autosizedRatedWaterFlowRate
50
+
51
+ return self.model.getAutosizedValue(self, 'Design Size Rated Water Flow Rate', 'm3/s')
52
+
53
+ end
54
+
26
55
 
27
56
  end
57
+
@@ -24,6 +24,8 @@ class OpenStudio::Model::Model
24
24
  require_relative 'HVACSizing.CoilHeatingGas'
25
25
  require_relative 'HVACSizing.CoilHeatingWater'
26
26
  require_relative 'HVACSizing.CoilHeatingDXSingleSpeed'
27
+ require_relative 'HVACSizing.CoilHeatingWaterToAirHeatPumpEquationFit'
28
+ require_relative 'HVACSizing.CoilCoolingWaterToAirHeatPumpEquationFit'
27
29
  require_relative 'HVACSizing.CoilCoolingDXSingleSpeed'
28
30
  require_relative 'HVACSizing.CoilCoolingDXTwoSpeed'
29
31
  require_relative 'HVACSizing.CoilCoolingWater'
@@ -300,6 +302,11 @@ class OpenStudio::Model::Model
300
302
 
301
303
  object_type = object.iddObject.type.valueDescription.gsub('OS:','')
302
304
 
305
+ # Special logic for two coil types which are inconsistently
306
+ # uppercase in the sqlfile:
307
+ object_type = object_type.upcase if object_type == 'Coil:Cooling:WaterToAirHeatPump:EquationFit'
308
+ object_type = object_type.upcase if object_type == 'Coil:Heating:WaterToAirHeatPump:EquationFit'
309
+
303
310
  sql = self.sqlFile
304
311
 
305
312
  if sql.is_initialized
@@ -51,7 +51,7 @@ class OpenStudio::Model::PumpVariableSpeed
51
51
  col_name = 'Design Power Consumption'
52
52
  end
53
53
 
54
- return self.model.getAutosizedValue(self, col_name, 'm3/s')
54
+ return self.model.getAutosizedValue(self, col_name, 'W')
55
55
 
56
56
  end
57
57
 
@@ -10,15 +10,20 @@ class OpenStudio::Model::AirTerminalSingleDuctVAVReheat
10
10
  # @param zone_oa_per_area [Double] the zone outdoor air per area, m^3/s
11
11
  # @return [Bool] returns true if successful, false if not
12
12
  # @todo remove exception where older vintages don't have minimum positions adjusted.
13
- def set_initial_prototype_damper_position(building_vintage, zone_oa_per_area)
13
+ def set_initial_prototype_damper_position(building_type, building_vintage, zone_oa_per_area)
14
14
 
15
15
  # Minimum damper position is based on prototype
16
16
  # assumptions, which are not clearly documented.
17
17
  min_damper_position = nil
18
+ vav_name = self.name.get
18
19
  case building_vintage
19
- when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004'
20
- min_damper_position = 0.3
21
- when '90.1-2007'
20
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
21
+ if building_type == "Outpatient" and vav_name.include? "Floor 1"
22
+ min_damper_position = 1
23
+ else
24
+ min_damper_position = 0.3
25
+ end
26
+ when '90.1-2004', '90.1-2007'
22
27
  min_damper_position = 0.3
23
28
  when '90.1-2010', '90.1-2013'
24
29
  min_damper_position = 0.2
@@ -34,7 +39,11 @@ class OpenStudio::Model::AirTerminalSingleDuctVAVReheat
34
39
  self.setConstantMinimumAirFlowFraction(min_damper_position)
35
40
  else
36
41
  # High OA zones
37
- self.setConstantMinimumAirFlowFraction(0.7)
42
+ if building_type == "Outpatient"
43
+ self.setConstantMinimumAirFlowFraction(1)
44
+ else
45
+ self.setConstantMinimumAirFlowFraction(0.7)
46
+ end
38
47
  end
39
48
  else
40
49
  # Low OA zones
@@ -37,7 +37,7 @@ class OpenStudio::Model::Model
37
37
  chilled_water_loop = self.getPlantLoopByName('Chilled Water Loop').get
38
38
  else
39
39
  condenser_water_loop = nil
40
- if prototype_input['chiller_condenser_type'] == 'WaterCooled'
40
+ if prototype_input['chiller_cooling_type'] == 'WaterCooled'
41
41
  condenser_water_loop = self.add_cw_loop()
42
42
  end
43
43
 
@@ -115,7 +115,7 @@ class OpenStudio::Model::Model
115
115
  # Special logic to make a heat pump loop if necessary
116
116
  heat_pump_loop = nil
117
117
  if prototype_input['pszac_heating_type'] == 'Water To Air Heat Pump'
118
- heat_pump_loop = add_hp_loop(prototype_input)
118
+ heat_pump_loop = add_hp_loop(building_type)
119
119
  end
120
120
 
121
121
  self.add_psz_ac(building_vintage,
@@ -139,6 +139,8 @@ class OpenStudio::Model::Model
139
139
  hot_water_loop = nil
140
140
  if self.getPlantLoopByName('Hot Water Loop').is_initialized
141
141
  hot_water_loop = self.getPlantLoopByName('Hot Water Loop').get
142
+ elsif building_type == 'MediumOffice'
143
+ hot_water_loop = nil
142
144
  else
143
145
  hot_water_loop = self.add_hw_loop('NaturalGas')
144
146
  end
@@ -149,7 +151,8 @@ class OpenStudio::Model::Model
149
151
  prototype_input['vav_operation_schedule'],
150
152
  prototype_input['vav_oa_damper_schedule'],
151
153
  hot_water_loop,
152
- return_plenum)
154
+ return_plenum,
155
+ building_type)
153
156
 
154
157
  when 'DOAS'
155
158
 
@@ -169,7 +172,7 @@ class OpenStudio::Model::Model
169
172
  chilled_water_loop = self.getPlantLoopByName('Chilled Water Loop').get
170
173
  else
171
174
  condenser_water_loop = nil
172
- if prototype_input['chiller_condenser_type'] == 'WaterCooled'
175
+ if prototype_input['chiller_cooling_type'] == 'WaterCooled'
173
176
  condenser_water_loop = self.add_cw_loop()
174
177
  end
175
178
 
@@ -210,7 +213,7 @@ class OpenStudio::Model::Model
210
213
  if self.getPlantLoopByName('Heat Pump Loop').is_initialized
211
214
  heat_pump_loop = self.getPlantLoopByName('Heat Pump Loop').get
212
215
  else
213
- heat_pump_loop = self.add_hp_loop()
216
+ heat_pump_loop = self.add_hp_loop(building_type)
214
217
  end
215
218
 
216
219
  self.add_data_center_hvac(building_vintage,
@@ -266,6 +269,13 @@ class OpenStudio::Model::Model
266
269
  system['balanced_exhaust_fraction_schedule_name'],
267
270
  thermal_zones)
268
271
 
272
+ when 'Zone Ventilation'
273
+
274
+ self.add_zone_ventilation(system['availability_sch_name'],
275
+ system['flow_rate'],
276
+ system['ventilation_type'],
277
+ thermal_zones)
278
+
269
279
  when 'Refrigeration'
270
280
 
271
281
  self.add_refrigeration(building_vintage,
@@ -23,6 +23,14 @@ class OpenStudio::Model::Model
23
23
  # @example Create a Small Office, 90.1-2010, in ASHRAE Climate Zone 5A (Chicago)
24
24
  # model.create_prototype_building('SmallOffice', '90.1-2010', 'ASHRAE 169-2006-5A')
25
25
  def create_prototype_building(building_type, building_vintage, climate_zone, sizing_run_dir = Dir.pwd, debug = false)
26
+
27
+ # There are no reference models for HighriseApartment at vintages Pre-1980 and 1980-2004. This is a quick check.
28
+ if building_type == "HighriseApartment"
29
+ if building_vintage == 'DOE Ref Pre-1980' or building_vintage == 'DOE Ref 1980-2004'
30
+ OpenStudio::logFree(OpenStudio::Error, 'Not available', "DOE Reference models for #{building_type} at vintage #{building_vintage} are not available, the measure is disabled for this specific type.")
31
+ return false
32
+ end
33
+ end
26
34
 
27
35
  lookup_building_type = self.get_lookup_name(building_type)
28
36
 
@@ -56,8 +64,14 @@ class OpenStudio::Model::Model
56
64
  self.add_occupancy_sensors(building_type, building_vintage, climate_zone)
57
65
  self.add_design_days_and_weather_file(building_type, building_vintage, climate_zone)
58
66
  self.set_sizing_parameters(building_type, building_vintage)
59
- self.yearDescription.get.setDayofWeekforStartDay('Sunday')
60
-
67
+ self.yearDescription.get.setDayofWeekforStartDay('Sunday')
68
+
69
+ # set climate zone and building type
70
+ self.getBuilding.setStandardsBuildingType(building_type)
71
+ if climate_zone.include? 'ASHRAE 169-2006-'
72
+ self.getClimateZones.setClimateZone("ASHRAE",climate_zone.gsub('ASHRAE 169-2006-',''))
73
+ end
74
+
61
75
  # Perform a sizing run
62
76
  if self.runSizingRun("#{sizing_run_dir}/SizingRun1") == false
63
77
  return false
@@ -80,6 +94,14 @@ class OpenStudio::Model::Model
80
94
  # which include sizing the fan pressure rises based
81
95
  # on the flow rate of the system.
82
96
  self.applyPrototypeHVACAssumptions(building_type, building_vintage, climate_zone)
97
+
98
+ # for 90.1-2010 Outpatient, AHU2 set minimum outdoor air flow rate as 0
99
+ # AHU1 doesn't have economizer
100
+ if building_type == "Outpatient"
101
+ self.modify_OAcontroller(building_vintage)
102
+ # For operating room 1&2 in 2010 and 2013, VAV minimum air flow is set by schedule
103
+ self.reset_or_room_vav_minimum_damper(prototype_input, building_vintage)
104
+ end
83
105
 
84
106
  # Apply the HVAC efficiency standard
85
107
  self.applyHVACEfficiencyStandard(building_vintage, climate_zone)
@@ -706,7 +728,7 @@ class OpenStudio::Model::Model
706
728
 
707
729
  # This map define the multipliers for spaces with multipliers not equals to 1
708
730
  case building_type
709
- when 'LargeHotel', 'MidriseApartment','LargeOffice'
731
+ when 'LargeHotel', 'MidriseApartment','LargeOffice','Hospital'
710
732
  space_multiplier_map = self.define_space_multiplier
711
733
  else
712
734
  space_multiplier_map ={}
@@ -949,40 +971,40 @@ class OpenStudio::Model::Model
949
971
  # @todo Consistency - make prototype and reference vintages consistent
950
972
  # @todo Add 90.1-2013?
951
973
  def modify_infiltration_coefficients(building_type, building_vintage, climate_zone)
952
- # Select the terrain type, which
953
- # impacts wind speed, and in turn infiltration
954
- terrain = 'City'
955
- case building_vintage
956
- when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
957
- case building_type
958
- when 'Warehouse'
959
- terrain = 'Urban'
960
- when 'SmallHotel'
961
- terrain = 'Suburbs'
962
- end
963
- end
964
- # Set the terrain type
965
- self.getSite.setTerrain(terrain)
966
-
967
- # modify the infiltration coefficients for 90.1-2004, 90.1-2007, 90.1-2010, 90.1-2013
968
- return true unless building_vintage == '90.1-2004' or building_vintage == '90.1-2007' or building_vintage == '90.1-2010' or building_vintage == '90.1-2013'
969
-
970
- # The pre-1980 and 1980-2004 buildings have this:
971
- # 1.0000, !- Constant Term Coefficient
972
- # 0.0000, !- Temperature Term Coefficient
973
- # 0.0000, !- Velocity Term Coefficient
974
- # 0.0000; !- Velocity Squared Term Coefficient
975
- # The 90.1-2010 buildings have this:
976
- # 0.0000, !- Constant Term Coefficient
977
- # 0.0000, !- Temperature Term Coefficient
978
- # 0.224, !- Velocity Term Coefficient
979
- # 0.0000; !- Velocity Squared Term Coefficient
980
- self.getSpaceInfiltrationDesignFlowRates.each do |infiltration|
981
- infiltration.setConstantTermCoefficient(0.0)
982
- infiltration.setTemperatureTermCoefficient(0.0)
983
- infiltration.setVelocityTermCoefficient(0.224)
984
- infiltration.setVelocitySquaredTermCoefficient(0.0)
974
+ # Select the terrain type, which
975
+ # impacts wind speed, and in turn infiltration
976
+ terrain = 'City'
977
+ case building_vintage
978
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
979
+ case building_type
980
+ when 'Warehouse'
981
+ terrain = 'Urban'
982
+ when 'SmallHotel'
983
+ terrain = 'Suburbs'
984
+ end
985
985
  end
986
+ # Set the terrain type
987
+ self.getSite.setTerrain(terrain)
988
+
989
+ # modify the infiltration coefficients for 90.1-2004, 90.1-2007, 90.1-2010, 90.1-2013
990
+ return true unless building_vintage == '90.1-2004' or building_vintage == '90.1-2007' or building_vintage == '90.1-2010' or building_vintage == '90.1-2013'
991
+
992
+ # The pre-1980 and 1980-2004 buildings have this:
993
+ # 1.0000, !- Constant Term Coefficient
994
+ # 0.0000, !- Temperature Term Coefficient
995
+ # 0.0000, !- Velocity Term Coefficient
996
+ # 0.0000; !- Velocity Squared Term Coefficient
997
+ # The 90.1-2010 buildings have this:
998
+ # 0.0000, !- Constant Term Coefficient
999
+ # 0.0000, !- Temperature Term Coefficient
1000
+ # 0.224, !- Velocity Term Coefficient
1001
+ # 0.0000; !- Velocity Squared Term Coefficient
1002
+ self.getSpaceInfiltrationDesignFlowRates.each do |infiltration|
1003
+ infiltration.setConstantTermCoefficient(0.0)
1004
+ infiltration.setTemperatureTermCoefficient(0.0)
1005
+ infiltration.setVelocityTermCoefficient(0.224)
1006
+ infiltration.setVelocitySquaredTermCoefficient(0.0)
1007
+ end
986
1008
  end
987
1009
 
988
1010
  # Sets the inside and outside convection algorithms for different vintages
@@ -1021,7 +1043,7 @@ self.getSite.setTerrain(terrain)
1021
1043
  case building_vintage
1022
1044
  when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004'
1023
1045
  case building_type
1024
- when 'PrimarySchool', 'SecondarySchool'
1046
+ when 'PrimarySchool', 'SecondarySchool', 'Outpatient'
1025
1047
  clg = 1.5
1026
1048
  htg = 1.5
1027
1049
  when 'LargeHotel'
@@ -78,7 +78,8 @@ class OpenStudio::Model::Model
78
78
  building_type)
79
79
 
80
80
  end
81
-
81
+
82
+ =begin
82
83
  elsif building_type == 'LargeHotel'
83
84
 
84
85
  # Add water use equipment to each space
@@ -170,6 +171,7 @@ class OpenStudio::Model::Model
170
171
  space_name,
171
172
  building_type)
172
173
  end
174
+ =end
173
175
 
174
176
  elsif prototype_input['main_service_water_peak_flowrate']
175
177
 
@@ -190,7 +192,7 @@ class OpenStudio::Model::Model
190
192
  space_type_map.each do |space_type_name, space_names|
191
193
  search_criteria = {
192
194
  'template' => building_vintage,
193
- 'building_type' => building_type,
195
+ 'building_type' => get_lookup_name(building_type),
194
196
  'space_type' => space_type_name
195
197
  }
196
198
  data = find_object($os_standards['space_types'],search_criteria)
@@ -205,7 +207,7 @@ class OpenStudio::Model::Model
205
207
  space_names.each do |space_name|
206
208
  space = self.getSpaceByName(space_name).get
207
209
  space_multiplier = space.multiplier
208
- self.add_swh_end_uses_by_space(building_type,
210
+ self.add_swh_end_uses_by_space(get_lookup_name(building_type),
209
211
  building_vintage,
210
212
  climate_zone,
211
213
  main_swh_loop,
@@ -25,7 +25,7 @@ class OpenStudio::Model::Model
25
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
26
  'PatRoom6_Flr_4', 'PatRoom7_Mult10_Flr_4', 'PatRoom8_Flr_4', ],
27
27
  'PhysTherapy' => ['PhysTherapy_Flr_3', ],
28
- 'Radiology' => ['Radiology_Flr_4', ]
28
+ 'Radiology' => ['Radiology_Flr_4', ] # total number of zones: 55 - equals to the IDF
29
29
  }
30
30
  return space_type_map
31
31
  end
@@ -83,41 +83,101 @@ class OpenStudio::Model::Model
83
83
  'type' => 'CAV',
84
84
  'space_names' => [
85
85
  'Kitchen_Flr_5'
86
- ]
87
- }
86
+ ] # 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
+ },
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
+ ]
125
+ }
88
126
  ]
89
127
  return system_to_space_map
90
128
  end
91
-
129
+
130
+ def define_space_multiplier
131
+ # This map define the multipliers for spaces with multipliers not equals to 1
132
+ space_multiplier_map = {
133
+ 'ER_Exam1_Mult4_Flr_1' => 4,
134
+ 'ER_Exam3_Mult4_Flr_1' => 4,
135
+ 'ER_Triage_Mult4_Flr_1' => 4,
136
+ 'Office1_Mult4_Flr_1' => 5,
137
+ 'OR2_Mult5_Flr_2' => 5,
138
+ 'IC_PatRoom1_Mult5_Flr_2' => 5,
139
+ '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
150
+ }
151
+ return space_multiplier_map
152
+ end
153
+
154
+
155
+
92
156
  def custom_hvac_tweaks(building_type, building_vintage, climate_zone, prototype_input)
93
157
 
94
158
  return true
95
159
 
96
160
  end
97
-
98
- def add_swh(building_type, building_vintage, climate_zone, prototype_input, hvac_standards)
99
-
100
- OpenStudio::logFree(OpenStudio::Info, "openstudio.model.Model", "Started Adding SWH")
101
-
102
- main_swh_loop = self.add_swh_loop(prototype_input, hvac_standards, 'main')
103
- water_heaters = main_swh_loop.supplyComponents(OpenStudio::Model::WaterHeaterMixed::iddObjectType)
104
-
105
- water_heaters.each do |water_heater|
106
- water_heater = water_heater.to_WaterHeaterMixed.get
107
- # water_heater.setAmbientTemperatureIndicator('Zone')
108
- # water_heater.setAmbientTemperatureThermalZone(default_water_heater_ambient_temp_sch)
109
- water_heater.setOffCycleParasiticFuelConsumptionRate(720)
110
- water_heater.setOnCycleParasiticFuelConsumptionRate(720)
111
- water_heater.setOffCycleLossCoefficienttoAmbientTemperature(7.561562668)
112
- water_heater.setOnCycleLossCoefficienttoAmbientTemperature(7.561562668)
113
- end
114
-
115
- self.add_swh_end_uses(prototype_input, hvac_standards, main_swh_loop, 'main')
116
-
117
- OpenStudio::logFree(OpenStudio::Info, "openstudio.model.Model", "Finished adding SWH")
161
+
162
+ def update_waterheater_loss_coefficient(building_vintage)
163
+ case building_vintage
164
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
165
+ self.getWaterHeaterMixeds.sort.each do |water_heater|
166
+ water_heater.setOffCycleLossCoefficienttoAmbientTemperature(0.798542707)
167
+ water_heater.setOnCycleLossCoefficienttoAmbientTemperature(0.798542707)
168
+ end
169
+ end
170
+ end
171
+
172
+ def custom_swh_tweaks(building_type, building_vintage, climate_zone, prototype_input)
118
173
 
174
+ self.update_waterheater_loss_coefficient(building_vintage)
175
+
119
176
  return true
120
177
 
121
- end #add swh
178
+ end
122
179
 
123
180
  end
181
+
182
+
183
+