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.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/test_performance_expected_dd_results.csv +950 -950
- data/lib/openstudio-standards.rb +8 -1
- data/lib/openstudio-standards/btap/btap.model.rb +1 -1
- data/lib/openstudio-standards/btap/economics.rb +14 -11
- data/lib/openstudio-standards/btap/envelope.rb +185 -257
- data/lib/openstudio-standards/btap/fileio.rb +1 -0
- data/lib/openstudio-standards/btap/geometry.rb +21 -1
- data/lib/openstudio-standards/btap/measures.rb +12 -11
- data/lib/openstudio-standards/btap/schedules.rb +3 -12
- data/lib/openstudio-standards/hvac_sizing/Siz.AirLoopHVACUnitaryHeatPumpAirToAirMultiSpeed.rb +178 -0
- data/lib/openstudio-standards/hvac_sizing/Siz.CoilCoolingDXMultiSpeed.rb +8 -8
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +3 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +3 -3
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +25 -23
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +91 -0
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +20 -2
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +39 -0
- data/lib/openstudio-standards/standards/Standards.Model.rb +29 -0
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +37 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +5963 -2723
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +5917 -2697
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +2011 -1112
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +1946 -1106
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +2 -18
- data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/data/space_types.json +1677 -1005
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +64 -13
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +31 -19
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/curves.json +75 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -16
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/space_types.json +1677 -1005
- data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +29 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +913 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/equip_eff_lim.json +52 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +105 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +23 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +803 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +787 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +29 -0
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +87 -0
- data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +22 -0
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1593 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +68 -33
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +24 -13
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +104 -99
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +24 -24
- data/lib/openstudio-standards/standards/necb/NECB2011/data/curves.json +50 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +31 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/led_lighting_data.json +2028 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1745 -1297
- data/lib/openstudio-standards/standards/necb/NECB2011/daylighting_control.md +70 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/demand_controlled_ventilation.md +46 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +69 -107
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +24 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +139 -141
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +344 -234
- data/lib/openstudio-standards/standards/necb/NECB2011/led_lighting.md +51 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +57 -9
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +1060 -34
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +9 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +2554 -1916
- data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +32 -1
- data/lib/openstudio-standards/standards/necb/NECB2017/data/led_lighting_data.json +2883 -0
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +2554 -1916
- data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +29 -0
- data/lib/openstudio-standards/version.rb +1 -1
- 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!(
|
720
|
-
|
721
|
-
|
722
|
-
|
723
|
-
|
724
|
-
|
725
|
-
|
726
|
-
|
727
|
-
|
728
|
-
|
729
|
-
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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
|
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('
|
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('
|
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('
|
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
|
-
#
|
1584
|
-
erv =
|
1585
|
-
|
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', "
|
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
|