openstudio-standards 0.8.3 → 0.8.5.rc1
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/ASHRAECollege.osm +30 -30
- data/data/geometry/ASHRAECourthouse.osm +22 -22
- data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
- data/data/geometry/DEER_Asm.osm +1 -1
- data/data/geometry/DEER_ECC.osm +1 -1
- data/data/geometry/DEER_EPr.osm +1 -1
- data/data/geometry/DEER_ERC.osm +1 -1
- data/data/geometry/DEER_ESe.osm +1 -1
- data/data/geometry/DEER_EUn.osm +1 -1
- data/data/geometry/DEER_Hsp.osm +1 -1
- data/data/geometry/DEER_Htl.osm +1 -1
- data/data/geometry/DEER_MBT.osm +1 -1
- data/data/geometry/DEER_MFm.osm +1 -1
- data/data/geometry/DEER_Nrs.osm +1 -1
- data/data/geometry/DEER_OfL.osm +1 -1
- data/data/geometry/DEER_OfS.osm +1 -1
- data/data/geometry/DEER_RFF.osm +1 -1
- data/data/geometry/DEER_RSD.osm +1 -1
- data/data/geometry/DEER_Rt3.osm +1 -1
- data/data/geometry/DEER_RtS.osm +1 -1
- data/data/standards/export_OpenStudio_libraries.rb +2 -3
- data/data/standards/test_performance_expected_dd_results.csv +42 -42
- data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
- data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
- data/lib/openstudio-standards/btap/activity.rb +480 -0
- data/lib/openstudio-standards/btap/attributes.rb +166 -0
- data/lib/openstudio-standards/btap/bridging.rb +561 -1402
- data/lib/openstudio-standards/btap/btap.rb +4 -2
- data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
- data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
- data/lib/openstudio-standards/btap/common_paths.rb +81 -0
- data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +52 -0
- data/lib/openstudio-standards/btap/common_resources/Constructions.csv +37 -0
- data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
- data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +1270 -0
- data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
- data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +2256 -0
- data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
- data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +2315 -0
- data/lib/openstudio-standards/btap/common_resources/hvac_vent_ahu.csv +925 -0
- data/lib/openstudio-standards/btap/common_resources/lighting.csv +364 -0
- data/lib/openstudio-standards/btap/common_resources/lighting_sets.csv +2667 -0
- data/lib/openstudio-standards/btap/common_resources/locations.csv +75 -0
- data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +35 -0
- data/lib/openstudio-standards/btap/common_resources/materials_hvac.csv +1686 -0
- data/lib/openstudio-standards/btap/common_resources/materials_lighting.csv +267 -0
- data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +164 -0
- data/lib/openstudio-standards/btap/costing/README.md +502 -0
- data/lib/openstudio-standards/btap/costing/btap_costing.rb +469 -0
- data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
- data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
- data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
- data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
- data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +173 -0
- data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +354 -0
- data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
- data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
- data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
- data/lib/openstudio-standards/btap/costing/envelope_costing.rb +215 -0
- data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
- data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +156 -0
- data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
- data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
- data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
- data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
- data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
- data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
- data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
- data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
- data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
- data/lib/openstudio-standards/btap/costing/test_list.txt +15 -0
- data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +27 -0
- data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
- data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
- data/lib/openstudio-standards/btap/geometry.rb +86 -6
- data/lib/openstudio-standards/btap/structure.rb +657 -0
- data/lib/openstudio-standards/constructions/modify.rb +2 -1
- data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
- data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
- data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
- data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
- data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
- data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
- data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
- data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
- data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
- data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
- data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
- data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
- data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
- data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
- data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
- data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
- data/lib/openstudio-standards/hvac/components/component.rb +39 -0
- data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
- data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
- data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
- data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
- data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
- data/lib/openstudio-standards/hvac/conversions.rb +222 -0
- data/lib/openstudio-standards/hvac/curves.rb +192 -0
- data/lib/openstudio-standards/hvac/helpers.rb +357 -0
- data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
- data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
- data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
- data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
- data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
- data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
- data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
- data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
- data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
- data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
- data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
- data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
- data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
- data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
- data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
- data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
- data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
- data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
- data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
- data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
- data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
- data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
- data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
- data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
- data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
- data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
- data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
- data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
- data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
- data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
- data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
- data/lib/openstudio-standards/standards/Standards.Model.rb +45 -20
- data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
- data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
- data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
- data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
- data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
- data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
- data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
- 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 +37 -102
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
- 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 +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
- 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 +37 -102
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
- 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 +45 -109
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
- 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 +45 -109
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
- data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
- 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 +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
- 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 +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
- 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.ChillerElectricEIR.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +7 -1
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
- data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
- data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +21 -37
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
- data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
- data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
- data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +115 -112
- data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +637 -249
- data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
- data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
- data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
- data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +75 -7
- data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +25 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
- data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
- data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +18 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
- data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +68 -150
- data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +444 -134
- data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
- data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
- data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
- data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +17 -8
- data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
- data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
- data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
- data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
- data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
- data/lib/openstudio-standards/standards/necb/README.md +343 -0
- data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
- data/lib/openstudio-standards/standards/necb/common/btap_data.rb +206 -32
- data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +75 -43
- data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
- data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
- data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
- data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
- data/lib/openstudio-standards/utilities/logging.rb +18 -14
- data/lib/openstudio-standards/version.rb +1 -1
- data/lib/openstudio-standards/weather/modify.rb +2 -2
- data/lib/openstudio-standards/weather/stat_file.rb +2 -2
- data/lib/openstudio-standards.rb +67 -38
- metadata +141 -50
- data/lib/openstudio-standards/hvac/components/create.rb +0 -169
- data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
- data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
- data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
- data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
- data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
- data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
- data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
- data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
- /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
|
@@ -0,0 +1,363 @@
|
|
|
1
|
+
module OpenstudioStandards
|
|
2
|
+
# The HVAC module provides methods create, modify, and get information about HVAC systems in the model
|
|
3
|
+
module HVAC
|
|
4
|
+
# @!group Component:Fan
|
|
5
|
+
# Methods to create, modify, and get information about fans
|
|
6
|
+
|
|
7
|
+
# creates an on off fan
|
|
8
|
+
#
|
|
9
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
10
|
+
# @param fan_name [String] fan name
|
|
11
|
+
# @param fan_efficiency [Double] fan efficiency
|
|
12
|
+
# @param pressure_rise [Double] fan pressure rise in Pa
|
|
13
|
+
# @param motor_efficiency [Double] fan motor efficiency
|
|
14
|
+
# @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
|
|
15
|
+
# @param end_use_subcategory [String] end use subcategory name
|
|
16
|
+
# @return [OpenStudio::Model::FanOnOff] on off fan object
|
|
17
|
+
def self.create_fan_on_off(model,
|
|
18
|
+
fan_name: nil,
|
|
19
|
+
fan_efficiency: nil,
|
|
20
|
+
pressure_rise: nil,
|
|
21
|
+
motor_efficiency: nil,
|
|
22
|
+
motor_in_airstream_fraction: nil,
|
|
23
|
+
end_use_subcategory: nil)
|
|
24
|
+
fan = OpenStudio::Model::FanOnOff.new(model)
|
|
25
|
+
fan.setName(fan_name) unless fan_name.nil?
|
|
26
|
+
fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
|
|
27
|
+
fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
|
|
28
|
+
fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
|
|
29
|
+
fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
|
|
30
|
+
fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
|
|
31
|
+
|
|
32
|
+
return fan
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
# creates a constant volume fan
|
|
36
|
+
#
|
|
37
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
38
|
+
# @param fan_name [String] fan name
|
|
39
|
+
# @param fan_efficiency [Double] fan efficiency
|
|
40
|
+
# @param pressure_rise [Double] fan pressure rise in Pa
|
|
41
|
+
# @param motor_efficiency [Double] fan motor efficiency
|
|
42
|
+
# @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
|
|
43
|
+
# @param end_use_subcategory [String] end use subcategory name
|
|
44
|
+
# @return [OpenStudio::Model::FanConstantVolume] constant volume fan object
|
|
45
|
+
def self.create_fan_constant_volume(model,
|
|
46
|
+
fan_name: nil,
|
|
47
|
+
fan_efficiency: nil,
|
|
48
|
+
pressure_rise: nil,
|
|
49
|
+
motor_efficiency: nil,
|
|
50
|
+
motor_in_airstream_fraction: nil,
|
|
51
|
+
end_use_subcategory: nil)
|
|
52
|
+
fan = OpenStudio::Model::FanConstantVolume.new(model)
|
|
53
|
+
fan.setName(fan_name) unless fan_name.nil?
|
|
54
|
+
fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
|
|
55
|
+
fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
|
|
56
|
+
fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
|
|
57
|
+
fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
|
|
58
|
+
fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
|
|
59
|
+
|
|
60
|
+
return fan
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
# creates a variable volume fan
|
|
64
|
+
#
|
|
65
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
66
|
+
# @param fan_name [String] fan name
|
|
67
|
+
# @param fan_efficiency [Double] fan efficiency
|
|
68
|
+
# @param pressure_rise [Double] fan pressure rise in Pa
|
|
69
|
+
# @param motor_efficiency [Double] fan motor efficiency
|
|
70
|
+
# @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
|
|
71
|
+
# @param end_use_subcategory [String] end use subcategory name
|
|
72
|
+
# @param fan_curve [String] fan curve for variable volume fans. See fan_variable_volume_set_control_type() for options.
|
|
73
|
+
# @param fan_power_minimum_flow_rate_input_method [String] options are Fraction, FixedFlowRate
|
|
74
|
+
# @param fan_power_minimum_flow_rate_fraction [Double] minimum flow rate fraction. overrides data in fan curve.
|
|
75
|
+
# @param fan_power_coefficient_1 [Double] fan power coefficient 1. overrides data in fan curve.
|
|
76
|
+
# @param fan_power_coefficient_2 [Double] fan power coefficient 2. overrides data in fan curve.
|
|
77
|
+
# @param fan_power_coefficient_3 [Double] fan power coefficient 3. overrides data in fan curve.
|
|
78
|
+
# @param fan_power_coefficient_4 [Double] fan power coefficient 4. overrides data in fan curve.
|
|
79
|
+
# @param fan_power_coefficient_5 [Double] fan power coefficient 5. overrides data in fan curve.
|
|
80
|
+
# @return [OpenStudio::Model::FanVariableVolume] variable volume fan object
|
|
81
|
+
def self.create_fan_variable_volume(model,
|
|
82
|
+
fan_name: nil,
|
|
83
|
+
fan_efficiency: nil,
|
|
84
|
+
pressure_rise: nil,
|
|
85
|
+
motor_efficiency: nil,
|
|
86
|
+
motor_in_airstream_fraction: nil,
|
|
87
|
+
end_use_subcategory: nil,
|
|
88
|
+
fan_curve: nil,
|
|
89
|
+
fan_power_minimum_flow_rate_input_method: nil,
|
|
90
|
+
fan_power_minimum_flow_rate_fraction: nil,
|
|
91
|
+
fan_power_coefficient_1: nil,
|
|
92
|
+
fan_power_coefficient_2: nil,
|
|
93
|
+
fan_power_coefficient_3: nil,
|
|
94
|
+
fan_power_coefficient_4: nil,
|
|
95
|
+
fan_power_coefficient_5: nil)
|
|
96
|
+
fan = OpenStudio::Model::FanVariableVolume.new(model)
|
|
97
|
+
fan.setName(fan_name) unless fan_name.nil?
|
|
98
|
+
fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
|
|
99
|
+
fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
|
|
100
|
+
fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
|
|
101
|
+
fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
|
|
102
|
+
fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
|
|
103
|
+
OpenstudioStandards::HVAC.fan_variable_volume_set_control_type(fan, control_type: fan_curve) unless fan_curve.nil?
|
|
104
|
+
fan.setFanPowerMinimumFlowRateInputMethod(fan_power_minimum_flow_rate_input_method) unless fan_power_minimum_flow_rate_input_method.nil?
|
|
105
|
+
fan.setFanPowerMinimumFlowFraction(fan_power_minimum_flow_rate_fraction) unless fan_power_minimum_flow_rate_fraction.nil?
|
|
106
|
+
fan.setFanPowerCoefficient1(fan_power_coefficient_1) unless fan_power_coefficient_1.nil?
|
|
107
|
+
fan.setFanPowerCoefficient2(fan_power_coefficient_2) unless fan_power_coefficient_2.nil?
|
|
108
|
+
fan.setFanPowerCoefficient3(fan_power_coefficient_3) unless fan_power_coefficient_3.nil?
|
|
109
|
+
fan.setFanPowerCoefficient4(fan_power_coefficient_4) unless fan_power_coefficient_4.nil?
|
|
110
|
+
fan.setFanPowerCoefficient5(fan_power_coefficient_5) unless fan_power_coefficient_5.nil?
|
|
111
|
+
|
|
112
|
+
return fan
|
|
113
|
+
end
|
|
114
|
+
|
|
115
|
+
# creates a zone exhaust fan
|
|
116
|
+
#
|
|
117
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
118
|
+
# @param fan_name [String] fan name
|
|
119
|
+
# @param fan_efficiency [Double] fan efficiency
|
|
120
|
+
# @param pressure_rise [Double] fan pressure rise in Pa
|
|
121
|
+
# @param end_use_subcategory [String] end use subcategory name
|
|
122
|
+
# @param system_availability_manager_coupling_mode [String] coupling mode, options are Coupled, Decoupled
|
|
123
|
+
# @return [OpenStudio::Model::FanZoneExhaust] the exhaust fan
|
|
124
|
+
def self.create_fan_zone_exhaust(model,
|
|
125
|
+
fan_name: nil,
|
|
126
|
+
fan_efficiency: nil,
|
|
127
|
+
pressure_rise: nil,
|
|
128
|
+
system_availability_manager_coupling_mode: nil,
|
|
129
|
+
end_use_subcategory: nil)
|
|
130
|
+
fan = OpenStudio::Model::FanZoneExhaust.new(model)
|
|
131
|
+
fan.setName(fan_name) unless fan_name.nil?
|
|
132
|
+
fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
|
|
133
|
+
fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
|
|
134
|
+
fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
|
|
135
|
+
fan.setSystemAvailabilityManagerCouplingMode(system_availability_manager_coupling_mode) unless system_availability_manager_coupling_mode.nil?
|
|
136
|
+
|
|
137
|
+
return fan
|
|
138
|
+
end
|
|
139
|
+
|
|
140
|
+
# creates a fan system model
|
|
141
|
+
#
|
|
142
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
143
|
+
# @param fan_name [String] fan name
|
|
144
|
+
# @param pressure_rise [Double] fan pressure rise in Pa
|
|
145
|
+
# @param motor_efficiency [Double] fan motor efficiency
|
|
146
|
+
# @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
|
|
147
|
+
# @param end_use_subcategory [String] end use subcategory name
|
|
148
|
+
# @param design_power_sizing_method [String] design power sizing method, options are PowerPerFlow or PowerPerFlowPerPressure
|
|
149
|
+
# @param power_per_flow_rate [Double] power per flow rate in W/(m^3/s)
|
|
150
|
+
# @param power_per_flow_rate_per_pressure [Double] power per flow rate per pressure in W/(m^3/s)/Pa
|
|
151
|
+
# @param speed_control_method [String] speed control method, options are Discrete or Continuous
|
|
152
|
+
# @param speeds [Array<[Integer, Integer]>] array of pairs of air flow rate fraction and electric power fraction for discrete speed fans
|
|
153
|
+
# @return [OpenStudio::Model::FanSystemModel] fan system model object
|
|
154
|
+
def self.create_fan_system_model(model,
|
|
155
|
+
fan_name: nil,
|
|
156
|
+
pressure_rise: nil,
|
|
157
|
+
motor_efficiency: nil,
|
|
158
|
+
motor_in_airstream_fraction: nil,
|
|
159
|
+
end_use_subcategory: nil,
|
|
160
|
+
design_power_sizing_method: 'PowerPerFlowPerPressure',
|
|
161
|
+
power_per_flow_rate: nil,
|
|
162
|
+
power_per_flow_rate_per_pressure: 1.66667,
|
|
163
|
+
speed_control_method: 'Continuous',
|
|
164
|
+
speeds: nil)
|
|
165
|
+
fan = OpenStudio::Model::FanSystemModel.new(model)
|
|
166
|
+
fan.setName(fan_name) unless fan_name.nil?
|
|
167
|
+
fan.setDesignPressureRise(pressure_rise) unless pressure_rise.nil?
|
|
168
|
+
fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
|
|
169
|
+
fan.setMotorInAirStreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
|
|
170
|
+
fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
|
|
171
|
+
fan.setDesignPowerSizingMethod(design_power_sizing_method) unless design_power_sizing_method.nil?
|
|
172
|
+
fan.setElectricPowerPerUnitFlowRate(power_per_flow_rate) unless power_per_flow_rate.nil?
|
|
173
|
+
fan.setElectricPowerPerUnitFlowRatePerUnitPressure(power_per_flow_rate_per_pressure) unless power_per_flow_rate_per_pressure.nil?
|
|
174
|
+
fan.setSpeedControlMethod(speed_control_method) unless speed_control_method.nil?
|
|
175
|
+
if !speeds.nil? && (speed_control_method == 'Discrete')
|
|
176
|
+
speeds.each { |pair| fan.addSpeed(pair[0], pair[1]) }
|
|
177
|
+
end
|
|
178
|
+
|
|
179
|
+
return fan
|
|
180
|
+
end
|
|
181
|
+
|
|
182
|
+
# create a fan with properties for a typical fan type
|
|
183
|
+
#
|
|
184
|
+
# @param model [OpenStudio::Model::Model] OpenStudio model object
|
|
185
|
+
# @param typical_fan [String] the kind of typical fan to create
|
|
186
|
+
# @param fan_name [String] fan name
|
|
187
|
+
# @param fan_efficiency [Double] fan efficiency
|
|
188
|
+
# @param pressure_rise [Double] fan pressure rise in Pa
|
|
189
|
+
# @param motor_efficiency [Double] fan motor efficiency
|
|
190
|
+
# @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
|
|
191
|
+
# @param end_use_subcategory [String] end use subcategory name
|
|
192
|
+
# @param fan_curve [String] fan curve for variable volume fans. See fan_variable_volume_set_control_type() for options.
|
|
193
|
+
# @param system_availability_manager_coupling_mode [String] coupling mode, options are Coupled, Decoupled
|
|
194
|
+
# @return [OpenStudio::Model::StraightComponent] fan object
|
|
195
|
+
def self.create_typical_fan(model, typical_fan,
|
|
196
|
+
fan_name: nil,
|
|
197
|
+
fan_efficiency: nil,
|
|
198
|
+
pressure_rise: nil,
|
|
199
|
+
motor_efficiency: nil,
|
|
200
|
+
motor_in_airstream_fraction: nil,
|
|
201
|
+
end_use_subcategory: nil,
|
|
202
|
+
fan_power_minimum_flow_rate_input_method: nil,
|
|
203
|
+
fan_power_minimum_flow_rate_fraction: nil,
|
|
204
|
+
fan_curve: nil,
|
|
205
|
+
system_availability_manager_coupling_mode: nil)
|
|
206
|
+
fan_json = JSON.parse(File.read("#{__dir__}/data/fans.json"), symbolize_names: true)
|
|
207
|
+
fan_data = fan_json[:fans].select { |hash| hash[:name] == typical_fan }
|
|
208
|
+
|
|
209
|
+
if fan_data.empty?
|
|
210
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC.fan', "Could not find fan data for typical fan '#{typical_fan}'.")
|
|
211
|
+
return nil
|
|
212
|
+
end
|
|
213
|
+
fan_data = fan_data[0]
|
|
214
|
+
|
|
215
|
+
# use argument values if provided, otherwise use values from the fan data
|
|
216
|
+
fan_efficiency ||= fan_data[:fan_efficiency]
|
|
217
|
+
pressure_rise_inh2o ||= fan_data[:pressure_rise]
|
|
218
|
+
pressure_rise_pa = pressure_rise_inh2o ? OpenStudio.convert(pressure_rise_inh2o, 'inH_{2}O', 'Pa').get : nil # convert pressure rise to Pa
|
|
219
|
+
motor_efficiency ||= fan_data[:motor_efficiency]
|
|
220
|
+
motor_in_airstream_fraction ||= fan_data[:motor_in_airstream_fraction]
|
|
221
|
+
|
|
222
|
+
case fan_data[:type]
|
|
223
|
+
when 'OnOff'
|
|
224
|
+
fan = OpenstudioStandards::HVAC.create_fan_on_off(model,
|
|
225
|
+
fan_name: fan_name,
|
|
226
|
+
fan_efficiency: fan_efficiency,
|
|
227
|
+
pressure_rise: pressure_rise_pa,
|
|
228
|
+
motor_efficiency: motor_efficiency,
|
|
229
|
+
motor_in_airstream_fraction: motor_in_airstream_fraction,
|
|
230
|
+
end_use_subcategory: end_use_subcategory)
|
|
231
|
+
when 'ConstantVolume'
|
|
232
|
+
fan = OpenstudioStandards::HVAC.create_fan_constant_volume(model,
|
|
233
|
+
fan_name: fan_name,
|
|
234
|
+
fan_efficiency: fan_efficiency,
|
|
235
|
+
pressure_rise: pressure_rise_pa,
|
|
236
|
+
motor_efficiency: motor_efficiency,
|
|
237
|
+
motor_in_airstream_fraction: motor_in_airstream_fraction,
|
|
238
|
+
end_use_subcategory: end_use_subcategory)
|
|
239
|
+
when 'VariableVolume'
|
|
240
|
+
fan_curve ||= fan_data[:fan_curve]
|
|
241
|
+
fan = OpenstudioStandards::HVAC.create_fan_variable_volume(model,
|
|
242
|
+
fan_name: fan_name,
|
|
243
|
+
fan_efficiency: fan_efficiency,
|
|
244
|
+
pressure_rise: pressure_rise_pa,
|
|
245
|
+
motor_efficiency: motor_efficiency,
|
|
246
|
+
motor_in_airstream_fraction: motor_in_airstream_fraction,
|
|
247
|
+
end_use_subcategory: end_use_subcategory,
|
|
248
|
+
fan_curve: fan_curve,
|
|
249
|
+
fan_power_minimum_flow_rate_input_method: fan_power_minimum_flow_rate_input_method,
|
|
250
|
+
fan_power_minimum_flow_rate_fraction: fan_power_minimum_flow_rate_fraction)
|
|
251
|
+
when 'ZoneExhaust'
|
|
252
|
+
fan = OpenstudioStandards::HVAC.create_fan_zone_exhaust(model,
|
|
253
|
+
fan_name: fan_name,
|
|
254
|
+
fan_efficiency: fan_efficiency,
|
|
255
|
+
pressure_rise: pressure_rise,
|
|
256
|
+
end_use_subcategory: end_use_subcategory,
|
|
257
|
+
system_availability_manager_coupling_mode: system_availability_manager_coupling_mode)
|
|
258
|
+
end
|
|
259
|
+
|
|
260
|
+
return fan
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
# Modify the fan curve coefficients to reflect a specific type of control.
|
|
264
|
+
#
|
|
265
|
+
# @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
|
|
266
|
+
# @param control_type [String] valid choices are:
|
|
267
|
+
# Single Zone VAV
|
|
268
|
+
# Multi Zone VAV with Fixed Static Pressure Setpoint
|
|
269
|
+
# Multi Zone VAV with Static Pressure Setpoint Reset
|
|
270
|
+
# Multi Zone VAV with Discharge Dampers
|
|
271
|
+
# Multi Zone VAV with Airfoil or Backward Incline riding the curve
|
|
272
|
+
# Multi Zone VAV with Airfoil or Backward Incline with Inlet Vanes
|
|
273
|
+
# Multi Zone VAV with Forward Curved fans riding the curve
|
|
274
|
+
# Multi Zone VAV with Forward Curved with Inlet Vanes
|
|
275
|
+
# Multi Zone VAV with Vane-axial with Variable Pitch Blades
|
|
276
|
+
# @return [Boolean] returns true if successful, false if not
|
|
277
|
+
def self.fan_variable_volume_set_control_type(fan_variable_volume, control_type: 'Multi Zone VAV with Static Pressure Setpoint Reset')
|
|
278
|
+
case control_type
|
|
279
|
+
when 'Single Zone VAV'
|
|
280
|
+
# Baseline for System Type 11 from ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
281
|
+
coeff_a = 0.027827882
|
|
282
|
+
coeff_b = 0.026583195
|
|
283
|
+
coeff_c = -0.0870687
|
|
284
|
+
coeff_d = 1.03091975
|
|
285
|
+
min_pct_pwr = 0.1
|
|
286
|
+
when 'Multi Zone VAV with Fixed Static Pressure Setpoint'
|
|
287
|
+
# Appendix G baseline from ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
288
|
+
coeff_a = 0.0013
|
|
289
|
+
coeff_b = 0.1470
|
|
290
|
+
coeff_c = 0.9506
|
|
291
|
+
coeff_d = -0.0998
|
|
292
|
+
min_pct_pwr = 0.2
|
|
293
|
+
when 'Multi Zone VAV with Static Pressure Setpoint Reset'
|
|
294
|
+
# OpenStudio default, baseline for System Types 5-8 from ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
295
|
+
coeff_a = 0.040759894
|
|
296
|
+
coeff_b = 0.08804497
|
|
297
|
+
coeff_c = -0.07292612
|
|
298
|
+
coeff_d = 0.943739823
|
|
299
|
+
min_pct_pwr = 0.1
|
|
300
|
+
when 'Multi Zone VAV with Discharge Dampers'
|
|
301
|
+
coeff_a = 0.18984763
|
|
302
|
+
coeff_b = 0.31447014
|
|
303
|
+
coeff_c = 0.49568211
|
|
304
|
+
coeff_d = 0.0
|
|
305
|
+
min_pct_pwr = 0.25
|
|
306
|
+
when 'Multi Zone VAV with Airfoil or Backward Incline riding the curve'
|
|
307
|
+
# From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
308
|
+
coeff_a = 0.1631
|
|
309
|
+
coeff_b = 1.5901
|
|
310
|
+
coeff_c = -0.8817
|
|
311
|
+
coeff_d = 0.1281
|
|
312
|
+
min_pct_pwr = 0.7
|
|
313
|
+
when 'Multi Zone VAV with Airfoil or Backward Incline with Inlet Vanes'
|
|
314
|
+
# From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
315
|
+
coeff_a = 0.9977
|
|
316
|
+
coeff_b = -0.659
|
|
317
|
+
coeff_c = 0.9547
|
|
318
|
+
coeff_d = -0.2936
|
|
319
|
+
min_pct_pwr = 0.5
|
|
320
|
+
when 'Multi Zone VAV with Forward Curved fans riding the curve'
|
|
321
|
+
# From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
322
|
+
coeff_a = 0.1224
|
|
323
|
+
coeff_b = 0.612
|
|
324
|
+
coeff_c = 0.5983
|
|
325
|
+
coeff_d = -0.3334
|
|
326
|
+
min_pct_pwr = 0.3
|
|
327
|
+
when 'Multi Zone VAV with Forward Curved with Inlet Vanes'
|
|
328
|
+
# From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
329
|
+
coeff_a = 0.3038
|
|
330
|
+
coeff_b = -0.7608
|
|
331
|
+
coeff_c = 2.2729
|
|
332
|
+
coeff_d = -0.8169
|
|
333
|
+
min_pct_pwr = 0.3
|
|
334
|
+
when 'Multi Zone VAV with Vane-axial with Variable Pitch Blades'
|
|
335
|
+
# From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
|
|
336
|
+
coeff_a = 0.1639
|
|
337
|
+
coeff_b = -0.4016
|
|
338
|
+
coeff_c = 1.9909
|
|
339
|
+
coeff_d = -0.7541
|
|
340
|
+
min_pct_pwr = 0.2
|
|
341
|
+
else
|
|
342
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.fan', "Fan control type '#{control_type}' not recognized, fan power coefficients will not be changed.")
|
|
343
|
+
return false
|
|
344
|
+
end
|
|
345
|
+
|
|
346
|
+
# Set the coefficients
|
|
347
|
+
fan_variable_volume.setFanPowerCoefficient1(coeff_a) unless coeff_a.nil?
|
|
348
|
+
fan_variable_volume.setFanPowerCoefficient2(coeff_b) unless coeff_b.nil?
|
|
349
|
+
fan_variable_volume.setFanPowerCoefficient3(coeff_c) unless coeff_c.nil?
|
|
350
|
+
fan_variable_volume.setFanPowerCoefficient4(coeff_d) unless coeff_d.nil?
|
|
351
|
+
|
|
352
|
+
# Set the fan minimum power
|
|
353
|
+
unless min_pct_pwr.nil?
|
|
354
|
+
fan_variable_volume.setFanPowerMinimumFlowRateInputMethod('Fraction')
|
|
355
|
+
fan_variable_volume.setFanPowerMinimumFlowFraction(min_pct_pwr)
|
|
356
|
+
end
|
|
357
|
+
|
|
358
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.HVAC.fan', "For #{fan_variable_volume.name}: Set fan curve coefficients to reflect control type of '#{control_type}'.")
|
|
359
|
+
|
|
360
|
+
return true
|
|
361
|
+
end
|
|
362
|
+
end
|
|
363
|
+
end
|
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
module OpenstudioStandards
|
|
2
|
+
# The HVAC module provides methods create, modify, and get information about HVAC systems in the model
|
|
3
|
+
module HVAC
|
|
4
|
+
# @!group Component:HX
|
|
5
|
+
# Methods to create, modify, and get information about heat exchangers
|
|
6
|
+
|
|
7
|
+
# creates HeatExchangerAirToAirSensibleAndLatent object with user-input effectiveness values
|
|
8
|
+
#
|
|
9
|
+
# @param model [<OpenStudio::Model::Model>] OpenStudio model
|
|
10
|
+
# @param name [String]
|
|
11
|
+
# @param type [String] Heat Exchanger Type. One of 'Plate', 'Rotary'
|
|
12
|
+
# @param economizer_lockout [Boolean] whether heat exchanger is locked out during economizing
|
|
13
|
+
# @param supply_air_outlet_temperature_control [Boolean]
|
|
14
|
+
# @param frost_control_type [String] heat exchanger frost control type. One of 'None', 'ExhaustAirRecirculation', 'ExhaustOnly', 'MinimumExhaustTemperature'
|
|
15
|
+
# @param nominal_electric_power [Float] Nominal electric power
|
|
16
|
+
# @param sensible_heating_100_eff [Float]
|
|
17
|
+
# @param sensible_heating_75_eff [Float]
|
|
18
|
+
# @param latent_heating_100_eff [Float]
|
|
19
|
+
# @param latent_heating_75_eff [Float]
|
|
20
|
+
# @param sensible_cooling_100_eff [Float]
|
|
21
|
+
# @param sensible_cooling_75_eff [Float]
|
|
22
|
+
# @param latent_cooling_100_eff [Float]
|
|
23
|
+
# @param latent_cooling_75_eff [Float]
|
|
24
|
+
# @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HeatExchangerAirToAirSensibleAndLatent object
|
|
25
|
+
def self.create_heat_exchanger_air_to_air_sensible_and_latent(model,
|
|
26
|
+
name: nil,
|
|
27
|
+
type: nil,
|
|
28
|
+
economizer_lockout: nil,
|
|
29
|
+
supply_air_outlet_temperature_control: nil,
|
|
30
|
+
frost_control_type: nil,
|
|
31
|
+
nominal_electric_power: nil,
|
|
32
|
+
sensible_heating_100_eff: nil,
|
|
33
|
+
sensible_heating_75_eff: nil,
|
|
34
|
+
latent_heating_100_eff: nil,
|
|
35
|
+
latent_heating_75_eff: nil,
|
|
36
|
+
sensible_cooling_100_eff: nil,
|
|
37
|
+
sensible_cooling_75_eff: nil,
|
|
38
|
+
latent_cooling_100_eff: nil,
|
|
39
|
+
latent_cooling_75_eff: nil)
|
|
40
|
+
heat_exchanger = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(model)
|
|
41
|
+
heat_exchanger.setName(name) unless name.nil?
|
|
42
|
+
|
|
43
|
+
unless type.nil?
|
|
44
|
+
if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues.include?(type)
|
|
45
|
+
heat_exchanger.setHeatExchangerType(type)
|
|
46
|
+
else
|
|
47
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC', "Entered heat exchanger type #{type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues}")
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
unless frost_control_type.nil?
|
|
52
|
+
if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues.include?(frost_control_type)
|
|
53
|
+
heat_exchanger.setFrostControlType(frost_control_type)
|
|
54
|
+
else
|
|
55
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC', "Entered heat exchanger frost control type #{frost_control_type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues}")
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
heat_exchanger.setEconomizerLockout(economizer_lockout) unless economizer_lockout.nil?
|
|
60
|
+
heat_exchanger.setSupplyAirOutletTemperatureControl(supply_air_outlet_temperature_control) unless supply_air_outlet_temperature_control.nil?
|
|
61
|
+
heat_exchanger.setNominalElectricPower(nominal_electric_power) unless nominal_electric_power.nil?
|
|
62
|
+
|
|
63
|
+
if model.version < OpenStudio::VersionString.new('3.8.0')
|
|
64
|
+
heat_exchanger.setSensibleEffectivenessat100HeatingAirFlow(sensible_heating_100_eff) unless sensible_heating_100_eff.nil?
|
|
65
|
+
heat_exchanger.setSensibleEffectivenessat75HeatingAirFlow(sensible_heating_75_eff) unless sensible_heating_75_eff.nil?
|
|
66
|
+
heat_exchanger.setLatentEffectivenessat100HeatingAirFlow(latent_heating_100_eff) unless latent_heating_100_eff.nil?
|
|
67
|
+
heat_exchanger.setLatentEffectivenessat75HeatingAirFlow(latent_heating_75_eff) unless latent_heating_75_eff.nil?
|
|
68
|
+
heat_exchanger.setSensibleEffectivenessat100CoolingAirFlow(sensible_cooling_100_eff) unless sensible_cooling_100_eff.nil?
|
|
69
|
+
heat_exchanger.setSensibleEffectivenessat75CoolingAirFlow(sensible_cooling_75_eff) unless sensible_cooling_75_eff.nil?
|
|
70
|
+
heat_exchanger.setLatentEffectivenessat100CoolingAirFlow(latent_cooling_100_eff) unless latent_cooling_100_eff.nil?
|
|
71
|
+
heat_exchanger.setLatentEffectivenessat75CoolingAirFlow(latent_cooling_75_eff) unless latent_cooling_75_eff.nil?
|
|
72
|
+
else
|
|
73
|
+
effectiveness_inputs = Hash.new { |hash, key| hash[key] = {} }
|
|
74
|
+
effectiveness_inputs['Sensible Heating'][0.75] = sensible_heating_75_eff.to_f unless sensible_heating_75_eff.nil?
|
|
75
|
+
effectiveness_inputs['Sensible Heating'][1.0] = sensible_heating_100_eff.to_f unless sensible_heating_100_eff.nil?
|
|
76
|
+
effectiveness_inputs['Latent Heating'][0.75] = latent_heating_75_eff.to_f unless latent_heating_75_eff.nil?
|
|
77
|
+
effectiveness_inputs['Latent Heating'][1.0] = latent_heating_100_eff.to_f unless latent_heating_100_eff.nil?
|
|
78
|
+
effectiveness_inputs['Sensible Cooling'][0.75] = sensible_cooling_75_eff.to_f unless sensible_cooling_75_eff.nil?
|
|
79
|
+
effectiveness_inputs['Sensible Cooling'][1.0] = sensible_cooling_100_eff.to_f unless sensible_cooling_100_eff.nil?
|
|
80
|
+
effectiveness_inputs['Latent Cooling'][0.75] = latent_cooling_75_eff.to_f unless latent_cooling_75_eff.nil?
|
|
81
|
+
effectiveness_inputs['Latent Cooling'][1.0] = latent_cooling_100_eff.to_f unless latent_cooling_100_eff.nil?
|
|
82
|
+
|
|
83
|
+
if effectiveness_inputs.values.all?(&:empty?)
|
|
84
|
+
OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.HVAC', 'Creating heat exchanger with historical effectiveness curves')
|
|
85
|
+
defaults = true
|
|
86
|
+
else
|
|
87
|
+
defaults = false
|
|
88
|
+
end
|
|
89
|
+
|
|
90
|
+
OpenstudioStandards::HVAC.heat_exchanger_air_to_air_set_effectiveness_values(heat_exchanger, defaults: defaults, values: effectiveness_inputs)
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
return heat_exchanger
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
# creates LookupTable objects to define effectiveness of HeatExchangerAirToAirSensibleAndLatent objects
|
|
97
|
+
#
|
|
98
|
+
# @param heat_exchanger [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio heat exchanger object to update
|
|
99
|
+
# @param type [String] type of curve to create. one of 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
|
|
100
|
+
# @param values_hash [Hash(Float=>Float)] user_input flow decimal fraction => effectiveness decimal fraction pairs, e.g. (0.75 => 0.81, 1.0 => 0.76)
|
|
101
|
+
# @return [<OpenStudio::Model::TableLookup>] lookup table object
|
|
102
|
+
def self.create_heat_exchanger_effectiveness_table(heat_exchanger, type, values_hash)
|
|
103
|
+
# validate inputs
|
|
104
|
+
types = ['Sensible Heating', 'Latent Heating', 'Sensible Cooling', 'Latent Cooling']
|
|
105
|
+
unless types.include? type
|
|
106
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC', "#{__method__} requires effectiveness type as one of #{types}")
|
|
107
|
+
return false
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def self.validate_effectiveness_hash(values_hash)
|
|
111
|
+
values_hash.all? do |key, value|
|
|
112
|
+
key.is_a?(Float) && value.is_a?(Float) && key.between?(0.0, 1.0) && value.between?(0.0, 1.0)
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
if !validate_effectiveness_hash(values_hash)
|
|
117
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC', "#{__method__} require values_hash to have keys and values between 0.0 and 1.0: #{values_hash}")
|
|
118
|
+
return false
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
# look for existing curve
|
|
122
|
+
type_a = type.split
|
|
123
|
+
method_name = "#{type_a[0].downcase}Effectivenessof#{type_a[1]}AirFlowCurve"
|
|
124
|
+
|
|
125
|
+
# use existing independent variable object if found and matches inputs
|
|
126
|
+
iv = nil
|
|
127
|
+
table = OpenStudio::Model::OptionalTableLookup.new
|
|
128
|
+
if heat_exchanger.send(method_name).is_initialized
|
|
129
|
+
table = heat_exchanger.send(method_name).get.to_TableLookup
|
|
130
|
+
curve = table.get
|
|
131
|
+
iv_existing = curve.independentVariables.first
|
|
132
|
+
if values_hash.keys.sort == iv_existing.values.sort
|
|
133
|
+
iv = iv_existing
|
|
134
|
+
end
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
# otherwise create new independent variable
|
|
138
|
+
if iv.nil?
|
|
139
|
+
iv = OpenStudio::Model::TableIndependentVariable.new(heat_exchanger.model)
|
|
140
|
+
iv.setName("#{heat_exchanger.name.get}_#{type.gsub(' ', '')}_IndependentVariable")
|
|
141
|
+
iv.setInterpolationMethod('Linear')
|
|
142
|
+
iv.setExtrapolationMethod('Linear')
|
|
143
|
+
iv.setMinimumValue(0.0)
|
|
144
|
+
iv.setMaximumValue(10.0)
|
|
145
|
+
iv.setUnitType('Dimensionless')
|
|
146
|
+
values_hash.keys.sort.each { |k| iv.addValue(k) }
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
# create new lookup table
|
|
150
|
+
t = OpenStudio::Model::TableLookup.new(heat_exchanger.model)
|
|
151
|
+
t.setName("#{heat_exchanger.name.get}_#{type.gsub(/ible|ent|ing|\s/, '')}Eff")
|
|
152
|
+
t.addIndependentVariable(iv)
|
|
153
|
+
t.setNormalizationMethod('DivisorOnly')
|
|
154
|
+
t.setMinimumOutput(0.0)
|
|
155
|
+
t.setMaximumOutput(10.0)
|
|
156
|
+
t.setOutputUnitType('Dimensionless')
|
|
157
|
+
values = values_hash.sort.map { |a| a[1] }
|
|
158
|
+
# protect against setting normalization divisor to zero for zero effectiveness
|
|
159
|
+
values[-1].zero? ? t.setNormalizationDivisor(1) : t.setNormalizationDivisor(values[-1])
|
|
160
|
+
values.each { |v| t.addOutputValue(v) }
|
|
161
|
+
|
|
162
|
+
# remove curve if found
|
|
163
|
+
table.get.remove if table.is_initialized
|
|
164
|
+
|
|
165
|
+
return t
|
|
166
|
+
end
|
|
167
|
+
|
|
168
|
+
# Applies historical default or user-input effectiveness values to a HeatExchanger:AirToAir:SensibleAndLatent object
|
|
169
|
+
#
|
|
170
|
+
# @param heat_exchanger [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HeatExchangerAirToAirSensibleAndLatent object to update
|
|
171
|
+
# @param defaults [Boolean] flag to apply historical default curves
|
|
172
|
+
# @param values [Hash{String=>Hash{Float=>Float}}] user-input effectiveness values, where keys are one of
|
|
173
|
+
# 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
|
|
174
|
+
# and value is a hash of (flow decimal fraction => effectivess decimal fraction), e.g. (0.75 => 0.81, 1.0 => 0.76)
|
|
175
|
+
# @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] modified OpenStudio HeatExchangerAirToAirSensibleAndLatent object
|
|
176
|
+
def self.heat_exchanger_air_to_air_set_effectiveness_values(heat_exchanger, defaults: false, values: nil)
|
|
177
|
+
if defaults
|
|
178
|
+
heat_exchanger.assignHistoricalEffectivenessCurves
|
|
179
|
+
if values.nil?
|
|
180
|
+
return heat_exchanger
|
|
181
|
+
end
|
|
182
|
+
elsif values.nil?
|
|
183
|
+
OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC', "#{__method__} called with defaults=false and no values provided. #{heat_exchanger.name.get} will not be modified")
|
|
184
|
+
return heat_exchanger
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
values.each do |type, values_hash|
|
|
188
|
+
# ensure values_hash has one value at 100% flow
|
|
189
|
+
unless values_hash.key?(1.0)
|
|
190
|
+
OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC', "Effectiveness Values for #{type} do not include 100% flow effectivenss. Cannot set effectiveness curves")
|
|
191
|
+
return false
|
|
192
|
+
end
|
|
193
|
+
|
|
194
|
+
lookup_table = OpenstudioStandards::HVAC.create_heat_exchanger_effectiveness_table(heat_exchanger, type, values_hash)
|
|
195
|
+
type_a = type.split
|
|
196
|
+
heat_exchanger.send("set#{type_a[0]}Effectivenessat100#{type_a[1]}AirFlow", values_hash[1.0])
|
|
197
|
+
heat_exchanger.send("set#{type_a[0]}Effectivenessof#{type_a[1]}AirFlowCurve", lookup_table)
|
|
198
|
+
end
|
|
199
|
+
|
|
200
|
+
return heat_exchanger
|
|
201
|
+
end
|
|
202
|
+
end
|
|
203
|
+
end
|