openstudio-standards 0.2.15 → 0.2.16
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/geometry/ASHRAECollege.osm +117 -117
- data/data/geometry/ASHRAEHighriseApartment.osm +0 -27
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1_28Jan2022.xlsx +0 -0
- data/data/standards/OpenStudio_Standards-ashrae_90_1_28_Jan2022_2.xlsx +0 -0
- data/data/standards/export_OpenStudio_libraries.rb +2 -0
- data/data/standards/test_performance_expected_dd_results.csv +892 -892
- data/lib/openstudio-standards/btap/btap_result.rb +2 -2
- data/lib/openstudio-standards/btap/reporting.rb +2 -2
- data/lib/openstudio-standards/btap/simmanager.rb +2 -2
- data/lib/openstudio-standards/hvac_sizing/Siz.ControllerOutdoorAir.rb +0 -54
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +11 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +26 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +14 -6
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +63 -63
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +12 -9
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +35 -16
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +23 -10
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +36 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +25 -15
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -3
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +2 -0
- data/lib/openstudio-standards/standards/Standards.Construction.rb +12 -6
- data/lib/openstudio-standards/standards/Standards.Model.rb +43 -8
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +15 -0
- data/lib/openstudio-standards/standards/Standards.Space.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +7 -0
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +5 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +32 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +22 -742
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +25 -25
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +19 -559
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +11 -11
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +19 -559
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +10 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +19 -559
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +13 -13
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +370 -910
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +18 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +19 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +2380 -1300
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +0 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +18 -18
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +140 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1176 -312
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_properties.json +172 -1132
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.construction_sets.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +9 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_properties.json +180 -1140
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.construction_sets.json +14 -14
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +10 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.construction_properties.json +9 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.construction_properties.json +9 -9
- data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +15 -0
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +12 -6
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +12 -6
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +16 -8
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +10 -20
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +209 -37
- data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +1 -0
- data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +8 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +16 -9
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartment.osm +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/MidriseApartment.osm +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +9 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +10 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +9 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -8
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +14 -8
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +4 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +38 -19
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +15 -4
- data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +10 -651
- data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +8 -38
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +159 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +41 -43
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +7 -4
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards.rb +1 -0
- metadata +5 -2
@@ -11,9 +11,9 @@ class Standard
|
|
11
11
|
# @param nominal_thermal_efficiency [Double] boiler nominal thermal efficiency
|
12
12
|
# @param eff_curve_temp_eval_var [String] LeavingBoiler or EnteringBoiler temperature for the boiler efficiency curve
|
13
13
|
# @param flow_mode [String] boiler flow mode
|
14
|
-
# @param
|
14
|
+
# @param lvg_temp_dsgn_f [Double] boiler leaving design temperature in degrees Fahrenheit
|
15
15
|
# note that this field is deprecated in OS versions 3.0+
|
16
|
-
# @param
|
16
|
+
# @param out_temp_lmt_f [Double] boiler outlet temperature limit in degrees Fahrenheit
|
17
17
|
# @param min_plr [Double] boiler minimum part load ratio
|
18
18
|
# @param max_plr [Double] boiler maximum part load ratio
|
19
19
|
# @param opt_plr [Double] boiler optimum part load ratio
|
@@ -27,8 +27,8 @@ class Standard
|
|
27
27
|
nominal_thermal_efficiency: 0.80,
|
28
28
|
eff_curve_temp_eval_var: 'LeavingBoiler',
|
29
29
|
flow_mode: 'LeavingSetpointModulated',
|
30
|
-
|
31
|
-
|
30
|
+
lvg_temp_dsgn_f: 180.0, # 82.22 degrees Celsius
|
31
|
+
out_temp_lmt_f: 203.0, # 95.0 degrees Celsius
|
32
32
|
min_plr: 0.0,
|
33
33
|
max_plr: 1.2,
|
34
34
|
opt_plr: 1.0,
|
@@ -48,6 +48,8 @@ class Standard
|
|
48
48
|
|
49
49
|
if fuel_type.nil? || fuel_type == 'Gas'
|
50
50
|
boiler.setFuelType('NaturalGas')
|
51
|
+
elsif fuel_type == 'Propane' || fuel_type == 'PropaneGas'
|
52
|
+
boiler.setFuelType('Propane')
|
51
53
|
else
|
52
54
|
boiler.setFuelType(fuel_type)
|
53
55
|
end
|
@@ -71,23 +73,24 @@ class Standard
|
|
71
73
|
end
|
72
74
|
|
73
75
|
if model.version < OpenStudio::VersionString.new('3.0.0')
|
74
|
-
if
|
76
|
+
if lvg_temp_dsgn_f.nil?
|
75
77
|
boiler.setDesignWaterOutletTemperature(OpenStudio.convert(180.0, 'F', 'C').get)
|
76
78
|
else
|
77
|
-
boiler.setDesignWaterOutletTemperature(OpenStudio.convert(
|
79
|
+
boiler.setDesignWaterOutletTemperature(OpenStudio.convert(lvg_temp_dsgn_f, 'F', 'C').get)
|
78
80
|
end
|
79
81
|
end
|
80
82
|
|
81
|
-
if
|
83
|
+
if out_temp_lmt_f.nil?
|
82
84
|
boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(203.0, 'F', 'C').get)
|
83
85
|
else
|
84
|
-
boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(
|
86
|
+
boiler.setWaterOutletUpperTemperatureLimit(OpenStudio.convert(out_temp_lmt_f, 'F', 'C').get)
|
85
87
|
end
|
86
88
|
|
87
89
|
# logic to set different defaults for condensing boilers if not specified
|
88
90
|
if draft_type == 'Condensing'
|
89
91
|
if model.version < OpenStudio::VersionString.new('3.0.0')
|
90
|
-
|
92
|
+
# default to 120 degrees Fahrenheit (48.49 degrees Celsius)
|
93
|
+
boiler.setDesignWaterOutletTemperature(OpenStudio.convert(120.0, 'F', 'C').get) if lvg_temp_dsgn_f.nil?
|
91
94
|
end
|
92
95
|
boiler.setNominalThermalEfficiency(0.96) if nominal_thermal_efficiency.nil?
|
93
96
|
end
|
@@ -44,22 +44,41 @@ class Standard
|
|
44
44
|
if type == 'OS default'
|
45
45
|
# use OS default curves
|
46
46
|
else # default curve set
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
47
|
+
if model.version < OpenStudio::VersionString.new('3.2.0')
|
48
|
+
clg_coil.setTotalCoolingCapacityCoefficient1(-4.30266987344639)
|
49
|
+
clg_coil.setTotalCoolingCapacityCoefficient2(7.18536990534372)
|
50
|
+
clg_coil.setTotalCoolingCapacityCoefficient3(-2.23946714486189)
|
51
|
+
clg_coil.setTotalCoolingCapacityCoefficient4(0.139995928440879)
|
52
|
+
clg_coil.setTotalCoolingCapacityCoefficient5(0.102660179888915)
|
53
|
+
clg_coil.setSensibleCoolingCapacityCoefficient1(6.0019444814887)
|
54
|
+
clg_coil.setSensibleCoolingCapacityCoefficient2(22.6300677244073)
|
55
|
+
clg_coil.setSensibleCoolingCapacityCoefficient3(-26.7960783730934)
|
56
|
+
clg_coil.setSensibleCoolingCapacityCoefficient4(-1.72374720346819)
|
57
|
+
clg_coil.setSensibleCoolingCapacityCoefficient5(0.490644802367817)
|
58
|
+
clg_coil.setSensibleCoolingCapacityCoefficient6(0.0693119353468141)
|
59
|
+
clg_coil.setCoolingPowerConsumptionCoefficient1(-5.67775976415698)
|
60
|
+
clg_coil.setCoolingPowerConsumptionCoefficient2(0.438988156976704)
|
61
|
+
clg_coil.setCoolingPowerConsumptionCoefficient3(5.845277342193)
|
62
|
+
clg_coil.setCoolingPowerConsumptionCoefficient4(0.141605667000125)
|
63
|
+
clg_coil.setCoolingPowerConsumptionCoefficient5(-0.168727936032429)
|
64
|
+
else
|
65
|
+
clg_coil.totalCoolingCapacityCurve.setCoefficient1Constant(-4.30266987344639)
|
66
|
+
clg_coil.totalCoolingCapacityCurve.setCoefficient2w(7.18536990534372)
|
67
|
+
clg_coil.totalCoolingCapacityCurve.setCoefficient3x(-2.23946714486189)
|
68
|
+
clg_coil.totalCoolingCapacityCurve.setCoefficient4y(0.139995928440879)
|
69
|
+
clg_coil.totalCoolingCapacityCurve.setCoefficient5z(0.102660179888915)
|
70
|
+
clg_coil.sensibleCoolingCapacityCurve.setCoefficient1Constant(6.0019444814887)
|
71
|
+
clg_coil.sensibleCoolingCapacityCurve.setCoefficient2v(22.6300677244073)
|
72
|
+
clg_coil.sensibleCoolingCapacityCurve.setCoefficient3w(-26.7960783730934)
|
73
|
+
clg_coil.sensibleCoolingCapacityCurve.setCoefficient4x(-1.72374720346819)
|
74
|
+
clg_coil.sensibleCoolingCapacityCurve.setCoefficient5y(0.490644802367817)
|
75
|
+
clg_coil.sensibleCoolingCapacityCurve.setCoefficient6z(0.0693119353468141)
|
76
|
+
clg_coil.coolingPowerConsumptionCurve.setCoefficient1Constant(-5.67775976415698)
|
77
|
+
clg_coil.coolingPowerConsumptionCurve.setCoefficient2w(0.438988156976704)
|
78
|
+
clg_coil.coolingPowerConsumptionCurve.setCoefficient3x(5.845277342193)
|
79
|
+
clg_coil.coolingPowerConsumptionCurve.setCoefficient4y(0.141605667000125)
|
80
|
+
clg_coil.coolingPowerConsumptionCurve.setCoefficient5z(-0.168727936032429)
|
81
|
+
end
|
63
82
|
end
|
64
83
|
|
65
84
|
return clg_coil
|
@@ -44,16 +44,29 @@ class Standard
|
|
44
44
|
if type == 'OS default'
|
45
45
|
# use OS default curves
|
46
46
|
else # default curve set
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
47
|
+
if model.version < OpenStudio::VersionString.new('3.2.0')
|
48
|
+
htg_coil.setHeatingCapacityCoefficient1(0.237847462869254)
|
49
|
+
htg_coil.setHeatingCapacityCoefficient2(-3.35823796081626)
|
50
|
+
htg_coil.setHeatingCapacityCoefficient3(3.80640467406376)
|
51
|
+
htg_coil.setHeatingCapacityCoefficient4(0.179200417311554)
|
52
|
+
htg_coil.setHeatingCapacityCoefficient5(0.12860719846082)
|
53
|
+
htg_coil.setHeatingPowerConsumptionCoefficient1(-3.79175529243238)
|
54
|
+
htg_coil.setHeatingPowerConsumptionCoefficient2(3.38799239505527)
|
55
|
+
htg_coil.setHeatingPowerConsumptionCoefficient3(1.5022612076303)
|
56
|
+
htg_coil.setHeatingPowerConsumptionCoefficient4(-0.177653510577989)
|
57
|
+
htg_coil.setHeatingPowerConsumptionCoefficient5(-0.103079864171839)
|
58
|
+
else
|
59
|
+
htg_coil.heatingCapacityCurve.setCoefficient1Constant(0.237847462869254)
|
60
|
+
htg_coil.heatingCapacityCurve.setCoefficient2w(-3.35823796081626)
|
61
|
+
htg_coil.heatingCapacityCurve.setCoefficient3x(3.80640467406376)
|
62
|
+
htg_coil.heatingCapacityCurve.setCoefficient4y(0.179200417311554)
|
63
|
+
htg_coil.heatingCapacityCurve.setCoefficient5z(0.12860719846082)
|
64
|
+
htg_coil.heatingPowerConsumptionCurve.setCoefficient1Constant(-3.79175529243238)
|
65
|
+
htg_coil.heatingPowerConsumptionCurve.setCoefficient2w(3.38799239505527)
|
66
|
+
htg_coil.heatingPowerConsumptionCurve.setCoefficient3x(1.5022612076303)
|
67
|
+
htg_coil.heatingPowerConsumptionCurve.setCoefficient4y(-0.177653510577989)
|
68
|
+
htg_coil.heatingPowerConsumptionCurve.setCoefficient5z(-0.103079864171839)
|
69
|
+
end
|
57
70
|
end
|
58
71
|
|
59
72
|
return htg_coil
|
@@ -2692,6 +2692,42 @@ Standard.class_eval do
|
|
2692
2692
|
return true
|
2693
2693
|
end
|
2694
2694
|
|
2695
|
+
# Calculate a model's window or WWR
|
2696
|
+
# Disregard space conditioning (assume all spaces are conditioned)
|
2697
|
+
# which is true for most of not all prototypes
|
2698
|
+
#
|
2699
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
2700
|
+
# @param wwr [Boolean]
|
2701
|
+
# @return [Numeric] Returns window to wall ratio (percentage) or window area.
|
2702
|
+
def model_get_window_area_info(model, wwr = true)
|
2703
|
+
|
2704
|
+
window_area = 0
|
2705
|
+
wall_area = 0
|
2706
|
+
|
2707
|
+
model.getSpaces.each do |space|
|
2708
|
+
# Get zone multipler
|
2709
|
+
multiplier = space.thermalZone.get.multiplier
|
2710
|
+
space.surfaces.each do |surface|
|
2711
|
+
next if surface.surfaceType != 'Wall'
|
2712
|
+
next if surface.outsideBoundaryCondition != 'Outdoors'
|
2713
|
+
|
2714
|
+
# Get wall and window area
|
2715
|
+
wall_area += surface.grossArea * multiplier
|
2716
|
+
surface.subSurfaces.each do |subsurface|
|
2717
|
+
subsurface_type = subsurface.subSurfaceType.to_s.downcase
|
2718
|
+
# Do not count doors
|
2719
|
+
next unless (subsurface_type.include? 'window') || (subsurface_type.include? 'glass')
|
2720
|
+
|
2721
|
+
window_area += subsurface.grossArea * subsurface.multiplier * multiplier
|
2722
|
+
end
|
2723
|
+
end
|
2724
|
+
end
|
2725
|
+
return window_area / wall_area * 100 if wwr
|
2726
|
+
|
2727
|
+
# else
|
2728
|
+
return window_area
|
2729
|
+
end
|
2730
|
+
|
2695
2731
|
# Calculate a model's window or WWR for a specific orientation
|
2696
2732
|
# Disregard space conditioning (assume all spaces are conditioned)
|
2697
2733
|
# which is true for most of not all prototypes
|
@@ -381,12 +381,13 @@ class Standard
|
|
381
381
|
hpwh.setCondenserBottomLocation(h_condbot)
|
382
382
|
hpwh.setCondenserTopLocation(h_condtop)
|
383
383
|
hpwh.setTankElementControlLogic('MutuallyExclusive')
|
384
|
+
hpwh.autocalculateEvaporatorAirFlowRate
|
384
385
|
elsif type == 'PumpedCondenser'
|
385
386
|
hpwh.setDeadBandTemperatureDifference(3.89)
|
387
|
+
hpwh.autosizeEvaporatorAirFlowRate
|
386
388
|
end
|
387
389
|
|
388
390
|
# set heat pump water heater properties
|
389
|
-
hpwh.setEvaporatorAirFlowRate(OpenStudio.convert(181.0, 'ft^3/min', 'm^3/s').get)
|
390
391
|
hpwh.setFanPlacement('DrawThrough')
|
391
392
|
hpwh.setOnCycleParasiticElectricLoad(0.0)
|
392
393
|
hpwh.setOffCycleParasiticElectricLoad(0.0)
|
@@ -445,9 +446,10 @@ class Standard
|
|
445
446
|
if type == 'WrappedCondenser'
|
446
447
|
coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPumpWrapped.get
|
447
448
|
coil.setRatedCondenserWaterTemperature(48.89)
|
449
|
+
coil.autocalculateRatedEvaporatorAirFlowRate
|
448
450
|
elsif type == 'PumpedCondenser'
|
449
|
-
coil =
|
450
|
-
|
451
|
+
coil = hpwh.dXCoil.to_CoilWaterHeatingAirToWaterHeatPump.get
|
452
|
+
coil.autosizeRatedEvaporatorAirFlowRate
|
451
453
|
end
|
452
454
|
|
453
455
|
# set coil properties
|
@@ -457,7 +459,6 @@ class Standard
|
|
457
459
|
coil.setRatedSensibleHeatRatio(shr)
|
458
460
|
coil.setRatedEvaporatorInletAirDryBulbTemperature(OpenStudio.convert(67.5, 'F', 'C').get)
|
459
461
|
coil.setRatedEvaporatorInletAirWetBulbTemperature(OpenStudio.convert(56.426, 'F', 'C').get)
|
460
|
-
coil.setRatedEvaporatorAirFlowRate(OpenStudio.convert(181.0, 'ft^3/min', 'm^3/s').get)
|
461
462
|
coil.setEvaporatorFanPowerIncludedinRatedCOP(true)
|
462
463
|
coil.setEvaporatorAirTemperatureTypeforCurveObjects('WetBulbTemperature')
|
463
464
|
coil.setHeatingCapacityFunctionofTemperatureCurve(hpwh_cap)
|
@@ -507,8 +508,7 @@ class Standard
|
|
507
508
|
tank.setSourceSideInletHeight(0)
|
508
509
|
tank.setSourceSideOutletHeight(0)
|
509
510
|
elsif type == 'PumpedCondenser'
|
510
|
-
tank =
|
511
|
-
hpwh.setTank(tank)
|
511
|
+
tank = hpwh.tank.to_WaterHeaterMixed.get
|
512
512
|
tank.setDeadbandTemperatureDifference(3.89)
|
513
513
|
tank.setHeaterControlType('Cycle')
|
514
514
|
tank.setHeaterMaximumCapacity(electric_backup_capacity)
|
@@ -24,7 +24,7 @@ class Standard
|
|
24
24
|
# Creates a hot water loop with a boiler, district heating, or a water-to-water heat pump and adds it to the model.
|
25
25
|
#
|
26
26
|
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
27
|
-
# @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2, DistrictHeating, HeatPump
|
27
|
+
# @param boiler_fuel_type [String] valid choices are Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2, DistrictHeating, HeatPump
|
28
28
|
# @param ambient_loop [OpenStudio::Model::PlantLoop] The condenser loop for the heat pump. Only used when boiler_fuel_type is HeatPump.
|
29
29
|
# @param system_name [String] the name of the system, or nil in which case it will be defaulted
|
30
30
|
# @param dsgn_sup_wtr_temp [Double] design supply water temperature in degrees Fahrenheit, default 180F
|
@@ -128,17 +128,17 @@ class Standard
|
|
128
128
|
when 'AirSourceHeatPump', 'ASHP'
|
129
129
|
create_central_air_source_heat_pump(model, hot_water_loop)
|
130
130
|
# Boiler
|
131
|
-
when 'Electricity', 'Gas', 'NaturalGas', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
|
131
|
+
when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
|
132
132
|
if boiler_lvg_temp_dsgn.nil?
|
133
|
-
|
133
|
+
lvg_temp_dsgn_f = dsgn_sup_wtr_temp
|
134
134
|
else
|
135
|
-
|
135
|
+
lvg_temp_dsgn_f = boiler_lvg_temp_dsgn
|
136
136
|
end
|
137
137
|
|
138
138
|
if boiler_out_temp_lmt.nil?
|
139
|
-
|
139
|
+
out_temp_lmt_f = 203.0
|
140
140
|
else
|
141
|
-
|
141
|
+
out_temp_lmt_f = boiler_out_temp_lmt
|
142
142
|
end
|
143
143
|
|
144
144
|
boiler = create_boiler_hot_water(model,
|
@@ -147,8 +147,8 @@ class Standard
|
|
147
147
|
draft_type: boiler_draft_type,
|
148
148
|
nominal_thermal_efficiency: 0.78,
|
149
149
|
eff_curve_temp_eval_var: boiler_eff_curve_temp_eval_var,
|
150
|
-
|
151
|
-
|
150
|
+
lvg_temp_dsgn_f: lvg_temp_dsgn_f,
|
151
|
+
out_temp_lmt_f: out_temp_lmt_f,
|
152
152
|
max_plr: boiler_max_plr,
|
153
153
|
sizing_factor: boiler_sizing_factor)
|
154
154
|
|
@@ -803,13 +803,13 @@ class Standard
|
|
803
803
|
when 'AirSourceHeatPump', 'ASHP'
|
804
804
|
heating_equipment = create_central_air_source_heat_pump(model, heat_pump_water_loop)
|
805
805
|
heating_equipment_stpt_manager.setName("#{heat_pump_water_loop.name} ASHP Scheduled Dual Setpoint")
|
806
|
-
when 'Electricity', 'Gas', 'NaturalGas', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
|
806
|
+
when 'Electricity', 'Gas', 'NaturalGas', 'Propane', 'PropaneGas', 'FuelOilNo1', 'FuelOilNo2'
|
807
807
|
heating_equipment = create_boiler_hot_water(model,
|
808
808
|
hot_water_loop: heat_pump_water_loop,
|
809
809
|
name: "#{heat_pump_water_loop.name} Supplemental Boiler",
|
810
810
|
fuel_type: heating_fuel,
|
811
811
|
flow_mode: 'ConstantFlow',
|
812
|
-
|
812
|
+
lvg_temp_dsgn_f: 86.0, # 30.0 degrees Celsius
|
813
813
|
min_plr: 0.0,
|
814
814
|
max_plr: 1.2,
|
815
815
|
opt_plr: 1.0)
|
@@ -4031,7 +4031,7 @@ class Standard
|
|
4031
4031
|
high_temp_radiant = OpenStudio::Model::ZoneHVACHighTemperatureRadiant.new(model)
|
4032
4032
|
high_temp_radiant.setName("#{zone.name} High Temp Radiant")
|
4033
4033
|
|
4034
|
-
if heating_type.nil? || heating_type == 'Gas'
|
4034
|
+
if heating_type.nil? || heating_type == 'NaturalGas' || heating_type == 'Gas'
|
4035
4035
|
high_temp_radiant.setFuelType('NaturalGas')
|
4036
4036
|
else
|
4037
4037
|
high_temp_radiant.setFuelType(heating_type)
|
@@ -4410,7 +4410,14 @@ class Standard
|
|
4410
4410
|
# @param radiant_type [String] type of radiant system, floor or ceiling, to create in zone.
|
4411
4411
|
# @param include_carpet [Bool] boolean to include thin carpet tile over radiant slab, default to true
|
4412
4412
|
# @param carpet_thickness_in [Double] thickness of carpet in inches
|
4413
|
-
# @param
|
4413
|
+
# @param model_occ_hr_start [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
4414
|
+
# Starting hour of building occupancy.
|
4415
|
+
# @param model_occ_hr_end [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
4416
|
+
# Ending hour of building occupancy.
|
4417
|
+
# @param control_strategy [String] name of control strategy. Options are 'proportional_control' and 'none'.
|
4418
|
+
# If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
|
4419
|
+
# detailed in Raftery et al. (2017), “A new control strategy for high thermal mass radiant systems”.
|
4420
|
+
# Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
|
4414
4421
|
# @param proportional_gain [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
4415
4422
|
# Proportional gain constant (recommended 0.3 or less).
|
4416
4423
|
# @param minimum_operation [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
|
@@ -4427,6 +4434,7 @@ class Standard
|
|
4427
4434
|
# Only used if radiant_lockout is true
|
4428
4435
|
# @return [Array<OpenStudio::Model::ZoneHVACLowTemperatureRadiantVariableFlow>] array of radiant objects.
|
4429
4436
|
# @todo Once the OpenStudio API supports it, make chilled water loops optional for heating only systems
|
4437
|
+
# @todo Lookup occupany start and end hours from zone occupancy schedule
|
4430
4438
|
def model_add_low_temp_radiant(model,
|
4431
4439
|
thermal_zones,
|
4432
4440
|
hot_water_loop,
|
@@ -4434,6 +4442,8 @@ class Standard
|
|
4434
4442
|
radiant_type: 'floor',
|
4435
4443
|
include_carpet: true,
|
4436
4444
|
carpet_thickness_in: 0.25,
|
4445
|
+
model_occ_hr_start: 6.0,
|
4446
|
+
model_occ_hr_end: 18.0,
|
4437
4447
|
control_strategy: 'proportional_control',
|
4438
4448
|
proportional_gain: 0.3,
|
4439
4449
|
minimum_operation: 1,
|
@@ -4743,6 +4753,8 @@ class Standard
|
|
4743
4753
|
if control_strategy == 'proportional_control'
|
4744
4754
|
model_add_radiant_proportional_controls(model, zone, radiant_loop,
|
4745
4755
|
radiant_type: radiant_type,
|
4756
|
+
model_occ_hr_start: model_occ_hr_start,
|
4757
|
+
model_occ_hr_end: model_occ_hr_end,
|
4746
4758
|
proportional_gain: proportional_gain,
|
4747
4759
|
minimum_operation: minimum_operation,
|
4748
4760
|
weekend_temperature_reset: weekend_temperature_reset,
|
@@ -5480,7 +5492,6 @@ class Standard
|
|
5480
5492
|
ventilation.setSchedule(availability_schedule)
|
5481
5493
|
|
5482
5494
|
if ventilation_type == 'Exhaust'
|
5483
|
-
ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
|
5484
5495
|
ventilation.setDesignFlowRate(flow_rate)
|
5485
5496
|
ventilation.setFanPressureRise(31.1361206455786)
|
5486
5497
|
ventilation.setFanTotalEfficiency(0.51)
|
@@ -5491,7 +5502,6 @@ class Standard
|
|
5491
5502
|
ventilation.setMaximumIndoorTemperature(100.0)
|
5492
5503
|
ventilation.setDeltaTemperature(-100.0)
|
5493
5504
|
elsif ventilation_type == 'Natural'
|
5494
|
-
ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
|
5495
5505
|
ventilation.setDesignFlowRate(flow_rate)
|
5496
5506
|
ventilation.setFanPressureRise(0.0)
|
5497
5507
|
ventilation.setFanTotalEfficiency(1.0)
|
@@ -5502,7 +5512,6 @@ class Standard
|
|
5502
5512
|
ventilation.setMaximumIndoorTemperature(29.4444452244559)
|
5503
5513
|
ventilation.setDeltaTemperature(-100.0)
|
5504
5514
|
elsif ventilation_type == 'Intake'
|
5505
|
-
ventilation.setDesignFlowRateCalculationMethod('Flow/Area')
|
5506
5515
|
ventilation.setFlowRateperZoneFloorArea(flow_rate)
|
5507
5516
|
ventilation.setFanPressureRise(49.8)
|
5508
5517
|
ventilation.setFanTotalEfficiency(0.53625)
|
@@ -5922,6 +5931,7 @@ class Standard
|
|
5922
5931
|
if air_loop_heating_type == 'Water'
|
5923
5932
|
hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
|
5924
5933
|
hot_water_loop_type: hot_water_loop_type)
|
5934
|
+
heating_type = 'Water'
|
5925
5935
|
else
|
5926
5936
|
hot_water_loop = nil
|
5927
5937
|
end
|
@@ -489,7 +489,7 @@ class Standard
|
|
489
489
|
fan_pwr_limit_type = 'variable volume'
|
490
490
|
elsif comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.is_initialized
|
491
491
|
fan = comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.get.supplyAirFan
|
492
|
-
if fan.to_FanConstantVolume.is_initialized ||
|
492
|
+
if fan.to_FanConstantVolume.is_initialized || fan.to_FanOnOff.is_initialized
|
493
493
|
fan_pwr_limit_type = 'constant volume'
|
494
494
|
elsif fan.to_FanVariableVolume.is_initialized
|
495
495
|
fan_pwr_limit_type = 'variable volume'
|
@@ -1712,7 +1712,7 @@ class Standard
|
|
1712
1712
|
heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_nominal_electric_power(erv)
|
1713
1713
|
|
1714
1714
|
# add economizer lockout
|
1715
|
-
erv.setSupplyAirOutletTemperatureControl(
|
1715
|
+
erv.setSupplyAirOutletTemperatureControl(true)
|
1716
1716
|
erv.setEconomizerLockout(true)
|
1717
1717
|
|
1718
1718
|
# add defrost
|
data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb
CHANGED
@@ -103,7 +103,6 @@ class Standard
|
|
103
103
|
# @param sql_db_vars_map [Hash] hash map
|
104
104
|
# @return [Hash] hash of coil objects
|
105
105
|
def coil_cooling_water_to_air_heat_pump_apply_efficiency_and_curves(coil_cooling_water_to_air_heat_pump, sql_db_vars_map)
|
106
|
-
successfully_set_all_properties = true
|
107
106
|
|
108
107
|
# Get the search criteria
|
109
108
|
search_criteria = {}
|
@@ -116,8 +115,15 @@ class Standard
|
|
116
115
|
|
117
116
|
# Check to make sure properties were found
|
118
117
|
if coil_props.nil?
|
119
|
-
|
120
|
-
|
118
|
+
# search again without capacity
|
119
|
+
matching_objects = model_find_objects(standards_data['water_source_heat_pumps'], search_criteria, nil, Date.today)
|
120
|
+
if matching_objects.size.zero?
|
121
|
+
# This proves that the search_criteria has issue finding the correct coil prop
|
122
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "For #{coil_cooling_water_to_air_heat_pump.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
123
|
+
else
|
124
|
+
# Issue warning indicate the coil size is may be too large
|
125
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingWaterToAirHeatPumpEquationFit', "The capacity of the coil: #{coil_cooling_water_to_air_heat_pump.name} maybe too large to be found in the efficiency standard. The coil capacity is #{capacity_btu_per_hr} Btu/hr.")
|
126
|
+
end
|
121
127
|
return sql_db_vars_map
|
122
128
|
end
|
123
129
|
|
@@ -22,6 +22,8 @@ class Standard
|
|
22
22
|
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
23
23
|
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
24
24
|
|
25
|
+
return false unless capacity_btu_per_hr > 0
|
26
|
+
|
25
27
|
# Get the boiler properties, if it exists for this template
|
26
28
|
return false unless standards_data.include?('furnaces')
|
27
29
|
|
@@ -83,16 +83,22 @@ class Standard
|
|
83
83
|
# and the R-value of the non-insulation layers and air films.
|
84
84
|
# This is the desired R-value of the insulation.
|
85
85
|
ins_r_value_si = target_r_value_si - other_layer_r_value_si
|
86
|
-
if ins_r_value_si <= 0.0
|
87
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Construction', "Requested U-value of #{target_u_value_ip} for #{construction.name} is too low given the other materials in the construction; insulation layer will not be modified.")
|
88
|
-
return false
|
89
|
-
end
|
90
|
-
ins_r_value_ip = OpenStudio.convert(ins_r_value_si, 'm^2*K/W', 'ft^2*h*R/Btu').get
|
91
86
|
|
92
87
|
# Set the R-value of the insulation layer
|
93
|
-
construction.layers.
|
88
|
+
construction.layers.each_with_index do |layer, l|
|
94
89
|
next unless layer.name.get == insulation_layer_name
|
95
90
|
|
91
|
+
# Remove insulation layer if requested R-value is lower than sum of non-insulation materials
|
92
|
+
if ins_r_value_si <= 0.0
|
93
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Construction', "Requested U-value of #{target_u_value_ip} for #{construction.name} is too low given the other materials in the construction; insulation layer will be removed.")
|
94
|
+
construction.eraseLayer(l)
|
95
|
+
# Set the target R-value to the sum of other layers to make name match properties
|
96
|
+
target_r_value_ip = OpenStudio.convert(other_layer_r_value_si, 'm^2*K/W', 'ft^2*hr*R/Btu').get
|
97
|
+
break # Don't modify the insulation layer since it has been removed
|
98
|
+
end
|
99
|
+
|
100
|
+
# Modify the insulation layer
|
101
|
+
ins_r_value_ip = OpenStudio.convert(ins_r_value_si, 'm^2*K/W', 'ft^2*h*R/Btu').get
|
96
102
|
if layer.to_StandardOpaqueMaterial.is_initialized
|
97
103
|
layer = layer.to_StandardOpaqueMaterial.get
|
98
104
|
layer.setThickness(ins_r_value_si * layer.conductivity)
|
@@ -2010,7 +2010,7 @@ class Standard
|
|
2010
2010
|
if existing_sch.is_initialized
|
2011
2011
|
existing_sch = existing_sch.get
|
2012
2012
|
existing_day_sch_vals = existing_sch.defaultDaySchedule.values
|
2013
|
-
if existing_day_sch_vals.size == 1 && existing_day_sch_vals[0]
|
2013
|
+
if existing_day_sch_vals.size == 1 && (existing_day_sch_vals[0] - value).abs < 1.0e-6
|
2014
2014
|
return existing_sch
|
2015
2015
|
end
|
2016
2016
|
end
|
@@ -2524,12 +2524,28 @@ class Standard
|
|
2524
2524
|
# which specifies properties by construction category by climate zone set.
|
2525
2525
|
# AKA the info in Tables 5.5-1-5.5-8
|
2526
2526
|
|
2527
|
-
|
2528
|
-
|
2529
|
-
|
2530
|
-
|
2531
|
-
|
2532
|
-
|
2527
|
+
wwr = model_get_percent_of_surface_range(model, intended_surface_type)
|
2528
|
+
|
2529
|
+
search_criteria = { 'template' => template,
|
2530
|
+
'climate_zone_set' => climate_zone_set,
|
2531
|
+
'intended_surface_type' => intended_surface_type,
|
2532
|
+
'standards_construction_type' => standards_construction_type,
|
2533
|
+
'building_category' => building_category }
|
2534
|
+
|
2535
|
+
if !wwr['minimum_percent_of_surface'].nil? && !wwr['maximum_percent_of_surface'].nil?
|
2536
|
+
search_criteria['minimum_percent_of_surface'] = wwr['minimum_percent_of_surface']
|
2537
|
+
search_criteria['maximum_percent_of_surface'] = wwr['maximum_percent_of_surface']
|
2538
|
+
end
|
2539
|
+
|
2540
|
+
# First search
|
2541
|
+
props = model_find_object(standards_data['construction_properties'], search_criteria)
|
2542
|
+
|
2543
|
+
if !props
|
2544
|
+
# Second search: In case need to use climate zone (e.g: 3) instead of sub-climate zone (e.g: 3A) for search
|
2545
|
+
climate_zone = climate_zone_set[0..-2]
|
2546
|
+
search_criteria['climate_zone_set'] = climate_zone
|
2547
|
+
props = model_find_object(standards_data['construction_properties'], search_criteria)
|
2548
|
+
end
|
2533
2549
|
|
2534
2550
|
if !props
|
2535
2551
|
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find construction properties for: #{template}-#{climate_zone_set}-#{intended_surface_type}-#{standards_construction_type}-#{building_category}.")
|
@@ -3602,6 +3618,12 @@ class Standard
|
|
3602
3618
|
# switch to use this but update test in standards and measures to load this outside of the method
|
3603
3619
|
construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
|
3604
3620
|
|
3621
|
+
if !construction_properties
|
3622
|
+
# Search again use climate zone (e.g. 3) instead of sub-climate zone (3A)
|
3623
|
+
search_criteria['climate_zone_set'] = climate_zone_set[0..-2]
|
3624
|
+
construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
|
3625
|
+
end
|
3626
|
+
|
3605
3627
|
return construction_properties
|
3606
3628
|
end
|
3607
3629
|
|
@@ -3962,6 +3984,9 @@ class Standard
|
|
3962
3984
|
|
3963
3985
|
# Air loops
|
3964
3986
|
model.getAirLoopHVACs.each(&:remove)
|
3987
|
+
if model.version > OpenStudio::VersionString.new('3.1.0')
|
3988
|
+
model.getAirLoopHVACDedicatedOutdoorAirSystems.each(&:remove)
|
3989
|
+
end
|
3965
3990
|
|
3966
3991
|
# Zone equipment
|
3967
3992
|
model.getThermalZones.sort.each do |zone|
|
@@ -4290,7 +4315,7 @@ class Standard
|
|
4290
4315
|
# @param possible_climate_zone_sets [Array] climate zone sets
|
4291
4316
|
# @return [String] climate zone ses
|
4292
4317
|
def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
|
4293
|
-
climate_zone_set = possible_climate_zone_sets.
|
4318
|
+
climate_zone_set = possible_climate_zone_sets.max
|
4294
4319
|
return climate_zone_set
|
4295
4320
|
end
|
4296
4321
|
|
@@ -5185,6 +5210,7 @@ class Standard
|
|
5185
5210
|
electric = true
|
5186
5211
|
|
5187
5212
|
if htg_fuels.include?('NaturalGas') ||
|
5213
|
+
htg_fuels.include?('Propane') ||
|
5188
5214
|
htg_fuels.include?('PropaneGas') ||
|
5189
5215
|
htg_fuels.include?('FuelOilNo1') ||
|
5190
5216
|
htg_fuels.include?('FuelOilNo2') ||
|
@@ -5779,6 +5805,15 @@ class Standard
|
|
5779
5805
|
return parametric_inputs
|
5780
5806
|
end
|
5781
5807
|
|
5808
|
+
# Determine the surface range of a baseline model.
|
5809
|
+
# The method calculates the window to wall ratio (assuming all spaces are conditioned)
|
5810
|
+
# and select the range based on the calculated window to wall ratio
|
5811
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5812
|
+
# @param intended_surface_type [String] surface type
|
5813
|
+
def model_get_percent_of_surface_range(model, intended_surface_type)
|
5814
|
+
return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
|
5815
|
+
end
|
5816
|
+
|
5782
5817
|
# Default SAT reset type
|
5783
5818
|
#
|
5784
5819
|
# @param air_loop_hvac [OpenStudio::Model::AirLoopHVAC] air loop
|
@@ -92,6 +92,21 @@ class Standard
|
|
92
92
|
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards fenestration type for #{planar_surface.name} from #{construction.name}. This surface will not have the standard applied.")
|
93
93
|
return previous_construction_map
|
94
94
|
end
|
95
|
+
# Exterior Doors
|
96
|
+
elsif surf_type == 'ExteriorDoor'
|
97
|
+
stds_type = standards_info.standardsConstructionType
|
98
|
+
if stds_type.is_initialized
|
99
|
+
stds_type = stds_type.get
|
100
|
+
case stds_type
|
101
|
+
when 'RollUp', 'Rollup', 'NonSwinging', 'Nonswinging'
|
102
|
+
stds_type = 'NonSwinging'
|
103
|
+
else
|
104
|
+
stds_type = 'Swinging'
|
105
|
+
end
|
106
|
+
else
|
107
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.PlanarSurface', "Could not determine the standards construction type for exterior door #{planar_surface.name}. This door will not have the standard applied.")
|
108
|
+
return previous_construction_map
|
109
|
+
end
|
95
110
|
# All other surface types
|
96
111
|
else
|
97
112
|
stds_type = standards_info.standardsConstructionType
|
@@ -599,6 +599,13 @@ class Standard
|
|
599
599
|
# switch to use this but update test in standards and measures to load this outside of the method
|
600
600
|
construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
|
601
601
|
|
602
|
+
if !construction_properties
|
603
|
+
# Search again use climate zone (e.g. 3) instead of sub-climate zone (3A)
|
604
|
+
search_criteria['climate_zone_set'] = climate_zone_set[0..-2]
|
605
|
+
construction_properties = model_find_object(standards_data['construction_properties'], search_criteria)
|
606
|
+
end
|
607
|
+
|
608
|
+
|
602
609
|
return construction_properties
|
603
610
|
end
|
604
611
|
end
|