openstudio-standards 0.2.17.rc1 → 0.2.17.rc2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
- data/data/standards/openstudio_standards_duplicates_log.csv +5 -0
- data/lib/openstudio-standards/btap/btap_result.rb +138 -138
- data/lib/openstudio-standards/btap/economics.rb +58 -53
- data/lib/openstudio-standards/btap/envelope.rb +1 -1
- data/lib/openstudio-standards/btap/fileio.rb +12 -12
- data/lib/openstudio-standards/btap/measures.rb +63 -59
- data/lib/openstudio-standards/btap/vintagizer.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +9 -3
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +50 -22
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +15 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.Model.rb +18 -18
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +1 -1
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +3 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +43 -40
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +2 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.entryways.json +8 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.parking.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +9 -9
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +5 -1
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +5 -1
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +8 -4
- data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +8 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +7 -3
- data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +4 -4
- data/lib/openstudio-standards/version.rb +1 -1
- metadata +4 -2
data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb
CHANGED
@@ -640,46 +640,49 @@ class ASHRAE9012019 < ASHRAE901
|
|
640
640
|
# Controller:MechanicalVentilation object
|
641
641
|
# to the design v_ot using the maximum OA
|
642
642
|
# fraction schedule
|
643
|
-
|
644
|
-
#
|
645
|
-
|
646
|
-
|
647
|
-
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
|
666
|
-
|
667
|
-
|
668
|
-
|
669
|
-
|
670
|
-
|
671
|
-
|
672
|
-
|
673
|
-
|
674
|
-
|
675
|
-
|
676
|
-
|
677
|
-
|
678
|
-
|
679
|
-
|
680
|
-
|
681
|
-
|
682
|
-
|
643
|
+
# In newer EnergyPlus versions, this is handled by Standard62.1VentilationRateProcedureWithLimit
|
644
|
+
# in the Controller:MechanicalVentilation object
|
645
|
+
if air_loop_hvac.model.version < OpenStudio::VersionString.new('3.3.0')
|
646
|
+
# Add EMS sensors
|
647
|
+
# OA mass flow calculated by the Controller:MechanicalVentilation
|
648
|
+
air_loop_hvac_name_ems = "EMS_#{air_loop_hvac.name.to_s.gsub(' ', '_')}"
|
649
|
+
oa_vrp_mass_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'Air System Outdoor Air Mechanical Ventilation Requested Mass Flow Rate')
|
650
|
+
oa_vrp_mass_flow.setKeyName(air_loop_hvac.name.to_s)
|
651
|
+
oa_vrp_mass_flow.setName("#{air_loop_hvac_name_ems}_OA_VRP")
|
652
|
+
# Actual sensed OA mass flow
|
653
|
+
oa_mass_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'Air System Outdoor Air Mass Flow Rate')
|
654
|
+
oa_mass_flow.setKeyName(air_loop_hvac.name.to_s)
|
655
|
+
oa_mass_flow.setName("#{air_loop_hvac_name_ems}_OA")
|
656
|
+
# Actual sensed volumetric OA flow
|
657
|
+
oa_vol_flow = OpenStudio::Model::EnergyManagementSystemSensor.new(air_loop_hvac.model, 'System Node Standard Density Volume Flow Rate')
|
658
|
+
oa_vol_flow.setKeyName("#{air_loop_hvac.name} Mixed Air Node")
|
659
|
+
oa_vol_flow.setName("#{air_loop_hvac_name_ems}_SUPPLY_FLOW")
|
660
|
+
|
661
|
+
# Add EMS actuator
|
662
|
+
max_oa_fraction = OpenStudio::Model::EnergyManagementSystemActuator.new(max_oa_frac_sch, max_oa_frac_sch_type, 'Schedule Value')
|
663
|
+
max_oa_fraction.setName("#{air_loop_hvac_name_ems}_MAX_OA_FRAC")
|
664
|
+
|
665
|
+
# Add EMS program
|
666
|
+
max_oa_ems_prog = OpenStudio::Model::EnergyManagementSystemProgram.new(air_loop_hvac.model)
|
667
|
+
max_oa_ems_prog.setName("#{air_loop_hvac.name}_MAX_OA_FRAC")
|
668
|
+
max_oa_ems_prog_body = <<-EMS
|
669
|
+
IF #{air_loop_hvac_name_ems}_OA > #{air_loop_hvac_name_ems}_OA_VRP,
|
670
|
+
SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = NULL,
|
671
|
+
ELSE,
|
672
|
+
IF #{air_loop_hvac_name_ems}_SUPPLY_FLOW > 0,
|
673
|
+
SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = #{v_ot} / #{air_loop_hvac_name_ems}_SUPPLY_FLOW,
|
674
|
+
ELSE,
|
675
|
+
SET #{air_loop_hvac_name_ems}_MAX_OA_FRAC = NULL,
|
676
|
+
ENDIF,
|
677
|
+
ENDIF
|
678
|
+
EMS
|
679
|
+
max_oa_ems_prog.setBody(max_oa_ems_prog_body)
|
680
|
+
|
681
|
+
max_oa_ems_prog_manager = OpenStudio::Model::EnergyManagementSystemProgramCallingManager.new(air_loop_hvac.model)
|
682
|
+
max_oa_ems_prog_manager.setName("SET_#{air_loop_hvac.name.to_s.gsub(' ', '_')}_MAX_OA_FRAC")
|
683
|
+
max_oa_ems_prog_manager.setCallingPoint('InsideHVACSystemIterationLoop')
|
684
|
+
max_oa_ems_prog_manager.addProgram(max_oa_ems_prog)
|
685
|
+
end
|
683
686
|
|
684
687
|
# Hard-size the sizing:system
|
685
688
|
# object with the calculated min OA flow rate
|
@@ -44,7 +44,8 @@ class ASHRAE9012019 < ASHRAE901
|
|
44
44
|
end
|
45
45
|
|
46
46
|
# Set fan operating schedule during assumed occupant standby mode time to 0 so the fan can cycle
|
47
|
-
|
47
|
+
# ZoneHVACFourPipeFanCoil has it optional, PTAC/PTHP starting a 3.5.0 is required
|
48
|
+
new_sch = model_set_schedule_value(OpenStudio::Model::OptionalSchedule.new(zone_hvac_component.supplyAirFanOperatingModeSchedule).get, '12' => 0)
|
48
49
|
zone_hvac_component.setSupplyAirFanOperatingModeSchedule(new_sch) unless new_sch == true
|
49
50
|
|
50
51
|
return true
|
@@ -2,25 +2,25 @@
|
|
2
2
|
"entryways": [
|
3
3
|
{
|
4
4
|
"building_type": "College",
|
5
|
-
"rollup_doors_per_10,000":
|
6
|
-
"entrance_doors_per_10,000":
|
7
|
-
"others_doors_per_10,000":
|
5
|
+
"rollup_doors_per_10,000": 0.0,
|
6
|
+
"entrance_doors_per_10,000": 2.0,
|
7
|
+
"others_doors_per_10,000": 2.45,
|
8
8
|
"entrance_canopies": null,
|
9
9
|
"emergency_canopies": null,
|
10
10
|
"canopy_size": null,
|
11
11
|
"floor_area_per_drive_through_window": null,
|
12
|
-
"notes":
|
12
|
+
"notes": "match secondary school"
|
13
13
|
},
|
14
14
|
{
|
15
15
|
"building_type": "Courthouse",
|
16
|
-
"rollup_doors_per_10,000":
|
17
|
-
"entrance_doors_per_10,000":
|
18
|
-
"others_doors_per_10,000":
|
16
|
+
"rollup_doors_per_10,000": 0.0,
|
17
|
+
"entrance_doors_per_10,000": 1.0,
|
18
|
+
"others_doors_per_10,000": 3.0,
|
19
19
|
"entrance_canopies": null,
|
20
20
|
"emergency_canopies": null,
|
21
21
|
"canopy_size": null,
|
22
22
|
"floor_area_per_drive_through_window": null,
|
23
|
-
"notes":
|
23
|
+
"notes": "match medium office"
|
24
24
|
},
|
25
25
|
{
|
26
26
|
"building_type": "FullServiceRestaurant",
|
@@ -2,7 +2,7 @@
|
|
2
2
|
"parking": [
|
3
3
|
{
|
4
4
|
"building_type": "College",
|
5
|
-
"building_area_per_spot":
|
5
|
+
"building_area_per_spot": 250.0,
|
6
6
|
"units_per_spot": null,
|
7
7
|
"students_per_spot": null,
|
8
8
|
"beds_per_spot": null,
|
@@ -11,7 +11,7 @@
|
|
11
11
|
},
|
12
12
|
{
|
13
13
|
"building_type": "Courthouse",
|
14
|
-
"building_area_per_spot":
|
14
|
+
"building_area_per_spot": 250.0,
|
15
15
|
"units_per_spot": null,
|
16
16
|
"students_per_spot": null,
|
17
17
|
"beds_per_spot": null,
|
@@ -47,4 +47,15 @@ class DOERef1980to2004 < ASHRAE901
|
|
47
47
|
damper_action = 'Single Maximum'
|
48
48
|
return damper_action
|
49
49
|
end
|
50
|
+
|
51
|
+
# Determine minimum ventilation efficiency for zones.
|
52
|
+
# For DOE Ref 1980-2004, assume that VAV system designers did not
|
53
|
+
# care about decreasing system OA flow rates and therefore did not
|
54
|
+
# adjust minimum damper positions to achieve any specific
|
55
|
+
# ventilation efficiency.
|
56
|
+
def air_loop_hvac_minimum_zone_ventilation_efficiency(air_loop_hvac)
|
57
|
+
min_ventilation_efficiency = 0
|
58
|
+
|
59
|
+
return min_ventilation_efficiency
|
60
|
+
end
|
50
61
|
end
|
data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb
CHANGED
@@ -47,4 +47,15 @@ class DOERefPre1980 < ASHRAE901
|
|
47
47
|
damper_action = 'Single Maximum'
|
48
48
|
return damper_action
|
49
49
|
end
|
50
|
+
|
51
|
+
# Determine minimum ventilation efficiency for zones.
|
52
|
+
# For DOE Ref Pre-1980, assume that VAV system designers did not
|
53
|
+
# care about decreasing system OA flow rates and therefore did not
|
54
|
+
# adjust minimum damper positions to achieve any specific
|
55
|
+
# ventilation efficiency.
|
56
|
+
def air_loop_hvac_minimum_zone_ventilation_efficiency(air_loop_hvac)
|
57
|
+
min_ventilation_efficiency = 0
|
58
|
+
|
59
|
+
return min_ventilation_efficiency
|
60
|
+
end
|
50
61
|
end
|
@@ -272,7 +272,7 @@ class ASHRAE901PRM < Standard
|
|
272
272
|
return_fan_power_fraction /= total_fan_avg_fan_w
|
273
273
|
relief_fan_power_fraction /= total_fan_avg_fan_w
|
274
274
|
else
|
275
|
-
|
275
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.ashrae_90_1_prm.AirLoopHVAC', "Total zone design airflow for #{air_loop_hvac.name} is 0.")
|
276
276
|
end
|
277
277
|
elsif system_type == 'PTAC' ||
|
278
278
|
system_type == 'PTHP' ||
|
@@ -1176,7 +1176,7 @@ class ASHRAE901PRM < Standard
|
|
1176
1176
|
# Template method for adding a setpoint manager for a coil control logic to a heating coil.
|
1177
1177
|
# ASHRAE 90.1-2019 Appendix G.
|
1178
1178
|
#
|
1179
|
-
# @param model [OpenStudio::Model::Model]
|
1179
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1180
1180
|
# @param thermalZones Array([OpenStudio::Model::ThermalZone]) thermal zone array
|
1181
1181
|
# @param coil Heating Coils
|
1182
1182
|
# @return [Boolean] true
|
@@ -1228,7 +1228,7 @@ class ASHRAE901PRM < Standard
|
|
1228
1228
|
# - 'false' otherwise
|
1229
1229
|
#
|
1230
1230
|
# @author Xuechen (Jerry) Lei, PNNL
|
1231
|
-
# @param model [OpenStudio::Model::Model]
|
1231
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1232
1232
|
def model_mark_zone_dcv_existence(model)
|
1233
1233
|
model.getAirLoopHVACs.each do |air_loop_hvac|
|
1234
1234
|
next unless air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
|
@@ -1274,7 +1274,7 @@ class ASHRAE901PRM < Standard
|
|
1274
1274
|
# "one user specified DCV exception"
|
1275
1275
|
#
|
1276
1276
|
# @author Xuechen (Jerry) Lei, PNNL
|
1277
|
-
# @param model [OpenStudio::Model::Model]
|
1277
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1278
1278
|
def model_add_dcv_user_exception_properties(model)
|
1279
1279
|
model.getAirLoopHVACs.each do |air_loop_hvac|
|
1280
1280
|
dcv_airloop_user_exception = false
|
@@ -1336,7 +1336,7 @@ class ASHRAE901PRM < Standard
|
|
1336
1336
|
# - 'flase' otherwise
|
1337
1337
|
#
|
1338
1338
|
# @author Xuechen (Jerry) Lei, PNNL
|
1339
|
-
# @param model [OpenStudio::Model::Model]
|
1339
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1340
1340
|
def model_add_dcv_requirement_properties(model)
|
1341
1341
|
model.getAirLoopHVACs.each do |air_loop_hvac|
|
1342
1342
|
if user_model_air_loop_hvac_demand_control_ventilation_required?(air_loop_hvac)
|
@@ -1370,7 +1370,7 @@ class ASHRAE901PRM < Standard
|
|
1370
1370
|
# generation
|
1371
1371
|
#
|
1372
1372
|
# @author Xuechen (Jerry) Lei, PNNL
|
1373
|
-
# @param model [OpenStudio::Model::Model]
|
1373
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1374
1374
|
def model_raise_user_model_dcv_errors(model)
|
1375
1375
|
# TODO: JXL add log msgs to PRM logger
|
1376
1376
|
model.getThermalZones.each do |thermal_zone|
|
@@ -1396,7 +1396,7 @@ class ASHRAE901PRM < Standard
|
|
1396
1396
|
# property 'apxg no need to have DCV' added
|
1397
1397
|
#
|
1398
1398
|
# @author Xuechen (Jerry) Lei, PNNL
|
1399
|
-
# @param model [OpenStudio::Model::Model]
|
1399
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1400
1400
|
def model_add_apxg_dcv_properties(model)
|
1401
1401
|
model.getAirLoopHVACs.each do |air_loop_hvac|
|
1402
1402
|
if air_loop_hvac.airLoopHVACOutdoorAirSystem.is_initialized
|
@@ -1434,7 +1434,7 @@ class ASHRAE901PRM < Standard
|
|
1434
1434
|
# Set DCV in baseline HVAC system if required
|
1435
1435
|
#
|
1436
1436
|
# @author Xuechen (Jerry) Lei, PNNL
|
1437
|
-
# @param model [OpenStudio::Model::Model]
|
1437
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model
|
1438
1438
|
def model_set_baseline_demand_control_ventilation(model, climate_zone)
|
1439
1439
|
model.getAirLoopHVACs.each do |air_loop_hvac|
|
1440
1440
|
if baseline_air_loop_hvac_demand_control_ventilation_required?(air_loop_hvac)
|
@@ -1452,7 +1452,7 @@ class ASHRAE901PRM < Standard
|
|
1452
1452
|
# include data source from:
|
1453
1453
|
# 1. user data csv files
|
1454
1454
|
# 2. data from measure and OpenStudio interface
|
1455
|
-
# @param [
|
1455
|
+
# @param [OpenStudio:model:Model] model
|
1456
1456
|
# @param [String] climate_zone
|
1457
1457
|
# @param [String] default_hvac_building_type
|
1458
1458
|
# @param [String] default_wwr_building_type
|
@@ -1948,7 +1948,7 @@ class ASHRAE901PRM < Standard
|
|
1948
1948
|
# The default shall be true
|
1949
1949
|
#
|
1950
1950
|
# @param [Boolean] run_all_orients: user inputs to indicate whether it is required to run all orientations
|
1951
|
-
# @param [OpenStudio::Model::Model]
|
1951
|
+
# @param [OpenStudio::Model::Model] OpenStudio model
|
1952
1952
|
def run_all_orientations(run_all_orients, user_model)
|
1953
1953
|
# Step 0, assign the default value
|
1954
1954
|
run_orients_flag = run_all_orients
|
@@ -7,7 +7,7 @@ class ASHRAE901PRM < Standard
|
|
7
7
|
# create a construction that meets those properties and assign it to this surface.
|
8
8
|
# 90.1-PRM-2019
|
9
9
|
#
|
10
|
-
# @param planar_surface [
|
10
|
+
# @param planar_surface [OpenStudio::Model:PlanarSurface] surface object
|
11
11
|
# @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
|
12
12
|
# @param previous_construction_map [Hash] a hash where the keys are an array of inputs
|
13
13
|
# [template, climate_zone, intended_surface_type, standards_construction_type, occ_type]
|
@@ -112,7 +112,11 @@ class ASHRAE901PRM < Standard
|
|
112
112
|
sizing_run_ran = model_run_sizing_run(model, "#{sizing_run_dir}/SR_cooling_plant") if !sizing_run_ran
|
113
113
|
|
114
114
|
if sizing_run_ran
|
115
|
-
|
115
|
+
if model.version <= OpenStudio::VersionString.new('3.2.1')
|
116
|
+
sizing_run_capacity = model.getAutosizedValueFromEquipmentSummary(chiller, 'Central Plant', 'Nominal Capacity', 'W').get
|
117
|
+
else
|
118
|
+
sizing_run_capacity = model.getAutosizedValueFromEquipmentSummary(chiller, 'Central Plant', 'Rated Capacity', 'W').get
|
119
|
+
end
|
116
120
|
chiller.setReferenceCapacity(sizing_run_capacity)
|
117
121
|
total_cooling_capacity_w += sizing_run_capacity
|
118
122
|
else
|
@@ -235,7 +235,11 @@ class BTAPPRE1980
|
|
235
235
|
air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(system_data[:CentralHeatingDesignSupplyAirTemperature])
|
236
236
|
air_loop_sizing.setAllOutdoorAirinCooling(system_data[:AllOutdoorAirinCooling])
|
237
237
|
air_loop_sizing.setAllOutdoorAirinHeating(system_data[:AllOutdoorAirinHeating])
|
238
|
-
|
238
|
+
if model.version < OpenStudio::VersionString.new('2.7.0')
|
239
|
+
air_loop_sizing.setMinimumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio])
|
240
|
+
else
|
241
|
+
air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio])
|
242
|
+
end
|
239
243
|
|
240
244
|
supply_fan = OpenStudio::Model::FanVariableVolume.new(model, always_on)
|
241
245
|
supply_fan.setName('Sys6 Supply Fan')
|
@@ -442,7 +442,7 @@ class ECMS
|
|
442
442
|
end
|
443
443
|
return storey_zones_map
|
444
444
|
end
|
445
|
-
|
445
|
+
|
446
446
|
#==============================================================================================================================
|
447
447
|
# Update the map between systems and zones
|
448
448
|
def update_system_zones_map(model,system_zones_map,system_zones_map_option,system_key)
|
@@ -482,7 +482,7 @@ class ECMS
|
|
482
482
|
system_zones_map = update_system_zones_map(model,system_zones_map,ecm_system_zones_map_option,'sys_1')
|
483
483
|
else
|
484
484
|
updated_system_zones_map = {}
|
485
|
-
system_zones_map.each {|sname,zones| updated_system_zones_map["sys_1#{sname[5..-1]}"] = zones} # doas unit is an NECB sys_1
|
485
|
+
system_zones_map.each {|sname,zones| updated_system_zones_map["sys_1#{sname[5..-1]}"] = zones} # doas unit is an NECB sys_1
|
486
486
|
system_zones_map = updated_system_zones_map
|
487
487
|
end
|
488
488
|
# Add outdoor VRF unit
|
@@ -612,7 +612,11 @@ class ECMS
|
|
612
612
|
airloop.sizingSystem.setSystemOutdoorAirMethod('ZoneSum')
|
613
613
|
airloop.sizingSystem.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
|
614
614
|
airloop.sizingSystem.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
|
615
|
-
|
615
|
+
if model.version < OpenStudio::VersionString.new('2.7.0')
|
616
|
+
airloop.sizingSystem.setMinimumSystemAirFlowRatio(1.0)
|
617
|
+
else
|
618
|
+
airloop.sizingSystem.setCentralHeatingMaximumSystemAirFlowRatio(1.0)
|
619
|
+
end
|
616
620
|
case sys_vent_type.downcase
|
617
621
|
when 'doas'
|
618
622
|
airloop.sizingSystem.setAllOutdoorAirinCooling(true)
|
@@ -1126,7 +1130,7 @@ class ECMS
|
|
1126
1130
|
# There is an error in EnergyPlus in the estimated capacity of the coil "CoilCoolingDXVariableSpeed".
|
1127
1131
|
# Here the capacity reported by OS is adjusted to estimate an appropriate capacity for the cooling coil.
|
1128
1132
|
# The autosized capacity is corrected for the actual fan flow rate and fan power.
|
1129
|
-
if supply_fan.autosizedMaximumFlowRate.is_initialized
|
1133
|
+
if supply_fan.autosizedMaximumFlowRate.is_initialized
|
1130
1134
|
fan_max_afr = supply_fan.autosizedMaximumFlowRate.to_f
|
1131
1135
|
elsif supply_fan.maximumFlowRate.is_initialized
|
1132
1136
|
fan_max_afr = supply_fan.maximumFlowRate.to_f
|
@@ -121,8 +121,11 @@ class ECMS
|
|
121
121
|
|
122
122
|
##### Add a "ZoneVentilation:DesignFlowRate" object for NV to set OA per person.
|
123
123
|
zn_vent_design_flow_rate_1 = OpenStudio::Model::ZoneVentilationDesignFlowRate.new(model)
|
124
|
-
zn_vent_design_flow_rate_1.setDesignFlowRateCalculationMethod('Flow/Person')
|
125
124
|
zn_vent_design_flow_rate_1.setFlowRateperPerson(oa_per_person_normalized_by_number_of_windows)
|
125
|
+
if model.version < OpenStudio::VersionString.new('3.5.0')
|
126
|
+
# Design Flow Rate Calculation Method is automatically set in 3.5.0+
|
127
|
+
zn_vent_design_flow_rate_1.setDesignFlowRateCalculationMethod('Flow/Person')
|
128
|
+
end
|
126
129
|
zn_vent_design_flow_rate_1.setVentilationType('Natural')
|
127
130
|
zn_vent_design_flow_rate_1.setMinimumIndoorTemperatureSchedule(min_Tin_schedule)
|
128
131
|
zn_vent_design_flow_rate_1.setMaximumIndoorTemperatureSchedule(max_Tin_schedule)
|
@@ -133,8 +136,11 @@ class ECMS
|
|
133
136
|
|
134
137
|
##### Add another "ZoneVentilation:DesignFlowRate" object for NV to set OA per floor area.
|
135
138
|
zn_vent_design_flow_rate_2 = OpenStudio::Model::ZoneVentilationDesignFlowRate.new(model)
|
136
|
-
zn_vent_design_flow_rate_2.setDesignFlowRateCalculationMethod('Flow/Area')
|
137
139
|
zn_vent_design_flow_rate_2.setFlowRateperZoneFloorArea(oa_per_floor_area_normalized_by_number_of_windows)
|
140
|
+
if model.version < OpenStudio::VersionString.new('3.5.0')
|
141
|
+
# Design Flow Rate Calculation Method is automatically set in 3.5.0+
|
142
|
+
zn_vent_design_flow_rate_2.setDesignFlowRateCalculationMethod('Flow/Area')
|
143
|
+
end
|
138
144
|
zn_vent_design_flow_rate_2.setVentilationType('Natural')
|
139
145
|
zn_vent_design_flow_rate_2.setMinimumIndoorTemperatureSchedule(min_Tin_schedule)
|
140
146
|
zn_vent_design_flow_rate_2.setMaximumIndoorTemperatureSchedule(max_Tin_schedule)
|
@@ -21,9 +21,9 @@ class NECB2011
|
|
21
21
|
# @return [Bool] returns true if an economizer is required, false if not
|
22
22
|
def air_loop_hvac_economizer_required?(air_loop_hvac)
|
23
23
|
economizer_required = false
|
24
|
-
|
24
|
+
|
25
25
|
# need a better way to determine if an economizer is needed.
|
26
|
-
return economizer_required if ((air_loop_hvac.name.to_s.include? 'Outpatient F1' ) ||
|
26
|
+
return economizer_required if ((air_loop_hvac.name.to_s.include? 'Outpatient F1' ) ||
|
27
27
|
(air_loop_hvac.sizingSystem.typeofLoadtoSizeOn.to_s == "VentilationRequirement"))
|
28
28
|
|
29
29
|
# A big number of btu per hr as the minimum requirement
|
@@ -1997,7 +1997,11 @@ class NECB2011
|
|
1997
1997
|
air_loop_sizing.setCentralHeatingDesignSupplyAirTemperature(system_data[:CentralHeatingDesignSupplyAirTemperature]) unless system_data[:CentralHeatingDesignSupplyAirTemperature].nil?
|
1998
1998
|
air_loop_sizing.setAllOutdoorAirinCooling(system_data[:AllOutdoorAirinCooling]) unless system_data[:AllOutdoorAirinCooling].nil?
|
1999
1999
|
air_loop_sizing.setAllOutdoorAirinHeating(system_data[:AllOutdoorAirinHeating]) unless system_data[:AllOutdoorAirinHeating].nil?
|
2000
|
-
|
2000
|
+
if model.version < OpenStudio::VersionString.new('2.7.0')
|
2001
|
+
air_loop_sizing.setMinimumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio]) unless system_data[:MinimumSystemAirFlowRatio].nil?
|
2002
|
+
else
|
2003
|
+
air_loop_sizing.setCentralHeatingMaximumSystemAirFlowRatio(system_data[:MinimumSystemAirFlowRatio]) unless system_data[:MinimumSystemAirFlowRatio].nil?
|
2004
|
+
end
|
2001
2005
|
return mau_air_loop
|
2002
2006
|
end
|
2003
2007
|
|
@@ -835,7 +835,7 @@ class NECB2011
|
|
835
835
|
air_loop_info[:cooling_coils][:dx_single_speed] << coil
|
836
836
|
single_speed = supply_comp.to_CoilCoolingDXSingleSpeed.get
|
837
837
|
coil[:name] = single_speed.name.get
|
838
|
-
coil[:cop] = single_speed.ratedCOP.
|
838
|
+
coil[:cop] = single_speed.ratedCOP.to_f
|
839
839
|
coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
|
840
840
|
coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
|
841
841
|
end
|
@@ -844,8 +844,8 @@ class NECB2011
|
|
844
844
|
air_loop_info[:cooling_coils][:dx_two_speed] << coil
|
845
845
|
two_speed = supply_comp.to_CoilCoolingDXTwoSpeed.get
|
846
846
|
coil[:name] = two_speed.name.get
|
847
|
-
coil[:cop_low] = two_speed.ratedLowSpeedCOP.
|
848
|
-
coil[:cop_high] = two_speed.ratedHighSpeedCOP.
|
847
|
+
coil[:cop_low] = two_speed.ratedLowSpeedCOP.to_f
|
848
|
+
coil[:cop_high] = two_speed.ratedHighSpeedCOP.to_f
|
849
849
|
coil[:nominal_total_capacity_w] = model.sqlFile.get.execAndReturnFirstDouble("SELECT Value FROM TabularDataWithStrings WHERE ReportName='EquipmentSummary' AND ReportForString='Entire Facility' AND TableName='Cooling Coils' AND ColumnName='Nominal Total Capacity' AND RowName='#{coil[:name].upcase}' ")
|
850
850
|
coil[:nominal_total_capacity_w] = validate_optional(coil[:nominal_total_capacity_w], model, -1.0)
|
851
851
|
end
|
@@ -1712,7 +1712,7 @@ class NECB2011
|
|
1712
1712
|
# This method will run the HRV compliance for a single air loop
|
1713
1713
|
#
|
1714
1714
|
# @param qaqc [:hash] Hash that contains the base data with qaqc keys
|
1715
|
-
# @param model [:OS:Model]
|
1715
|
+
# @param model [:OS:Model] OpenStudio Model
|
1716
1716
|
# @param air_loop_info [:hash] single air_loop object from the qaqc hash
|
1717
1717
|
def necb_hrv_compliance_for_single_airloop(qaqc, model, air_loop_info)
|
1718
1718
|
# HRV check
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: openstudio-standards
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.2.17.
|
4
|
+
version: 0.2.17.rc2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Andrew Parker
|
@@ -28,7 +28,7 @@ authors:
|
|
28
28
|
autorequire:
|
29
29
|
bindir: bin
|
30
30
|
cert_chain: []
|
31
|
-
date: 2022-10-
|
31
|
+
date: 2022-10-20 00:00:00.000000000 Z
|
32
32
|
dependencies:
|
33
33
|
- !ruby/object:Gem::Dependency
|
34
34
|
name: minitest-reporters
|
@@ -653,6 +653,7 @@ files:
|
|
653
653
|
- data/geometry/DOERefSmallOffice.json
|
654
654
|
- data/geometry/DOERefWarehouse.json
|
655
655
|
- data/geometry/DOERefWarehouse.osm
|
656
|
+
- data/standards/OpenStudio_Standards-ashrae_90_1.xlsx
|
656
657
|
- data/standards/exclude_list.csv
|
657
658
|
- data/standards/export_OpenStudio_libraries.rb
|
658
659
|
- data/standards/legacy_dd_results.csv
|
@@ -661,6 +662,7 @@ files:
|
|
661
662
|
- data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1-ALL-comstockspace_types.csv
|
662
663
|
- data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv
|
663
664
|
- data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1space_types.csv
|
665
|
+
- data/standards/openstudio_standards_duplicates_log.csv
|
664
666
|
- data/standards/templates_to_climate_zones.json
|
665
667
|
- data/standards/test_performance_expected_dd_results.csv
|
666
668
|
- data/weather/ALTURAS_725958_CZ2010.ddy
|