openstudio-standards 0.2.15 → 0.2.16.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- 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/test_performance_expected_dd_results.csv +710 -710
- 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/prototypes/common/buildings/Prototype.College.rb +26 -5
- 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 +0 -3
- 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 +38 -7
- 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/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 +6 -6
- 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 +6 -6
- 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 +7 -7
- 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 +7 -7
- 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 +12 -12
- 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 +12 -12
- 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/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 +4 -2
@@ -20,8 +20,8 @@ module BTAP
|
|
20
20
|
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Electricity' AND RowName='Electricity:Facility'" +
|
21
21
|
" AND ColumnName='Electricity Maximum Value' AND Units='W'")
|
22
22
|
natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
|
23
|
-
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='
|
24
|
-
" AND ColumnName='Gas Maximum Value' AND Units='W'")
|
23
|
+
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Natural Gas' AND RowName='NaturalGas:Facility'" +
|
24
|
+
" AND ColumnName='Natural Gas Maximum Value' AND Units='W'")
|
25
25
|
|
26
26
|
# Create hash to store all the collected data.
|
27
27
|
qaqc = {}
|
@@ -215,8 +215,8 @@ module BTAP
|
|
215
215
|
end
|
216
216
|
|
217
217
|
natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
|
218
|
-
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='
|
219
|
-
" AND ColumnName='Gas Maximum Value' AND Units='W'")
|
218
|
+
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Natural Gas' AND RowName='NaturalGas:Facility'" +
|
219
|
+
" AND ColumnName='Natural Gas Maximum Value' AND Units='W'")
|
220
220
|
if natural_gas_peak.empty?
|
221
221
|
natural_gas_peak = 0.0
|
222
222
|
end
|
@@ -472,8 +472,8 @@ module BTAP
|
|
472
472
|
end
|
473
473
|
|
474
474
|
natural_gas_peak = model.sqlFile().get().execAndReturnFirstDouble("SELECT Value FROM tabulardatawithstrings WHERE ReportName='EnergyMeters'" +
|
475
|
-
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Gas' AND RowName='
|
476
|
-
" AND ColumnName='Gas Maximum Value' AND Units='W'")
|
475
|
+
" AND ReportForString='Entire Facility' AND TableName='Annual and Peak Values - Natural Gas' AND RowName='NaturalGas:Facility'" +
|
476
|
+
" AND ColumnName='Natural Gas Maximum Value' AND Units='W'")
|
477
477
|
if natural_gas_peak.empty?
|
478
478
|
natural_gas_peak = 0.0
|
479
479
|
end
|
@@ -54,60 +54,6 @@ class OpenStudio::Model::ControllerOutdoorAir
|
|
54
54
|
end
|
55
55
|
air_loop = oa_sys.airLoop.get
|
56
56
|
|
57
|
-
# Determine if the system is multizone
|
58
|
-
multizone = false
|
59
|
-
if air_loop.thermalZones.size > 1
|
60
|
-
multizone = true
|
61
|
-
end
|
62
|
-
|
63
|
-
# Determine if the system is variable volume
|
64
|
-
vav = false
|
65
|
-
air_loop.supplyComponents.reverse.each do |comp|
|
66
|
-
if comp.to_FanVariableVolume.is_initialized
|
67
|
-
vav = true
|
68
|
-
elsif comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.is_initialized
|
69
|
-
fan = comp.to_AirLoopHVACUnitaryHeatCoolVAVChangeoverBypass.get.supplyAirFan
|
70
|
-
if fan.to_FanVariableVolume.is_initialized
|
71
|
-
vav = true
|
72
|
-
end
|
73
|
-
elsif comp.to_AirLoopHVACUnitarySystem.is_initialized
|
74
|
-
fan = comp.to_AirLoopHVACUnitarySystem.get.supplyFan
|
75
|
-
if fan.is_initialized
|
76
|
-
if fan.get.to_FanVariableVolume.is_initialized
|
77
|
-
vav = true
|
78
|
-
end
|
79
|
-
end
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
# If it is a multizone VAV system, get the system multiplier
|
84
|
-
# to work around the bug in EnergyPlus.
|
85
|
-
if multizone && vav
|
86
|
-
if oa.is_initialized
|
87
|
-
oa_val = oa.get
|
88
|
-
|
89
|
-
# Get the system multiplier
|
90
|
-
mult = 1
|
91
|
-
|
92
|
-
# Get all the zone multipliers
|
93
|
-
zn_mults = []
|
94
|
-
air_loop.thermalZones.each do |zone|
|
95
|
-
zn_mults << zone.multiplier
|
96
|
-
end
|
97
|
-
|
98
|
-
# Warn if there are different multipliers
|
99
|
-
uniq_mults = zn_mults.uniq
|
100
|
-
if uniq_mults.size > 1
|
101
|
-
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.AirLoopHVAC', "For #{air_loop.name}: not all zones on the system have an identical zone multiplier. Multipliers are: #{uniq_mults.join(', ')}.")
|
102
|
-
else
|
103
|
-
mult = uniq_mults[0]
|
104
|
-
end
|
105
|
-
|
106
|
-
oa_val = oa_val * mult
|
107
|
-
oa = OpenStudio::OptionalDouble.new(oa_val)
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
57
|
return oa
|
112
58
|
end
|
113
59
|
end
|
@@ -263,6 +263,11 @@ class OpenStudio::Model::Model
|
|
263
263
|
# Get the object type
|
264
264
|
obj_type = equipment.iddObjectType.valueName.to_s
|
265
265
|
case obj_type
|
266
|
+
when 'OS_AirLooHVAC_UnitarySystem'
|
267
|
+
equipment = equipment.to_AirLoopHVACUnitarySystem.get
|
268
|
+
if equipment.heatingCoil.is_initialized
|
269
|
+
fuels += self.coil_heating_fuels(equipment.heatingCoil.get)
|
270
|
+
end
|
266
271
|
when 'OS_AirTerminal_SingleDuct_ConstantVolume_FourPipeInduction'
|
267
272
|
equipment = equipment.to_AirTerminalSingleDuctConstantVolumeFourPipeInduction.get
|
268
273
|
fuels += self.coil_heating_fuels(equipment.heatingCoil)
|
@@ -350,7 +355,12 @@ class OpenStudio::Model::Model
|
|
350
355
|
zone.equipment.each do |equipment|
|
351
356
|
# Get the object type
|
352
357
|
obj_type = equipment.iddObjectType.valueName.to_s
|
353
|
-
case obj_type
|
358
|
+
case obj_type
|
359
|
+
when 'OS_AirLoopHVAC_UnitarySystem'
|
360
|
+
equipment = equipment.to_AirLoopHVACUnitarySystem.get
|
361
|
+
if equipment.coolingCoil.is_initialized
|
362
|
+
fuels += self.coil_cooling_fuels(equipment.coolingCoil.get)
|
363
|
+
end
|
354
364
|
when 'OS_AirTerminal_SingleDuct_ConstantVolume_CooledBeam'
|
355
365
|
equipment = equipment.to_AirTerminalSingleDuctConstantVolumeCooledBeam.get
|
356
366
|
fuels += self.coil_cooling_fuels(equipment.coilCoolingCooledBeam)
|
@@ -9,6 +9,27 @@ module College
|
|
9
9
|
# @param prototype_input [Hash] hash of prototype inputs
|
10
10
|
# @return [Bool] returns true if successful, false if not
|
11
11
|
def model_custom_hvac_tweaks(model, building_type, climate_zone, prototype_input)
|
12
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
|
13
|
+
|
14
|
+
model.getSpaces.each do |space|
|
15
|
+
if space.name.get.to_s == 'CB_PUBLIC_ELEVATORS_F1'
|
16
|
+
model_add_elevator(model,
|
17
|
+
space,
|
18
|
+
prototype_input['number_of_elevators'],
|
19
|
+
prototype_input['elevator_type'],
|
20
|
+
prototype_input['elevator_schedule'],
|
21
|
+
prototype_input['elevator_fan_schedule'],
|
22
|
+
prototype_input['elevator_fan_schedule'],
|
23
|
+
building_type)
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
|
28
|
+
|
29
|
+
# add extra infiltration for entry door
|
30
|
+
add_door_infiltration(climate_zone, model)
|
31
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Added door infiltration')
|
32
|
+
|
12
33
|
return true
|
13
34
|
end
|
14
35
|
|
@@ -25,7 +46,7 @@ module College
|
|
25
46
|
infiltration_entrydoor.setName('entry door Infiltration')
|
26
47
|
infiltration_per_zone_entrydoor = 0
|
27
48
|
if template == '90.1-2004'
|
28
|
-
infiltration_per_zone_entrydoor =
|
49
|
+
infiltration_per_zone_entrydoor = 4.566024
|
29
50
|
infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
|
30
51
|
elsif template == '90.1-2007'
|
31
52
|
case climate_zone
|
@@ -35,10 +56,10 @@ module College
|
|
35
56
|
'ASHRAE 169-2006-4A',
|
36
57
|
'ASHRAE 169-2006-4B',
|
37
58
|
'ASHRAE 169-2006-4C'
|
38
|
-
infiltration_per_zone_entrydoor =
|
59
|
+
infiltration_per_zone_entrydoor = 3.204085
|
39
60
|
infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
|
40
61
|
else
|
41
|
-
infiltration_per_zone_entrydoor =
|
62
|
+
infiltration_per_zone_entrydoor = 4.566024
|
42
63
|
infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
|
43
64
|
end
|
44
65
|
elsif template == '90.1-2010' || template == '90.1-2013'
|
@@ -46,10 +67,10 @@ module College
|
|
46
67
|
when 'ASHRAE 169-2006-3A',
|
47
68
|
'ASHRAE 169-2006-3B',
|
48
69
|
'ASHRAE 169-2006-3C'
|
49
|
-
infiltration_per_zone_entrydoor =
|
70
|
+
infiltration_per_zone_entrydoor = 3.204085
|
50
71
|
infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
|
51
72
|
else
|
52
|
-
infiltration_per_zone_entrydoor =
|
73
|
+
infiltration_per_zone_entrydoor = 4.566024
|
53
74
|
infiltration_entrydoor.setSchedule(model_add_schedule(model, 'College INFIL_Door_Opening_SCH'))
|
54
75
|
end
|
55
76
|
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)
|
@@ -5480,7 +5480,6 @@ class Standard
|
|
5480
5480
|
ventilation.setSchedule(availability_schedule)
|
5481
5481
|
|
5482
5482
|
if ventilation_type == 'Exhaust'
|
5483
|
-
ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
|
5484
5483
|
ventilation.setDesignFlowRate(flow_rate)
|
5485
5484
|
ventilation.setFanPressureRise(31.1361206455786)
|
5486
5485
|
ventilation.setFanTotalEfficiency(0.51)
|
@@ -5491,7 +5490,6 @@ class Standard
|
|
5491
5490
|
ventilation.setMaximumIndoorTemperature(100.0)
|
5492
5491
|
ventilation.setDeltaTemperature(-100.0)
|
5493
5492
|
elsif ventilation_type == 'Natural'
|
5494
|
-
ventilation.setDesignFlowRateCalculationMethod('Flow/Zone')
|
5495
5493
|
ventilation.setDesignFlowRate(flow_rate)
|
5496
5494
|
ventilation.setFanPressureRise(0.0)
|
5497
5495
|
ventilation.setFanTotalEfficiency(1.0)
|
@@ -5502,7 +5500,6 @@ class Standard
|
|
5502
5500
|
ventilation.setMaximumIndoorTemperature(29.4444452244559)
|
5503
5501
|
ventilation.setDeltaTemperature(-100.0)
|
5504
5502
|
elsif ventilation_type == 'Intake'
|
5505
|
-
ventilation.setDesignFlowRateCalculationMethod('Flow/Area')
|
5506
5503
|
ventilation.setFlowRateperZoneFloorArea(flow_rate)
|
5507
5504
|
ventilation.setFanPressureRise(49.8)
|
5508
5505
|
ventilation.setFanTotalEfficiency(0.53625)
|
@@ -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)
|
@@ -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
|
|
@@ -4290,7 +4312,7 @@ class Standard
|
|
4290
4312
|
# @param possible_climate_zone_sets [Array] climate zone sets
|
4291
4313
|
# @return [String] climate zone ses
|
4292
4314
|
def model_get_climate_zone_set_from_list(model, possible_climate_zone_sets)
|
4293
|
-
climate_zone_set = possible_climate_zone_sets.
|
4315
|
+
climate_zone_set = possible_climate_zone_sets.max
|
4294
4316
|
return climate_zone_set
|
4295
4317
|
end
|
4296
4318
|
|
@@ -5779,6 +5801,15 @@ class Standard
|
|
5779
5801
|
return parametric_inputs
|
5780
5802
|
end
|
5781
5803
|
|
5804
|
+
# Determine the surface range of a baseline model.
|
5805
|
+
# The method calculates the window to wall ratio (assuming all spaces are conditioned)
|
5806
|
+
# and select the range based on the calculated window to wall ratio
|
5807
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
5808
|
+
# @param intended_surface_type [String] surface type
|
5809
|
+
def model_get_percent_of_surface_range(model, intended_surface_type)
|
5810
|
+
return { 'minimum_percent_of_surface' => nil, 'maximum_percent_of_surface' => nil }
|
5811
|
+
end
|
5812
|
+
|
5782
5813
|
# Default SAT reset type
|
5783
5814
|
#
|
5784
5815
|
# @param air_loop_hvac [OpenStudio::Model::AirLoopHVAC] air loop
|
@@ -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
|