openstudio-standards 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
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
+