openstudio-standards 0.2.15.pre.rc2 → 0.2.16.rc2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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)
|