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.
- checksums.yaml +4 -4
- data/data/geometry/Geometry.hospital.osm +118 -109
- data/data/geometry/Geometry.hospital_original.osm +8947 -0
- data/data/geometry/Geometry.large_office_2010.osm +118 -102
- data/data/standards/OpenStudio_Standards.xlsx +0 -0
- data/data/standards/OpenStudio_Standards_construction_properties.json +1993 -1959
- data/data/standards/OpenStudio_Standards_construction_sets.json +18 -18
- data/data/standards/OpenStudio_Standards_constructions.json +28 -0
- data/data/standards/OpenStudio_Standards_ground_temperatures.json +561 -1071
- data/data/standards/OpenStudio_Standards_materials.json +2 -2
- data/data/standards/OpenStudio_Standards_prototype_inputs.json +32 -32
- data/data/standards/OpenStudio_Standards_schedules.json +435 -20
- data/data/standards/OpenStudio_Standards_space_types.json +2005 -614
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilCoolingWaterToAirHeatPumpEquationFit.rb +49 -7
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingWaterToAirHeatPumpEquationFit.rb +37 -7
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.Model.rb +7 -0
- data/lib/openstudio-standards/hvac_sizing/HVACSizing.PumpVariableSpeed.rb +1 -1
- data/lib/openstudio-standards/prototypes/Prototype.AirTerminalSingleDuctVAVReheat.rb +14 -5
- data/lib/openstudio-standards/prototypes/Prototype.Model.hvac.rb +15 -5
- data/lib/openstudio-standards/prototypes/Prototype.Model.rb +59 -37
- data/lib/openstudio-standards/prototypes/Prototype.Model.swh.rb +5 -3
- data/lib/openstudio-standards/prototypes/Prototype.hospital.rb +86 -26
- data/lib/openstudio-standards/prototypes/Prototype.hvac_systems.rb +97 -16
- data/lib/openstudio-standards/prototypes/Prototype.outpatient.rb +217 -6
- data/lib/openstudio-standards/prototypes/Prototype.warehouse.rb +48 -1
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +126 -27
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +14 -1
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +40 -1
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +4 -2
- data/lib/openstudio-standards/version.rb +1 -1
- metadata +3 -2
data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilCoolingWaterToAirHeatPumpEquationFit.rb
CHANGED
@@ -4,7 +4,10 @@ class OpenStudio::Model::CoilCoolingWaterToAirHeatPumpEquationFit
|
|
4
4
|
|
5
5
|
# Sets all auto-sizeable fields to autosize
|
6
6
|
def autosize
|
7
|
-
|
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
|
-
|
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
|
20
|
-
|
47
|
+
# returns the autosized rated total cooling capacity as an optional double
|
48
|
+
def autosizedRatedTotalCoolingCapacity
|
21
49
|
|
22
|
-
|
50
|
+
return self.model.getAutosizedValue(self, 'Design Size Rated Total Cooling Capacity', 'W')
|
23
51
|
|
24
|
-
|
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
|
data/lib/openstudio-standards/hvac_sizing/HVACSizing.CoilHeatingWaterToAirHeatPumpEquationFit.rb
CHANGED
@@ -4,7 +4,9 @@ class OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit
|
|
4
4
|
|
5
5
|
# Sets all auto-sizeable fields to autosize
|
6
6
|
def autosize
|
7
|
-
|
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
|
-
|
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
|
20
|
-
|
41
|
+
# returns the autosized rated total Heating capacity as an optional double
|
42
|
+
def autosizedRatedHeatingCapacity
|
21
43
|
|
22
|
-
|
44
|
+
return self.model.getAutosizedValue(self, 'Design Size Rated Heating Capacity', 'W')
|
23
45
|
|
24
|
-
|
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
|
@@ -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'
|
20
|
-
|
21
|
-
|
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
|
-
|
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['
|
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(
|
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['
|
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
|
-
|
953
|
-
|
954
|
-
|
955
|
-
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
-
|
960
|
-
|
961
|
-
|
962
|
-
|
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
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
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
|
178
|
+
end
|
122
179
|
|
123
180
|
end
|
181
|
+
|
182
|
+
|
183
|
+
|