openstudio-standards 0.2.16 → 0.2.17.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/data/standards/manage_OpenStudio_Standards.rb +31 -4
- data/lib/openstudio-standards/btap/geometry.rb +1 -1
- data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +354 -2
- data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +79 -0
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3313 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +12 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +3 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +167 -93
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +2 -4
- data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +1 -0
- data/lib/openstudio-standards/refs/references.rb +3 -0
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +279 -6
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +50 -2
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +4 -0
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -1
- data/lib/openstudio-standards/standards/Standards.Construction.rb +185 -3
- data/lib/openstudio-standards/standards/Standards.Fan.rb +14 -6
- data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +1 -0
- data/lib/openstudio-standards/standards/Standards.Model.rb +1751 -383
- data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +130 -9
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +50 -3
- data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +44 -0
- data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +27 -0
- data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +543 -0
- data/lib/openstudio-standards/standards/Standards.Space.rb +665 -15
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +141 -4
- data/lib/openstudio-standards/standards/Standards.SubSurface.rb +2 -1
- data/lib/openstudio-standards/standards/Standards.Surface.rb +117 -0
- data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +197 -49
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +41 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +6 -8
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +7 -7
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +9 -9
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +12 -0
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +10 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +45 -45
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +10 -10
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +792 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +10 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +31 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +91 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +84 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +145 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +106 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +71 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +194 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +120 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +110 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +73 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +24 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +5 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +55 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +3045 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +187 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +450 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +106 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +666 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +54 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +168 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +132 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +239 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +176 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +25 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.boilers.json +52 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.chillers.json +112 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.climate_zone_sets.json +210 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_properties.json +10384 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_sets.json +133 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.furnaces.json +43 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +119 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +130 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +13 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.lpd_space_type.json +568 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +264 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_baseline_hvac.json +439 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_constructions.json +685 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +213 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_ext_ltg.json +32 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_heat_type.json +136 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_hvac_bldg_type.json +32 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json +1837 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_swh_bldg_type.json +184 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_wwr_bldg_type.json +84 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +148 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +157 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.climate_zone_sets.json +210 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +18329 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +340 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.materials.json +49924 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_building_rotation_exception.md +44 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/check_pump_power_and_control.md +71 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/dcv.md +68 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/dcv_implementation.png +0 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/elevators.md +14 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/exhaust_air_energy_recovery.md +36 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/f_c_factors.md +19 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/fan_power_credits.md +15 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/preheat_coil.md +59 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/pump_power_control.md +46 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/return_air_type.md +31 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_baseline_wwr.md +191 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_hw_and_chw_supply_water_temp_reset_control.md +24 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_num_boilers_chillers_towers.md +49 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +80 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_space_lpd.md +73 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/unenclosed_and_unconditioned_spaces.md +11 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/unmet_load_hours.md +20 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/vav_parallel_piu_terminals_fan_control.md +23 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/vav_terminals_min_flow_setpoint.md +21 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_airloop_hvac.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_airloop_hvac_doas.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_building.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_design_specification_outdoor_air.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_electric_equipment.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_exterior_lights.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_gas_equipment.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_lights.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_spacetype.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_thermal_zone.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_connections.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_equipment.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_equipment_definition.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_zone_hvac.csv +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_zone_infiltration.csv +1 -0
- data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +12 -0
- data/lib/openstudio-standards/standards/deer/data/deer.fans.json +12 -0
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +1 -1
- data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +1 -1
- data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +24 -11
- data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +13 -15
- data/lib/openstudio-standards/standards/necb/NECB2011/data/province_map.json +17 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +6 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +3 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +2 -3
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +33 -924
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +15 -15
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +135 -29
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +16 -4
- data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +40 -42
- data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +1 -1
- data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +89 -89
- data/lib/openstudio-standards/utilities/array.rb +11 -0
- data/lib/openstudio-standards/utilities/logging.rb +48 -0
- data/lib/openstudio-standards/utilities/object_info.rb +20 -0
- data/lib/openstudio-standards/utilities/schedule_translator.rb +348 -0
- data/lib/openstudio-standards/utilities/sqlfile.rb +68 -0
- data/lib/openstudio-standards/version.rb +2 -2
- data/lib/openstudio-standards/weather/Weather.Model.rb +42 -55
- data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
- data/lib/openstudio-standards.rb +35 -1
- metadata +111 -6
- 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/openstudio_standards_duplicates_log.csv +0 -143
data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb
ADDED
@@ -0,0 +1,194 @@
|
|
1
|
+
class ASHRAE901PRM < Standard
|
2
|
+
# @!group CoilHeatingDXSingleSpeed
|
3
|
+
|
4
|
+
include ASHRAEPRMCoilDX
|
5
|
+
|
6
|
+
# Finds capacity in W. This is the cooling capacity of the paired DX cooling coil.
|
7
|
+
#
|
8
|
+
# @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
|
9
|
+
# @param sys_type [String] HVAC system type
|
10
|
+
# @return [Double] capacity in W to be used for find object
|
11
|
+
def coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, sys_type)
|
12
|
+
capacity_w = nil
|
13
|
+
|
14
|
+
# Get the paired cooling coil
|
15
|
+
clg_coil = nil
|
16
|
+
|
17
|
+
# Unitary and zone equipment
|
18
|
+
if coil_heating_dx_single_speed.airLoopHVAC.empty?
|
19
|
+
if coil_heating_dx_single_speed.containingHVACComponent.is_initialized
|
20
|
+
containing_comp = coil_heating_dx_single_speed.containingHVACComponent.get
|
21
|
+
if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
|
22
|
+
clg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get.coolingCoil
|
23
|
+
elsif containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
|
24
|
+
unitary = containing_comp.to_AirLoopHVACUnitarySystem.get
|
25
|
+
if unitary.coolingCoil.is_initialized
|
26
|
+
clg_coil = unitary.coolingCoil.get
|
27
|
+
end
|
28
|
+
end
|
29
|
+
elsif coil_heating_dx_single_speed.containingZoneHVACComponent.is_initialized
|
30
|
+
containing_comp = coil_heating_dx_single_speed.containingZoneHVACComponent.get
|
31
|
+
# PTHP
|
32
|
+
if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
|
33
|
+
pthp = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get
|
34
|
+
clg_coil = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
# On AirLoop directly
|
40
|
+
if coil_heating_dx_single_speed.airLoopHVAC.is_initialized
|
41
|
+
air_loop = coil_heating_dx_single_speed.airLoopHVAC.get
|
42
|
+
# Check for the presence of any other type of cooling coil
|
43
|
+
clg_types = ['OS:Coil:Cooling:DX:SingleSpeed',
|
44
|
+
'OS:Coil:Cooling:DX:TwoSpeed']
|
45
|
+
clg_types.each do |ct|
|
46
|
+
coils = air_loop.supplyComponents(ct.to_IddObjectType)
|
47
|
+
next if coils.empty?
|
48
|
+
|
49
|
+
clg_coil = coils[0]
|
50
|
+
break # Stop on first DX cooling coil found
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
# If no paired cooling coil was found, throw an error and fall back to the heating capacity of the DX heating coil
|
55
|
+
if clg_coil.nil?
|
56
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, the paired DX cooling coil could not be found to determine capacity. Efficiency will incorrectly be based on DX coil's heating capacity.")
|
57
|
+
if coil_heating_dx_single_speed.ratedTotalHeatingCapacity.is_initialized
|
58
|
+
capacity_w = coil_heating_dx_single_speed.ratedTotalHeatingCapacity.get
|
59
|
+
elsif coil_heating_dx_single_speed.autosizedRatedTotalHeatingCapacity.is_initialized
|
60
|
+
capacity_w = coil_heating_dx_single_speed.autosizedRatedTotalHeatingCapacity.get
|
61
|
+
else
|
62
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name} capacity is not available, cannot apply efficiency standard to paired DX heating coil.")
|
63
|
+
return 0.0
|
64
|
+
end
|
65
|
+
return capacity_w
|
66
|
+
end
|
67
|
+
|
68
|
+
# If a coil was found, cast to the correct type
|
69
|
+
if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized
|
70
|
+
clg_coil = clg_coil.to_CoilCoolingDXSingleSpeed.get
|
71
|
+
capacity_w = coil_cooling_dx_single_speed_find_capacity(clg_coil, sys_type)
|
72
|
+
elsif clg_coil.to_CoilCoolingDXTwoSpeed.is_initialized
|
73
|
+
clg_coil = clg_coil.to_CoilCoolingDXTwoSpeed.get
|
74
|
+
capacity_w = coil_cooling_dx_two_speed_find_capacity(clg_coil, sys_type)
|
75
|
+
end
|
76
|
+
|
77
|
+
# Check for user data that indicates multiple systems per thermal zone
|
78
|
+
# This could be true for a data center where this is common practice
|
79
|
+
# Or it could be for a thermal zone that represents multiple real building zones
|
80
|
+
mult = 1
|
81
|
+
thermal_zone = nil
|
82
|
+
comp = coil_heating_dx_single_speed.containingHVACComponent
|
83
|
+
if comp.is_initialized
|
84
|
+
if comp.get.to_AirLoopHVACUnitarySystem.is_initialized
|
85
|
+
unitary = comp.get.to_AirLoopHVACUnitarySystem.get
|
86
|
+
thermal_zone = unitary.controllingZoneorThermostatLocation.get
|
87
|
+
end
|
88
|
+
end
|
89
|
+
# meth = comp.methods
|
90
|
+
comp = coil_heating_dx_single_speed.containingZoneHVACComponent
|
91
|
+
if comp.is_initialized
|
92
|
+
if comp.get.thermalZone.is_initialized
|
93
|
+
thermal_zone = comp.get.thermalZone.get
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
if !thermal_zone.nil?
|
98
|
+
if standards_data.key?('userdata_thermal_zone')
|
99
|
+
standards_data['userdata_thermal_zone'].each do |row|
|
100
|
+
next unless row['name'].to_s.downcase.strip == thermal_zone.name.to_s.downcase.strip
|
101
|
+
|
102
|
+
if row['number_of_systems'].to_s.upcase.strip != ''
|
103
|
+
mult = row['number_of_systems'].to_s
|
104
|
+
if mult.to_i.to_s == mult
|
105
|
+
mult = mult.to_i
|
106
|
+
capacity_w /= mult
|
107
|
+
else
|
108
|
+
OpenStudio.logFree(OpenStudio::Error, 'prm.log', 'In userdata_thermalzone, number_of_systems requires integer input.')
|
109
|
+
end
|
110
|
+
break
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
|
116
|
+
# If it's a PTAC or PTHP System, we need to divide the capacity by the potential zone multiplier
|
117
|
+
# because the COP is dependent on capacity, and the capacity should be the capacity of a single zone, not all the zones
|
118
|
+
if sys_type == 'PTHP'
|
119
|
+
mult = 1
|
120
|
+
comp = coil_heating_dx_single_speed.containingZoneHVACComponent
|
121
|
+
if comp.is_initialized
|
122
|
+
if comp.get.thermalZone.is_initialized
|
123
|
+
mult = comp.get.thermalZone.get.multiplier
|
124
|
+
if mult > 1
|
125
|
+
total_cap = capacity_w
|
126
|
+
capacity_w /= mult
|
127
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, total capacity of #{OpenStudio.convert(total_cap, 'W', 'kBtu/hr').get.round(2)}kBTU/hr was divided by the zone multiplier of #{mult} to give #{capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get.round(2)}kBTU/hr.")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
132
|
+
|
133
|
+
return capacity_w
|
134
|
+
end
|
135
|
+
|
136
|
+
# Finds lookup object in standards and return efficiency
|
137
|
+
#
|
138
|
+
# @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
|
139
|
+
# @param sys_type [String] HVAC system type
|
140
|
+
# @param rename [Bool] if true, object will be renamed to include capacity and efficiency level
|
141
|
+
# @return [Double] full load efficiency (COP)
|
142
|
+
def coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, sys_type, rename = false)
|
143
|
+
# find ac properties
|
144
|
+
capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, sys_type)
|
145
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
146
|
+
search_criteria = coil_dx_find_search_criteria(coil_heating_dx_single_speed, capacity_btu_per_hr, sys_type)
|
147
|
+
|
148
|
+
# find object
|
149
|
+
ac_props = nil
|
150
|
+
ac_props = model_find_object(standards_data['heat_pumps_heating'], search_criteria, capacity_btu_per_hr, Date.today)
|
151
|
+
# Get the minimum efficiency standards
|
152
|
+
cop = nil
|
153
|
+
|
154
|
+
# Check to make sure properties were found
|
155
|
+
if ac_props.nil?
|
156
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
157
|
+
return cop # value of nil
|
158
|
+
end
|
159
|
+
|
160
|
+
cop = ac_props['copnfcooling']
|
161
|
+
new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_btu_per_hr.round}Btu/hr #{cop}COP"
|
162
|
+
|
163
|
+
# Rename
|
164
|
+
if rename
|
165
|
+
coil_heating_dx_single_speed.setName(new_comp_name)
|
166
|
+
end
|
167
|
+
|
168
|
+
return cop
|
169
|
+
end
|
170
|
+
|
171
|
+
# Applies the standard efficiency ratings and typical performance curves to this object.
|
172
|
+
#
|
173
|
+
# @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
|
174
|
+
# @param sql_db_vars_map [Hash] hash map
|
175
|
+
# @param sys_type [String] HVAC system type
|
176
|
+
# @return [Hash] hash of coil objects
|
177
|
+
def coil_heating_dx_single_speed_apply_efficiency_and_curves(coil_heating_dx_single_speed, sql_db_vars_map, sys_type)
|
178
|
+
# Preserve the original name
|
179
|
+
orig_name = coil_heating_dx_single_speed.name.to_s
|
180
|
+
|
181
|
+
# Find the minimum COP and rename with efficiency rating
|
182
|
+
cop = coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, sys_type, false)
|
183
|
+
|
184
|
+
# Map the original name to the new name
|
185
|
+
sql_db_vars_map[coil_heating_dx_single_speed.name.to_s] = orig_name
|
186
|
+
|
187
|
+
# Set the efficiency values
|
188
|
+
unless cop.nil?
|
189
|
+
coil_heating_dx_single_speed.setRatedCOP(cop)
|
190
|
+
end
|
191
|
+
|
192
|
+
return sql_db_vars_map
|
193
|
+
end
|
194
|
+
end
|
@@ -0,0 +1,120 @@
|
|
1
|
+
class ASHRAE901PRM < Standard
|
2
|
+
# @!group BoilerHotWater
|
3
|
+
|
4
|
+
# find search criteria
|
5
|
+
#
|
6
|
+
# @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
|
7
|
+
# @param sys_type [String] HVAC system type
|
8
|
+
# @return [Hash] used for standards_lookup_table(model)
|
9
|
+
def coil_heating_gas_find_search_criteria(coil_heating_gas, sys_type)
|
10
|
+
# Define the criteria to find the furnace properties
|
11
|
+
# in the hvac standards data set.
|
12
|
+
search_criteria = {}
|
13
|
+
search_criteria['fuel_type'] = 'Gas'
|
14
|
+
if sys_type == 'PSZ_AC'
|
15
|
+
search_criteria['subcategory'] = 'Furnace'
|
16
|
+
elsif sys_type == 'Gas_Furnace'
|
17
|
+
search_criteria['subcategory'] = 'Unit Heater'
|
18
|
+
else
|
19
|
+
search_criteria['subcategory'] = 'Furnace'
|
20
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "#{coil_heating_gas.name} is not for a PSZ-AC or Gas Furnace and cannot apply efficiency standard.")
|
21
|
+
end
|
22
|
+
|
23
|
+
return search_criteria
|
24
|
+
end
|
25
|
+
|
26
|
+
# find furnace capacity
|
27
|
+
#
|
28
|
+
# @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
|
29
|
+
# @return [Double] capacity in W to be used for find object
|
30
|
+
def coil_heating_gas_find_capacity(coil_heating_gas)
|
31
|
+
# Get the coil capacity
|
32
|
+
capacity_w = nil
|
33
|
+
if coil_heating_gas.nominalCapacity.is_initialized
|
34
|
+
capacity_w = coil_heating_gas.nominalCapacity.get
|
35
|
+
elsif coil_heating_gas.autosizedNominalCapacity.is_initialized
|
36
|
+
capacity_w = coil_heating_gas.autosizedNominalCapacity.get
|
37
|
+
else
|
38
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name} capacity is not available, cannot apply efficiency standard.")
|
39
|
+
successfully_set_all_properties = false
|
40
|
+
return successfully_set_all_properties
|
41
|
+
end
|
42
|
+
|
43
|
+
return capacity_w
|
44
|
+
end
|
45
|
+
|
46
|
+
# Finds lookup object in standards and return minimum thermal efficiency
|
47
|
+
#
|
48
|
+
# @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
|
49
|
+
# @param sys_type [String] HVAC system type
|
50
|
+
# @param rename [Bool] if true, object will be renamed to include capacity and efficiency level
|
51
|
+
# @return [Double] minimum thermal efficiency
|
52
|
+
def coil_heating_gas_standard_minimum_thermal_efficiency(coil_heating_gas, sys_type, rename = false)
|
53
|
+
# Get the coil properties
|
54
|
+
search_criteria = coil_heating_gas_find_search_criteria(coil_heating_gas, sys_type)
|
55
|
+
capacity_w = coil_heating_gas_find_capacity(coil_heating_gas)
|
56
|
+
capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
|
57
|
+
capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
|
58
|
+
|
59
|
+
# Get the minimum efficiency standards
|
60
|
+
thermal_eff = nil
|
61
|
+
|
62
|
+
# Get the coil properties
|
63
|
+
coil_table = @standards_data['furnaces']
|
64
|
+
coil_props = model_find_object(coil_table, search_criteria, [capacity_btu_per_hr, 0.001].max)
|
65
|
+
|
66
|
+
# Check to make sure properties were found
|
67
|
+
if coil_props.nil?
|
68
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
|
69
|
+
successfully_set_all_properties = false
|
70
|
+
return successfully_set_all_properties
|
71
|
+
end
|
72
|
+
|
73
|
+
# New name initial value
|
74
|
+
new_comp_name = coil_heating_gas.name
|
75
|
+
|
76
|
+
# If specified as thermal efficiency
|
77
|
+
unless coil_props['minimum_thermal_efficiency'].nil?
|
78
|
+
thermal_eff = coil_props['minimum_thermal_efficiency']
|
79
|
+
new_comp_name = "#{coil_heating_gas.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{thermal_eff} Thermal Eff"
|
80
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGas', "For #{template}: #{coil_heating_gas.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; Thermal Efficiency = #{thermal_eff}")
|
81
|
+
end
|
82
|
+
|
83
|
+
# If specified as combustion efficiency
|
84
|
+
unless coil_props['minimum_combustion_efficiency'].nil?
|
85
|
+
min_comb_eff = coil_props['minimum_combustion_efficiency']
|
86
|
+
thermal_eff = combustion_eff_to_thermal_eff(min_comb_eff)
|
87
|
+
new_comp_name = "#{coil_heating_gas.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_comb_eff} Combustion Eff"
|
88
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGas', "For #{template}: #{coil_heating_gas.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; Combustion Efficiency = #{min_comb_eff}")
|
89
|
+
end
|
90
|
+
|
91
|
+
unless thermal_eff
|
92
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{CoilHeatingGas.name}, cannot find coil efficiency, cannot apply efficiency standard.")
|
93
|
+
successfully_set_all_properties = false
|
94
|
+
return successfully_set_all_properties
|
95
|
+
end
|
96
|
+
|
97
|
+
# Rename
|
98
|
+
if rename
|
99
|
+
coil_heating_gas.setName(new_comp_name)
|
100
|
+
end
|
101
|
+
|
102
|
+
return thermal_eff
|
103
|
+
end
|
104
|
+
|
105
|
+
# Applies the standard efficiency ratings and typical performance curves to this object.
|
106
|
+
#
|
107
|
+
# @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
|
108
|
+
# @param sql_db_vars_map [Hash] hash map
|
109
|
+
# @param sys_type [String] HVAC system type
|
110
|
+
# @return [Hash] hash of coil objects
|
111
|
+
def coil_heating_gas_apply_efficiency_and_curves(coil_heating_gas, sql_db_vars_map, sys_type)
|
112
|
+
# Thermal efficiency
|
113
|
+
thermal_eff = coil_heating_gas_standard_minimum_thermal_efficiency(coil_heating_gas, sys_type)
|
114
|
+
|
115
|
+
# Set the efficiency values
|
116
|
+
coil_heating_gas.setGasBurnerEfficiency(thermal_eff.to_f)
|
117
|
+
|
118
|
+
return sql_db_vars_map
|
119
|
+
end
|
120
|
+
end
|
@@ -0,0 +1,110 @@
|
|
1
|
+
# A variety of cooling tower methods that are the same regardless of type.
|
2
|
+
# These methods are available to CoolingTowerSingleSpeed, CoolingTowerTwoSpeed, and CoolingTowerVariableSpeed
|
3
|
+
module ASHRAEPRMCoolingTower
|
4
|
+
# @!group CoolingTower
|
5
|
+
|
6
|
+
# Set the cooling tower fan power such that the tower
|
7
|
+
# hits the minimum performance (gpm/hp) specified by the standard.
|
8
|
+
# Note that in this case hp is motor nameplate hp, per 90.1.
|
9
|
+
# This method assumes that the fan brake horsepower is 90%
|
10
|
+
# of the motor nameplate hp.
|
11
|
+
# This method determines the minimum motor efficiency
|
12
|
+
# for the nameplate motor hp and sets the actual
|
13
|
+
# fan power by multiplying the brake horsepower
|
14
|
+
# by the efficiency. Thus the fan power used as
|
15
|
+
# an input to the simulation divided by the design flow
|
16
|
+
# rate will not (and should not)
|
17
|
+
# exactly equal the minimum tower performance.
|
18
|
+
#
|
19
|
+
# @param cooling_tower [OpenStudio::Model::StraightComponent] cooling tower object, allowable types:
|
20
|
+
# CoolingTowerSingleSpeed, CoolingTowerTwoSpeed, and CoolingTowerVariableSpeed
|
21
|
+
# @return [Bool] returns true if successful, false if not
|
22
|
+
def cooling_tower_apply_minimum_power_per_flow(cooling_tower)
|
23
|
+
# Get the design water flow rate
|
24
|
+
design_water_flow_m3_per_s = nil
|
25
|
+
if cooling_tower.designWaterFlowRate.is_initialized
|
26
|
+
design_water_flow_m3_per_s = cooling_tower.designWaterFlowRate.get
|
27
|
+
elsif cooling_tower.autosizedDesignWaterFlowRate.is_initialized
|
28
|
+
design_water_flow_m3_per_s = cooling_tower.autosizedDesignWaterFlowRate.get
|
29
|
+
else
|
30
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name} design water flow rate is not available, cannot apply efficiency standard.")
|
31
|
+
return false
|
32
|
+
end
|
33
|
+
design_water_flow_gpm = OpenStudio.convert(design_water_flow_m3_per_s, 'm^3/s', 'gal/min').get
|
34
|
+
|
35
|
+
# Get the table of cooling tower efficiencies
|
36
|
+
heat_rejection = standards_data['heat_rejection']
|
37
|
+
|
38
|
+
# Define the criteria to find the cooling tower properties
|
39
|
+
# in the hvac standards data set.
|
40
|
+
search_criteria = {}
|
41
|
+
search_criteria['template'] = template
|
42
|
+
|
43
|
+
# By definition cooling towers in E+ are open.
|
44
|
+
# Closed cooling towers are the fluidcooler objects.
|
45
|
+
search_criteria['equipment_type'] = 'Open Cooling Tower'
|
46
|
+
|
47
|
+
# Define the criteria to find the fan type
|
48
|
+
search_criteria['fan_type'] = 'Axial'
|
49
|
+
|
50
|
+
# Get the cooling tower properties
|
51
|
+
ct_props = model_find_object(heat_rejection, search_criteria)
|
52
|
+
unless ct_props
|
53
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, cannot find heat rejection properties, cannot apply standard efficiencies or curves.")
|
54
|
+
return false
|
55
|
+
end
|
56
|
+
|
57
|
+
# Get cooling tower efficiency
|
58
|
+
min_gpm_per_hp = ct_props['minimum_performance']
|
59
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, design water flow = #{design_water_flow_gpm.round} gpm, minimum performance = #{min_gpm_per_hp} gpm/hp (nameplate).")
|
60
|
+
|
61
|
+
# Calculate the allowed fan brake horsepower
|
62
|
+
# per method used in PNNL prototype buildings.
|
63
|
+
# Assumes that the fan brake horsepower is 90%
|
64
|
+
# of the fan nameplate rated motor power.
|
65
|
+
fan_motor_nameplate_hp = design_water_flow_gpm / min_gpm_per_hp
|
66
|
+
fan_bhp = 0.9 * fan_motor_nameplate_hp
|
67
|
+
|
68
|
+
# Lookup the minimum motor efficiency
|
69
|
+
fan_motor_eff = 0.85
|
70
|
+
motors = standards_data['motors']
|
71
|
+
|
72
|
+
# Assuming all fan motors are 4-pole Enclosed
|
73
|
+
search_criteria = {
|
74
|
+
'template' => template,
|
75
|
+
'number_of_poles' => 'Any',
|
76
|
+
'type' => 'Any'
|
77
|
+
}
|
78
|
+
|
79
|
+
motor_properties = model_find_object(motors, search_criteria, fan_motor_nameplate_hp)
|
80
|
+
if motor_properties.nil?
|
81
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, could not find motor properties using search criteria: #{search_criteria}, motor_hp = #{fan_motor_nameplate_hp} hp.")
|
82
|
+
return false
|
83
|
+
end
|
84
|
+
|
85
|
+
fan_motor_eff = motor_properties['nominal_full_load_efficiency']
|
86
|
+
nominal_hp = motor_properties['maximum_capacity'].to_f.round(1)
|
87
|
+
# Round to nearest whole HP for niceness
|
88
|
+
if nominal_hp >= 2
|
89
|
+
nominal_hp = nominal_hp.round
|
90
|
+
end
|
91
|
+
|
92
|
+
# Calculate the fan motor power
|
93
|
+
fan_motor_actual_power_hp = fan_bhp / fan_motor_eff
|
94
|
+
# Convert to W
|
95
|
+
fan_motor_actual_power_w = fan_motor_actual_power_hp * 745.7 # 745.7 W/HP
|
96
|
+
|
97
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, allowed fan motor nameplate hp = #{fan_motor_nameplate_hp.round(1)} hp, fan brake horsepower = #{fan_bhp.round(1)}, and fan motor actual power = #{fan_motor_actual_power_hp.round(1)} hp (#{fan_motor_actual_power_w.round} W) at #{fan_motor_eff} motor efficiency.")
|
98
|
+
|
99
|
+
# Append the efficiency to the name
|
100
|
+
cooling_tower.setName("#{cooling_tower.name} #{min_gpm_per_hp.round(1)} gpm/hp")
|
101
|
+
|
102
|
+
# Hard size the design fan power.
|
103
|
+
# Leave the water flow and air flow autosized.
|
104
|
+
if cooling_tower.to_CoolingTowerVariableSpeed.is_initialized
|
105
|
+
cooling_tower.setDesignFanPower(fan_motor_actual_power_w)
|
106
|
+
end
|
107
|
+
|
108
|
+
return true
|
109
|
+
end
|
110
|
+
end
|
@@ -0,0 +1,73 @@
|
|
1
|
+
# A variety of fan calculation methods that are the same regardless of fan type.
|
2
|
+
# These methods are available to FanConstantVolume, FanOnOff, FanVariableVolume, and FanZoneExhaust
|
3
|
+
module ASHRAE901PRMFan
|
4
|
+
# Determines the minimum fan motor efficiency and nominal size for a given motor bhp.
|
5
|
+
# This should be the total brake horsepower with any desired safety factor already included.
|
6
|
+
# This method picks the next nominal motor catgory larger than the required brake horsepower,
|
7
|
+
# and the efficiency is based on that size.
|
8
|
+
# For example, if the bhp = 6.3, the nominal size will be 7.5HP and the efficiency
|
9
|
+
# for 90.1-2010 will be 91.7% from Table 10.8B.
|
10
|
+
# This method assumes 4-pole, 1800rpm totally-enclosed fan-cooled motors.
|
11
|
+
#
|
12
|
+
# @param fan [OpenStudio::Model::StraightComponent] fan object, allowable types:
|
13
|
+
# FanConstantVolume, FanOnOff, FanVariableVolume, and FanZoneExhaust
|
14
|
+
# @param motor_bhp [Double] motor brake horsepower (hp)
|
15
|
+
# @return [Array<Double>] minimum motor efficiency (0.0 to 1.0), nominal horsepower
|
16
|
+
def fan_standard_minimum_motor_efficiency_and_size(fan, motor_bhp)
|
17
|
+
fan_motor_eff = 0.85
|
18
|
+
nominal_hp = motor_bhp
|
19
|
+
|
20
|
+
# Don't attempt to look up motor efficiency
|
21
|
+
# for zero-hp fans, which may occur when there is no
|
22
|
+
# airflow required for a particular system, typically
|
23
|
+
# heated-only spaces with high internal gains
|
24
|
+
# and no OA requirements such as elevator shafts.
|
25
|
+
return [fan_motor_eff, 0] if motor_bhp == 0.0
|
26
|
+
|
27
|
+
# Lookup the minimum motor efficiency
|
28
|
+
motors = standards_data['motors']
|
29
|
+
|
30
|
+
# Assuming all fan motors are 4-pole ODP
|
31
|
+
search_criteria = {
|
32
|
+
'template' => template,
|
33
|
+
'number_of_poles' => 4.0,
|
34
|
+
'type' => 'Enclosed'
|
35
|
+
}
|
36
|
+
|
37
|
+
# Exception for small fans, including
|
38
|
+
# zone exhaust, fan coil, and fan powered terminals.
|
39
|
+
# In this case, use the 0.5 HP for the lookup.
|
40
|
+
if fan_small_fan?(fan)
|
41
|
+
nominal_hp = 0.5
|
42
|
+
else
|
43
|
+
motor_properties = model_find_object(motors, search_criteria, capacity = nil, date = nil, area = nil, num_floors = nil, fan_motor_bhp = motor_bhp)
|
44
|
+
if motor_properties.nil?
|
45
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Fan', "For #{fan.name}, could not find motor properties using search criteria: #{search_criteria}, motor_bhp = #{motor_bhp} hp.")
|
46
|
+
return [fan_motor_eff, nominal_hp]
|
47
|
+
end
|
48
|
+
|
49
|
+
# If the biggest fan motor size is hit, use the highest category efficiency
|
50
|
+
if nominal_hp == 9999.0
|
51
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Fan', "For #{fan.name}, there is no greater nominal HP. Use the efficiency of the largest motor category.")
|
52
|
+
nominal_hp = motor_bhp
|
53
|
+
end
|
54
|
+
|
55
|
+
# Round to nearest whole HP for niceness
|
56
|
+
if nominal_hp >= 2
|
57
|
+
nominal_hp = nominal_hp.round
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Get the efficiency based on the nominal horsepower
|
62
|
+
motor_properties = model_find_object(motors, search_criteria, fan_motor_bhp = motor_bhp)
|
63
|
+
|
64
|
+
if motor_properties.nil?
|
65
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Fan', "For #{fan.name}, could not find nominal motor properties using search criteria: #{search_criteria}, motor_hp = #{nominal_hp} hp.")
|
66
|
+
return [fan_motor_eff, nominal_hp]
|
67
|
+
end
|
68
|
+
fan_motor_eff = motor_properties['nominal_full_load_efficiency']
|
69
|
+
nominal_hp = motor_properties['maximum_capacity'].round(1)
|
70
|
+
|
71
|
+
return [fan_motor_eff, nominal_hp]
|
72
|
+
end
|
73
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
class ASHRAE901PRM
|
2
|
+
# @!group FanVariableVolume
|
3
|
+
|
4
|
+
include ASHRAE901PRMFan
|
5
|
+
|
6
|
+
# Determines whether there is a requirement to have a VSD or some other method to reduce fan power at low part load ratios.
|
7
|
+
# Required for all VAV fans for stable baseline
|
8
|
+
# @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
|
9
|
+
# @return [Bool] returns true if required, false if not
|
10
|
+
def fan_variable_volume_part_load_fan_power_limitation?(fan_variable_volume)
|
11
|
+
part_load_control_required = true
|
12
|
+
return part_load_control_required
|
13
|
+
end
|
14
|
+
|
15
|
+
# The threhold horsepower below which part load control is not required.
|
16
|
+
# always required for stable baseline, so threshold is zero
|
17
|
+
#
|
18
|
+
# @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
|
19
|
+
# @return [Double] the limit, in horsepower. Return zero for no limit by default.
|
20
|
+
def fan_variable_volume_part_load_fan_power_limitation_hp_limit(fan_variable_volume)
|
21
|
+
hp_limit = 0
|
22
|
+
return hp_limit
|
23
|
+
end
|
24
|
+
end
|
data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb
ADDED
@@ -0,0 +1,55 @@
|
|
1
|
+
class ASHRAE901PRM < Standard
|
2
|
+
# @!group HeatExchangerSensLat
|
3
|
+
|
4
|
+
# Defines the minimum sensible and latent effectiveness of the heat exchanger.
|
5
|
+
# Assumed to apply to sensible and latent effectiveness at all flow rates.
|
6
|
+
#
|
7
|
+
# @param heat_exchanger_air_to_air_sensible_and_latent [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio heat exchanger object
|
8
|
+
# @return [Array] List of full and part load heat exchanger effectiveness
|
9
|
+
def heat_exchanger_air_to_air_sensible_and_latent_minimum_effectiveness(heat_exchanger_air_to_air_sensible_and_latent)
|
10
|
+
# Get required ERR
|
11
|
+
enthalpy_recovery_ratio = heat_exchanger_air_to_air_sensible_and_latent_enthalpy_recovery_ratio(heat_exchanger_air_to_air_sensible_and_latent)
|
12
|
+
|
13
|
+
# Get design condition for climate zones
|
14
|
+
climate_zone = model_standards_climate_zone(heat_exchanger_air_to_air_sensible_and_latent.model)
|
15
|
+
design_conditions = heat_exchanger_air_to_air_sensible_and_latent_design_conditions(heat_exchanger_air_to_air_sensible_and_latent, climate_zone)
|
16
|
+
|
17
|
+
# Adjust, and convert ERR to Effectiveness for input to the model
|
18
|
+
enthalpy_recovery_ratio = enthalpy_recovery_ratio_design_to_typical_adjustment(enthalpy_recovery_ratio, climate_zone)
|
19
|
+
full_htg_sens_eff, full_htg_lat_eff, part_htg_sens_eff, part_htg_lat_eff, full_cool_sens_eff, full_cool_lat_eff, part_cool_sens_eff, part_cool_lat_eff = heat_exchanger_air_to_air_sensible_and_latent_enthalpy_recovery_ratio_to_effectiveness(enthalpy_recovery_ratio, design_conditions)
|
20
|
+
|
21
|
+
return full_htg_sens_eff, full_htg_lat_eff, part_htg_sens_eff, part_htg_lat_eff, full_cool_sens_eff, full_cool_lat_eff, part_cool_sens_eff, part_cool_lat_eff
|
22
|
+
end
|
23
|
+
|
24
|
+
# Determine the heat exchanger design conditions for a specific climate zones
|
25
|
+
#
|
26
|
+
# @param heat_exchanger_air_to_air_sensible_and_latent [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio heat exchanger object
|
27
|
+
# @param climate_zone [String] Climate zone used to generate the model
|
28
|
+
# @return [String] Heat exchanger design conditions
|
29
|
+
def heat_exchanger_air_to_air_sensible_and_latent_design_conditions(heat_exchanger_air_to_air_sensible_and_latent, climate_zone)
|
30
|
+
case climate_zone
|
31
|
+
when 'ASHRAE 169-2006-6B',
|
32
|
+
'ASHRAE 169-2013-6B',
|
33
|
+
'ASHRAE 169-2006-7A',
|
34
|
+
'ASHRAE 169-2013-7A',
|
35
|
+
'ASHRAE 169-2006-7B',
|
36
|
+
'ASHRAE 169-2013-7B',
|
37
|
+
'ASHRAE 169-2006-8A',
|
38
|
+
'ASHRAE 169-2013-8A',
|
39
|
+
'ASHRAE 169-2006-8B',
|
40
|
+
'ASHRAE 169-2013-8B'
|
41
|
+
design_conditions = 'heating'
|
42
|
+
else
|
43
|
+
design_conditions = 'cooling'
|
44
|
+
end
|
45
|
+
return design_conditions
|
46
|
+
end
|
47
|
+
|
48
|
+
# Determine the required enthalpy recovery ratio (ERR)
|
49
|
+
#
|
50
|
+
# @param heat_exchanger_air_to_air_sensible_and_latent [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio heat exchanger object
|
51
|
+
# @return [Float] ERR
|
52
|
+
def heat_exchanger_air_to_air_sensible_and_latent_enthalpy_recovery_ratio(heat_exchanger_air_to_air_sensible_and_latent)
|
53
|
+
return 0.5
|
54
|
+
end
|
55
|
+
end
|