openstudio-standards 0.2.15.pre.rc2 → 0.2.16.rc2
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/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 +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/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/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 +24 -15
- 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 +42 -7
- 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 +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/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
@@ -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)
|
@@ -236,7 +236,7 @@ class OpenStudio::Model::ThermalZone
|
|
236
236
|
# serving those air loops.
|
237
237
|
#
|
238
238
|
# return [Array<String>] An array. Possible values are
|
239
|
-
# Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2,
|
239
|
+
# Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
|
240
240
|
# Coal, Diesel, Gasoline, DistrictCooling, DistrictHeating,
|
241
241
|
# and SolarEnergy.
|
242
242
|
def heating_fuels
|
@@ -278,7 +278,7 @@ class OpenStudio::Model::ThermalZone
|
|
278
278
|
# serving those air loops.
|
279
279
|
#
|
280
280
|
# return [Array<String>] An array. Possible values are
|
281
|
-
# Electricity, NaturalGas, PropaneGas, FuelOilNo1, FuelOilNo2,
|
281
|
+
# Electricity, NaturalGas, Propane, PropaneGas, FuelOilNo1, FuelOilNo2,
|
282
282
|
# Coal, Diesel, Gasoline, DistrictCooling, DistrictHeating,
|
283
283
|
# and SolarEnergy.
|
284
284
|
def cooling_fuels
|
@@ -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
|
@@ -11,6 +11,15 @@ module Laboratory
|
|
11
11
|
def model_custom_hvac_tweaks(model, building_type, climate_zone, prototype_input)
|
12
12
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started building type specific adjustments')
|
13
13
|
|
14
|
+
# get the fume hood space type and exhaust ACH
|
15
|
+
fume_hood_exhaust_ach = nil
|
16
|
+
model.getSpaceTypes.each do |spc_type|
|
17
|
+
next unless spc_type.name.get.to_s.downcase.include? 'fume hood'
|
18
|
+
|
19
|
+
spc_type_properties = space_type_get_standards_data(spc_type)
|
20
|
+
fume_hood_exhaust_ach = spc_type_properties['ventilation_air_changes'].to_f
|
21
|
+
end
|
22
|
+
|
14
23
|
# For fume hood, the OA rate varies with the fume hood schedule
|
15
24
|
# So add "Proportional Control Minimum Outdoor Air Flow Rate Schedule"
|
16
25
|
# at the mean time, modify "Outdoor Air Method" to "ProportionalControlBasedOnDesignOARate" in Controller:MechanicalVentilation of the DOAS
|
@@ -19,6 +28,11 @@ module Laboratory
|
|
19
28
|
|
20
29
|
ventilation = space.designSpecificationOutdoorAir.get
|
21
30
|
ventilation.setOutdoorAirFlowRateFractionSchedule(model_add_schedule(model, 'Lab_FumeHood_Sch'))
|
31
|
+
|
32
|
+
# add exhaust fan to fume hood zone
|
33
|
+
fume_hood_zone_volume = space.volume
|
34
|
+
flow_rate_fume_hood = fume_hood_zone_volume * fume_hood_exhaust_ach / 3600.0
|
35
|
+
model_add_exhaust_fan(model, [space.thermalZone.get], flow_rate: flow_rate_fume_hood, flow_fraction_schedule_name: 'Lab_FumeHood_Sch')
|
22
36
|
end
|
23
37
|
|
24
38
|
# adjust doas sizing
|
@@ -38,12 +52,6 @@ module Laboratory
|
|
38
52
|
end
|
39
53
|
end
|
40
54
|
|
41
|
-
# @todo add exhaust fan to fume hood zone
|
42
|
-
# search_criteria = ...
|
43
|
-
# fume_hood_space = model_find_object(standards_data['Space Types'], search_criteria)
|
44
|
-
# fume_hood_zone_volume = fume_hood_space.getVolume...
|
45
|
-
# flow_rate_fume_hood = fume_hood_zone_volume * fume_hood_space['Ventilation_Air_Changes...']
|
46
|
-
# model_add_exhaust_fan(model, thermal_zones, flow_rate=flow_rate_fume_hood, flow_fraction_schedule_name='Lab_FumeHood_Sch')
|
47
55
|
OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished building type specific adjustments')
|
48
56
|
return true
|
49
57
|
end
|
@@ -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)
|