openstudio-standards 0.2.12.rc4 → 0.2.12.rc5

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
  3. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  4. data/data/standards/test_performance_expected_dd_results.csv +950 -950
  5. data/lib/openstudio-standards.rb +8 -1
  6. data/lib/openstudio-standards/btap/btap.model.rb +1 -1
  7. data/lib/openstudio-standards/btap/economics.rb +14 -11
  8. data/lib/openstudio-standards/btap/envelope.rb +185 -257
  9. data/lib/openstudio-standards/btap/fileio.rb +1 -0
  10. data/lib/openstudio-standards/btap/geometry.rb +21 -1
  11. data/lib/openstudio-standards/btap/measures.rb +12 -11
  12. data/lib/openstudio-standards/btap/schedules.rb +3 -12
  13. data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +178 -0
  14. data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +8 -8
  15. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +3 -0
  16. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +3 -3
  17. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +25 -23
  18. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +91 -0
  19. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +20 -2
  20. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +39 -0
  21. data/lib/openstudio-standards/standards/Standards.Model.rb +29 -0
  22. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +37 -4
  23. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +15 -15
  24. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +15 -15
  25. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +5 -5
  26. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +15 -15
  27. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +5963 -2723
  28. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +5917 -2697
  29. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +2011 -1112
  30. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +1946 -1106
  31. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +2 -18
  32. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +1677 -1005
  33. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +64 -13
  34. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +31 -19
  35. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/curves.json +75 -0
  36. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -16
  37. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +1677 -1005
  38. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +29 -0
  39. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +913 -0
  40. data/lib/openstudio-standards/standards/necb/ECMS/data/equip_eff_lim.json +52 -0
  41. data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +105 -0
  42. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +23 -0
  43. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +803 -0
  44. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +787 -0
  45. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +29 -0
  46. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +87 -0
  47. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +22 -0
  48. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1593 -0
  49. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +68 -33
  50. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +24 -13
  51. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +104 -99
  52. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +24 -24
  53. data/lib/openstudio-standards/standards/necb/NECB2011/data/curves.json +50 -0
  54. data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +31 -0
  55. data/lib/openstudio-standards/standards/necb/NECB2011/data/led_lighting_data.json +2028 -0
  56. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1745 -1297
  57. data/lib/openstudio-standards/standards/necb/NECB2011/daylighting_control.md +70 -0
  58. data/lib/openstudio-standards/standards/necb/NECB2011/demand_controlled_ventilation.md +46 -0
  59. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +69 -107
  60. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +24 -1
  61. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +139 -141
  62. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -0
  63. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +344 -234
  64. data/lib/openstudio-standards/standards/necb/NECB2011/led_lighting.md +51 -0
  65. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +57 -9
  66. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +1060 -34
  67. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +9 -1
  68. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
  69. data/lib/openstudio-standards/standards/necb/NECB2015/data/led_lighting_data.json +2883 -0
  70. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +2554 -1916
  71. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +32 -1
  72. data/lib/openstudio-standards/standards/necb/NECB2017/data/led_lighting_data.json +2883 -0
  73. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +2554 -1916
  74. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +29 -0
  75. data/lib/openstudio-standards/version.rb +1 -1
  76. metadata +21 -2
@@ -807,6 +807,7 @@ module BTAP
807
807
  next if field_name.include?('Cooling Control Zone or Zone List Name')
808
808
  next if field_name.include?('Heating Control Zone or Zone List Name')
809
809
  next if field_name.include?('Heating Zone Fans Only Zone or Zone List Name')
810
+ next if field_name.include?('Zone Terminal Unit List')
810
811
 
811
812
  # Don't compare the names of schedule type limits
812
813
  # because they appear to be created non-deteministically
@@ -2176,6 +2176,26 @@ module BTAP
2176
2176
  end
2177
2177
 
2178
2178
 
2179
+ def self.rotate_building(model: , degrees: nil)
2180
+
2181
+ # report as not applicable if effective relative rotation is 0
2182
+ if degrees == 0 || degrees.nil?
2183
+ puts ('The requested rotation was 0 or nil degrees. The model was not rotated.')
2184
+ return
2185
+ end
2186
+
2187
+ # check the relative_building_rotation for reasonableness
2188
+ degrees -= 360.0 * (degrees / 360.0).truncate if (degrees > 360) || (degrees < -360)
2189
+
2190
+ # reporting initial condition of model
2191
+ building = model.getBuilding
2192
+ # rotate the building
2193
+ final_building_angle = building.setNorthAxis(building.northAxis + degrees)
2194
+ end
2195
+
2196
+
2197
+
2198
+
2179
2199
  module BuildingStoreys
2180
2200
 
2181
2201
  #This method will delete any exisiting stories and then try to assign stories based on
@@ -2824,7 +2844,7 @@ module BTAP
2824
2844
  #a bit of acrobatics to get the construction object from the ConstrustionBase object's name.
2825
2845
  construction = OpenStudio::Model::getConstructionByName(surface.model, surface.construction.get.name.to_s).get
2826
2846
  #create a new construction with the requested RSI value based on the current construction.
2827
- return BTAP::Resources::Envelope::Constructions::get_shgc(model,construction)
2847
+ return BTAP::Resources::Envelope::Constructions::get_shgc(surface.model,construction)
2828
2848
  end
2829
2849
 
2830
2850
  #This method gets the tvis for the surface
@@ -716,17 +716,18 @@ module BTAP
716
716
 
717
717
  new_construction_set =vintage_construction_set.clone(model).to_DefaultConstructionSet.get
718
718
  #Set conductances to needed values in construction set if possible.
719
- BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!( model, "#{@default_construction_set}-modified",new_construction_set,
720
- @ext_wall_rsi, @ext_floor_rsi, @ext_roof_rsi,
721
- @ground_wall_rsi, @ground_floor_rsi, @ground_roof_rsi,
722
- @fixed_window_rsi, @fixed_wind_solar_trans, @fixed_wind_vis_trans,
723
- @operable_window_rsi, @operable_wind_solar_trans, @operable_wind_vis_trans,
724
- @door_construction_rsi,
725
- @glass_door_rsi, @glass_door_solar_trans, @glass_door_vis_trans,
726
- @overhead_door_rsi,
727
- @skylight_rsi, @skylight_solar_trans, @skylight_vis_trans,
728
- @tubular_daylight_dome_rsi, @tubular_daylight_dome_solar_trans, @tubular_daylight_dome_vis_trans,
729
- @tubular_daylight_diffuser_rsi, @tubular_daylight_diffuser_solar_trans, @tubular_daylight_diffuser_vis_trans
719
+ BTAP::Resources::Envelope::ConstructionSets::customize_default_surface_construction_set_rsi!(
720
+ model: model, name: "#{@default_construction_set}-modified",default_surface_construction_set: new_construction_set,
721
+ ext_wall_rsi: @ext_wall_rsi, ext_floor_rsi: @ext_floor_rsi, ext_roof_rsi: @ext_roof_rsi,
722
+ ground_wall_rsi: @ground_wall_rsi, ground_floor_rsi: @ground_floor_rsi, ground_roof_rsi: @ground_roof_rsi,
723
+ fixed_window_rsi: @fixed_window_rsi, fixed_wind_solar_trans: @fixed_wind_solar_trans, fixed_wind_vis_trans: @fixed_wind_vis_trans,
724
+ operable_window_rsi: @operable_window_rsi, operable_wind_solar_trans: @operable_wind_solar_trans, operable_wind_vis_trans: @operable_wind_vis_trans,
725
+ door_construction_rsi: @door_construction_rsi,
726
+ glass_door_rsi: @glass_door_rsi, glass_door_solar_trans: @glass_door_solar_trans, glass_door_vis_trans: @glass_door_vis_trans,
727
+ overhead_door_rsi: @overhead_door_rsi,
728
+ skylight_rsi: @skylight_rsi, skylight_solar_trans: @skylight_solar_trans, skylight_vis_trans: @skylight_vis_trans,
729
+ tubular_daylight_dome_rsi: @tubular_daylight_dome_rsi, tubular_daylight_dome_solar_trans: @tubular_daylight_dome_solar_trans, tubular_daylight_dome_vis_trans: @tubular_daylight_dome_vis_trans,
730
+ tubular_daylight_diffuser_rsi: @tubular_daylight_diffuser_rsi, tubular_daylight_diffuser_solar_trans: @tubular_daylight_diffuser_solar_trans, tubular_daylight_diffuser_vis_trans: @tubular_daylight_diffuser_vis_trans
730
731
  )
731
732
 
732
733
 
@@ -747,12 +747,15 @@ module BTAP
747
747
  end
748
748
  return ruleset
749
749
  end
750
+
750
751
  def self.create_annual_fraction_ruleset_schedule(model,name,hourArrayValues)
751
752
  self.create_annual_ruleset_schedule(model,name,"FRACTION",hourArrayValues)
752
753
  end
754
+
753
755
  def self.create_annual_on_off_ruleset_schedule(model,name,hourArrayValues)
754
756
  self.create_annual_ruleset_schedule(model,name,"ON_OFF",hourArrayValues)
755
757
  end
758
+
756
759
  def self.create_annual_temperature_ruleset_schedule(model,name,hourArrayValues)
757
760
  self.create_annual_ruleset_schedule(model,name,"TEMPERATURE",hourArrayValues)
758
761
  end
@@ -858,18 +861,6 @@ module BTAP
858
861
  # return ruleset
859
862
  # end
860
863
 
861
- def self.create_annual_fraction_ruleset_schedule(model,name,hourArrayValues)
862
- self.create_annual_ruleset_schedule(model,name,"FRACTION",hourArrayValues)
863
- end
864
-
865
- def self.create_annual_on_off_ruleset_schedule(model,name,hourArrayValues)
866
- self.create_annual_ruleset_schedule(model,name,"ON_OFF",hourArrayValues)
867
- end
868
-
869
- def self.create_annual_temperature_ruleset_schedule(model,name,hourArrayValues)
870
- self.create_annual_ruleset_schedule(model,name,"TEMPERATURE",hourArrayValues)
871
- end
872
-
873
864
 
874
865
 
875
866
  # This method creates a new dual setpoint schedule using pre-created heating and cooling schedules.
@@ -0,0 +1,178 @@
1
+
2
+ # open the class to add methods to return sizing values
3
+ class OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir
4
+
5
+ # Sets all auto-sizeable fields to autosize
6
+ def autosize
7
+ self.autosizeSupplyAirFlowRateDuringCoolingOperation
8
+ self.autosizeSupplyAirFlowRateDuringHeatingOperation
9
+ self.autosizeSupplyAirFlowRateWhenNoCoolingorHeatingisNeeded
10
+ self.autosizeSpeed1SupplyAirFlowRateDuringCoolingOperation
11
+ self.autosizeSpeed1SupplyAirFlowRateDuringHeatingOperation
12
+ self.autosizeSpeed2SupplyAirFlowRateDuringCoolingOperation
13
+ self.autosizeSpeed2SupplyAirFlowRateDuringHeatingOperation
14
+ self.autosizeSpeed3SupplyAirFlowRateDuringCoolingOperation
15
+ self.autosizeSpeed3SupplyAirFlowRateDuringHeatingOperation
16
+ self.autosizeSpeed4SupplyAirFlowRateDuringCoolingOperation
17
+ self.autosizeSpeed4SupplyAirFlowRateDuringHeatingOperation
18
+ self.autosizeMaximumSupplyAirTemperaturefromSupplementalHeater
19
+ end
20
+
21
+ # Takes the values calculated by the EnergyPlus sizing routines
22
+ # and puts them into this object model in place of the autosized fields.
23
+ # Must have previously completed a run with sql output for this to work.
24
+ def applySizingValues
25
+
26
+ sup_air_flow_cooling = self.autosizedSupplyAirFlowRateDuringCoolingOperation
27
+ if sup_air_flow_cooling.is_initialized
28
+ self.setSupplyAirFlowRateDuringCoolingOperation(sup_air_flow_cooling.get)
29
+ end
30
+
31
+ sup_air_flow_heating = self.autosizedsSupplyAirFlowRateDuringHeatingOperation
32
+ if sup_air_flow_heating.is_initialized
33
+ self.setSupplyAirFlowRateDuringHeatingOperation(sup_air_flow_heating.get)
34
+ end
35
+
36
+ sup_air_flow_no_htg_clg = self.autosizedSupplyAirFlowRateWhenNoCoolingorHeatingisNeeded
37
+ if sup_air_flow_no_htg_clg.is_initialized
38
+ self.setSupplyAirFlowRateWhenNoCoolingorHeatingisNeeded(sup_air_flow_no_htg_clg.get)
39
+ end
40
+
41
+ speed1_sup_air_flow_cooling = self.autosizedSpeed1SupplyAirFlowRateDuringCoolingOperation
42
+ if speed1_sup_air_flow_cooling.is_initialized
43
+ self.setSpeed1SupplyAirFlowRateDuringCoolingOperation(speed1_sup_air_flow_cooling.get)
44
+ end
45
+
46
+ speed1_sup_air_flow_heating = self.autosizedsSpeed1SupplyAirFlowRateDuringHeatingOperation
47
+ if speed1_sup_air_flow_heating.is_initialized
48
+ self.setSpeed1SupplyAirFlowRateDuringHeatingOperation(speed1_sup_air_flow_heating.get)
49
+ end
50
+
51
+ speed2_sup_air_flow_cooling = self.autosizedSpeed2SupplyAirFlowRateDuringCoolingOperation
52
+ if speed2_sup_air_flow_cooling.is_initialized
53
+ self.setSpeed2SupplyAirFlowRateDuringCoolingOperation(speed2_sup_air_flow_cooling.get)
54
+ end
55
+
56
+ speed2_sup_air_flow_heating = self.autosizedsSpeed2SupplyAirFlowRateDuringHeatingOperation
57
+ if speed2_sup_air_flow_heating.is_initialized
58
+ self.setSpeed2SupplyAirFlowRateDuringHeatingOperation(speed2_sup_air_flow_heating.get)
59
+ end
60
+
61
+ speed3_sup_air_flow_cooling = self.autosizedSpeed3SupplyAirFlowRateDuringCoolingOperation
62
+ if speed1_sup_air_flow_cooling.is_initialized
63
+ self.setSpeed3SupplyAirFlowRateDuringCoolingOperation(speed3_sup_air_flow_cooling.get)
64
+ end
65
+
66
+ speed3_sup_air_flow_heating = self.autosizedsSpeed3SupplyAirFlowRateDuringHeatingOperation
67
+ if speed3_sup_air_flow_heating.is_initialized
68
+ self.setSpeed3SupplyAirFlowRateDuringHeatingOperation(speed3_sup_air_flow_heating.get)
69
+ end
70
+
71
+ speed3_sup_air_flow_no_htg_clg = self.autosizedSpeed3SupplyAirFlowRateWhenNoCoolingorHeatingisNeeded
72
+ if speed3_sup_air_flow_no_htg_clg.is_initialized
73
+ self.setSpeed3SupplyAirFlowRateWhenNoCoolingorHeatingisNeeded(speed3_sup_air_flow_no_htg_clg.get)
74
+ end
75
+
76
+ speed4_sup_air_flow_cooling = self.autosizedSpeed4SupplyAirFlowRateDuringCoolingOperation
77
+ if speed4_sup_air_flow_cooling.is_initialized
78
+ self.setSpeed4SupplyAirFlowRateDuringCoolingOperation(speed4_sup_air_flow_cooling.get)
79
+ end
80
+
81
+ speed4_sup_air_flow_heating = self.autosizedsSpeed4SupplyAirFlowRateDuringHeatingOperation
82
+ if speed4_sup_air_flow_heating.is_initialized
83
+ self.setSpeed4SupplyAirFlowRateDuringHeatingOperation(speed4_sup_air_flow_heating.get)
84
+ end
85
+
86
+ max_sup_htg_temp = self.autosizedMaximumSupplyAirTemperaturefromSupplementalHeater
87
+ if max_sup_htg_temp.is_initialized
88
+ self.setMaximumSupplyAirTemperaturefromSupplementalHeater(max_sup_htg_temp.get)
89
+ end
90
+
91
+ end
92
+
93
+ # returns the autosized supply air flow rate during cooling operation as an optional double
94
+ def autosizedSupplyAirFlowRateDuringCoolingOperation
95
+
96
+ return self.model.getAutosizedValue(self, 'Supply Air Flow Rate During Heating Operation', 'm3/s')
97
+
98
+ end
99
+
100
+ # returns the autosized supply air flow rate during heating operation as an optional double
101
+ def autosizedSupplyAirFlowRateDuringHeatingOperation
102
+
103
+ return self.model.getAutosizedValue(self, 'Supply Air Flow Rate During Cooling Operation', 'm3/s')
104
+
105
+ end
106
+
107
+ # returns the autosized supply air flow rate when no heating or cooling is needed as an optional double
108
+ def autosizedSupplyAirFlowRateWhenNoCoolingorHeatingisNeeded
109
+
110
+ return self.model.getAutosizedValue(self, 'Supply Air Flow Rate', 'm3/s')
111
+
112
+ end
113
+
114
+ # returns the autosized supply air flow rate during cooling operation as an optional double
115
+ def autosizedSpeed1SupplyAirFlowRateDuringCoolingOperation
116
+
117
+ return self.model.getAutosizedValue(self, 'Speed 1 Supply Air Flow Rate During Heating Operation', 'm3/s')
118
+
119
+ end
120
+
121
+ # returns the autosized supply air flow rate during heating operation as an optional double
122
+ def autosizedSpeed1SupplyAirFlowRateDuringHeatingOperation
123
+
124
+ return self.model.getAutosizedValue(self, 'Speed 1 Supply Air Flow Rate During Cooling Operation', 'm3/s')
125
+
126
+ end
127
+
128
+ # returns the autosized supply air flow rate during cooling operation as an optional double
129
+ def autosizedSpeed2SupplyAirFlowRateDuringCoolingOperation
130
+
131
+ return self.model.getAutosizedValue(self, 'Speed 2 Supply Air Flow Rate During Heating Operation', 'm3/s')
132
+
133
+ end
134
+
135
+ # returns the autosized supply air flow rate during heating operation as an optional double
136
+ def autosizedSpeed2SupplyAirFlowRateDuringHeatingOperation
137
+
138
+ return self.model.getAutosizedValue(self, 'Speed 2 Supply Air Flow Rate During Cooling Operation', 'm3/s')
139
+
140
+ end
141
+
142
+ # returns the autosized supply air flow rate during cooling operation as an optional double
143
+ def autosizedSpeed3SupplyAirFlowRateDuringCoolingOperation
144
+
145
+ return self.model.getAutosizedValue(self, 'Speed 3 Supply Air Flow Rate During Heating Operation', 'm3/s')
146
+
147
+ end
148
+
149
+ # returns the autosized supply air flow rate during heating operation as an optional double
150
+ def autosizedSpeed3SupplyAirFlowRateDuringHeatingOperation
151
+
152
+ return self.model.getAutosizedValue(self, 'Speed 3 Supply Air Flow Rate During Cooling Operation', 'm3/s')
153
+
154
+ end
155
+
156
+ # returns the autosized supply air flow rate during cooling operation as an optional double
157
+ def autosizedSpeed4SupplyAirFlowRateDuringCoolingOperation
158
+
159
+ return self.model.getAutosizedValue(self, 'Speed 4 Supply Air Flow Rate During Heating Operation', 'm3/s')
160
+
161
+ end
162
+
163
+ # returns the autosized supply air flow rate during heating operation as an optional double
164
+ def autosizedSpeed4SupplyAirFlowRateDuringHeatingOperation
165
+
166
+ return self.model.getAutosizedValue(self, 'Speed 4 Supply Air Flow Rate During Cooling Operation', 'm3/s')
167
+
168
+ end
169
+
170
+ # returns the autosized maximum supply air temperature from supplemental heater as an optional double
171
+ def autosizedMaximumSupplyAirTemperaturefromSupplementalHeater
172
+
173
+ return self.model.getAutosizedValue(self, 'Maximum Supply Air Temperature from Supplemental Heater', 'C')
174
+
175
+ end
176
+
177
+
178
+ end
@@ -88,56 +88,56 @@ class OpenStudio::Model::CoilCoolingDXMultiSpeed
88
88
  # returns the autosized rated total cooling capacity for stage 1 as an optional double
89
89
  def autosizedSpeed1GrossRatedTotalCoolingCapacity
90
90
 
91
- return self.model.getAutosizedValue(self,'Speed 1 Design Size Rated Total Cooling Capacity', 'W')
91
+ return self.model.getAutosizedValue(self,'Design Size Speed 1 Gross Rated Total Cooling Capacity', 'W')
92
92
 
93
93
  end
94
94
 
95
95
  # returns the autosized rated total cooling capacity for stage 2 as an optional double
96
96
  def autosizedSpeed2GrossRatedTotalCoolingCapacity
97
97
 
98
- return self.model.getAutosizedValue(self,'Speed 2 Design Size Rated Total Cooling Capacity', 'W')
98
+ return self.model.getAutosizedValue(self,'Design Size Speed 2 Gross Rated Total Cooling Capacity', 'W')
99
99
 
100
100
  end
101
101
 
102
102
  # returns the autosized rated total cooling capacity for stage 3 as an optional double
103
103
  def autosizedSpeed3GrossRatedTotalCoolingCapacity
104
104
 
105
- return self.model.getAutosizedValue(self,'Speed 3 Design Size Rated Total Cooling Capacity', 'W')
105
+ return self.model.getAutosizedValue(self,'Design Size Speed 3 Gross Rated Total Cooling Capacity', 'W')
106
106
 
107
107
  end
108
108
 
109
109
  # returns the autosized rated total cooling capacity for stage 4 as an optional double
110
110
  def autosizedSpeed4GrossRatedTotalCoolingCapacity
111
111
 
112
- return self.model.getAutosizedValue(self,'Speed 4 Design Size Rated Total Cooling Capacity', 'W')
112
+ return self.model.getAutosizedValue(self,'Design Size Speed 4 Gross Rated Total Cooling Capacity', 'W')
113
113
 
114
114
  end
115
115
 
116
116
  # returns the autosized rated sensible heat ratio for stage 1 as an optional double
117
117
  def autosizedSpeed1RatedSensibleHeatRatio
118
118
 
119
- return self.model.getAutosizedValue(self,'Speed 1 Design Size Rated Sensible Heat Ratio', '')
119
+ return self.model.getAutosizedValue(self,'Design Size Speed 1 Rated Sensible Heat Ratio', '')
120
120
 
121
121
  end
122
122
 
123
123
  # returns the autosized rated sensible heat ratio for stage 2 as an optional double
124
124
  def autosizedSpeed2RatedSensibleHeatRatio
125
125
 
126
- return self.model.getAutosizedValue(self,'Speed 2 Design Size Rated Sensible Heat Ratio', '')
126
+ return self.model.getAutosizedValue(self,'Design Size Speed 2 Rated Sensible Heat Ratio', '')
127
127
 
128
128
  end
129
129
 
130
130
  # returns the autosized rated sensible heat ratio for stage 3 as an optional double
131
131
  def autosizedSpeed3RatedSensibleHeatRatio
132
132
 
133
- return self.model.getAutosizedValue(self,'Speed 3 Design Size Rated Sensible Heat Ratio', '')
133
+ return self.model.getAutosizedValue(self,'Design Size Speed 3 Rated Sensible Heat Ratio', '')
134
134
 
135
135
  end
136
136
 
137
137
  # returns the autosized rated sensible heat ratio for stage 4 as an optional double
138
138
  def autosizedSpeed4RatedSensibleHeatRatio
139
139
 
140
- return self.model.getAutosizedValue(self,'Speed 4 Design Size Rated Sensible Heat Ratio', '')
140
+ return self.model.getAutosizedValue(self,'Design Size Speed 4 Rated Sensible Heat Ratio', '')
141
141
 
142
142
  end
143
143
 
@@ -17,16 +17,19 @@ class OpenStudio::Model::Model
17
17
  require_relative 'Siz.AirTermSnglDuctUncontrolled'
18
18
  require_relative 'Siz.AirLoopHVAC'
19
19
  require_relative 'Siz.AirLoopHVACUnitaryHeatPumpAirToAir'
20
+ require_relative 'Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed'
20
21
  require_relative 'Siz.FanConstantVolume'
21
22
  require_relative 'Siz.FanVariableVolume'
22
23
  require_relative 'Siz.FanOnOff'
23
24
  require_relative 'Siz.CoilHeatingElectric'
24
25
  require_relative 'Siz.CoilHeatingGas'
26
+ require_relative 'Siz.CoilHeatingGasMultiStage'
25
27
  require_relative 'Siz.CoilHeatingWater'
26
28
  require_relative 'Siz.CoilHeatingDXSingleSpeed'
27
29
  require_relative 'Siz.CoilHeatingDXMultiSpeed'
28
30
  require_relative 'Siz.CoilHeatingWaterToAirHeatPumpEquationFit'
29
31
  require_relative 'Siz.CoilCoolingWaterToAirHeatPumpEquationFit'
32
+ require_relative 'Siz.CoilCoolingDXMultiSpeed'
30
33
  require_relative 'Siz.CoilCoolingDXSingleSpeed'
31
34
  require_relative 'Siz.CoilCoolingDXTwoSpeed'
32
35
  require_relative 'Siz.CoilCoolingWater'
@@ -1661,7 +1661,7 @@ class Standard
1661
1661
  end
1662
1662
  controller_mv = oa_intake_controller.controllerMechanicalVentilation
1663
1663
  controller_mv.setName("#{air_loop.name} Vent Controller")
1664
- controller_mv.setSystemOutdoorAirMethod('VentilationRateProcedure')
1664
+ controller_mv.setSystemOutdoorAirMethod('ZoneSum')
1665
1665
  oa_intake = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_intake_controller)
1666
1666
  oa_intake.setName("#{air_loop.name} OA System")
1667
1667
  oa_intake.addToNode(air_loop.supplyInletNode)
@@ -1838,7 +1838,7 @@ class Standard
1838
1838
  # oa_intake_controller.setMinimumOutdoorAirSchedule(oa_damper_sch)
1839
1839
  controller_mv = oa_intake_controller.controllerMechanicalVentilation
1840
1840
  controller_mv.setName("#{air_loop.name} Vent Controller")
1841
- controller_mv.setSystemOutdoorAirMethod('VentilationRateProcedure')
1841
+ controller_mv.setSystemOutdoorAirMethod('ZoneSum')
1842
1842
  oa_intake = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_intake_controller)
1843
1843
  oa_intake.setName("#{air_loop.name} OA System")
1844
1844
  oa_intake.addToNode(air_loop.supplyInletNode)
@@ -2158,7 +2158,7 @@ class Standard
2158
2158
  oa_intake_controller.resetEconomizerMinimumLimitDryBulbTemperature
2159
2159
  controller_mv = oa_intake_controller.controllerMechanicalVentilation
2160
2160
  controller_mv.setName("#{air_loop.name} Vent Controller")
2161
- controller_mv.setSystemOutdoorAirMethod('VentilationRateProcedure')
2161
+ controller_mv.setSystemOutdoorAirMethod('ZoneSum')
2162
2162
 
2163
2163
  oa_intake = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_intake_controller)
2164
2164
  oa_intake.setName("#{air_loop.name} OA System")
@@ -108,20 +108,12 @@ class Standard
108
108
  # Other zones have OA requirements converted
109
109
  # to per-area values only so DCV performance is only
110
110
  # based on the subset of zones that required DCV.
111
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Converting ventilation requirements to per-area for all zones served that do not require DCV.")
111
112
  air_loop_hvac.thermalZones.sort.each do |zone|
112
113
  unless thermal_zone_demand_control_ventilation_required?(zone, climate_zone)
113
114
  thermal_zone_convert_oa_req_to_per_area(zone)
114
115
  end
115
116
  end
116
- else
117
- # For systems that do not require DCV,
118
- # convert OA requirements to per-area values
119
- # so that other features such as
120
- # multizone VAV optimization do not
121
- # incorrectly take variable occupancy into account.
122
- air_loop_hvac.thermalZones.sort.each do |zone|
123
- thermal_zone_convert_oa_req_to_per_area(zone)
124
- end
125
117
  end
126
118
 
127
119
  # SAT reset
@@ -148,14 +140,6 @@ class Standard
148
140
  air_loop_hvac_remove_motorized_oa_damper(air_loop_hvac)
149
141
  end
150
142
 
151
- # Zones that require DCV preserve both per-area and per-person OA reqs.
152
- # Other zones have OA reqs converted to per-area values only so that DCV
153
- air_loop_hvac.thermalZones.sort.each do |zone|
154
- unless thermal_zone_demand_control_ventilation_required?(zone, climate_zone)
155
- thermal_zone_convert_oa_req_to_per_area(zone)
156
- end
157
- end
158
-
159
143
  # Optimum Start
160
144
  air_loop_hvac_enable_optimum_start(air_loop_hvac) if air_loop_hvac_optimum_start_required?(air_loop_hvac)
161
145
 
@@ -825,10 +809,17 @@ class Standard
825
809
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name} capacity of #{coil.name} is not available, total cooling capacity of air loop will be incorrect when applying standard.")
826
810
  end
827
811
  end
812
+ elsif sc.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized
813
+ unitary = sc.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get
814
+ clg_coil = unitary.coolingCoil
815
+ # CoilCoolingDXMultSpeed
816
+ if clg_coil.to_CoilCoolingDXMultiSpeed.is_initialized
817
+ coil = clg_coil.to_CoilCoolingDXMultiSpeed.get
818
+ total_cooling_capacity_w = coil_cooling_dx_multi_speed_find_capacity(coil)
819
+ end
828
820
  elsif sc.to_CoilCoolingDXMultiSpeed.is_initialized ||
829
821
  sc.to_CoilCoolingCooledBeam.is_initialized ||
830
822
  sc.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.is_initialized ||
831
- sc.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.is_initialized ||
832
823
  sc.to_AirLoopHVACUnitarySystem.is_initialized
833
824
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "#{air_loop_hvac.name} has a cooling coil named #{sc.name}, whose type is not yet covered by economizer checks.")
834
825
  # CoilCoolingDXMultiSpeed
@@ -836,7 +827,6 @@ class Standard
836
827
  # CoilCoolingWaterToAirHeatPumpEquationFit
837
828
  # AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass
838
829
  # AirLoopHVACUnitaryHeatPumpAirToAir
839
- # AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed
840
830
  # AirLoopHVACUnitarySystem
841
831
  end
842
832
  end
@@ -1580,9 +1570,18 @@ class Standard
1580
1570
  return false
1581
1571
  end
1582
1572
 
1583
- # Create an ERV and add it to the OA system
1584
- erv = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(air_loop_hvac.model)
1585
- erv.addToNode(oa_system.outboardOANode.get)
1573
+ # Get the existing ERV or create an ERV and add it to the OA system
1574
+ erv = nil
1575
+ air_loop_hvac.supplyComponents.each do |supply_comp|
1576
+ if supply_comp.to_HeatExchangerAirToAirSensibleAndLatent.is_initialized
1577
+ erv = supply_comp.to_HeatExchangerAirToAirSensibleAndLatent.get
1578
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}, adjusting properties for existing ERV #{erv.name} instead of adding another one.")
1579
+ end
1580
+ end
1581
+ if erv.nil?
1582
+ erv = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(air_loop_hvac.model)
1583
+ erv.addToNode(oa_system.outboardOANode.get)
1584
+ end
1586
1585
 
1587
1586
  # Determine whether to use an ERV and HRV and heat exchanger style
1588
1587
  erv_type = air_loop_hvac_energy_recovery_ventilator_type(air_loop_hvac, climate_zone)
@@ -2148,7 +2147,7 @@ class Standard
2148
2147
 
2149
2148
  # Enable DCV in the controller mechanical ventilation
2150
2149
  controller_mv.setDemandControlledVentilation(true)
2151
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "Enabled DCV for air loop: #{air_loop_hvac.name}.")
2150
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirLoopHVAC', "For #{air_loop_hvac.name}: Enabled DCV.")
2152
2151
 
2153
2152
  return true
2154
2153
  end
@@ -3062,6 +3061,9 @@ class Standard
3062
3061
 
3063
3062
  # Set HVAC availability schedule to follow occupancy
3064
3063
  air_loop_hvac.setAvailabilitySchedule(loop_occ_sch)
3064
+ air_loop_hvac.supplyComponents('OS:AirLoopHVAC:UnitaryHeatPump:AirToAir:MultiSpeed'.to_IddObjectType).each do |comp|
3065
+ comp.to_AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.get.setAvailabilitySchedule(loop_occ_sch)
3066
+ end
3065
3067
 
3066
3068
  return true
3067
3069
  end