urbanopt-cli 0.9.2 → 0.10.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/{nightly_build.yml → nightly_ci_build.yml} +6 -5
- data/CHANGELOG.md +16 -2
- data/CMakeLists.txt +7 -7
- data/Gemfile +8 -7
- data/LICENSE.md +18 -15
- data/README.md +2 -1
- data/Rakefile +2 -37
- data/example_files/Gemfile +10 -8
- data/example_files/mappers/Baseline.rb +170 -191
- data/example_files/mappers/ChilledWaterStorage.rb +8 -30
- data/example_files/mappers/ClassProject.rb +2 -27
- data/example_files/mappers/CreateBar.rb +2 -28
- data/example_files/mappers/EvCharging.rb +2 -27
- data/example_files/mappers/FlexibleHotWater.rb +2 -27
- data/example_files/mappers/Floorspace.rb +2 -27
- data/example_files/mappers/HighEfficiency.rb +2 -27
- data/example_files/mappers/HighEfficiencyCreateBar.rb +2 -27
- data/example_files/mappers/HighEfficiencyFloorspace.rb +2 -27
- data/example_files/mappers/PeakHoursMelsShedding.rb +4 -27
- data/example_files/mappers/PeakHoursThermostatAdjust.rb +4 -27
- data/example_files/mappers/ThermalStorage.rb +2 -28
- data/example_files/measures/BuildResidentialModel/measure.rb +30 -60
- data/example_files/measures/BuildResidentialModel/measure.xml +253 -84
- data/example_files/measures/BuildResidentialModel/resources/util.rb +45 -45
- data/example_files/python_deps/dependencies.json +3 -3
- data/example_files/resources/hpxml-measures/.github/pull_request_template.md +1 -1
- data/example_files/resources/hpxml-measures/.github/workflows/config.yml +28 -19
- data/example_files/resources/hpxml-measures/.gitignore +0 -997
- data/example_files/resources/hpxml-measures/.readthedocs.yml +9 -0
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +476 -230
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +244 -75
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +42 -15
- data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +24 -9
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +11 -33
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +23 -50
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +2 -2
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +119 -0
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +67 -290
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.md +6 -5
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +78 -349
- data/example_files/resources/hpxml-measures/Changelog.md +80 -10
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +212 -144
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +164 -170
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +238 -167
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +12 -4
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +36 -6
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +33 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +9 -7
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +79 -61
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +387 -124
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +427 -196
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +11515 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/README.md +1 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +224 -85
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +334 -319
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +572 -838
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +162 -68
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +4 -20
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +12 -10
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +34 -37
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +8 -101
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +31 -40
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +8761 -0
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-10-mins.csv +52561 -52561
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic.csv +8761 -8761
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +384 -155
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +2 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +68 -90
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +34 -223
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +16 -4
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +94 -40
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +765 -302
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +119 -69
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +8 -8
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +51 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +196 -9
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +36 -13
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -3
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +2 -2
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +571 -61
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +190 -81
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +11 -11
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +188 -50
- data/example_files/resources/hpxml-measures/README.md +3 -3
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +659 -815
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +301 -1112
- data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +605 -350
- data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +18 -14
- data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +15 -15
- data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +13 -3
- data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +3 -3
- data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +894 -596
- data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +127 -76
- data/example_files/resources/hpxml-measures/tasks.rb +185 -2802
- data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +3401 -0
- data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +1 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +1 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +1 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +17 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +2 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +4 -5
- data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +1 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +4 -5
- data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +3 -3
- data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +3 -4
- data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +0 -1
- data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +1 -0
- data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +1 -0
- data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +12 -8
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +9 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-2stories.xml → base-bldgtype-attached-2stories.xml} +610 -639
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-atticroof-cathedral.xml → base-bldgtype-attached-atticroof-cathedral.xml} +558 -587
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml +611 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached.xml → base-bldgtype-attached.xml} +610 -639
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml +462 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-calctype-operational.xml → base-bldgtype-multifamily-residents-1.xml} +453 -480
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +11 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +15 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +10 -39
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +11 -43
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +19 -25
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +18 -24
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +549 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +13 -43
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +552 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +17 -47
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +559 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +19 -25
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml +557 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml → base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml} +552 -583
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml → base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml} +562 -586
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +587 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +17 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml +553 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +519 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +566 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +513 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-crankcase-heater-40w.xml +556 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +560 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +17 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +17 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +17 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +17 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +555 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +553 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +506 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +542 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +14 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +14 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +14 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +14 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +525 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +564 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +506 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +513 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +16 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +11 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +529 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +537 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +516 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +1 -7
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +12 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +14 -44
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +10 -38
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +14 -37
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +12 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +12 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +12 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +10 -38
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +10 -38
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +509 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +10 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +30 -138
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +24 -26
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +18 -44
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +18 -44
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +18 -44
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +16 -42
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +560 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +556 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-loads-large-uncommon.xml → base-residents-1-misc-loads-large-uncommon.xml} +616 -644
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-loads-large-uncommon2.xml → base-residents-1-misc-loads-large-uncommon2.xml} +616 -644
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational.xml → base-residents-1.xml} +547 -575
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-defaults.xml → base-residents-5.xml} +515 -539
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-smooth.xml → base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml} +563 -583
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +21 -41
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-available.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-unavailable.xml +565 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +620 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +619 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +619 -0
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +10 -38
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +10 -40
- data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +10 -37
- data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +16 -4
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +16 -3
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +16 -3
- data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +16 -2
- data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +386 -0
- data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +381 -0
- data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +370 -0
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +2 -2
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +2 -12
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +2 -12
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +2 -5
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -9
- data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -9
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +475 -444
- data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +475 -444
- data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +177 -112
- data/example_files/resources/meta_measure.rb +2 -27
- data/example_files/xml_building/17/README.md +3 -3
- data/lib/uo_cli/version.rb +3 -38
- data/lib/uo_cli.rb +3 -38
- data/uo_cli.gemspec +6 -7
- metadata +70 -51
- data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.json +0 -388
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +0 -6136
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +0 -4846
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-smooth.csv +0 -8761
- data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-vacancy.csv +0 -8761
- data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_CO_Colorado.Springs-Peterson.Field.724660_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_DE_Wilmington-New.Castle.County.AP.724089_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_FL_Miami.Intl.AP.722020_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_MD_Baltimore-Washington.Intl.AP.724060_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_MN_Duluth.Intl.AP.727450_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_NC_Charlotte-Douglas.Intl.AP.723140_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_NJ_Cape.May.County.AP.745966_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_NV_Las.Vegas-McCarran.Intl.AP.723860_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/USA_TX_Dallas-Fort.Worth.Intl.AP.722590_TMY3-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +0 -35
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +0 -2508
- data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +0 -2508
@@ -1,29 +1,13 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
class HVACSizing
|
4
|
-
def self.calculate(weather, hpxml, cfa,
|
4
|
+
def self.calculate(weather, hpxml, cfa, hvac_systems)
|
5
5
|
# Calculates heating/cooling design loads, and selects equipment
|
6
6
|
# values (e.g., capacities, airflows) specific to each HVAC system.
|
7
7
|
# Calculations generally follow ACCA Manual J/S.
|
8
8
|
|
9
9
|
@hpxml = hpxml
|
10
10
|
@cfa = cfa
|
11
|
-
@nbeds = nbeds
|
12
|
-
|
13
|
-
def self.is_system_to_skip(hvac)
|
14
|
-
# These shared systems should be converted to other equivalent
|
15
|
-
# systems before being autosized
|
16
|
-
if [HPXML::HVACTypeChiller,
|
17
|
-
HPXML::HVACTypeCoolingTower].include?(hvac.CoolType)
|
18
|
-
return true
|
19
|
-
end
|
20
|
-
if [HPXML::HVACTypeHeatPumpWaterLoopToAir].include?(hvac.HeatType) &&
|
21
|
-
hvac.HeatingLoadFraction.nil?
|
22
|
-
return true
|
23
|
-
end
|
24
|
-
|
25
|
-
return false
|
26
|
-
end
|
27
11
|
|
28
12
|
process_site_calcs_and_design_temps(weather)
|
29
13
|
|
@@ -31,8 +15,8 @@ class HVACSizing
|
|
31
15
|
bldg_design_loads = DesignLoads.new
|
32
16
|
process_load_windows_skylights(bldg_design_loads, weather)
|
33
17
|
process_load_doors(bldg_design_loads)
|
34
|
-
process_load_walls(bldg_design_loads
|
35
|
-
process_load_roofs(bldg_design_loads
|
18
|
+
process_load_walls(bldg_design_loads)
|
19
|
+
process_load_roofs(bldg_design_loads)
|
36
20
|
process_load_ceilings(bldg_design_loads)
|
37
21
|
process_load_floors(bldg_design_loads)
|
38
22
|
process_load_slabs(bldg_design_loads)
|
@@ -46,23 +30,26 @@ class HVACSizing
|
|
46
30
|
all_hvac_sizing_values = {}
|
47
31
|
system_design_loads = bldg_design_loads.dup
|
48
32
|
hvac_systems.each do |hvac_system|
|
49
|
-
|
50
|
-
|
33
|
+
hvac_heating, hvac_cooling = hvac_system[:heating], hvac_system[:cooling]
|
34
|
+
set_hvac_types(hvac_heating, hvac_cooling)
|
35
|
+
next if is_system_to_skip(hvac_heating)
|
51
36
|
|
52
37
|
# Apply duct loads as needed
|
53
|
-
|
54
|
-
|
55
|
-
|
38
|
+
set_fractions_load_served(hvac_heating, hvac_cooling)
|
39
|
+
apply_hvac_temperatures(system_design_loads, hvac_heating, hvac_cooling)
|
40
|
+
ducts_heat_load = calculate_load_ducts_heating(system_design_loads, hvac_heating)
|
41
|
+
ducts_cool_load_sens, ducts_cool_load_lat = calculate_load_ducts_cooling(system_design_loads, weather, hvac_cooling)
|
56
42
|
apply_load_ducts(bldg_design_loads, ducts_heat_load, ducts_cool_load_sens, ducts_cool_load_lat) # Update duct loads in reported building design loads
|
57
43
|
|
58
44
|
hvac_sizing_values = HVACSizingValues.new
|
59
|
-
apply_hvac_loads(
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
45
|
+
apply_hvac_loads(hvac_heating, hvac_sizing_values, system_design_loads, ducts_heat_load, ducts_cool_load_sens, ducts_cool_load_lat)
|
46
|
+
apply_hvac_size_limits(hvac_cooling)
|
47
|
+
apply_hvac_heat_pump_logic(hvac_sizing_values, hvac_cooling)
|
48
|
+
apply_hvac_equipment_adjustments(hvac_sizing_values, weather, hvac_heating, hvac_cooling, hvac_system)
|
49
|
+
apply_hvac_installation_quality(hvac_sizing_values, hvac_heating, hvac_cooling)
|
50
|
+
apply_hvac_fixed_capacities(hvac_sizing_values, hvac_heating, hvac_cooling)
|
51
|
+
apply_hvac_ground_loop(hvac_sizing_values, weather, hvac_cooling)
|
52
|
+
apply_hvac_finalize_airflows(hvac_sizing_values, hvac_heating, hvac_cooling)
|
66
53
|
|
67
54
|
all_hvac_sizing_values[hvac_system] = hvac_sizing_values
|
68
55
|
end
|
@@ -72,6 +59,21 @@ class HVACSizing
|
|
72
59
|
|
73
60
|
private
|
74
61
|
|
62
|
+
def self.is_system_to_skip(hvac_heating)
|
63
|
+
# These shared systems should be converted to other equivalent
|
64
|
+
# systems before being autosized
|
65
|
+
if [HPXML::HVACTypeChiller,
|
66
|
+
HPXML::HVACTypeCoolingTower].include?(@cooling_type)
|
67
|
+
return true
|
68
|
+
end
|
69
|
+
if (@heating_type == HPXML::HVACTypeHeatPumpWaterLoopToAir) &&
|
70
|
+
hvac_heating.fraction_heat_load_served.nil?
|
71
|
+
return true
|
72
|
+
end
|
73
|
+
|
74
|
+
return false
|
75
|
+
end
|
76
|
+
|
75
77
|
def self.process_site_calcs_and_design_temps(weather)
|
76
78
|
'''
|
77
79
|
Site Calculations and Design Temperatures
|
@@ -81,14 +83,14 @@ class HVACSizing
|
|
81
83
|
@daily_range_temp_adjust = [4, 0, -5]
|
82
84
|
|
83
85
|
# Manual J inside conditions
|
84
|
-
@cool_setpoint =
|
85
|
-
@heat_setpoint =
|
86
|
+
@cool_setpoint = @hpxml.header.manualj_cooling_setpoint
|
87
|
+
@heat_setpoint = @hpxml.header.manualj_heating_setpoint
|
86
88
|
|
87
89
|
@cool_design_grains = UnitConversions.convert(weather.design.CoolingHumidityRatio, 'lbm/lbm', 'grains')
|
88
90
|
|
89
91
|
# Calculate the design temperature differences
|
90
|
-
@ctd = [
|
91
|
-
@htd = [@heat_setpoint -
|
92
|
+
@ctd = [@hpxml.header.manualj_cooling_design_temp - @cool_setpoint, 0.0].max
|
93
|
+
@htd = [@heat_setpoint - @hpxml.header.manualj_heating_design_temp, 0.0].max
|
92
94
|
|
93
95
|
# Calculate the average Daily Temperature Range (DTR) to determine the class (low, medium, high)
|
94
96
|
dtr = weather.design.DailyTemperatureRange
|
@@ -109,11 +111,12 @@ class HVACSizing
|
|
109
111
|
@acf = MathTools.interp2(weather.header.Altitude, alt_cnt * 1000.0, (alt_cnt + 1.0) * 1000.0, acfs[alt_cnt], acfs[alt_cnt + 1])
|
110
112
|
|
111
113
|
# Calculate the interior humidity in Grains and enthalpy in Btu/lb for cooling
|
112
|
-
|
113
|
-
|
114
|
+
cool_setpoint_c = UnitConversions.convert(@cool_setpoint, 'F', 'C')
|
115
|
+
pwsat = 6.11 * 10**(7.5 * cool_setpoint_c / (237.3 + cool_setpoint_c)) / 10.0 # kPa, using https://www.weather.gov/media/epz/wxcalc/vaporPressure.pdf
|
116
|
+
rh_indoor_cooling = 0.5 # Manual J is vague on the indoor RH but uses 50% in its examples
|
114
117
|
hr_indoor_cooling = (0.62198 * rh_indoor_cooling * pwsat) / (UnitConversions.convert(weather.header.LocalPressure, 'atm', 'kPa') - rh_indoor_cooling * pwsat)
|
115
118
|
@cool_indoor_grains = UnitConversions.convert(hr_indoor_cooling, 'lbm/lbm', 'grains')
|
116
|
-
@wetbulb_indoor_cooling = Psychrometrics.Twb_fT_R_P(@cool_setpoint, rh_indoor_cooling, UnitConversions.convert(weather.header.LocalPressure, 'atm', 'psi'))
|
119
|
+
@wetbulb_indoor_cooling = Psychrometrics.Twb_fT_R_P(nil, @cool_setpoint, rh_indoor_cooling, UnitConversions.convert(weather.header.LocalPressure, 'atm', 'psi'))
|
117
120
|
|
118
121
|
db_indoor_degC = UnitConversions.convert(@cool_setpoint, 'F', 'C')
|
119
122
|
@enthalpy_indoor_cooling = (1.006 * db_indoor_degC + hr_indoor_cooling * (2501.0 + 1.86 * db_indoor_degC)) * UnitConversions.convert(1.0, 'kJ', 'Btu') * UnitConversions.convert(1.0, 'lbm', 'kg')
|
@@ -144,11 +147,11 @@ class HVACSizing
|
|
144
147
|
|
145
148
|
if [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace,
|
146
149
|
HPXML::LocationOtherNonFreezingSpace, HPXML::LocationExteriorWall, HPXML::LocationUnderSlab].include? location
|
147
|
-
@cool_design_temps[location] = calculate_scheduled_space_design_temps(location, @cool_setpoint,
|
148
|
-
@heat_design_temps[location] = calculate_scheduled_space_design_temps(location, @heat_setpoint,
|
150
|
+
@cool_design_temps[location] = calculate_scheduled_space_design_temps(location, @cool_setpoint, @hpxml.header.manualj_cooling_design_temp, weather.data.GroundMonthlyTemps.max)
|
151
|
+
@heat_design_temps[location] = calculate_scheduled_space_design_temps(location, @heat_setpoint, @hpxml.header.manualj_heating_design_temp, weather.data.GroundMonthlyTemps.min)
|
149
152
|
elsif [HPXML::LocationOutside, HPXML::LocationRoofDeck].include? location
|
150
|
-
@cool_design_temps[location] =
|
151
|
-
@heat_design_temps[location] =
|
153
|
+
@cool_design_temps[location] = @hpxml.header.manualj_cooling_design_temp
|
154
|
+
@heat_design_temps[location] = @hpxml.header.manualj_heating_design_temp
|
152
155
|
elsif HPXML::conditioned_locations.include? location
|
153
156
|
@cool_design_temps[location] = process_design_temp_cooling(weather, HPXML::LocationLivingSpace)
|
154
157
|
@heat_design_temps[location] = process_design_temp_heating(weather, HPXML::LocationLivingSpace)
|
@@ -164,7 +167,7 @@ class HVACSizing
|
|
164
167
|
heat_temp = @heat_setpoint
|
165
168
|
|
166
169
|
elsif location == HPXML::LocationGarage
|
167
|
-
heat_temp =
|
170
|
+
heat_temp = @hpxml.header.manualj_heating_design_temp + 13.0
|
168
171
|
|
169
172
|
elsif (location == HPXML::LocationAtticUnvented) || (location == HPXML::LocationAtticVented)
|
170
173
|
|
@@ -178,16 +181,16 @@ class HVACSizing
|
|
178
181
|
# Attic is considered to be encapsulated. MJ8 says to use an attic
|
179
182
|
# temperature of 95F, however alternative approaches are permissible
|
180
183
|
if location == HPXML::LocationAtticVented
|
181
|
-
heat_temp =
|
184
|
+
heat_temp = @hpxml.header.manualj_heating_design_temp
|
182
185
|
else
|
183
|
-
heat_temp = calculate_space_design_temps(location, weather, @heat_setpoint,
|
186
|
+
heat_temp = calculate_space_design_temps(location, weather, @heat_setpoint, @hpxml.header.manualj_heating_design_temp, weather.data.GroundMonthlyTemps.min)
|
184
187
|
end
|
185
188
|
else
|
186
|
-
heat_temp =
|
189
|
+
heat_temp = @hpxml.header.manualj_heating_design_temp
|
187
190
|
end
|
188
191
|
|
189
192
|
elsif [HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceUnvented, HPXML::LocationCrawlspaceVented].include? location
|
190
|
-
heat_temp = calculate_space_design_temps(location, weather, @heat_setpoint,
|
193
|
+
heat_temp = calculate_space_design_temps(location, weather, @heat_setpoint, @hpxml.header.manualj_heating_design_temp, weather.data.GroundMonthlyTemps.min)
|
191
194
|
|
192
195
|
end
|
193
196
|
|
@@ -224,15 +227,15 @@ class HVACSizing
|
|
224
227
|
# Calculate the garage cooling design temperature based on Table 4C
|
225
228
|
# Linearly interpolate between having living space over the garage and not having living space above the garage
|
226
229
|
if @daily_range_num == 0.0
|
227
|
-
cool_temp = (
|
230
|
+
cool_temp = (@hpxml.header.manualj_cooling_design_temp +
|
228
231
|
(11.0 * garage_frac_under_conditioned) +
|
229
232
|
(22.0 * (1.0 - garage_frac_under_conditioned)))
|
230
233
|
elsif @daily_range_num == 1.0
|
231
|
-
cool_temp = (
|
234
|
+
cool_temp = (@hpxml.header.manualj_cooling_design_temp +
|
232
235
|
(6.0 * garage_frac_under_conditioned) +
|
233
236
|
(17.0 * (1.0 - garage_frac_under_conditioned)))
|
234
237
|
elsif @daily_range_num == 2.0
|
235
|
-
cool_temp = (
|
238
|
+
cool_temp = (@hpxml.header.manualj_cooling_design_temp +
|
236
239
|
(1.0 * garage_frac_under_conditioned) +
|
237
240
|
(12.0 * (1.0 - garage_frac_under_conditioned)))
|
238
241
|
end
|
@@ -249,9 +252,9 @@ class HVACSizing
|
|
249
252
|
# Attic is considered to be encapsulated. MJ8 says to use an attic
|
250
253
|
# temperature of 95F, however alternative approaches are permissible
|
251
254
|
if location == HPXML::LocationAtticVented
|
252
|
-
cool_temp =
|
255
|
+
cool_temp = @hpxml.header.manualj_cooling_design_temp + 40.0 # This is the number from a California study with dark shingle roof and similar ventilation.
|
253
256
|
else
|
254
|
-
cool_temp = calculate_space_design_temps(location, weather, @cool_setpoint,
|
257
|
+
cool_temp = calculate_space_design_temps(location, weather, @cool_setpoint, @hpxml.header.manualj_cooling_design_temp, weather.data.GroundMonthlyTemps.max, true)
|
255
258
|
end
|
256
259
|
|
257
260
|
else
|
@@ -267,9 +270,9 @@ class HVACSizing
|
|
267
270
|
|
268
271
|
if location == HPXML::LocationAtticUnvented
|
269
272
|
if not roof.radiant_barrier
|
270
|
-
cool_temp += (150.0 + (
|
273
|
+
cool_temp += (150.0 + (@hpxml.header.manualj_cooling_design_temp - 95.0) + @daily_range_temp_adjust[@daily_range_num]) * roof.net_area
|
271
274
|
else
|
272
|
-
cool_temp += (130.0 + (
|
275
|
+
cool_temp += (130.0 + (@hpxml.header.manualj_cooling_design_temp - 95.0) + @daily_range_temp_adjust[@daily_range_num]) * roof.net_area
|
273
276
|
end
|
274
277
|
else
|
275
278
|
if not roof.radiant_barrier
|
@@ -331,11 +334,11 @@ class HVACSizing
|
|
331
334
|
cool_temp /= tot_roof_area
|
332
335
|
|
333
336
|
# Adjust base CLTD for cooling design temperature and daily range
|
334
|
-
cool_temp += (
|
337
|
+
cool_temp += (@hpxml.header.manualj_cooling_design_temp - 95.0) + @daily_range_temp_adjust[@daily_range_num]
|
335
338
|
end
|
336
339
|
|
337
340
|
elsif [HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceUnvented, HPXML::LocationCrawlspaceVented].include? location
|
338
|
-
cool_temp = calculate_space_design_temps(location, weather, @cool_setpoint,
|
341
|
+
cool_temp = calculate_space_design_temps(location, weather, @cool_setpoint, @hpxml.header.manualj_cooling_design_temp, weather.data.GroundMonthlyTemps.max)
|
339
342
|
|
340
343
|
end
|
341
344
|
|
@@ -476,7 +479,7 @@ class HVACSizing
|
|
476
479
|
# Windows
|
477
480
|
bldg_design_loads.Heat_Windows = 0.0
|
478
481
|
alp_load = 0.0 # Average Load Procedure (ALP) Load
|
479
|
-
afl_hr = [0.0
|
482
|
+
afl_hr = [0.0] * 12 # Initialize Hourly Aggregate Fenestration Load (AFL)
|
480
483
|
|
481
484
|
@hpxml.windows.each do |window|
|
482
485
|
next unless window.wall.is_exterior_thermal_boundary
|
@@ -489,7 +492,7 @@ class HVACSizing
|
|
489
492
|
|
490
493
|
bldg_design_loads.Heat_Windows += window_ufactor * window.area * @htd
|
491
494
|
|
492
|
-
for hr in -1..
|
495
|
+
for hr in -1..11
|
493
496
|
|
494
497
|
# If hr == -1: Calculate the Average Load Procedure (ALP) Load
|
495
498
|
# Else: Calculate the hourly Aggregate Fenestration Load (AFL)
|
@@ -610,7 +613,7 @@ class HVACSizing
|
|
610
613
|
# Skylights
|
611
614
|
bldg_design_loads.Heat_Skylights = 0.0
|
612
615
|
alp_load = 0.0 # Average Load Procedure (ALP) Load
|
613
|
-
afl_hr = [0.0
|
616
|
+
afl_hr = [0.0] * 12 # Initialize Hourly Aggregate Fenestration Load (AFL)
|
614
617
|
|
615
618
|
@hpxml.skylights.each do |skylight|
|
616
619
|
skylight_summer_sf = skylight.interior_shading_factor_summer * skylight.exterior_shading_factor_summer
|
@@ -622,7 +625,7 @@ class HVACSizing
|
|
622
625
|
|
623
626
|
bldg_design_loads.Heat_Skylights += skylight_ufactor * skylight.area * @htd
|
624
627
|
|
625
|
-
for hr in -1..
|
628
|
+
for hr in -1..11
|
626
629
|
|
627
630
|
# If hr == -1: Calculate the Average Load Procedure (ALP) Load
|
628
631
|
# Else: Calculate the hourly Aggregate Fenestration Load (AFL)
|
@@ -716,7 +719,7 @@ class HVACSizing
|
|
716
719
|
end
|
717
720
|
end
|
718
721
|
|
719
|
-
def self.process_load_walls(bldg_design_loads
|
722
|
+
def self.process_load_walls(bldg_design_loads)
|
720
723
|
'''
|
721
724
|
Heating and Cooling Loads: Walls
|
722
725
|
'''
|
@@ -771,7 +774,7 @@ class HVACSizing
|
|
771
774
|
|
772
775
|
if @ctd >= 10.0
|
773
776
|
# Adjust the CLTD for different cooling design temperatures
|
774
|
-
cltd += (
|
777
|
+
cltd += (@hpxml.header.manualj_cooling_design_temp - 95.0)
|
775
778
|
# Adjust the CLTD for daily temperature range
|
776
779
|
cltd += @daily_range_temp_adjust[@daily_range_num]
|
777
780
|
else
|
@@ -799,7 +802,7 @@ class HVACSizing
|
|
799
802
|
end
|
800
803
|
end
|
801
804
|
|
802
|
-
def self.process_load_roofs(bldg_design_loads
|
805
|
+
def self.process_load_roofs(bldg_design_loads)
|
803
806
|
'''
|
804
807
|
Heating and Cooling Loads: Roofs
|
805
808
|
'''
|
@@ -846,7 +849,7 @@ class HVACSizing
|
|
846
849
|
end
|
847
850
|
|
848
851
|
# Adjust base CLTD for different CTD or DR
|
849
|
-
cltd += (
|
852
|
+
cltd += (@hpxml.header.manualj_cooling_design_temp - 95.0) + @daily_range_temp_adjust[@daily_range_num]
|
850
853
|
|
851
854
|
bldg_design_loads.Cool_Roofs += (1.0 / roof.insulation_assembly_r_value) * roof.net_area * cltd
|
852
855
|
bldg_design_loads.Heat_Roofs += (1.0 / roof.insulation_assembly_r_value) * roof.net_area * @htd
|
@@ -953,9 +956,16 @@ class HVACSizing
|
|
953
956
|
bldg_design_loads.Heat_Slabs += f_value * slab.exposed_perimeter * @htd
|
954
957
|
elsif HPXML::conditioned_below_grade_locations.include? slab.interior_adjacent_to
|
955
958
|
# Based on MJ 8th Ed. A12-7 and ASHRAE HoF 2013 pg 18.31 Eq 40
|
956
|
-
|
957
|
-
|
958
|
-
|
959
|
+
slab_is_insulated = false
|
960
|
+
if slab.under_slab_insulation_width > 0 && slab.under_slab_insulation_r_value > 0
|
961
|
+
slab_is_insulated = true
|
962
|
+
elsif slab.perimeter_insulation_depth > 0 && slab.perimeter_insulation_r_value > 0
|
963
|
+
slab_is_insulated = true
|
964
|
+
elsif slab.under_slab_insulation_spans_entire_slab && slab.under_slab_insulation_r_value > 0
|
965
|
+
slab_is_insulated = true
|
966
|
+
end
|
967
|
+
k_soil = 0.8 # Value from ASHRAE HoF, probably used by Manual J
|
968
|
+
r_other = 1.47 # Value from ASHRAE HoF, probably used by Manual J
|
959
969
|
foundation_walls = @hpxml.foundation_walls.select { |fw| fw.is_thermal_boundary }
|
960
970
|
z_f = foundation_walls.map { |fw| fw.depth_below_grade }.sum(0.0) / foundation_walls.size # Average below-grade depth
|
961
971
|
sqrt_term = [slab.exposed_perimeter**2 - 16.0 * slab.area, 0.0].max
|
@@ -964,8 +974,11 @@ class HVACSizing
|
|
964
974
|
w_b = [length, width].min
|
965
975
|
w_b = [w_b, 1.0].max # handle zero exposed perimeter
|
966
976
|
u_avg_bf = (2.0 * k_soil / (Math::PI * w_b)) * (Math::log(w_b / 2.0 + z_f / 2.0 + (k_soil * r_other) / Math::PI) - Math::log(z_f / 2.0 + (k_soil * r_other) / Math::PI))
|
967
|
-
|
968
|
-
|
977
|
+
u_value = 0.85 * u_avg_bf # To account for the storage effect of soil, multiply by 0.85
|
978
|
+
if slab_is_insulated
|
979
|
+
u_value *= 0.7 # U-values are multiplied y 0.70 to produce U-values for insulated floors
|
980
|
+
end
|
981
|
+
bldg_design_loads.Heat_Slabs += u_value * slab.area * @htd
|
969
982
|
end
|
970
983
|
end
|
971
984
|
end
|
@@ -975,23 +988,8 @@ class HVACSizing
|
|
975
988
|
Heating and Cooling Loads: Infiltration & Ventilation
|
976
989
|
'''
|
977
990
|
|
978
|
-
|
979
|
-
|
980
|
-
infil_height = @hpxml.air_infiltration_measurements.select { |i| !i.infiltration_height.nil? }[0].infiltration_height
|
981
|
-
sla = nil
|
982
|
-
@hpxml.air_infiltration_measurements.each do |measurement|
|
983
|
-
if [HPXML::UnitsACH, HPXML::UnitsCFM].include?(measurement.unit_of_measure) && !measurement.house_pressure.nil?
|
984
|
-
if measurement.unit_of_measure == HPXML::UnitsACH
|
985
|
-
ach50 = Airflow.calc_air_leakage_at_diff_pressure(0.65, measurement.air_leakage, measurement.house_pressure, 50.0)
|
986
|
-
elsif measurement.unit_of_measure == HPXML::UnitsCFM
|
987
|
-
achXX = measurement.air_leakage * 60.0 / infil_volume # Convert CFM to ACH
|
988
|
-
ach50 = Airflow.calc_air_leakage_at_diff_pressure(0.65, achXX, measurement.house_pressure, 50.0)
|
989
|
-
end
|
990
|
-
sla = Airflow.get_infiltration_SLA_from_ACH50(ach50, 0.65, @cfa, infil_volume)
|
991
|
-
elsif measurement.unit_of_measure == HPXML::UnitsACHNatural
|
992
|
-
sla = Airflow.get_infiltration_SLA_from_ACH(measurement.air_leakage, infil_height, weather)
|
993
|
-
end
|
994
|
-
end
|
991
|
+
sla, _ach50, _nach, _volume, _height, a_ext = Airflow.get_values_from_air_infiltration_measurements(@hpxml, @cfa, weather)
|
992
|
+
sla *= a_ext
|
995
993
|
ela = sla * @cfa
|
996
994
|
|
997
995
|
ncfl_ag = @hpxml.building_construction.number_of_conditioned_floors_above_grade
|
@@ -1012,13 +1010,13 @@ class HVACSizing
|
|
1012
1010
|
|
1013
1011
|
cfm_Heating = q_bal_Sens + (icfm_Heating**2.0 + q_unb_cfm**2.0)**0.5 - q_preheat - q_recirc
|
1014
1012
|
|
1015
|
-
|
1016
|
-
|
1013
|
+
cfm_cool_load_sens = q_bal_Sens + (icfm_Cooling**2.0 + q_unb_cfm**2.0)**0.5 - q_precool - q_recirc
|
1014
|
+
cfm_cool_load_lat = q_bal_Lat + (icfm_Cooling**2.0 + q_unb_cfm**2.0)**0.5 - q_recirc
|
1017
1015
|
|
1018
1016
|
bldg_design_loads.Heat_InfilVent = 1.1 * @acf * cfm_Heating * @htd
|
1019
1017
|
|
1020
|
-
bldg_design_loads.
|
1021
|
-
bldg_design_loads.
|
1018
|
+
bldg_design_loads.Cool_InfilVent_Sens = 1.1 * @acf * cfm_cool_load_sens * @ctd
|
1019
|
+
bldg_design_loads.Cool_InfilVent_Lat = 0.68 * @acf * cfm_cool_load_lat * (@cool_design_grains - @cool_indoor_grains)
|
1022
1020
|
end
|
1023
1021
|
|
1024
1022
|
def self.process_load_internal_gains(bldg_design_loads)
|
@@ -1026,10 +1024,8 @@ class HVACSizing
|
|
1026
1024
|
Cooling Load: Internal Gains
|
1027
1025
|
'''
|
1028
1026
|
|
1029
|
-
|
1030
|
-
|
1031
|
-
bldg_design_loads.Cool_IntGains_Sens = 1600.0 + 230.0 * n_occupants
|
1032
|
-
bldg_design_loads.Cool_IntGains_Lat = 200.0 * n_occupants
|
1027
|
+
bldg_design_loads.Cool_IntGains_Sens = @hpxml.header.manualj_internal_loads_sensible + 230.0 * @hpxml.header.manualj_num_occupants
|
1028
|
+
bldg_design_loads.Cool_IntGains_Lat = @hpxml.header.manualj_internal_loads_latent + 200.0 * @hpxml.header.manualj_num_occupants
|
1033
1029
|
end
|
1034
1030
|
|
1035
1031
|
def self.aggregate_loads(bldg_design_loads)
|
@@ -1048,12 +1044,12 @@ class HVACSizing
|
|
1048
1044
|
bldg_design_loads.Cool_Sens = bldg_design_loads.Cool_Windows + bldg_design_loads.Cool_Skylights +
|
1049
1045
|
bldg_design_loads.Cool_Doors + bldg_design_loads.Cool_Walls +
|
1050
1046
|
bldg_design_loads.Cool_Floors + bldg_design_loads.Cool_Ceilings +
|
1051
|
-
bldg_design_loads.Cool_Roofs + bldg_design_loads.
|
1047
|
+
bldg_design_loads.Cool_Roofs + bldg_design_loads.Cool_InfilVent_Sens +
|
1052
1048
|
bldg_design_loads.Cool_IntGains_Sens
|
1053
|
-
bldg_design_loads.Cool_Lat = bldg_design_loads.
|
1049
|
+
bldg_design_loads.Cool_Lat = bldg_design_loads.Cool_InfilVent_Lat + bldg_design_loads.Cool_IntGains_Lat
|
1054
1050
|
if bldg_design_loads.Cool_Lat < 0 # No latent loads; also zero out individual components
|
1055
1051
|
bldg_design_loads.Cool_Lat = 0.0
|
1056
|
-
bldg_design_loads.
|
1052
|
+
bldg_design_loads.Cool_InfilVent_Lat = 0.0
|
1057
1053
|
bldg_design_loads.Cool_IntGains_Lat = 0.0
|
1058
1054
|
end
|
1059
1055
|
bldg_design_loads.Cool_Tot = bldg_design_loads.Cool_Sens + bldg_design_loads.Cool_Lat
|
@@ -1064,60 +1060,55 @@ class HVACSizing
|
|
1064
1060
|
bldg_design_loads.Cool_Ducts_Lat = 0.0
|
1065
1061
|
end
|
1066
1062
|
|
1067
|
-
def self.apply_hvac_temperatures(
|
1063
|
+
def self.apply_hvac_temperatures(system_design_loads, hvac_heating, hvac_cooling)
|
1068
1064
|
'''
|
1069
1065
|
HVAC Temperatures
|
1070
1066
|
'''
|
1071
1067
|
# Evaporative cooler temperature calculation based on Manual S Figure 4-7
|
1072
|
-
if
|
1068
|
+
if @cooling_type == HPXML::HVACTypeEvaporativeCooler
|
1073
1069
|
td_potential = @cool_design_temps[HPXML::LocationOutside] - @wetbulb_outdoor_cooling
|
1074
|
-
td = td_potential *
|
1075
|
-
|
1070
|
+
td = td_potential * hvac_cooling.additional_properties.effectiveness
|
1071
|
+
@leaving_air_temp = @cool_design_temps[HPXML::LocationOutside] - td
|
1076
1072
|
else
|
1077
1073
|
# Calculate Leaving Air Temperature
|
1078
1074
|
shr = [system_design_loads.Cool_Sens / system_design_loads.Cool_Tot, 1.0].min
|
1079
1075
|
# Determine the Leaving Air Temperature (LAT) based on Manual S Table 1-4
|
1080
1076
|
if shr < 0.80
|
1081
|
-
|
1077
|
+
@leaving_air_temp = 54.0 # F
|
1082
1078
|
elsif shr < 0.85
|
1083
1079
|
# MJ8 says to use 56 degF in this SHR range. Linear interpolation provides a more
|
1084
1080
|
# continuous supply air flow rate across building efficiency levels.
|
1085
|
-
|
1081
|
+
@leaving_air_temp = ((58.0 - 54.0) / (0.85 - 0.80)) * (shr - 0.8) + 54.0 # F
|
1086
1082
|
else
|
1087
|
-
|
1083
|
+
@leaving_air_temp = 58.0 # F
|
1088
1084
|
end
|
1089
1085
|
end
|
1090
1086
|
|
1091
1087
|
# Calculate Supply Air Temperature
|
1092
|
-
if
|
1093
|
-
|
1094
|
-
|
1095
|
-
HPXML::HVACTypeHeatPumpWaterLoopToAir,
|
1096
|
-
HPXML::HVACTypeHeatPumpPTHP,
|
1097
|
-
HPXML::HVACTypeHeatPumpRoom].include? hvac.HeatType
|
1098
|
-
hvac.SupplyAirTemp = 105.0 # F
|
1099
|
-
hvac.BackupSupplyAirTemp = 120.0 # F
|
1088
|
+
if hvac_heating.is_a? HPXML::HeatPump
|
1089
|
+
@supply_air_temp = 105.0 # F
|
1090
|
+
@backup_supply_air_temp = 120.0 # F
|
1100
1091
|
else
|
1101
|
-
|
1092
|
+
@supply_air_temp = 120.0 # F
|
1102
1093
|
end
|
1103
1094
|
end
|
1104
1095
|
|
1105
|
-
def self.apply_hvac_loads(
|
1096
|
+
def self.apply_hvac_loads(hvac_heating, system_design_loads, bldg_design_loads, ducts_heat_load, ducts_cool_load_sens, ducts_cool_load_lat)
|
1106
1097
|
# Calculate design loads that this HVAC system serves
|
1107
1098
|
|
1108
1099
|
# Heating
|
1109
|
-
system_design_loads.Heat_Load = bldg_design_loads.Heat_Tot *
|
1110
|
-
if
|
1100
|
+
system_design_loads.Heat_Load = bldg_design_loads.Heat_Tot * @fraction_heat_load_served
|
1101
|
+
if @heating_type == HPXML::HVACTypeHeatPumpWaterLoopToAir
|
1111
1102
|
# Size to meet original fraction load served (not adjusted value from HVAC.apply_shared_heating_systems()
|
1112
1103
|
# This ensures, e.g., that an appropriate heating airflow is used for duct losses.
|
1113
|
-
system_design_loads.Heat_Load = system_design_loads.Heat_Load / (1.0 /
|
1104
|
+
system_design_loads.Heat_Load = system_design_loads.Heat_Load / (1.0 / hvac_heating.heating_efficiency_cop)
|
1114
1105
|
end
|
1115
1106
|
system_design_loads.Heat_Load_Supp = system_design_loads.Heat_Load
|
1116
1107
|
|
1117
1108
|
# Cooling
|
1118
|
-
system_design_loads.Cool_Load_Tot = bldg_design_loads.Cool_Tot *
|
1119
|
-
system_design_loads.Cool_Load_Sens = bldg_design_loads.Cool_Sens *
|
1120
|
-
system_design_loads.Cool_Load_Lat = bldg_design_loads.Cool_Lat *
|
1109
|
+
system_design_loads.Cool_Load_Tot = bldg_design_loads.Cool_Tot * @fraction_cool_load_served
|
1110
|
+
system_design_loads.Cool_Load_Sens = bldg_design_loads.Cool_Sens * @fraction_cool_load_served
|
1111
|
+
system_design_loads.Cool_Load_Lat = bldg_design_loads.Cool_Lat * @fraction_cool_load_served
|
1121
1112
|
|
1122
1113
|
# After applying load fraction to building design loads (w/o ducts), add duct load specific to this HVAC system
|
1123
1114
|
system_design_loads.Heat_Load += ducts_heat_load.to_f
|
@@ -1127,54 +1118,65 @@ class HVACSizing
|
|
1127
1118
|
system_design_loads.Cool_Load_Tot += ducts_cool_load_sens.to_f + ducts_cool_load_lat.to_f
|
1128
1119
|
end
|
1129
1120
|
|
1130
|
-
def self.
|
1131
|
-
|
1132
|
-
|
1133
|
-
|
1134
|
-
HPXML::HVACTypeHeatPumpGroundToAir,
|
1135
|
-
HPXML::HVACTypeHeatPumpWaterLoopToAir,
|
1136
|
-
HPXML::HVACTypeHeatPumpPTHP,
|
1137
|
-
HPXML::HVACTypeHeatPumpRoom].include? hvac.CoolType
|
1138
|
-
if (@hpxml.header.heat_pump_sizing_methodology != HPXML::HeatPumpSizingACCA) && (hvac.CoolingLoadFraction > 0) && (hvac.HeatingLoadFraction > 0)
|
1139
|
-
# Note: Heat_Load_Supp should NOT be adjusted; we only want to adjust the HP capacity, not the HP backup heating capacity.
|
1140
|
-
max_load = [hvac_sizing_values.Heat_Load, hvac_sizing_values.Cool_Load_Tot].max
|
1141
|
-
hvac_sizing_values.Heat_Load = max_load
|
1142
|
-
hvac_sizing_values.Cool_Load_Sens *= max_load / hvac_sizing_values.Cool_Load_Tot
|
1143
|
-
hvac_sizing_values.Cool_Load_Lat *= max_load / hvac_sizing_values.Cool_Load_Tot
|
1144
|
-
hvac_sizing_values.Cool_Load_Tot = max_load
|
1121
|
+
def self.apply_hvac_size_limits(hvac_cooling)
|
1122
|
+
@oversize_limit = 1.15
|
1123
|
+
@oversize_delta = 15000.0
|
1124
|
+
@undersize_limit = 0.9
|
1145
1125
|
|
1146
|
-
|
1147
|
-
|
1148
|
-
|
1126
|
+
if not hvac_cooling.nil?
|
1127
|
+
if hvac_cooling.compressor_type == HPXML::HVACCompressorTypeTwoStage
|
1128
|
+
@oversize_limit = 1.2
|
1129
|
+
elsif hvac_cooling.compressor_type == HPXML::HVACCompressorTypeVariableSpeed
|
1130
|
+
@oversize_limit = 1.3
|
1149
1131
|
end
|
1150
1132
|
end
|
1151
1133
|
end
|
1152
1134
|
|
1135
|
+
def self.apply_hvac_heat_pump_logic(hvac_sizing_values, hvac_cooling)
|
1136
|
+
# If HERS/MaxLoad methodology, uses at least the larger of heating and cooling loads for heat pump sizing (required for ERI).
|
1137
|
+
return unless hvac_cooling.is_a? HPXML::HeatPump
|
1138
|
+
return if @fraction_cool_load_served == 0
|
1139
|
+
return if @fraction_heat_load_served == 0
|
1140
|
+
|
1141
|
+
if (@hpxml.header.heat_pump_sizing_methodology != HPXML::HeatPumpSizingACCA)
|
1142
|
+
# Note: Heat_Load_Supp should NOT be adjusted; we only want to adjust the HP capacity, not the HP backup heating capacity.
|
1143
|
+
max_load = [hvac_sizing_values.Heat_Load, hvac_sizing_values.Cool_Load_Tot].max
|
1144
|
+
hvac_sizing_values.Heat_Load = max_load
|
1145
|
+
hvac_sizing_values.Cool_Load_Sens *= max_load / hvac_sizing_values.Cool_Load_Tot
|
1146
|
+
hvac_sizing_values.Cool_Load_Lat *= max_load / hvac_sizing_values.Cool_Load_Tot
|
1147
|
+
hvac_sizing_values.Cool_Load_Tot = max_load
|
1148
|
+
|
1149
|
+
# Override Manual S oversize allowances:
|
1150
|
+
@oversize_limit = 1.0
|
1151
|
+
@oversize_delta = 0.0
|
1152
|
+
end
|
1153
|
+
end
|
1154
|
+
|
1153
1155
|
def self.get_duct_regain_factor(duct)
|
1154
1156
|
# dse_Fregain values comes from MJ8 pg 204 and Walker (1998) "Technical background for default
|
1155
1157
|
# values used for forced air systems in proposed ASHRAE Std. 152"
|
1156
1158
|
|
1157
1159
|
dse_Fregain = nil
|
1158
1160
|
|
1159
|
-
if [HPXML::LocationOutside, HPXML::LocationRoofDeck].include? duct.
|
1161
|
+
if [HPXML::LocationOutside, HPXML::LocationRoofDeck].include? duct.duct_location
|
1160
1162
|
dse_Fregain = 0.0
|
1161
1163
|
|
1162
1164
|
elsif [HPXML::LocationOtherHousingUnit, HPXML::LocationOtherHeatedSpace, HPXML::LocationOtherMultifamilyBufferSpace,
|
1163
|
-
HPXML::LocationOtherNonFreezingSpace, HPXML::LocationExteriorWall, HPXML::LocationUnderSlab].include? duct.
|
1164
|
-
space_values = Geometry.get_temperature_scheduled_space_values(duct.
|
1165
|
+
HPXML::LocationOtherNonFreezingSpace, HPXML::LocationExteriorWall, HPXML::LocationUnderSlab].include? duct.duct_location
|
1166
|
+
space_values = Geometry.get_temperature_scheduled_space_values(duct.duct_location)
|
1165
1167
|
dse_Fregain = space_values[:f_regain]
|
1166
1168
|
|
1167
|
-
elsif [HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceVented, HPXML::LocationCrawlspaceUnvented].include? duct.
|
1169
|
+
elsif [HPXML::LocationBasementUnconditioned, HPXML::LocationCrawlspaceVented, HPXML::LocationCrawlspaceUnvented].include? duct.duct_location
|
1168
1170
|
|
1169
|
-
ceilings = @hpxml.floors.select { |f| f.is_floor && [f.interior_adjacent_to, f.exterior_adjacent_to].include?(duct.
|
1171
|
+
ceilings = @hpxml.floors.select { |f| f.is_floor && [f.interior_adjacent_to, f.exterior_adjacent_to].include?(duct.duct_location) }
|
1170
1172
|
avg_ceiling_rvalue = calculate_average_r_value(ceilings)
|
1171
1173
|
ceiling_insulated = (avg_ceiling_rvalue > 4)
|
1172
1174
|
|
1173
|
-
walls = @hpxml.foundation_walls.select { |f| [f.interior_adjacent_to, f.exterior_adjacent_to].include? duct.
|
1175
|
+
walls = @hpxml.foundation_walls.select { |f| [f.interior_adjacent_to, f.exterior_adjacent_to].include? duct.duct_location }
|
1174
1176
|
avg_wall_rvalue = calculate_average_r_value(walls)
|
1175
1177
|
walls_insulated = (avg_wall_rvalue > 4)
|
1176
1178
|
|
1177
|
-
if duct.
|
1179
|
+
if duct.duct_location == HPXML::LocationBasementUnconditioned
|
1178
1180
|
if not ceiling_insulated
|
1179
1181
|
if not walls_insulated
|
1180
1182
|
dse_Fregain = 0.50 # Uninsulated ceiling, uninsulated walls
|
@@ -1184,7 +1186,7 @@ class HVACSizing
|
|
1184
1186
|
else
|
1185
1187
|
dse_Fregain = 0.30 # Insulated ceiling
|
1186
1188
|
end
|
1187
|
-
elsif duct.
|
1189
|
+
elsif duct.duct_location == HPXML::LocationCrawlspaceVented
|
1188
1190
|
if ceiling_insulated && walls_insulated
|
1189
1191
|
dse_Fregain = 0.17 # Insulated ceiling, insulated walls
|
1190
1192
|
elsif ceiling_insulated && (not walls_insulated)
|
@@ -1194,7 +1196,7 @@ class HVACSizing
|
|
1194
1196
|
elsif (not ceiling_insulated) && (not walls_insulated)
|
1195
1197
|
dse_Fregain = 0.50 # Uninsulated ceiling, uninsulated walls
|
1196
1198
|
end
|
1197
|
-
elsif duct.
|
1199
|
+
elsif duct.duct_location == HPXML::LocationCrawlspaceUnvented
|
1198
1200
|
if ceiling_insulated && walls_insulated
|
1199
1201
|
dse_Fregain = 0.30 # Insulated ceiling, insulated walls
|
1200
1202
|
elsif ceiling_insulated && (not walls_insulated)
|
@@ -1206,13 +1208,13 @@ class HVACSizing
|
|
1206
1208
|
end
|
1207
1209
|
end
|
1208
1210
|
|
1209
|
-
elsif [HPXML::LocationAtticVented, HPXML::LocationAtticUnvented].include? duct.
|
1211
|
+
elsif [HPXML::LocationAtticVented, HPXML::LocationAtticUnvented].include? duct.duct_location
|
1210
1212
|
dse_Fregain = 0.10 # This would likely be higher for unvented attics with roof insulation
|
1211
1213
|
|
1212
|
-
elsif [HPXML::LocationGarage].include? duct.
|
1214
|
+
elsif [HPXML::LocationGarage].include? duct.duct_location
|
1213
1215
|
dse_Fregain = 0.05
|
1214
1216
|
|
1215
|
-
elsif HPXML::conditioned_locations.include? duct.
|
1217
|
+
elsif HPXML::conditioned_locations.include? duct.duct_location
|
1216
1218
|
dse_Fregain = 1.0
|
1217
1219
|
|
1218
1220
|
end
|
@@ -1220,31 +1222,20 @@ class HVACSizing
|
|
1220
1222
|
return dse_Fregain
|
1221
1223
|
end
|
1222
1224
|
|
1223
|
-
def self.calculate_load_ducts_heating(system_design_loads,
|
1225
|
+
def self.calculate_load_ducts_heating(system_design_loads, hvac_heating)
|
1224
1226
|
'''
|
1225
1227
|
Heating Duct Loads
|
1226
1228
|
'''
|
1227
1229
|
|
1228
|
-
return if (system_design_loads.Heat_Tot == 0) ||
|
1230
|
+
return if hvac_heating.nil? || (system_design_loads.Heat_Tot == 0) || hvac_heating.distribution_system.nil? || hvac_heating.distribution_system.ducts.empty?
|
1231
|
+
return if @fraction_heat_load_served == 0
|
1229
1232
|
|
1230
|
-
init_heat_load = system_design_loads.Heat_Tot *
|
1233
|
+
init_heat_load = system_design_loads.Heat_Tot * @fraction_heat_load_served
|
1231
1234
|
|
1232
1235
|
# Distribution system efficiency (DSE) calculations based on ASHRAE Standard 152
|
1233
|
-
dse_As, dse_Ar = calc_ducts_areas(hvac.Ducts)
|
1234
|
-
supply_r, return_r = calc_ducts_rvalues(hvac.Ducts)
|
1235
|
-
|
1236
|
-
design_temp_values = { HPXML::DuctTypeSupply => @heat_design_temps, HPXML::DuctTypeReturn => @heat_design_temps }
|
1237
|
-
dse_Tamb_heating_s, dse_Tamb_heating_r = calc_ducts_area_weighted_average(hvac.Ducts, design_temp_values)
|
1238
1236
|
|
1239
|
-
|
1240
|
-
|
1241
|
-
# in each space. F_regain shall be calculated separately for supply and return locations.
|
1242
|
-
dse_Fregains = {}
|
1243
|
-
hvac.Ducts.each do |duct|
|
1244
|
-
dse_Fregains[duct.Location] = get_duct_regain_factor(duct)
|
1245
|
-
end
|
1246
|
-
fregain_values = { HPXML::DuctTypeSupply => dse_Fregains, HPXML::DuctTypeReturn => dse_Fregains }
|
1247
|
-
dse_Fregain_s, dse_Fregain_r = calc_ducts_area_weighted_average(hvac.Ducts, fregain_values)
|
1237
|
+
duct_values = calc_duct_conduction_values(hvac_heating.distribution_system, @heat_design_temps)
|
1238
|
+
dse_As, dse_Ar, supply_r, return_r, dse_Tamb_s, dse_Tamb_r, dse_Fregain_s, dse_Fregain_r = duct_values
|
1248
1239
|
|
1249
1240
|
# Initialize for the iteration
|
1250
1241
|
delta = 1
|
@@ -1256,11 +1247,11 @@ class HVACSizing
|
|
1256
1247
|
heat_load_prev = heat_load_next
|
1257
1248
|
|
1258
1249
|
# Calculate the new heating air flow rate
|
1259
|
-
heat_cfm = calc_airflow_rate_manual_s(heat_load_next, (
|
1250
|
+
heat_cfm = calc_airflow_rate_manual_s(heat_load_next, (@supply_air_temp - @heat_setpoint))
|
1260
1251
|
|
1261
|
-
dse_Qs, dse_Qr =
|
1252
|
+
dse_Qs, dse_Qr = calc_duct_leakages_cfm25(hvac_heating.distribution_system, heat_cfm)
|
1262
1253
|
|
1263
|
-
dse_DE = calc_delivery_effectiveness_heating(dse_Qs, dse_Qr, heat_cfm, heat_load_next,
|
1254
|
+
dse_DE = calc_delivery_effectiveness_heating(dse_Qs, dse_Qr, heat_cfm, heat_load_next, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, @heat_setpoint, dse_Fregain_s, dse_Fregain_r, supply_r, return_r)
|
1264
1255
|
|
1265
1256
|
# Calculate the increase in heating load due to ducts (Approach: DE = Qload/Qequip -> Qducts = Qequip-Qload)
|
1266
1257
|
heat_load_next = init_heat_load / dse_DE
|
@@ -1273,41 +1264,31 @@ class HVACSizing
|
|
1273
1264
|
return ducts_heat_load
|
1274
1265
|
end
|
1275
1266
|
|
1276
|
-
def self.calculate_load_ducts_cooling(system_design_loads, weather,
|
1267
|
+
def self.calculate_load_ducts_cooling(system_design_loads, weather, hvac_cooling)
|
1277
1268
|
'''
|
1278
1269
|
Cooling Duct Loads
|
1279
1270
|
'''
|
1280
|
-
return if (system_design_loads.Cool_Sens == 0) || (hvac.CoolingLoadFraction == 0) || hvac.Ducts.empty?
|
1281
1271
|
|
1282
|
-
|
1283
|
-
|
1272
|
+
return if hvac_cooling.nil? || (system_design_loads.Cool_Sens == 0) || hvac_cooling.distribution_system.nil? || hvac_cooling.distribution_system.ducts.empty?
|
1273
|
+
return if @fraction_cool_load_served == 0
|
1274
|
+
|
1275
|
+
init_cool_load_sens = system_design_loads.Cool_Sens * @fraction_cool_load_served
|
1276
|
+
init_cool_load_lat = system_design_loads.Cool_Lat * @fraction_cool_load_served
|
1284
1277
|
|
1285
1278
|
# Distribution system efficiency (DSE) calculations based on ASHRAE Standard 152
|
1286
|
-
dse_As, dse_Ar = calc_ducts_areas(hvac.Ducts)
|
1287
|
-
supply_r, return_r = calc_ducts_rvalues(hvac.Ducts)
|
1288
1279
|
|
1289
|
-
|
1290
|
-
|
1291
|
-
|
1292
|
-
# ASHRAE 152 6.5.2
|
1293
|
-
# For systems with ducts in several locations, F_regain shall be weighted by the fraction of exposed duct area
|
1294
|
-
# in each space. F_regain shall be calculated separately for supply and return locations.
|
1295
|
-
dse_Fregains = {}
|
1296
|
-
hvac.Ducts.each do |duct|
|
1297
|
-
dse_Fregains[duct.Location] = get_duct_regain_factor(duct)
|
1298
|
-
end
|
1299
|
-
fregain_values = { HPXML::DuctTypeSupply => dse_Fregains, HPXML::DuctTypeReturn => dse_Fregains }
|
1300
|
-
dse_Fregain_s, dse_Fregain_r = calc_ducts_area_weighted_average(hvac.Ducts, fregain_values)
|
1280
|
+
duct_values = calc_duct_conduction_values(hvac_cooling.distribution_system, @cool_design_temps)
|
1281
|
+
dse_As, dse_Ar, supply_r, return_r, dse_Tamb_s, dse_Tamb_r, dse_Fregain_s, dse_Fregain_r = duct_values
|
1301
1282
|
|
1302
1283
|
# Calculate the air enthalpy in the return duct location for DSE calculations
|
1303
|
-
dse_h_r = (1.006 * UnitConversions.convert(
|
1284
|
+
dse_h_r = (1.006 * UnitConversions.convert(dse_Tamb_r, 'F', 'C') + weather.design.CoolingHumidityRatio * (2501.0 + 1.86 * UnitConversions.convert(dse_Tamb_r, 'F', 'C'))) * UnitConversions.convert(1.0, 'kJ', 'Btu') * UnitConversions.convert(1.0, 'lbm', 'kg')
|
1304
1285
|
|
1305
1286
|
# Initialize for the iteration
|
1306
1287
|
delta = 1
|
1307
1288
|
cool_load_tot_next = init_cool_load_sens + init_cool_load_lat
|
1308
1289
|
|
1309
|
-
cool_cfm = calc_airflow_rate_manual_s(init_cool_load_sens, (@cool_setpoint -
|
1310
|
-
_dse_Qs, dse_Qr =
|
1290
|
+
cool_cfm = calc_airflow_rate_manual_s(init_cool_load_sens, (@cool_setpoint - @leaving_air_temp))
|
1291
|
+
_dse_Qs, dse_Qr = calc_duct_leakages_cfm25(hvac_cooling.distribution_system, cool_cfm)
|
1311
1292
|
|
1312
1293
|
for _iter in 1..50
|
1313
1294
|
break if delta.abs <= 0.001
|
@@ -1318,11 +1299,11 @@ class HVACSizing
|
|
1318
1299
|
cool_load_tot = cool_load_lat + cool_load_sens
|
1319
1300
|
|
1320
1301
|
# Calculate the new cooling air flow rate
|
1321
|
-
cool_cfm = calc_airflow_rate_manual_s(cool_load_sens, (@cool_setpoint -
|
1302
|
+
cool_cfm = calc_airflow_rate_manual_s(cool_load_sens, (@cool_setpoint - @leaving_air_temp))
|
1322
1303
|
|
1323
|
-
dse_Qs, dse_Qr =
|
1304
|
+
dse_Qs, dse_Qr = calc_duct_leakages_cfm25(hvac_cooling.distribution_system, cool_cfm)
|
1324
1305
|
|
1325
|
-
dse_DE, _dse_dTe_cooling, _cool_duct_sens = calc_delivery_effectiveness_cooling(dse_Qs, dse_Qr,
|
1306
|
+
dse_DE, _dse_dTe_cooling, _cool_duct_sens = calc_delivery_effectiveness_cooling(dse_Qs, dse_Qr, @leaving_air_temp, cool_cfm, cool_load_sens, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, @cool_setpoint, dse_Fregain_s, dse_Fregain_r, cool_load_tot, dse_h_r, supply_r, return_r)
|
1326
1307
|
|
1327
1308
|
cool_load_tot_next = (init_cool_load_sens + init_cool_load_lat) / dse_DE
|
1328
1309
|
|
@@ -1345,17 +1326,19 @@ class HVACSizing
|
|
1345
1326
|
bldg_design_loads.Cool_Tot += total_ducts_cool_load_sens.to_f + total_ducts_cool_load_lat.to_f
|
1346
1327
|
end
|
1347
1328
|
|
1348
|
-
def self.apply_hvac_equipment_adjustments(hvac_sizing_values, weather,
|
1329
|
+
def self.apply_hvac_equipment_adjustments(hvac_sizing_values, weather, hvac_heating, hvac_cooling, hvac_system)
|
1349
1330
|
'''
|
1350
1331
|
Equipment Adjustments
|
1351
1332
|
'''
|
1352
1333
|
|
1353
|
-
underSizeLimit = 0.9
|
1354
|
-
|
1355
1334
|
# Cooling
|
1356
1335
|
|
1336
|
+
if not hvac_cooling.nil?
|
1337
|
+
hvac_cooling_ap = hvac_cooling.additional_properties
|
1338
|
+
end
|
1339
|
+
|
1357
1340
|
# Calculate the air flow rate required for design conditions
|
1358
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Cool_Load_Sens, (@cool_setpoint -
|
1341
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Cool_Load_Sens, (@cool_setpoint - @leaving_air_temp))
|
1359
1342
|
|
1360
1343
|
if hvac_sizing_values.Cool_Load_Tot <= 0
|
1361
1344
|
|
@@ -1364,19 +1347,21 @@ class HVACSizing
|
|
1364
1347
|
hvac_sizing_values.Cool_Airflow = 0.0
|
1365
1348
|
|
1366
1349
|
elsif [HPXML::HVACTypeCentralAirConditioner,
|
1367
|
-
HPXML::HVACTypeHeatPumpAirToAir].include?
|
1350
|
+
HPXML::HVACTypeHeatPumpAirToAir].include? @cooling_type
|
1368
1351
|
|
1369
|
-
|
1370
|
-
|
1352
|
+
entering_temp = @hpxml.header.manualj_cooling_design_temp
|
1353
|
+
hvac_cooling_speed = get_sizing_speed(hvac_cooling_ap)
|
1354
|
+
coefficients = hvac_cooling_ap.cool_cap_ft_spec[hvac_cooling_speed]
|
1371
1355
|
|
1372
|
-
|
1373
|
-
|
1356
|
+
total_cap_curve_value = MathTools.biquadratic(@wetbulb_indoor_cooling, entering_temp, coefficients)
|
1357
|
+
cool_cap_rated = hvac_sizing_values.Cool_Load_Tot / total_cap_curve_value
|
1374
1358
|
|
1375
|
-
|
1359
|
+
hvac_cooling_shr = hvac_cooling_ap.cool_rated_shrs_gross[hvac_cooling_speed]
|
1360
|
+
sens_cap_rated = cool_cap_rated * hvac_cooling_shr
|
1376
1361
|
|
1377
|
-
|
1378
|
-
|
1379
|
-
|
1362
|
+
sensible_cap_curve_value = process_curve_fit(hvac_sizing_values.Cool_Airflow, hvac_sizing_values.Cool_Load_Tot, entering_temp)
|
1363
|
+
sens_cap_design = sens_cap_rated * sensible_cap_curve_value
|
1364
|
+
lat_cap_design = [hvac_sizing_values.Cool_Load_Tot - sens_cap_design, 1.0].max
|
1380
1365
|
|
1381
1366
|
shr_biquadratic = get_shr_biquadratic
|
1382
1367
|
a_sens = shr_biquadratic[0]
|
@@ -1385,75 +1370,75 @@ class HVACSizing
|
|
1385
1370
|
d_sens = shr_biquadratic[5]
|
1386
1371
|
|
1387
1372
|
# Adjust Sizing
|
1388
|
-
if
|
1373
|
+
if lat_cap_design < hvac_sizing_values.Cool_Load_Lat
|
1389
1374
|
# Size by MJ8 Latent load, return to rated conditions
|
1390
1375
|
|
1391
1376
|
# Solve for the new sensible and total capacity at design conditions:
|
1392
|
-
# CoolingLoad_Lat =
|
1393
|
-
# solve the following for
|
1394
|
-
# substituting in CFM =
|
1377
|
+
# CoolingLoad_Lat = cool_cap_design - cool_load_sens_cap_design
|
1378
|
+
# solve the following for cool_cap_design: sens_cap_design = SHRRated * cool_cap_design / total_cap_curve_value * function(CFM/cool_cap_design, ODB)
|
1379
|
+
# substituting in CFM = cool_load_sens_cap_design / (1.1 * ACF * (cool_setpoint - LAT))
|
1395
1380
|
|
1396
|
-
|
1397
|
-
(UnitConversions.convert(b_sens, 'ton', 'Btu/hr') + UnitConversions.convert(d_sens, 'ton', 'Btu/hr') *
|
1398
|
-
(1.1 * @acf * (@cool_setpoint -
|
1399
|
-
(a_sens + c_sens *
|
1381
|
+
cool_load_sens_cap_design = hvac_sizing_values.Cool_Load_Lat / ((total_cap_curve_value / hvac_cooling_shr - \
|
1382
|
+
(UnitConversions.convert(b_sens, 'ton', 'Btu/hr') + UnitConversions.convert(d_sens, 'ton', 'Btu/hr') * entering_temp) / \
|
1383
|
+
(1.1 * @acf * (@cool_setpoint - @leaving_air_temp))) / \
|
1384
|
+
(a_sens + c_sens * entering_temp) - 1.0)
|
1400
1385
|
|
1401
|
-
|
1386
|
+
cool_cap_design = cool_load_sens_cap_design + hvac_sizing_values.Cool_Load_Lat
|
1402
1387
|
|
1403
1388
|
# The SHR of the equipment at the design condition
|
1404
|
-
|
1389
|
+
shr_design = cool_load_sens_cap_design / cool_cap_design
|
1405
1390
|
|
1406
1391
|
# If the adjusted equipment size is negative (occurs at altitude), use oversize limit (the adjustment
|
1407
1392
|
# almost always hits the oversize limit in this case, making this a safe assumption)
|
1408
|
-
if (
|
1409
|
-
|
1393
|
+
if (cool_cap_design < 0) || (cool_load_sens_cap_design < 0)
|
1394
|
+
cool_cap_design = @oversize_limit * hvac_sizing_values.Cool_Load_Tot
|
1410
1395
|
end
|
1411
1396
|
|
1412
1397
|
# Limit total capacity to oversize limit
|
1413
|
-
|
1398
|
+
cool_cap_design = [cool_cap_design, @oversize_limit * hvac_sizing_values.Cool_Load_Tot].min
|
1414
1399
|
|
1415
1400
|
# Determine the final sensible capacity at design using the SHR
|
1416
|
-
|
1401
|
+
cool_load_sens_cap_design = shr_design * cool_cap_design
|
1417
1402
|
|
1418
1403
|
# Calculate the final air flow rate using final sensible capacity at design
|
1419
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(
|
1404
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_load_sens_cap_design, (@cool_setpoint - @leaving_air_temp))
|
1420
1405
|
|
1421
1406
|
# Determine rated capacities
|
1422
|
-
hvac_sizing_values.Cool_Capacity =
|
1423
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1407
|
+
hvac_sizing_values.Cool_Capacity = cool_cap_design / total_cap_curve_value
|
1408
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1424
1409
|
|
1425
|
-
elsif
|
1410
|
+
elsif sens_cap_design < @undersize_limit * hvac_sizing_values.Cool_Load_Sens
|
1426
1411
|
# Size by MJ8 Sensible load, return to rated conditions, find Sens with SHRRated. Limit total
|
1427
1412
|
# capacity to oversizing limit
|
1428
1413
|
|
1429
|
-
|
1414
|
+
sens_cap_design = @undersize_limit * hvac_sizing_values.Cool_Load_Sens
|
1430
1415
|
|
1431
1416
|
# Solve for the new total system capacity at design conditions:
|
1432
|
-
#
|
1433
|
-
# = SHRRated *
|
1434
|
-
# = SHRRated *
|
1417
|
+
# sens_cap_design = sens_cap_rated * sensible_cap_curve_value
|
1418
|
+
# = SHRRated * cool_cap_design / total_cap_curve_value * sensible_cap_curve_value
|
1419
|
+
# = SHRRated * cool_cap_design / total_cap_curve_value * function(CFM/cool_cap_design, ODB)
|
1435
1420
|
|
1436
|
-
|
1421
|
+
cool_cap_design = (sens_cap_design / (hvac_cooling_shr / total_cap_curve_value) - \
|
1437
1422
|
(b_sens * UnitConversions.convert(hvac_sizing_values.Cool_Airflow, 'ton', 'Btu/hr') + \
|
1438
|
-
d_sens * UnitConversions.convert(hvac_sizing_values.Cool_Airflow, 'ton', 'Btu/hr') *
|
1439
|
-
|
1423
|
+
d_sens * UnitConversions.convert(hvac_sizing_values.Cool_Airflow, 'ton', 'Btu/hr') * entering_temp)) / \
|
1424
|
+
(a_sens + c_sens * entering_temp)
|
1440
1425
|
|
1441
1426
|
# Limit total capacity to oversize limit
|
1442
|
-
|
1427
|
+
cool_cap_design = [cool_cap_design, @oversize_limit * hvac_sizing_values.Cool_Load_Tot].min
|
1443
1428
|
|
1444
|
-
hvac_sizing_values.Cool_Capacity =
|
1445
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1429
|
+
hvac_sizing_values.Cool_Capacity = cool_cap_design / total_cap_curve_value
|
1430
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1446
1431
|
|
1447
1432
|
# Recalculate the air flow rate in case the oversizing limit has been used
|
1448
|
-
|
1449
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(
|
1433
|
+
cool_load_sens_cap_design = hvac_sizing_values.Cool_Capacity_Sens * sensible_cap_curve_value
|
1434
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_load_sens_cap_design, (@cool_setpoint - @leaving_air_temp))
|
1450
1435
|
|
1451
1436
|
else
|
1452
|
-
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot /
|
1453
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1437
|
+
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot / total_cap_curve_value
|
1438
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1454
1439
|
|
1455
|
-
|
1456
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(
|
1440
|
+
cool_load_sens_cap_design = hvac_sizing_values.Cool_Capacity_Sens * sensible_cap_curve_value
|
1441
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_load_sens_cap_design, (@cool_setpoint - @leaving_air_temp))
|
1457
1442
|
end
|
1458
1443
|
|
1459
1444
|
# Ensure the air flow rate is in between 200 and 500 cfm/ton.
|
@@ -1465,85 +1450,93 @@ class HVACSizing
|
|
1465
1450
|
end
|
1466
1451
|
|
1467
1452
|
elsif [HPXML::HVACTypeHeatPumpMiniSplit,
|
1468
|
-
HPXML::HVACTypeMiniSplitAirConditioner].include?
|
1453
|
+
HPXML::HVACTypeMiniSplitAirConditioner].include? @cooling_type
|
1469
1454
|
|
1470
|
-
|
1471
|
-
|
1455
|
+
entering_temp = @hpxml.header.manualj_cooling_design_temp
|
1456
|
+
hvac_cooling_speed = get_sizing_speed(hvac_cooling_ap)
|
1457
|
+
coefficients = hvac_cooling_ap.cool_cap_ft_spec[hvac_cooling_speed]
|
1472
1458
|
|
1473
|
-
|
1459
|
+
total_cap_curve_value = MathTools.biquadratic(@wetbulb_indoor_cooling, entering_temp, coefficients)
|
1460
|
+
hvac_cooling_shr = hvac_cooling_ap.cool_rated_shrs_gross[hvac_cooling_speed]
|
1474
1461
|
|
1475
|
-
hvac_sizing_values.Cool_Capacity = (hvac_sizing_values.Cool_Load_Tot /
|
1476
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1477
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_user(hvac_sizing_values.Cool_Capacity,
|
1462
|
+
hvac_sizing_values.Cool_Capacity = (hvac_sizing_values.Cool_Load_Tot / total_cap_curve_value)
|
1463
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1464
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_user(hvac_sizing_values.Cool_Capacity, hvac_cooling_ap.cool_rated_cfm_per_ton[-1], hvac_cooling_ap.cool_capacity_ratios[-1])
|
1478
1465
|
|
1479
1466
|
elsif [HPXML::HVACTypeRoomAirConditioner,
|
1480
1467
|
HPXML::HVACTypePTAC,
|
1481
1468
|
HPXML::HVACTypeHeatPumpPTHP,
|
1482
|
-
HPXML::HVACTypeHeatPumpRoom].include?
|
1469
|
+
HPXML::HVACTypeHeatPumpRoom].include? @cooling_type
|
1483
1470
|
|
1484
|
-
|
1485
|
-
|
1471
|
+
entering_temp = @hpxml.header.manualj_cooling_design_temp
|
1472
|
+
hvac_cooling_speed = get_sizing_speed(hvac_cooling_ap)
|
1473
|
+
total_cap_curve_value = MathTools.biquadratic(@wetbulb_indoor_cooling, entering_temp, hvac_cooling_ap.cool_cap_ft_spec[hvac_cooling_speed])
|
1474
|
+
hvac_cooling_shr = hvac_cooling_ap.cool_rated_shrs_gross[hvac_cooling_speed]
|
1486
1475
|
|
1487
|
-
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot /
|
1488
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1489
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_user(hvac_sizing_values.Cool_Capacity,
|
1476
|
+
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot / total_cap_curve_value
|
1477
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1478
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_user(hvac_sizing_values.Cool_Capacity, hvac_cooling_ap.cool_rated_cfm_per_ton[hvac_cooling_speed], 1.0)
|
1490
1479
|
|
1491
|
-
elsif
|
1480
|
+
elsif HPXML::HVACTypeHeatPumpGroundToAir == @cooling_type
|
1492
1481
|
coil_bf = gshp_coil_bf
|
1493
|
-
|
1482
|
+
entering_temp = hvac_cooling_ap.design_chw
|
1483
|
+
hvac_cooling_speed = get_sizing_speed(hvac_cooling_ap)
|
1494
1484
|
|
1495
1485
|
# Neglecting the water flow rate for now because it's not available yet. Air flow rate is pre-adjusted values.
|
1496
1486
|
design_wb_temp = UnitConversions.convert(@wetbulb_indoor_cooling, 'f', 'k')
|
1497
1487
|
design_db_temp = UnitConversions.convert(@cool_setpoint, 'f', 'k')
|
1498
|
-
design_w_temp = UnitConversions.convert(
|
1488
|
+
design_w_temp = UnitConversions.convert(entering_temp, 'f', 'k')
|
1499
1489
|
design_vfr_air = UnitConversions.convert(hvac_sizing_values.Cool_Airflow, 'cfm', 'm^3/s')
|
1500
1490
|
|
1501
|
-
|
1491
|
+
cool_cap_curve_spec = hvac_cooling_ap.cool_cap_curve_spec[hvac_cooling_speed]
|
1492
|
+
cool_sh_curve_spec = hvac_cooling_ap.cool_sh_curve_spec[hvac_cooling_speed]
|
1493
|
+
total_cap_curve_value, sensible_cap_curve_value = calc_gshp_clg_curve_value(cool_cap_curve_spec, cool_sh_curve_spec, design_wb_temp, design_db_temp, design_w_temp, design_vfr_air, nil)
|
1502
1494
|
|
1503
|
-
|
1495
|
+
bypass_factor_curve_value = MathTools.biquadratic(@wetbulb_indoor_cooling, @cool_setpoint, gshp_coil_bf_ft_spec)
|
1496
|
+
hvac_cooling_shr = hvac_cooling_ap.cool_rated_shrs_gross[hvac_cooling_speed]
|
1504
1497
|
|
1505
|
-
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot /
|
1506
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1498
|
+
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot / total_cap_curve_value # Note: cool_cap_design = hvac_sizing_values.Cool_Load_Tot
|
1499
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1507
1500
|
|
1508
|
-
|
1509
|
-
(1.0 + (1.0 - coil_bf *
|
1510
|
-
(80.0 - @cool_setpoint) / (@cool_setpoint -
|
1511
|
-
|
1501
|
+
cool_load_sens_cap_design = (hvac_sizing_values.Cool_Capacity_Sens * sensible_cap_curve_value /
|
1502
|
+
(1.0 + (1.0 - coil_bf * bypass_factor_curve_value) *
|
1503
|
+
(80.0 - @cool_setpoint) / (@cool_setpoint - @leaving_air_temp)))
|
1504
|
+
cool_load_lat_cap_design = hvac_sizing_values.Cool_Load_Tot - cool_load_sens_cap_design
|
1512
1505
|
|
1513
|
-
# Adjust Sizing so that coil sensible at design >=
|
1514
|
-
|
1515
|
-
|
1516
|
-
|
1506
|
+
# Adjust Sizing so that coil sensible at design >= CoolingLoad_Sens, and coil latent at design >= CoolingLoad_Lat, and equipment SHRRated is maintained.
|
1507
|
+
cool_load_sens_cap_design = [cool_load_sens_cap_design, hvac_sizing_values.Cool_Load_Sens].max
|
1508
|
+
cool_load_lat_cap_design = [cool_load_lat_cap_design, hvac_sizing_values.Cool_Load_Lat].max
|
1509
|
+
cool_cap_design = cool_load_sens_cap_design + cool_load_lat_cap_design
|
1517
1510
|
|
1518
1511
|
# Limit total capacity via oversizing limit
|
1519
|
-
|
1520
|
-
hvac_sizing_values.Cool_Capacity =
|
1521
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1512
|
+
cool_cap_design = [cool_cap_design, @oversize_limit * hvac_sizing_values.Cool_Load_Tot].min
|
1513
|
+
hvac_sizing_values.Cool_Capacity = cool_cap_design / total_cap_curve_value
|
1514
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1522
1515
|
|
1523
1516
|
# Recalculate the air flow rate in case the oversizing limit has been used
|
1524
|
-
|
1525
|
-
(1.0 + (1.0 - coil_bf *
|
1526
|
-
(80.0 - @cool_setpoint) / (@cool_setpoint -
|
1527
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(
|
1517
|
+
cool_load_sens_cap_design = (hvac_sizing_values.Cool_Capacity_Sens * sensible_cap_curve_value /
|
1518
|
+
(1.0 + (1.0 - coil_bf * bypass_factor_curve_value) *
|
1519
|
+
(80.0 - @cool_setpoint) / (@cool_setpoint - @leaving_air_temp)))
|
1520
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_load_sens_cap_design, (@cool_setpoint - @leaving_air_temp))
|
1528
1521
|
|
1529
|
-
elsif
|
1522
|
+
elsif HPXML::HVACTypeEvaporativeCooler == @cooling_type
|
1530
1523
|
|
1531
1524
|
hvac_sizing_values.Cool_Capacity = hvac_sizing_values.Cool_Load_Tot
|
1532
1525
|
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Load_Sens
|
1533
|
-
if @cool_setpoint -
|
1534
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Cool_Load_Sens, (@cool_setpoint -
|
1526
|
+
if @cool_setpoint - @leaving_air_temp > 0
|
1527
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Cool_Load_Sens, (@cool_setpoint - @leaving_air_temp))
|
1535
1528
|
else
|
1536
1529
|
hvac_sizing_values.Cool_Airflow = @cfa * 2.0 # Use industry rule of thumb sizing method adopted by HEScore
|
1537
1530
|
end
|
1538
1531
|
|
1539
|
-
elsif
|
1532
|
+
elsif HPXML::HVACTypeHeatPumpWaterLoopToAir == @cooling_type
|
1540
1533
|
|
1541
1534
|
# Model only currently used for heating
|
1542
1535
|
hvac_sizing_values.Cool_Capacity = 0.0
|
1543
1536
|
hvac_sizing_values.Cool_Capacity_Sens = 0.0
|
1544
1537
|
hvac_sizing_values.Cool_Airflow = 0.0
|
1545
1538
|
|
1546
|
-
elsif
|
1539
|
+
elsif @cooling_type.nil?
|
1547
1540
|
|
1548
1541
|
hvac_sizing_values.Cool_Capacity = 0.0
|
1549
1542
|
hvac_sizing_values.Cool_Capacity_Sens = 0.0
|
@@ -1551,11 +1544,16 @@ class HVACSizing
|
|
1551
1544
|
|
1552
1545
|
else
|
1553
1546
|
|
1554
|
-
fail "Unexpected cooling type: #{
|
1547
|
+
fail "Unexpected cooling type: #{@cooling_type}."
|
1555
1548
|
|
1556
1549
|
end
|
1557
1550
|
|
1558
1551
|
# Heating
|
1552
|
+
|
1553
|
+
if not hvac_heating.nil?
|
1554
|
+
hvac_heating_ap = hvac_heating.additional_properties
|
1555
|
+
end
|
1556
|
+
|
1559
1557
|
if hvac_sizing_values.Heat_Load <= 0
|
1560
1558
|
|
1561
1559
|
hvac_sizing_values.Heat_Capacity = 0.0
|
@@ -1566,17 +1564,17 @@ class HVACSizing
|
|
1566
1564
|
elsif [HPXML::HVACTypeHeatPumpAirToAir,
|
1567
1565
|
HPXML::HVACTypeHeatPumpMiniSplit,
|
1568
1566
|
HPXML::HVACTypeHeatPumpPTHP,
|
1569
|
-
HPXML::HVACTypeHeatPumpRoom].include?
|
1570
|
-
process_heat_pump_adjustment(hvac_sizing_values, weather,
|
1567
|
+
HPXML::HVACTypeHeatPumpRoom].include? @heating_type
|
1568
|
+
process_heat_pump_adjustment(hvac_sizing_values, weather, hvac_heating, total_cap_curve_value, hvac_system)
|
1571
1569
|
hvac_sizing_values.Heat_Capacity_Supp = hvac_sizing_values.Heat_Load_Supp
|
1572
|
-
if
|
1573
|
-
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (
|
1570
|
+
if @heating_type == HPXML::HVACTypeHeatPumpAirToAir
|
1571
|
+
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (@supply_air_temp - @heat_setpoint))
|
1574
1572
|
else
|
1575
|
-
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_user(hvac_sizing_values.Heat_Capacity,
|
1573
|
+
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_user(hvac_sizing_values.Heat_Capacity, hvac_heating_ap.heat_rated_cfm_per_ton[-1], hvac_heating_ap.heat_capacity_ratios[-1])
|
1576
1574
|
end
|
1577
|
-
hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (
|
1575
|
+
hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (@backup_supply_air_temp - @heat_setpoint))
|
1578
1576
|
|
1579
|
-
elsif [HPXML::HVACTypeHeatPumpGroundToAir].include?
|
1577
|
+
elsif [HPXML::HVACTypeHeatPumpGroundToAir].include? @heating_type
|
1580
1578
|
|
1581
1579
|
if hvac_sizing_values.Cool_Capacity > 0
|
1582
1580
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Heat_Load
|
@@ -1591,32 +1589,32 @@ class HVACSizing
|
|
1591
1589
|
hvac_sizing_values.Cool_Capacity = [hvac_sizing_values.Cool_Capacity, hvac_sizing_values.Heat_Capacity].max
|
1592
1590
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Cool_Capacity
|
1593
1591
|
|
1594
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1595
|
-
|
1596
|
-
(1.0 + (1.0 - gshp_coil_bf *
|
1597
|
-
(80.0 - @cool_setpoint) / (@cool_setpoint -
|
1598
|
-
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(
|
1592
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_shr
|
1593
|
+
cool_load_sens_cap_design = (hvac_sizing_values.Cool_Capacity_Sens * sensible_cap_curve_value /
|
1594
|
+
(1.0 + (1.0 - gshp_coil_bf * bypass_factor_curve_value) *
|
1595
|
+
(80.0 - @cool_setpoint) / (@cool_setpoint - @leaving_air_temp)))
|
1596
|
+
hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_load_sens_cap_design, (@cool_setpoint - @leaving_air_temp))
|
1599
1597
|
else
|
1600
1598
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Heat_Load
|
1601
1599
|
hvac_sizing_values.Heat_Capacity_Supp = hvac_sizing_values.Heat_Load_Supp
|
1602
1600
|
end
|
1603
|
-
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (
|
1604
|
-
hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (
|
1601
|
+
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (@supply_air_temp - @heat_setpoint))
|
1602
|
+
hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (@backup_supply_air_temp - @heat_setpoint))
|
1605
1603
|
|
1606
|
-
elsif [HPXML::HVACTypeHeatPumpWaterLoopToAir].include?
|
1604
|
+
elsif [HPXML::HVACTypeHeatPumpWaterLoopToAir].include? @heating_type
|
1607
1605
|
|
1608
1606
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Heat_Load
|
1609
1607
|
hvac_sizing_values.Heat_Capacity_Supp = hvac_sizing_values.Heat_Load_Supp
|
1610
1608
|
|
1611
|
-
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (
|
1612
|
-
hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (
|
1609
|
+
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (@supply_air_temp - @heat_setpoint))
|
1610
|
+
hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (@backup_supply_air_temp - @heat_setpoint))
|
1613
1611
|
|
1614
|
-
elsif (
|
1612
|
+
elsif (@heating_type == HPXML::HVACTypeFurnace) || ((not hvac_cooling.nil?) && hvac_cooling.has_integrated_heating)
|
1615
1613
|
|
1616
1614
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Heat_Load
|
1617
1615
|
hvac_sizing_values.Heat_Capacity_Supp = 0.0
|
1618
1616
|
|
1619
|
-
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (
|
1617
|
+
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (@supply_air_temp - @heat_setpoint))
|
1620
1618
|
hvac_sizing_values.Heat_Airflow_Supp = 0.0
|
1621
1619
|
|
1622
1620
|
elsif [HPXML::HVACTypeStove,
|
@@ -1624,29 +1622,29 @@ class HVACSizing
|
|
1624
1622
|
HPXML::HVACTypeFixedHeater,
|
1625
1623
|
HPXML::HVACTypeWallFurnace,
|
1626
1624
|
HPXML::HVACTypeFloorFurnace,
|
1627
|
-
HPXML::HVACTypeFireplace].include?
|
1625
|
+
HPXML::HVACTypeFireplace].include? @heating_type
|
1628
1626
|
|
1629
1627
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Heat_Load
|
1630
1628
|
hvac_sizing_values.Heat_Capacity_Supp = 0.0
|
1631
1629
|
|
1632
|
-
if
|
1630
|
+
if hvac_heating_ap.heat_rated_cfm_per_ton[0] > 0
|
1633
1631
|
# Fixed airflow rate
|
1634
|
-
hvac_sizing_values.Heat_Airflow = UnitConversions.convert(hvac_sizing_values.Heat_Capacity, 'Btu/hr', 'ton') *
|
1632
|
+
hvac_sizing_values.Heat_Airflow = UnitConversions.convert(hvac_sizing_values.Heat_Capacity, 'Btu/hr', 'ton') * hvac_heating_ap.heat_rated_cfm_per_ton[0]
|
1635
1633
|
else
|
1636
1634
|
# Autosized airflow rate
|
1637
|
-
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (
|
1635
|
+
hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (@supply_air_temp - @heat_setpoint))
|
1638
1636
|
end
|
1639
1637
|
hvac_sizing_values.Heat_Airflow_Supp = 0.0
|
1640
1638
|
|
1641
1639
|
elsif [HPXML::HVACTypeBoiler,
|
1642
|
-
HPXML::HVACTypeElectricResistance].include?
|
1640
|
+
HPXML::HVACTypeElectricResistance].include? @heating_type
|
1643
1641
|
|
1644
1642
|
hvac_sizing_values.Heat_Capacity = hvac_sizing_values.Heat_Load
|
1645
1643
|
hvac_sizing_values.Heat_Capacity_Supp = 0.0
|
1646
1644
|
hvac_sizing_values.Heat_Airflow = 0.0
|
1647
1645
|
hvac_sizing_values.Heat_Airflow_Supp = 0.0
|
1648
1646
|
|
1649
|
-
elsif
|
1647
|
+
elsif @heating_type.nil?
|
1650
1648
|
|
1651
1649
|
hvac_sizing_values.Heat_Capacity = 0.0
|
1652
1650
|
hvac_sizing_values.Heat_Capacity_Supp = 0.0
|
@@ -1655,51 +1653,64 @@ class HVACSizing
|
|
1655
1653
|
|
1656
1654
|
else
|
1657
1655
|
|
1658
|
-
fail "Unexpected heating type: #{
|
1656
|
+
fail "Unexpected heating type: #{@heating_type}."
|
1659
1657
|
|
1660
1658
|
end
|
1661
1659
|
end
|
1662
1660
|
|
1663
|
-
def self.apply_hvac_installation_quality(hvac_sizing_values,
|
1661
|
+
def self.apply_hvac_installation_quality(hvac_sizing_values, hvac_heating, hvac_cooling)
|
1664
1662
|
# Increases the autosized heating/cooling capacities to account for any reduction
|
1665
1663
|
# in capacity due to HVAC installation quality. This is done to prevent causing
|
1666
1664
|
# unmet loads.
|
1667
1665
|
|
1668
|
-
|
1669
|
-
|
1670
|
-
|
1671
|
-
HPXML::HVACTypeMiniSplitAirConditioner,
|
1672
|
-
HPXML::HVACTypeHeatPumpGroundToAir].include? hvac.CoolType
|
1673
|
-
return if (hvac.ChargeDefectRatio.to_f.abs < 0.001) && (hvac.AirflowDefectRatioCooling.to_f.abs < 0.001) && (hvac.AirflowDefectRatioHeating.to_f.abs < 0.001)
|
1666
|
+
cool_charge_defect_ratio = 0.0
|
1667
|
+
cool_airflow_defect_ratio = 0.0
|
1668
|
+
heat_airflow_defect_ratio = 0.0
|
1674
1669
|
|
1675
|
-
|
1676
|
-
|
1677
|
-
|
1670
|
+
if not hvac_cooling.nil?
|
1671
|
+
if hvac_cooling.respond_to? :charge_defect_ratio
|
1672
|
+
cool_charge_defect_ratio = hvac_cooling.charge_defect_ratio.to_f
|
1673
|
+
end
|
1674
|
+
if hvac_cooling.respond_to? :airflow_defect_ratio
|
1675
|
+
cool_airflow_defect_ratio = hvac_cooling.airflow_defect_ratio.to_f
|
1676
|
+
end
|
1677
|
+
end
|
1678
|
+
if (not hvac_heating.nil?)
|
1679
|
+
if hvac_heating.respond_to? :airflow_defect_ratio
|
1680
|
+
heat_airflow_defect_ratio = hvac_heating.airflow_defect_ratio.to_f
|
1681
|
+
end
|
1682
|
+
end
|
1678
1683
|
|
1679
|
-
|
1684
|
+
return if (cool_charge_defect_ratio.abs < 0.001) && (cool_airflow_defect_ratio.abs < 0.001) && (heat_airflow_defect_ratio.abs < 0.001)
|
1680
1685
|
|
1681
1686
|
# Cooling
|
1687
|
+
|
1688
|
+
f_ch = cool_charge_defect_ratio.round(3)
|
1689
|
+
|
1682
1690
|
if [HPXML::HVACTypeHeatPumpAirToAir,
|
1683
1691
|
HPXML::HVACTypeCentralAirConditioner,
|
1684
1692
|
HPXML::HVACTypeHeatPumpMiniSplit,
|
1685
1693
|
HPXML::HVACTypeMiniSplitAirConditioner,
|
1686
|
-
HPXML::HVACTypeHeatPumpGroundToAir].include?(
|
1694
|
+
HPXML::HVACTypeHeatPumpGroundToAir].include?(@cooling_type) && @fraction_cool_load_served > 0
|
1695
|
+
|
1696
|
+
hvac_cooling_ap = hvac_cooling.additional_properties
|
1687
1697
|
|
1688
1698
|
cool_airflow_rated_defect_ratio = []
|
1689
1699
|
cool_airflow_rated_ratio = []
|
1690
|
-
|
1691
|
-
|
1692
|
-
for speed in 0..(
|
1693
|
-
cool_airflow_rated_ratio << cool_cfm_m3s / HVAC.calc_rated_airflow(hvac_sizing_values.Cool_Capacity,
|
1694
|
-
cool_airflow_rated_defect_ratio << cool_cfm_m3s * (1 +
|
1700
|
+
if @cooling_type != HPXML::HVACTypeHeatPumpGroundToAir
|
1701
|
+
cool_cfm_m3s = UnitConversions.convert(hvac_sizing_values.Cool_Airflow, 'cfm', 'm^3/s')
|
1702
|
+
for speed in 0..(hvac_cooling_ap.cool_rated_cfm_per_ton.size - 1)
|
1703
|
+
cool_airflow_rated_ratio << cool_cfm_m3s / HVAC.calc_rated_airflow(hvac_sizing_values.Cool_Capacity, hvac_cooling_ap.cool_rated_cfm_per_ton[speed], hvac_cooling_ap.cool_capacity_ratios[speed])
|
1704
|
+
cool_airflow_rated_defect_ratio << cool_cfm_m3s * (1 + cool_airflow_defect_ratio) / HVAC.calc_rated_airflow(hvac_sizing_values.Cool_Capacity, hvac_cooling_ap.cool_rated_cfm_per_ton[speed], hvac_cooling_ap.cool_capacity_ratios[speed])
|
1695
1705
|
end
|
1696
1706
|
else
|
1697
1707
|
cool_airflow_rated_ratio = [1.0] # actual air flow is equal to rated (before applying defect ratio) in current methodology
|
1698
|
-
cool_airflow_rated_defect_ratio = [1 +
|
1708
|
+
cool_airflow_rated_defect_ratio = [1 + cool_airflow_defect_ratio]
|
1699
1709
|
end
|
1710
|
+
|
1700
1711
|
if not cool_airflow_rated_defect_ratio.empty?
|
1701
1712
|
cap_clg_ratios = []
|
1702
|
-
for speed in 0..(
|
1713
|
+
for speed in 0..(cool_airflow_rated_defect_ratio.size - 1)
|
1703
1714
|
# NOTE: heat pump (cooling) curves don't exhibit expected trends at extreme faults;
|
1704
1715
|
clg_fff_cap_coeff, _clg_fff_eir_coeff = HVAC.get_airflow_fault_cooling_coeff()
|
1705
1716
|
a1_AF_Qgr_c = clg_fff_cap_coeff[0]
|
@@ -1714,8 +1725,8 @@ class HVACSizing
|
|
1714
1725
|
a4_CH_Qgr_c = qgr_values[3]
|
1715
1726
|
|
1716
1727
|
q0_CH = a1_CH_Qgr_c
|
1717
|
-
q1_CH = a2_CH_Qgr_c *
|
1718
|
-
q2_CH = a3_CH_Qgr_c *
|
1728
|
+
q1_CH = a2_CH_Qgr_c * UnitConversions.convert(@cool_setpoint, 'F', 'C')
|
1729
|
+
q2_CH = a3_CH_Qgr_c * UnitConversions.convert(@hpxml.header.manualj_cooling_design_temp, 'F', 'C')
|
1719
1730
|
q3_CH = a4_CH_Qgr_c * f_ch
|
1720
1731
|
y_CH_Q_c = 1 + ((q0_CH + q1_CH + q2_CH + q3_CH) * f_ch)
|
1721
1732
|
|
@@ -1739,7 +1750,7 @@ class HVACSizing
|
|
1739
1750
|
|
1740
1751
|
prev_capacity = hvac_sizing_values.Cool_Capacity
|
1741
1752
|
hvac_sizing_values.Cool_Capacity *= cap_clg_ratios.max
|
1742
|
-
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity *
|
1753
|
+
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac_cooling_ap.cool_rated_shrs_gross[get_sizing_speed(hvac_cooling_ap)]
|
1743
1754
|
if prev_capacity > 0 # Preserve cfm/ton
|
1744
1755
|
hvac_sizing_values.Cool_Airflow = hvac_sizing_values.Cool_Airflow * hvac_sizing_values.Cool_Capacity / prev_capacity
|
1745
1756
|
else
|
@@ -1749,24 +1760,29 @@ class HVACSizing
|
|
1749
1760
|
end
|
1750
1761
|
|
1751
1762
|
# Heating
|
1763
|
+
|
1752
1764
|
if [HPXML::HVACTypeHeatPumpAirToAir,
|
1753
1765
|
HPXML::HVACTypeHeatPumpMiniSplit,
|
1754
|
-
HPXML::HVACTypeHeatPumpGroundToAir].include?(
|
1766
|
+
HPXML::HVACTypeHeatPumpGroundToAir].include?(@heating_type) && @fraction_heat_load_served > 0
|
1767
|
+
|
1768
|
+
hvac_heating_ap = hvac_heating.additional_properties
|
1769
|
+
|
1755
1770
|
heat_airflow_rated_defect_ratio = []
|
1756
1771
|
heat_airflow_rated_ratio = []
|
1757
|
-
|
1758
|
-
|
1759
|
-
for speed in 0..(
|
1760
|
-
heat_airflow_rated_ratio << heat_cfm_m3s / HVAC.calc_rated_airflow(hvac_sizing_values.Heat_Capacity,
|
1761
|
-
heat_airflow_rated_defect_ratio << heat_cfm_m3s * (1 +
|
1772
|
+
if @heating_type != HPXML::HVACTypeHeatPumpGroundToAir
|
1773
|
+
heat_cfm_m3s = UnitConversions.convert(hvac_sizing_values.Heat_Airflow, 'cfm', 'm^3/s')
|
1774
|
+
for speed in 0..(hvac_heating_ap.heat_rated_cfm_per_ton.size - 1)
|
1775
|
+
heat_airflow_rated_ratio << heat_cfm_m3s / HVAC.calc_rated_airflow(hvac_sizing_values.Heat_Capacity, hvac_heating_ap.heat_rated_cfm_per_ton[speed], hvac_heating_ap.heat_capacity_ratios[speed])
|
1776
|
+
heat_airflow_rated_defect_ratio << heat_cfm_m3s * (1 + heat_airflow_defect_ratio) / HVAC.calc_rated_airflow(hvac_sizing_values.Heat_Capacity, hvac_heating_ap.heat_rated_cfm_per_ton[speed], hvac_heating_ap.heat_capacity_ratios[speed])
|
1762
1777
|
end
|
1763
1778
|
else
|
1764
1779
|
heat_airflow_rated_ratio = [1.0] # actual air flow is equal to rated (before applying defect ratio) in current methodology
|
1765
|
-
heat_airflow_rated_defect_ratio = [1 +
|
1780
|
+
heat_airflow_rated_defect_ratio = [1 + heat_airflow_defect_ratio]
|
1766
1781
|
end
|
1782
|
+
|
1767
1783
|
if not heat_airflow_rated_defect_ratio.empty?
|
1768
1784
|
cap_htg_ratios = []
|
1769
|
-
for speed in 0..(
|
1785
|
+
for speed in 0..(heat_airflow_rated_defect_ratio.size - 1)
|
1770
1786
|
htg_fff_cap_coeff, _htg_fff_eir_coeff = HVAC.get_airflow_fault_heating_coeff()
|
1771
1787
|
a1_AF_Qgr_h = htg_fff_cap_coeff[0]
|
1772
1788
|
a2_AF_Qgr_h = htg_fff_cap_coeff[1]
|
@@ -1779,7 +1795,7 @@ class HVACSizing
|
|
1779
1795
|
a3_CH_Qgr_h = qgr_values[3]
|
1780
1796
|
|
1781
1797
|
qh1_CH = a1_CH_Qgr_h
|
1782
|
-
qh2_CH = a2_CH_Qgr_h *
|
1798
|
+
qh2_CH = a2_CH_Qgr_h * UnitConversions.convert(@hpxml.header.manualj_heating_design_temp, 'F', 'C')
|
1783
1799
|
qh3_CH = a3_CH_Qgr_h * f_ch
|
1784
1800
|
y_CH_Q_h = 1 + ((qh1_CH + qh2_CH + qh3_CH) * f_ch)
|
1785
1801
|
|
@@ -1800,6 +1816,7 @@ class HVACSizing
|
|
1800
1816
|
cap_htg_ratio = 1 / (heat_cap_fff / heat_cap_fff_nodefect)
|
1801
1817
|
cap_htg_ratios << cap_htg_ratio
|
1802
1818
|
end
|
1819
|
+
|
1803
1820
|
prev_capacity = hvac_sizing_values.Heat_Capacity
|
1804
1821
|
hvac_sizing_values.Heat_Capacity *= cap_htg_ratios.max
|
1805
1822
|
if prev_capacity > 0 # Preserve cfm/ton
|
@@ -1811,32 +1828,47 @@ class HVACSizing
|
|
1811
1828
|
end
|
1812
1829
|
end
|
1813
1830
|
|
1814
|
-
def self.apply_hvac_fixed_capacities(hvac_sizing_values,
|
1831
|
+
def self.apply_hvac_fixed_capacities(hvac_sizing_values, hvac_heating, hvac_cooling)
|
1815
1832
|
'''
|
1816
1833
|
Fixed Sizing Equipment
|
1817
1834
|
'''
|
1818
1835
|
|
1819
1836
|
# Override HVAC capacities if values are provided
|
1820
|
-
if
|
1837
|
+
if not hvac_cooling.nil?
|
1838
|
+
fixed_cooling_capacity = hvac_cooling.cooling_capacity
|
1839
|
+
end
|
1840
|
+
if (not fixed_cooling_capacity.nil?) && (hvac_sizing_values.Cool_Capacity > 0)
|
1821
1841
|
prev_capacity = hvac_sizing_values.Cool_Capacity
|
1822
|
-
hvac_sizing_values.Cool_Capacity =
|
1842
|
+
hvac_sizing_values.Cool_Capacity = fixed_cooling_capacity
|
1823
1843
|
if @hpxml.header.allow_increased_fixed_capacities
|
1824
1844
|
hvac_sizing_values.Cool_Capacity = [hvac_sizing_values.Cool_Capacity, prev_capacity].max
|
1825
1845
|
end
|
1826
1846
|
hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity_Sens * hvac_sizing_values.Cool_Capacity / prev_capacity
|
1827
1847
|
hvac_sizing_values.Cool_Airflow = hvac_sizing_values.Cool_Airflow * hvac_sizing_values.Cool_Capacity / prev_capacity
|
1828
1848
|
end
|
1829
|
-
if
|
1849
|
+
if not hvac_heating.nil?
|
1850
|
+
fixed_heating_capacity = hvac_heating.heating_capacity
|
1851
|
+
elsif (not hvac_cooling.nil?) && hvac_cooling.has_integrated_heating
|
1852
|
+
fixed_heating_capacity = hvac_cooling.integrated_heating_system_capacity
|
1853
|
+
end
|
1854
|
+
if (not fixed_heating_capacity.nil?) && (hvac_sizing_values.Heat_Capacity > 0)
|
1830
1855
|
prev_capacity = hvac_sizing_values.Heat_Capacity
|
1831
|
-
hvac_sizing_values.Heat_Capacity =
|
1856
|
+
hvac_sizing_values.Heat_Capacity = fixed_heating_capacity
|
1832
1857
|
if @hpxml.header.allow_increased_fixed_capacities
|
1833
1858
|
hvac_sizing_values.Heat_Capacity = [hvac_sizing_values.Heat_Capacity, prev_capacity].max
|
1834
1859
|
end
|
1835
1860
|
hvac_sizing_values.Heat_Airflow = hvac_sizing_values.Heat_Airflow * hvac_sizing_values.Heat_Capacity / prev_capacity
|
1836
1861
|
end
|
1837
|
-
if
|
1862
|
+
if hvac_heating.is_a? HPXML::HeatPump
|
1863
|
+
if not hvac_heating.backup_heating_capacity.nil?
|
1864
|
+
fixed_supp_heating_capacity = hvac_heating.backup_heating_capacity
|
1865
|
+
elsif not hvac_heating.backup_system.nil?
|
1866
|
+
fixed_supp_heating_capacity = hvac_heating.backup_system.heating_capacity
|
1867
|
+
end
|
1868
|
+
end
|
1869
|
+
if (not fixed_supp_heating_capacity.nil?) && (hvac_sizing_values.Heat_Capacity_Supp > 0)
|
1838
1870
|
prev_capacity = hvac_sizing_values.Heat_Capacity_Supp
|
1839
|
-
hvac_sizing_values.Heat_Capacity_Supp =
|
1871
|
+
hvac_sizing_values.Heat_Capacity_Supp = fixed_supp_heating_capacity
|
1840
1872
|
if @hpxml.header.allow_increased_fixed_capacities
|
1841
1873
|
hvac_sizing_values.Heat_Capacity_Supp = [hvac_sizing_values.Heat_Capacity_Supp, prev_capacity].max
|
1842
1874
|
end
|
@@ -1844,16 +1876,18 @@ class HVACSizing
|
|
1844
1876
|
end
|
1845
1877
|
end
|
1846
1878
|
|
1847
|
-
def self.apply_hvac_ground_loop(hvac_sizing_values, weather,
|
1879
|
+
def self.apply_hvac_ground_loop(hvac_sizing_values, weather, hvac_cooling)
|
1848
1880
|
'''
|
1849
1881
|
GSHP Ground Loop Sizing Calculations
|
1850
1882
|
'''
|
1851
|
-
return
|
1883
|
+
return if @cooling_type != HPXML::HVACTypeHeatPumpGroundToAir
|
1884
|
+
|
1885
|
+
hvac_cooling_ap = hvac_cooling.additional_properties
|
1852
1886
|
|
1853
1887
|
# Autosize ground loop heat exchanger length
|
1854
1888
|
bore_spacing = 20.0 # ft, distance between bores
|
1855
|
-
pipe_r_value = gshp_hx_pipe_rvalue(
|
1856
|
-
nom_length_heat, nom_length_cool = gshp_hxbore_ft_per_ton(weather,
|
1889
|
+
pipe_r_value = gshp_hx_pipe_rvalue(hvac_cooling_ap)
|
1890
|
+
nom_length_heat, nom_length_cool = gshp_hxbore_ft_per_ton(weather, hvac_cooling_ap, bore_spacing, pipe_r_value)
|
1857
1891
|
|
1858
1892
|
bore_length_heat = nom_length_heat * hvac_sizing_values.Heat_Capacity / UnitConversions.convert(1.0, 'ton', 'Btu/hr')
|
1859
1893
|
bore_length_cool = nom_length_cool * hvac_sizing_values.Cool_Capacity / UnitConversions.convert(1.0, 'ton', 'Btu/hr')
|
@@ -1909,15 +1943,13 @@ class HVACSizing
|
|
1909
1943
|
else
|
1910
1944
|
# Search for first valid bore field
|
1911
1945
|
new_bore_config = nil
|
1912
|
-
valid_field_found = false
|
1913
1946
|
valid_configs.keys.each do |bore_config|
|
1914
1947
|
next unless valid_configs[bore_config].include? num_bore_holes
|
1915
1948
|
|
1916
|
-
valid_field_found = true
|
1917
1949
|
new_bore_config = bore_config
|
1918
1950
|
break
|
1919
1951
|
end
|
1920
|
-
if
|
1952
|
+
if not new_bore_config.nil?
|
1921
1953
|
bore_config = new_bore_config
|
1922
1954
|
else
|
1923
1955
|
fail 'Could not construct a valid GSHP bore field configuration.'
|
@@ -1936,47 +1968,62 @@ class HVACSizing
|
|
1936
1968
|
hvac_sizing_values.GSHP_G_Functions = [lntts, gfnc_coeff]
|
1937
1969
|
end
|
1938
1970
|
|
1939
|
-
def self.apply_hvac_finalize_airflows(hvac_sizing_values,
|
1971
|
+
def self.apply_hvac_finalize_airflows(hvac_sizing_values, hvac_heating, hvac_cooling)
|
1940
1972
|
'''
|
1941
1973
|
Finalize Sizing Calculations
|
1942
1974
|
'''
|
1943
1975
|
|
1944
|
-
if
|
1945
|
-
hvac_sizing_values.Heat_Airflow
|
1976
|
+
if (not hvac_heating.nil?) && hvac_heating.respond_to?(:airflow_defect_ratio)
|
1977
|
+
if hvac_sizing_values.Heat_Airflow > 0
|
1978
|
+
hvac_sizing_values.Heat_Airflow *= (1.0 + hvac_heating.airflow_defect_ratio.to_f)
|
1979
|
+
end
|
1946
1980
|
end
|
1947
1981
|
|
1948
|
-
if
|
1949
|
-
hvac_sizing_values.Cool_Airflow
|
1982
|
+
if (not hvac_cooling.nil?) && hvac_cooling.respond_to?(:airflow_defect_ratio)
|
1983
|
+
if hvac_sizing_values.Cool_Airflow > 0
|
1984
|
+
hvac_sizing_values.Cool_Airflow *= (1.0 + hvac_cooling.airflow_defect_ratio.to_f)
|
1985
|
+
end
|
1950
1986
|
end
|
1951
1987
|
end
|
1952
1988
|
|
1953
|
-
def self.process_heat_pump_adjustment(hvac_sizing_values, weather,
|
1989
|
+
def self.process_heat_pump_adjustment(hvac_sizing_values, weather, hvac_heating, total_cap_curve_value, hvac_system)
|
1954
1990
|
'''
|
1955
1991
|
Adjust heat pump sizing
|
1956
1992
|
'''
|
1957
|
-
|
1958
|
-
|
1959
|
-
|
1993
|
+
|
1994
|
+
hvac_heating_ap = hvac_heating.additional_properties
|
1995
|
+
|
1996
|
+
if hvac_heating_ap.heat_cap_ft_spec.size > 1
|
1997
|
+
coefficients = hvac_heating_ap.heat_cap_ft_spec[-1]
|
1998
|
+
capacity_ratio = hvac_heating_ap.heat_capacity_ratios[-1]
|
1960
1999
|
else
|
1961
|
-
coefficients =
|
2000
|
+
coefficients = hvac_heating_ap.heat_cap_ft_spec[0]
|
1962
2001
|
capacity_ratio = 1.0
|
1963
2002
|
end
|
1964
2003
|
|
1965
|
-
if
|
2004
|
+
if hvac_heating.is_a? HPXML::HeatPump
|
2005
|
+
if not hvac_heating.backup_heating_switchover_temp.nil?
|
2006
|
+
min_compressor_temp = hvac_heating.backup_heating_switchover_temp
|
2007
|
+
elsif not hvac_heating.compressor_lockout_temp.nil?
|
2008
|
+
min_compressor_temp = hvac_heating.compressor_lockout_temp
|
2009
|
+
end
|
2010
|
+
end
|
2011
|
+
if (not min_compressor_temp.nil?) && (min_compressor_temp > @hpxml.header.manualj_heating_design_temp)
|
1966
2012
|
# Calculate the heating load at the switchover temperature to limit uninitialized capacity
|
1967
|
-
|
1968
|
-
|
1969
|
-
|
1970
|
-
heating_load =
|
1971
|
-
heating_db =
|
2013
|
+
temp_heat_design_temp = @hpxml.header.manualj_heating_design_temp
|
2014
|
+
@hpxml.header.manualj_heating_design_temp = min_compressor_temp
|
2015
|
+
_alternate_bldg_design_loads, alternate_all_hvac_sizing_values = calculate(weather, @hpxml, @cfa, [hvac_system])
|
2016
|
+
heating_load = alternate_all_hvac_sizing_values[hvac_system].Heat_Load
|
2017
|
+
heating_db = min_compressor_temp
|
2018
|
+
@hpxml.header.manualj_heating_design_temp = temp_heat_design_temp
|
1972
2019
|
else
|
1973
2020
|
heating_load = hvac_sizing_values.Heat_Load
|
1974
|
-
heating_db =
|
2021
|
+
heating_db = @hpxml.header.manualj_heating_design_temp
|
1975
2022
|
end
|
1976
2023
|
|
1977
2024
|
heat_cap_rated = (heating_load / MathTools.biquadratic(@heat_setpoint, heating_db, coefficients)) / capacity_ratio
|
1978
2025
|
|
1979
|
-
if
|
2026
|
+
if total_cap_curve_value.nil? # Heat pump has no cooling
|
1980
2027
|
if @hpxml.header.heat_pump_sizing_methodology == HPXML::HeatPumpSizingMaxLoad
|
1981
2028
|
# Size based on heating, taking into account reduced heat pump capacity at the design temperature
|
1982
2029
|
hvac_sizing_values.Heat_Capacity = heat_cap_rated
|
@@ -1997,10 +2044,10 @@ class HVACSizing
|
|
1997
2044
|
load_shr = hvac_sizing_values.Cool_Load_Sens / hvac_sizing_values.Cool_Load_Tot
|
1998
2045
|
if ((weather.data.HDD65F / weather.data.CDD50F) < 2.0) || (load_shr < 0.95)
|
1999
2046
|
# Mild winter or has a latent cooling load
|
2000
|
-
hvac_sizing_values.Cool_Capacity = [(
|
2047
|
+
hvac_sizing_values.Cool_Capacity = [(@oversize_limit * hvac_sizing_values.Cool_Load_Tot) / total_cap_curve_value, heat_cap_rated].min
|
2001
2048
|
else
|
2002
2049
|
# Cold winter and no latent cooling load (add a ton rule applies)
|
2003
|
-
hvac_sizing_values.Cool_Capacity = [(hvac_sizing_values.Cool_Load_Tot +
|
2050
|
+
hvac_sizing_values.Cool_Capacity = [(hvac_sizing_values.Cool_Load_Tot + @oversize_delta) / total_cap_curve_value, heat_cap_rated].min
|
2004
2051
|
end
|
2005
2052
|
end
|
2006
2053
|
hvac_sizing_values.Cool_Airflow = cfm_per_btuh * hvac_sizing_values.Cool_Capacity
|
@@ -2073,7 +2120,7 @@ class HVACSizing
|
|
2073
2120
|
return rated_cfm_per_ton * capacity_ratio * UnitConversions.convert(capacity, 'Btu/hr', 'ton') # Maximum air flow under heating operation
|
2074
2121
|
end
|
2075
2122
|
|
2076
|
-
def self.calc_gshp_clg_curve_value(
|
2123
|
+
def self.calc_gshp_clg_curve_value(cool_cap_curve_spec, cool_sh_curve_spec, wb_temp, db_temp, w_temp, vfr_air, loop_flow = nil, rated_vfr_air = nil)
|
2077
2124
|
# Reference conditions in thesis with largest capacity:
|
2078
2125
|
# See Appendix B Figure B.3 of https://hvac.okstate.edu/sites/default/files/pubs/theses/MS/27-Tang_Thesis_05.pdf
|
2079
2126
|
ref_temp = 283 # K
|
@@ -2085,66 +2132,47 @@ class HVACSizing
|
|
2085
2132
|
end
|
2086
2133
|
ref_vfr_water = 0.000284
|
2087
2134
|
|
2088
|
-
a_1 =
|
2089
|
-
a_2 =
|
2090
|
-
a_3 =
|
2091
|
-
a_4 =
|
2092
|
-
a_5 =
|
2093
|
-
b_1 =
|
2094
|
-
b_2 =
|
2095
|
-
b_3 =
|
2096
|
-
b_4 =
|
2097
|
-
b_5 =
|
2098
|
-
b_6 =
|
2099
|
-
|
2100
|
-
if not loop_flow.nil?
|
2101
|
-
totalCap_CurveValue = a_1 + wb_temp / ref_temp * a_2 + w_temp / ref_temp * a_3 + vfr_air / ref_vfr_air * a_4 + loop_flow / ref_vfr_water * a_5
|
2102
|
-
sensibleCap_CurveValue = b_1 + db_temp / ref_temp * b_2 + wb_temp / ref_temp * b_3 + w_temp / ref_temp * b_4 + vfr_air / ref_vfr_air * b_5 + loop_flow / ref_vfr_water * b_6
|
2103
|
-
else
|
2104
|
-
totalCap_CurveValue = a_1 + wb_temp / ref_temp * a_2 + w_temp / ref_temp * a_3 + vfr_air / ref_vfr_air * a_4
|
2105
|
-
sensibleCap_CurveValue = b_1 + db_temp / ref_temp * b_2 + wb_temp / ref_temp * b_3 + w_temp / ref_temp * b_4 + vfr_air / ref_vfr_air * b_5
|
2106
|
-
end
|
2107
|
-
return totalCap_CurveValue, sensibleCap_CurveValue
|
2108
|
-
end
|
2135
|
+
a_1 = cool_cap_curve_spec[0]
|
2136
|
+
a_2 = cool_cap_curve_spec[1]
|
2137
|
+
a_3 = cool_cap_curve_spec[2]
|
2138
|
+
a_4 = cool_cap_curve_spec[3]
|
2139
|
+
a_5 = cool_cap_curve_spec[4]
|
2140
|
+
b_1 = cool_sh_curve_spec[0]
|
2141
|
+
b_2 = cool_sh_curve_spec[1]
|
2142
|
+
b_3 = cool_sh_curve_spec[2]
|
2143
|
+
b_4 = cool_sh_curve_spec[3]
|
2144
|
+
b_5 = cool_sh_curve_spec[4]
|
2145
|
+
b_6 = cool_sh_curve_spec[5]
|
2109
2146
|
|
2110
|
-
|
2111
|
-
# Reference conditions in thesis with largest capacity:
|
2112
|
-
# See Appendix B Figure B.3 of https://hvac.okstate.edu/sites/default/files/pubs/theses/MS/27-Tang_Thesis_05.pdf
|
2113
|
-
ref_temp = 283 # K
|
2114
|
-
ref_vfr_air = UnitConversions.convert(1200, 'cfm', 'm^3/s')
|
2115
|
-
ref_vfr_water = 0.000284
|
2147
|
+
loop_flow = 0.0 if loop_flow.nil?
|
2116
2148
|
|
2117
|
-
|
2118
|
-
|
2119
|
-
a_3 = hvac.HEAT_CAP_FT_SPEC[hvac.SizingSpeed][2]
|
2120
|
-
a_4 = hvac.HEAT_CAP_FT_SPEC[hvac.SizingSpeed][3]
|
2121
|
-
a_5 = hvac.HEAT_CAP_FT_SPEC[hvac.SizingSpeed][4]
|
2149
|
+
total_cap_curve_value = a_1 + wb_temp / ref_temp * a_2 + w_temp / ref_temp * a_3 + vfr_air / ref_vfr_air * a_4 + loop_flow / ref_vfr_water * a_5
|
2150
|
+
sensible_cap_curve_value = b_1 + db_temp / ref_temp * b_2 + wb_temp / ref_temp * b_3 + w_temp / ref_temp * b_4 + vfr_air / ref_vfr_air * b_5 + loop_flow / ref_vfr_water * b_6
|
2122
2151
|
|
2123
|
-
|
2124
|
-
return cap_CurveValue
|
2152
|
+
return total_cap_curve_value, sensible_cap_curve_value
|
2125
2153
|
end
|
2126
2154
|
|
2127
2155
|
def self.calc_delivery_effectiveness_heating(dse_Qs, dse_Qr, system_cfm, load_sens, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, t_setpoint, dse_Fregain_s, dse_Fregain_r, supply_r, return_r, air_dens = @inside_air_dens, air_cp = Gas.Air.cp)
|
2128
2156
|
'''
|
2129
2157
|
Calculate the Delivery Effectiveness for heating (using the method of ASHRAE Standard 152).
|
2130
2158
|
'''
|
2131
|
-
dse_Bs, dse_Br,
|
2132
|
-
dse_DE = _calc_dse_DE_heating(
|
2133
|
-
dse_DEcorr = _calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br,
|
2159
|
+
dse_Bs, dse_Br, dse_As, dse_Ar, dse_dTe, dse_dT_s, dse_dT_r = _calc_dse_init(system_cfm, load_sens, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, t_setpoint, dse_Qs, dse_Qr, supply_r, return_r, air_dens, air_cp)
|
2160
|
+
dse_DE = _calc_dse_DE_heating(dse_As, dse_Bs, dse_Ar, dse_Br, dse_dT_s, dse_dT_r, dse_dTe)
|
2161
|
+
dse_DEcorr = _calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br, dse_Ar, dse_dT_r, dse_dTe)
|
2134
2162
|
|
2135
2163
|
return dse_DEcorr
|
2136
2164
|
end
|
2137
2165
|
|
2138
|
-
def self.calc_delivery_effectiveness_cooling(dse_Qs, dse_Qr,
|
2166
|
+
def self.calc_delivery_effectiveness_cooling(dse_Qs, dse_Qr, leaving_air_temp, system_cfm, load_sens, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, t_setpoint, dse_Fregain_s, dse_Fregain_r, load_total, dse_h_r, supply_r, return_r, air_dens = @inside_air_dens, air_cp = Gas.Air.cp, h_in = @enthalpy_indoor_cooling)
|
2139
2167
|
'''
|
2140
2168
|
Calculate the Delivery Effectiveness for cooling (using the method of ASHRAE Standard 152).
|
2141
2169
|
'''
|
2142
|
-
dse_Bs, dse_Br,
|
2170
|
+
dse_Bs, dse_Br, dse_As, dse_Ar, dse_dTe, _dse_dT_s, dse_dT_r = _calc_dse_init(system_cfm, load_sens, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, t_setpoint, dse_Qs, dse_Qr, supply_r, return_r, air_dens, air_cp)
|
2143
2171
|
dse_dTe *= -1.0
|
2144
|
-
dse_DE,
|
2145
|
-
dse_DEcorr = _calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br,
|
2172
|
+
dse_DE, cooling_load_ducts_sens = _calc_dse_DE_cooling(dse_As, system_cfm, load_total, dse_Ar, dse_h_r, dse_Br, dse_dT_r, dse_Bs, leaving_air_temp, dse_Tamb_s, load_sens, air_dens, air_cp, h_in)
|
2173
|
+
dse_DEcorr = _calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br, dse_Ar, dse_dT_r, dse_dTe)
|
2146
2174
|
|
2147
|
-
return dse_DEcorr, dse_dTe,
|
2175
|
+
return dse_DEcorr, dse_dTe, cooling_load_ducts_sens
|
2148
2176
|
end
|
2149
2177
|
|
2150
2178
|
def self._calc_dse_init(system_cfm, load_sens, dse_Tamb_s, dse_Tamb_r, dse_As, dse_Ar, t_setpoint, dse_Qs, dse_Qr, supply_r, return_r, air_dens, air_cp)
|
@@ -2152,43 +2180,43 @@ class HVACSizing
|
|
2152
2180
|
dse_Bs = Math.exp((-1.0 * dse_As) / (60.0 * system_cfm * air_dens * air_cp * supply_r))
|
2153
2181
|
dse_Br = Math.exp((-1.0 * dse_Ar) / (60.0 * system_cfm * air_dens * air_cp * return_r))
|
2154
2182
|
|
2155
|
-
|
2156
|
-
|
2183
|
+
dse_As = (system_cfm - dse_Qs) / system_cfm
|
2184
|
+
dse_Ar = (system_cfm - dse_Qr) / system_cfm
|
2157
2185
|
|
2158
2186
|
dse_dTe = load_sens / (60.0 * system_cfm * air_dens * air_cp)
|
2159
2187
|
dse_dT_s = t_setpoint - dse_Tamb_s
|
2160
2188
|
dse_dT_r = t_setpoint - dse_Tamb_r
|
2161
2189
|
|
2162
|
-
return dse_Bs, dse_Br,
|
2190
|
+
return dse_Bs, dse_Br, dse_As, dse_Ar, dse_dTe, dse_dT_s, dse_dT_r
|
2163
2191
|
end
|
2164
2192
|
|
2165
|
-
def self._calc_dse_DE_cooling(
|
2193
|
+
def self._calc_dse_DE_cooling(dse_As, system_cfm, load_total, dse_Ar, dse_h_r, dse_Br, dse_dT_r, dse_Bs, leaving_air_temp, dse_Tamb_s, load_sens, air_dens, air_cp, h_in)
|
2166
2194
|
# Calculate the delivery effectiveness (Equation 6-25)
|
2167
|
-
dse_DE = ((
|
2195
|
+
dse_DE = ((dse_As * 60.0 * system_cfm * air_dens) / (-1.0 * load_total)) * \
|
2168
2196
|
(((-1.0 * load_total) / (60.0 * system_cfm * air_dens)) + \
|
2169
|
-
(1.0 -
|
2170
|
-
|
2171
|
-
air_cp * (dse_Bs - 1.0) * (
|
2197
|
+
(1.0 - dse_Ar) * (dse_h_r - h_in) + \
|
2198
|
+
dse_Ar * air_cp * (dse_Br - 1.0) * dse_dT_r + \
|
2199
|
+
air_cp * (dse_Bs - 1.0) * (leaving_air_temp - dse_Tamb_s))
|
2172
2200
|
|
2173
2201
|
# Calculate the sensible heat transfer from surroundings
|
2174
|
-
|
2202
|
+
cooling_load_ducts_sens = (1.0 - [dse_DE, 0.0].max) * load_sens
|
2175
2203
|
|
2176
|
-
return dse_DE,
|
2204
|
+
return dse_DE, cooling_load_ducts_sens
|
2177
2205
|
end
|
2178
2206
|
|
2179
|
-
def self._calc_dse_DE_heating(
|
2207
|
+
def self._calc_dse_DE_heating(dse_As, dse_Bs, dse_Ar, dse_Br, dse_dT_s, dse_dT_r, dse_dTe)
|
2180
2208
|
# Calculate the delivery effectiveness (Equation 6-23)
|
2181
|
-
dse_DE = (
|
2182
|
-
|
2183
|
-
|
2209
|
+
dse_DE = (dse_As * dse_Bs -
|
2210
|
+
dse_As * dse_Bs * (1.0 - dse_Ar * dse_Br) * (dse_dT_r / dse_dTe) -
|
2211
|
+
dse_As * (1.0 - dse_Bs) * (dse_dT_s / dse_dTe))
|
2184
2212
|
|
2185
2213
|
return dse_DE
|
2186
2214
|
end
|
2187
2215
|
|
2188
|
-
def self._calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br,
|
2216
|
+
def self._calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br, dse_Ar, dse_dT_r, dse_dTe)
|
2189
2217
|
# Calculate the delivery effectiveness corrector for regain (Equation 6-40)
|
2190
2218
|
dse_DEcorr = (dse_DE + dse_Fregain_s * (1.0 - dse_DE) - (dse_Fregain_s - dse_Fregain_r -
|
2191
|
-
dse_Br * (
|
2219
|
+
dse_Br * (dse_Ar * dse_Fregain_s - dse_Fregain_r)) * dse_dT_r / dse_dTe)
|
2192
2220
|
|
2193
2221
|
# Limit the DE to a reasonable value to prevent negative values and huge equipment
|
2194
2222
|
dse_DEcorr = [dse_DEcorr, 0.25].max
|
@@ -2197,382 +2225,92 @@ class HVACSizing
|
|
2197
2225
|
return dse_DEcorr
|
2198
2226
|
end
|
2199
2227
|
|
2200
|
-
def self.calculate_sensible_latent_split(return_leakage_cfm, cool_load_tot,
|
2228
|
+
def self.calculate_sensible_latent_split(return_leakage_cfm, cool_load_tot, cool_load_lat)
|
2201
2229
|
# Calculate the latent duct leakage load (Manual J accounts only for return duct leakage)
|
2202
|
-
|
2230
|
+
dse_cool_load_latent = [0.0, 0.68 * @acf * return_leakage_cfm * (@cool_design_grains - @cool_indoor_grains)].max
|
2203
2231
|
|
2204
2232
|
# Calculate final latent and load
|
2205
|
-
|
2206
|
-
|
2233
|
+
cool_load_lat += dse_cool_load_latent
|
2234
|
+
cool_load_sens = cool_load_tot - cool_load_lat
|
2207
2235
|
|
2208
|
-
return
|
2236
|
+
return cool_load_lat, cool_load_sens
|
2209
2237
|
end
|
2210
2238
|
|
2211
|
-
def self.
|
2212
|
-
|
2213
|
-
|
2214
|
-
|
2215
|
-
|
2216
|
-
ducts.each do |duct|
|
2217
|
-
next if HPXML::conditioned_locations_this_unit.include? duct.Location
|
2218
|
-
|
2219
|
-
uncond_area[duct.Side] += duct.Area
|
2220
|
-
end
|
2239
|
+
def self.calc_duct_conduction_values(distribution_system, design_temps)
|
2240
|
+
dse_A = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
|
2241
|
+
dse_Ufactor = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
|
2242
|
+
dse_Tamb = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
|
2243
|
+
dse_Fregain = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
|
2221
2244
|
|
2222
|
-
|
2223
|
-
|
2224
|
-
|
2245
|
+
[HPXML::DuctTypeSupply, HPXML::DuctTypeReturn].each do |duct_type|
|
2246
|
+
# Calculate total area outside this unit's conditioned space
|
2247
|
+
total_area = 0.0
|
2248
|
+
distribution_system.ducts.each do |duct|
|
2249
|
+
next if duct.duct_type != duct_type
|
2250
|
+
next if HPXML::conditioned_locations_this_unit.include? duct.duct_location
|
2225
2251
|
|
2226
|
-
|
2227
|
-
value[duct.Side] += values[duct.Side][duct.Location] * duct.Area / uncond_area[duct.Side]
|
2228
|
-
else
|
2229
|
-
value[duct.Side] += values[duct.Side][duct.Location]
|
2252
|
+
total_area += duct.duct_surface_area * duct.duct_surface_area_multiplier
|
2230
2253
|
end
|
2231
|
-
end
|
2232
2254
|
|
2233
|
-
|
2234
|
-
|
2235
|
-
|
2236
|
-
|
2237
|
-
|
2238
|
-
|
2239
|
-
|
2255
|
+
if total_area == 0
|
2256
|
+
# There still may be leakage to the outside, so set Tamb to outside environment
|
2257
|
+
dse_Tamb[duct_type] = design_temps[HPXML::LocationOutside]
|
2258
|
+
else
|
2259
|
+
distribution_system.ducts.each do |duct|
|
2260
|
+
next if duct.duct_type != duct_type
|
2261
|
+
next if HPXML::conditioned_locations_this_unit.include? duct.duct_location
|
2240
2262
|
|
2241
|
-
|
2242
|
-
|
2243
|
-
next if HPXML::conditioned_locations_this_unit.include? duct.Location
|
2263
|
+
duct_area = duct.duct_surface_area * duct.duct_surface_area_multiplier
|
2264
|
+
dse_A[duct_type] += duct_area
|
2244
2265
|
|
2245
|
-
|
2246
|
-
end
|
2266
|
+
# Calculate area-weighted values:
|
2247
2267
|
|
2248
|
-
|
2249
|
-
end
|
2268
|
+
duct_area_fraction = duct_area / total_area
|
2250
2269
|
|
2251
|
-
|
2252
|
-
'''
|
2253
|
-
Calculate total supply & return duct leakage in cfm.
|
2254
|
-
'''
|
2270
|
+
dse_Ufactor[duct_type] += 1.0 / duct.duct_effective_r_value * duct_area_fraction
|
2255
2271
|
|
2256
|
-
|
2257
|
-
ducts.each do |duct|
|
2258
|
-
next if HPXML::conditioned_locations_this_unit.include? duct.Location
|
2272
|
+
dse_Tamb[duct_type] += design_temps[duct.duct_location] * duct_area_fraction
|
2259
2273
|
|
2260
|
-
|
2261
|
-
|
2262
|
-
elsif duct.LeakageCFM25.to_f > 0
|
2263
|
-
cfms[duct.Side] += duct.LeakageCFM25
|
2264
|
-
elsif duct.LeakageCFM50.to_f > 0
|
2265
|
-
cfms[duct.Side] += Airflow.calc_air_leakage_at_diff_pressure(0.65, duct.LeakageCFM50, 50.0, 25.0)
|
2274
|
+
dse_Fregain[duct_type] += get_duct_regain_factor(duct) * duct_area_fraction
|
2275
|
+
end
|
2266
2276
|
end
|
2267
2277
|
end
|
2268
2278
|
|
2269
|
-
return
|
2279
|
+
return dse_A[HPXML::DuctTypeSupply], dse_A[HPXML::DuctTypeReturn],
|
2280
|
+
1.0 / dse_Ufactor[HPXML::DuctTypeSupply], 1.0 / dse_Ufactor[HPXML::DuctTypeReturn],
|
2281
|
+
dse_Tamb[HPXML::DuctTypeSupply], dse_Tamb[HPXML::DuctTypeReturn],
|
2282
|
+
dse_Fregain[HPXML::DuctTypeSupply], dse_Fregain[HPXML::DuctTypeReturn]
|
2270
2283
|
end
|
2271
2284
|
|
2272
|
-
def self.
|
2285
|
+
def self.calc_duct_leakages_cfm25(distribution_system, system_cfm)
|
2273
2286
|
'''
|
2274
|
-
Calculate
|
2287
|
+
Calculate supply & return duct leakage in cfm25.
|
2275
2288
|
'''
|
2276
2289
|
|
2277
|
-
|
2278
|
-
ducts.each do |duct|
|
2279
|
-
next if HPXML::conditioned_locations_this_unit.include? duct.Location
|
2280
|
-
|
2281
|
-
u_factors[duct.Side][duct.Location] = 1.0 / duct.Rvalue
|
2282
|
-
end
|
2283
|
-
|
2284
|
-
supply_u, return_u = calc_ducts_area_weighted_average(ducts, u_factors)
|
2285
|
-
|
2286
|
-
return 1.0 / supply_u, 1.0 / return_u
|
2287
|
-
end
|
2288
|
-
|
2289
|
-
def self.get_hvac_information(hvac_system)
|
2290
|
-
# FUTURE: Remove this method and use hvac_system objects directly.
|
2291
|
-
hvac = HVACInfo.new
|
2292
|
-
|
2293
|
-
hpxml_hvacs = []
|
2294
|
-
if not hvac_system[:heating].nil?
|
2295
|
-
hpxml_hvacs << hvac_system[:heating]
|
2296
|
-
end
|
2297
|
-
if not hvac_system[:cooling].nil?
|
2298
|
-
hpxml_hvacs << hvac_system[:cooling]
|
2299
|
-
end
|
2300
|
-
|
2301
|
-
# Get heating/cooling system info from HPXML objects
|
2302
|
-
hpxml_hvacs.uniq.each do |hpxml_hvac|
|
2303
|
-
hpxml_hvac_ap = hpxml_hvac.additional_properties
|
2304
|
-
|
2305
|
-
hvac.hvac_system = hvac_system
|
2306
|
-
|
2307
|
-
# System type
|
2308
|
-
if hpxml_hvac.respond_to? :heating_system_type
|
2309
|
-
hvac.HeatType = hpxml_hvac.heating_system_type
|
2310
|
-
elsif hpxml_hvac.respond_to? :cooling_system_type
|
2311
|
-
hvac.CoolType = hpxml_hvac.cooling_system_type
|
2312
|
-
elsif hpxml_hvac.respond_to? :heat_pump_type
|
2313
|
-
hvac.HeatType = hpxml_hvac.heat_pump_type
|
2314
|
-
hvac.CoolType = hpxml_hvac.heat_pump_type
|
2315
|
-
end
|
2316
|
-
|
2317
|
-
# Load fractions
|
2318
|
-
if hpxml_hvac.respond_to? :fraction_heat_load_served
|
2319
|
-
hvac.HeatingLoadFraction = hpxml_hvac.fraction_heat_load_served
|
2320
|
-
end
|
2321
|
-
if hpxml_hvac.respond_to? :fraction_cool_load_served
|
2322
|
-
hvac.CoolingLoadFraction = hpxml_hvac.fraction_cool_load_served
|
2323
|
-
end
|
2324
|
-
if hpxml_hvac.is_a?(HPXML::HeatingSystem) && hpxml_hvac.is_heat_pump_backup_system
|
2325
|
-
# Use the same load fractions as the heat pump
|
2326
|
-
heat_pump = @hpxml.heat_pumps.select { |hp| hp.backup_system_idref == hpxml_hvac.id }[0]
|
2327
|
-
hvac.HeatingLoadFraction = heat_pump.fraction_heat_load_served
|
2328
|
-
hvac.CoolingLoadFraction = heat_pump.fraction_cool_load_served
|
2329
|
-
end
|
2330
|
-
|
2331
|
-
# Capacities
|
2332
|
-
if hpxml_hvac.is_a?(HPXML::HeatingSystem) || hpxml_hvac.is_a?(HPXML::HeatPump)
|
2333
|
-
hvac.FixedHeatingCapacity = hpxml_hvac.heating_capacity
|
2334
|
-
end
|
2335
|
-
if hpxml_hvac.is_a?(HPXML::CoolingSystem) || hpxml_hvac.is_a?(HPXML::HeatPump)
|
2336
|
-
hvac.FixedCoolingCapacity = hpxml_hvac.cooling_capacity
|
2337
|
-
end
|
2338
|
-
if hpxml_hvac.is_a?(HPXML::HeatPump)
|
2339
|
-
if not hpxml_hvac.backup_heating_capacity.nil?
|
2340
|
-
hvac.FixedSuppHeatingCapacity = hpxml_hvac.backup_heating_capacity
|
2341
|
-
elsif not hpxml_hvac.backup_system.nil?
|
2342
|
-
hvac.FixedSuppHeatingCapacity = hpxml_hvac.backup_system.heating_capacity
|
2343
|
-
end
|
2344
|
-
end
|
2345
|
-
|
2346
|
-
# Integrated heating systems
|
2347
|
-
if hpxml_hvac.is_a?(HPXML::CoolingSystem) && hpxml_hvac.has_integrated_heating
|
2348
|
-
hvac.HasIntegratedHeating = true
|
2349
|
-
hvac.HeatingLoadFraction = hpxml_hvac.integrated_heating_system_fraction_heat_load_served
|
2350
|
-
hvac.FixedHeatingCapacity = hpxml_hvac.integrated_heating_system_capacity
|
2351
|
-
end
|
2352
|
-
|
2353
|
-
# HP Switchover Temperature
|
2354
|
-
if hpxml_hvac.is_a?(HPXML::HeatPump)
|
2355
|
-
hvac.SwitchoverTemperature = hpxml_hvac.backup_heating_switchover_temp
|
2356
|
-
end
|
2357
|
-
|
2358
|
-
# Number of speeds
|
2359
|
-
if hpxml_hvac.is_a?(HPXML::CoolingSystem) || hpxml_hvac.is_a?(HPXML::HeatPump)
|
2360
|
-
# Cooling
|
2361
|
-
if hpxml_hvac_ap.respond_to? :num_speeds
|
2362
|
-
num_speeds = hpxml_hvac_ap.num_speeds
|
2363
|
-
end
|
2364
|
-
num_speeds = 1 if num_speeds.nil?
|
2365
|
-
hvac.NumSpeedsCooling = num_speeds
|
2366
|
-
if hvac.NumSpeedsCooling == 2
|
2367
|
-
hvac.OverSizeLimit = 1.2
|
2368
|
-
elsif hvac.NumSpeedsCooling > 2
|
2369
|
-
hvac.OverSizeLimit = 1.3
|
2370
|
-
end
|
2371
|
-
end
|
2372
|
-
if hpxml_hvac.is_a?(HPXML::HeatingSystem) || hpxml_hvac.is_a?(HPXML::HeatPump)
|
2373
|
-
# Heating
|
2374
|
-
if hpxml_hvac_ap.respond_to? :num_speeds
|
2375
|
-
num_speeds = hpxml_hvac_ap.num_speeds
|
2376
|
-
end
|
2377
|
-
num_speeds = 1 if num_speeds.nil?
|
2378
|
-
hvac.NumSpeedsHeating = num_speeds
|
2379
|
-
end
|
2380
|
-
|
2381
|
-
# HVAC installation quality
|
2382
|
-
if hpxml_hvac.respond_to? :charge_defect_ratio
|
2383
|
-
if [HPXML::HVACTypeCentralAirConditioner,
|
2384
|
-
HPXML::HVACTypeMiniSplitAirConditioner,
|
2385
|
-
HPXML::HVACTypeHeatPumpAirToAir,
|
2386
|
-
HPXML::HVACTypeHeatPumpMiniSplit,
|
2387
|
-
HPXML::HVACTypeHeatPumpGroundToAir].include? hvac.CoolType
|
2388
|
-
hvac.ChargeDefectRatio = hpxml_hvac.charge_defect_ratio
|
2389
|
-
end
|
2390
|
-
end
|
2391
|
-
if hpxml_hvac.respond_to? :airflow_defect_ratio
|
2392
|
-
# Cooling
|
2393
|
-
if [HPXML::HVACTypeCentralAirConditioner,
|
2394
|
-
HPXML::HVACTypeMiniSplitAirConditioner,
|
2395
|
-
HPXML::HVACTypeHeatPumpAirToAir,
|
2396
|
-
HPXML::HVACTypeHeatPumpMiniSplit,
|
2397
|
-
HPXML::HVACTypeHeatPumpGroundToAir].include? hvac.CoolType
|
2398
|
-
if not hpxml_hvac.distribution_system.nil? # Exclude ductless
|
2399
|
-
hvac.AirflowDefectRatioCooling = hpxml_hvac.airflow_defect_ratio
|
2400
|
-
end
|
2401
|
-
end
|
2402
|
-
# Heating
|
2403
|
-
if [HPXML::HVACTypeFurnace,
|
2404
|
-
HPXML::HVACTypeHeatPumpAirToAir,
|
2405
|
-
HPXML::HVACTypeHeatPumpMiniSplit,
|
2406
|
-
HPXML::HVACTypeHeatPumpGroundToAir].include? hvac.HeatType
|
2407
|
-
if not hpxml_hvac.distribution_system.nil? # Exclude ductless
|
2408
|
-
hvac.AirflowDefectRatioHeating = hpxml_hvac.airflow_defect_ratio
|
2409
|
-
end
|
2410
|
-
end
|
2411
|
-
end
|
2412
|
-
|
2413
|
-
# Rated airflow rates
|
2414
|
-
if hpxml_hvac_ap.respond_to? :cool_rated_cfm_per_ton
|
2415
|
-
hvac.RatedCFMperTonCooling = hpxml_hvac_ap.cool_rated_cfm_per_ton
|
2416
|
-
end
|
2417
|
-
if hpxml_hvac_ap.respond_to? :heat_rated_cfm_per_ton
|
2418
|
-
hvac.RatedCFMperTonHeating = hpxml_hvac_ap.heat_rated_cfm_per_ton
|
2419
|
-
end
|
2420
|
-
|
2421
|
-
# Capacity ratios
|
2422
|
-
if hpxml_hvac_ap.respond_to? :cool_capacity_ratios
|
2423
|
-
hvac.CapacityRatioCooling = hpxml_hvac_ap.cool_capacity_ratios
|
2424
|
-
end
|
2425
|
-
if hpxml_hvac_ap.respond_to? :heat_capacity_ratios
|
2426
|
-
hvac.CapacityRatioHeating = hpxml_hvac_ap.heat_capacity_ratios
|
2427
|
-
end
|
2428
|
-
|
2429
|
-
# Sizing speed
|
2430
|
-
hvac.SizingSpeed = get_sizing_speed(hvac.NumSpeedsCooling, hvac.CapacityRatioCooling)
|
2431
|
-
|
2432
|
-
# Rated SHRs
|
2433
|
-
if hpxml_hvac_ap.respond_to? :cool_rated_shrs_gross
|
2434
|
-
hvac.SHRRated = hpxml_hvac_ap.cool_rated_shrs_gross
|
2435
|
-
end
|
2436
|
-
|
2437
|
-
# Performance curves
|
2438
|
-
if hpxml_hvac_ap.respond_to? :cool_cap_ft_spec
|
2439
|
-
hvac.COOL_CAP_FT_SPEC = hpxml_hvac_ap.cool_cap_ft_spec
|
2440
|
-
end
|
2441
|
-
if hpxml_hvac_ap.respond_to? :cool_sh_ft_spec
|
2442
|
-
hvac.COOL_SH_FT_SPEC = hpxml_hvac_ap.cool_sh_ft_spec
|
2443
|
-
end
|
2444
|
-
if hpxml_hvac_ap.respond_to? :heat_cap_ft_spec
|
2445
|
-
hvac.HEAT_CAP_FT_SPEC = hpxml_hvac_ap.heat_cap_ft_spec
|
2446
|
-
end
|
2447
|
-
if hpxml_hvac_ap.respond_to? :cool_cap_fflow_spec
|
2448
|
-
hvac.COOL_CAP_FFLOW_SPEC = hpxml_hvac_ap.cool_cap_fflow_spec
|
2449
|
-
end
|
2450
|
-
if hpxml_hvac_ap.respond_to? :heat_cap_fflow_spec
|
2451
|
-
hvac.HEAT_CAP_FFLOW_SPEC = hpxml_hvac_ap.heat_cap_fflow_spec
|
2452
|
-
end
|
2453
|
-
if hpxml_hvac_ap.respond_to? :cool_cap_curve_spec
|
2454
|
-
hvac.COOL_CAP_CURVE_SPEC = hpxml_hvac_ap.cool_cap_curve_spec
|
2455
|
-
end
|
2456
|
-
if hpxml_hvac_ap.respond_to? :cool_sh_curve_spec
|
2457
|
-
hvac.COOL_SH_CURVE_SPEC = hpxml_hvac_ap.cool_sh_curve_spec
|
2458
|
-
end
|
2459
|
-
if hpxml_hvac_ap.respond_to? :heat_cap_curve_spec
|
2460
|
-
hvac.HEAT_CAP_CURVE_SPEC = hpxml_hvac_ap.heat_cap_curve_spec
|
2461
|
-
end
|
2290
|
+
cfms = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
|
2462
2291
|
|
2463
|
-
|
2464
|
-
if
|
2465
|
-
|
2466
|
-
end
|
2292
|
+
distribution_system.duct_leakage_measurements.each do |m|
|
2293
|
+
next if m.duct_leakage_total_or_to_outside != HPXML::DuctLeakageToOutside
|
2294
|
+
next unless [HPXML::DuctTypeSupply, HPXML::DuctTypeReturn].include? m.duct_type
|
2467
2295
|
|
2468
|
-
|
2469
|
-
|
2470
|
-
|
2471
|
-
|
2472
|
-
|
2473
|
-
|
2296
|
+
if m.duct_leakage_units == HPXML::UnitsPercent
|
2297
|
+
cfms[m.duct_type] += m.duct_leakage_value * system_cfm
|
2298
|
+
elsif m.duct_leakage_units == HPXML::UnitsCFM25
|
2299
|
+
cfms[m.duct_type] += m.duct_leakage_value
|
2300
|
+
elsif m.duct_leakage_units == HPXML::UnitsCFM50
|
2301
|
+
cfms[m.duct_type] += Airflow.calc_air_leakage_at_diff_pressure(0.65, m.duct_leakage_value, 50.0, 25.0)
|
2474
2302
|
end
|
2475
|
-
|
2476
|
-
hvac.HeatingEIR = hpxml_hvac_ap.heat_rated_eirs[0]
|
2477
|
-
end
|
2478
|
-
if hvac.HeatType == HPXML::HVACTypeHeatPumpGroundToAir
|
2479
|
-
hvac.GSHP_design_chw = hpxml_hvac_ap.design_chw
|
2480
|
-
hvac.GSHP_design_delta_t = hpxml_hvac_ap.design_delta_t
|
2481
|
-
hvac.GSHP_design_hw = hpxml_hvac_ap.design_hw
|
2482
|
-
hvac.GSHP_bore_d = hpxml_hvac_ap.bore_diameter
|
2483
|
-
hvac.GSHP_pipe_od = hpxml_hvac_ap.pipe_od
|
2484
|
-
hvac.GSHP_pipe_id = hpxml_hvac_ap.pipe_id
|
2485
|
-
hvac.GSHP_pipe_cond = hpxml_hvac_ap.pipe_cond
|
2486
|
-
hvac.GSHP_grout_k = hpxml_hvac_ap.grout_conductivity
|
2487
|
-
end
|
2488
|
-
|
2489
|
-
# Evaporative cooler
|
2490
|
-
if hpxml_hvac_ap.respond_to? :effectiveness
|
2491
|
-
hvac.EvapCoolerEffectiveness = hpxml_hvac_ap.effectiveness
|
2492
|
-
end
|
2493
|
-
|
2494
|
-
# Ducts
|
2495
|
-
# FUTURE: Consolidate w/ ducts code in measure.rb
|
2496
|
-
hvac.Ducts = []
|
2497
|
-
next unless not hpxml_hvac.distribution_system.nil?
|
2498
|
-
|
2499
|
-
lto = { supply_percent: nil, supply_cfm25: nil, return_percent: nil, return_cfm25: nil }
|
2500
|
-
hpxml_hvac.distribution_system.duct_leakage_measurements.each do |m|
|
2501
|
-
next unless m.duct_leakage_total_or_to_outside == 'to outside'
|
2303
|
+
end
|
2502
2304
|
|
2503
|
-
|
2504
|
-
|
2505
|
-
elsif m.duct_leakage_units == HPXML::UnitsCFM25 && m.duct_type == HPXML::DuctTypeSupply
|
2506
|
-
lto[:supply_cfm25] = m.duct_leakage_value
|
2507
|
-
elsif m.duct_leakage_units == HPXML::UnitsCFM50 && m.duct_type == HPXML::DuctTypeSupply
|
2508
|
-
lto[:supply_cfm50] = m.duct_leakage_value
|
2509
|
-
elsif m.duct_leakage_units == HPXML::UnitsPercent && m.duct_type == HPXML::DuctTypeReturn
|
2510
|
-
lto[:return_percent] = m.duct_leakage_value
|
2511
|
-
elsif m.duct_leakage_units == HPXML::UnitsCFM25 && m.duct_type == HPXML::DuctTypeReturn
|
2512
|
-
lto[:return_cfm25] = m.duct_leakage_value
|
2513
|
-
elsif m.duct_leakage_units == HPXML::UnitsCFM50 && m.duct_type == HPXML::DuctTypeReturn
|
2514
|
-
lto[:return_cfm50] = m.duct_leakage_value
|
2515
|
-
end
|
2516
|
-
end
|
2517
|
-
total_uncond_supply_area = hpxml_hvac.distribution_system.total_unconditioned_duct_areas[HPXML::DuctTypeSupply]
|
2518
|
-
total_uncond_return_area = hpxml_hvac.distribution_system.total_unconditioned_duct_areas[HPXML::DuctTypeReturn]
|
2519
|
-
hpxml_hvac.distribution_system.ducts.each do |duct|
|
2520
|
-
next if HPXML::conditioned_locations_this_unit.include? duct.duct_location
|
2305
|
+
return cfms[HPXML::DuctTypeSupply], cfms[HPXML::DuctTypeReturn]
|
2306
|
+
end
|
2521
2307
|
|
2522
|
-
|
2523
|
-
d.Side = duct.duct_type
|
2524
|
-
d.Location = duct.duct_location
|
2525
|
-
d.Area = duct.duct_surface_area * duct.duct_surface_area_multiplier
|
2526
|
-
|
2527
|
-
# Calculate R-value w/ air film
|
2528
|
-
d.Rvalue = Airflow.get_duct_insulation_rvalue(duct.duct_insulation_r_value, d.Side)
|
2529
|
-
|
2530
|
-
# Leakage to Outside apportioned to this duct
|
2531
|
-
if d.Side == HPXML::DuctTypeSupply
|
2532
|
-
d.LeakageFrac = lto[:supply_percent].to_f * d.Area / total_uncond_supply_area
|
2533
|
-
d.LeakageCFM25 = lto[:supply_cfm25].to_f * d.Area / total_uncond_supply_area
|
2534
|
-
d.LeakageCFM50 = lto[:supply_cfm50].to_f * d.Area / total_uncond_supply_area
|
2535
|
-
elsif d.Side == HPXML::DuctTypeReturn
|
2536
|
-
d.LeakageFrac = lto[:return_percent].to_f * d.Area / total_uncond_return_area
|
2537
|
-
d.LeakageCFM25 = lto[:return_cfm25].to_f * d.Area / total_uncond_return_area
|
2538
|
-
d.LeakageCFM50 = lto[:return_cfm50].to_f * d.Area / total_uncond_return_area
|
2539
|
-
end
|
2540
|
-
hvac.Ducts << d
|
2541
|
-
end
|
2542
|
-
# If all ducts are in conditioned space, treat leakage as going to outside
|
2543
|
-
if (lto[:supply_percent].to_f + lto[:supply_cfm25].to_f + lto[:supply_cfm50].to_f) > 0 && total_uncond_supply_area == 0
|
2544
|
-
d = DuctInfo.new
|
2545
|
-
d.Side = HPXML::DuctTypeSupply
|
2546
|
-
d.Location = HPXML::LocationOutside
|
2547
|
-
d.Area = 0.0
|
2548
|
-
d.Rvalue = Airflow.get_duct_insulation_rvalue(0.0, d.Side)
|
2549
|
-
d.LeakageFrac = lto[:supply_percent]
|
2550
|
-
d.LeakageCFM25 = lto[:supply_cfm25]
|
2551
|
-
d.LeakageCFM50 = lto[:supply_cfm50]
|
2552
|
-
hvac.Ducts << d
|
2553
|
-
end
|
2554
|
-
next unless (lto[:return_percent].to_f + lto[:return_cfm25].to_f + lto[:return_cfm50].to_f) > 0 && total_uncond_return_area == 0
|
2555
|
-
|
2556
|
-
d = DuctInfo.new
|
2557
|
-
d.Side = HPXML::DuctTypeReturn
|
2558
|
-
d.Location = HPXML::LocationOutside
|
2559
|
-
d.Area = 0.0
|
2560
|
-
d.Rvalue = Airflow.get_duct_insulation_rvalue(0.0, d.Side)
|
2561
|
-
d.LeakageFrac = lto[:return_percent]
|
2562
|
-
d.LeakageCFM25 = lto[:return_cfm25]
|
2563
|
-
d.LeakageCFM50 = lto[:return_cfm50]
|
2564
|
-
hvac.Ducts << d
|
2565
|
-
end
|
2566
|
-
|
2567
|
-
return hvac
|
2568
|
-
end
|
2569
|
-
|
2570
|
-
def self.process_curve_fit(airFlowRate, capacity, temp)
|
2308
|
+
def self.process_curve_fit(airflow_rate, capacity, temp)
|
2571
2309
|
# TODO: Get rid of this curve by using ADP/BF calculations
|
2572
2310
|
return 0 if capacity == 0
|
2573
2311
|
|
2574
2312
|
capacity_tons = UnitConversions.convert(capacity, 'Btu/hr', 'ton')
|
2575
|
-
return MathTools.biquadratic(
|
2313
|
+
return MathTools.biquadratic(airflow_rate / capacity_tons, temp, get_shr_biquadratic)
|
2576
2314
|
end
|
2577
2315
|
|
2578
2316
|
def self.get_shr_biquadratic
|
@@ -2582,19 +2320,19 @@ class HVACSizing
|
|
2582
2320
|
return [1.08464364, 0.002096954, 0, -0.005766327, 0, -0.000011147]
|
2583
2321
|
end
|
2584
2322
|
|
2585
|
-
def self.get_sizing_speed(
|
2586
|
-
if
|
2587
|
-
|
2588
|
-
|
2589
|
-
for speed in 0..(
|
2323
|
+
def self.get_sizing_speed(hvac_cooling_ap)
|
2324
|
+
if hvac_cooling_ap.respond_to?(:cool_capacity_ratios) && (hvac_cooling_ap.cool_capacity_ratios.size > 1)
|
2325
|
+
sizing_speed = hvac_cooling_ap.cool_capacity_ratios.size # Default
|
2326
|
+
sizing_speed_delta = 10 # Initialize
|
2327
|
+
for speed in 0..(hvac_cooling_ap.cool_capacity_ratios.size - 1)
|
2590
2328
|
# Select curves for sizing using the speed with the capacity ratio closest to 1
|
2591
|
-
|
2592
|
-
if
|
2593
|
-
|
2594
|
-
|
2329
|
+
delta = (hvac_cooling_ap.cool_capacity_ratios[speed] - 1).abs
|
2330
|
+
if delta <= sizing_speed_delta
|
2331
|
+
sizing_speed = speed
|
2332
|
+
sizing_speed_delta = delta
|
2595
2333
|
end
|
2596
2334
|
end
|
2597
|
-
return
|
2335
|
+
return sizing_speed
|
2598
2336
|
end
|
2599
2337
|
return 0
|
2600
2338
|
end
|
@@ -2638,10 +2376,10 @@ class HVACSizing
|
|
2638
2376
|
if [HPXML::LocationCrawlspaceVented, HPXML::LocationAtticVented].include? location
|
2639
2377
|
# Vented space
|
2640
2378
|
if location == HPXML::LocationCrawlspaceVented
|
2641
|
-
vented_crawl = @hpxml.foundations.
|
2379
|
+
vented_crawl = @hpxml.foundations.find { |f| f.foundation_type == HPXML::FoundationTypeCrawlspaceVented }
|
2642
2380
|
sla = vented_crawl.vented_crawlspace_sla
|
2643
2381
|
else
|
2644
|
-
vented_attic = @hpxml.attics.
|
2382
|
+
vented_attic = @hpxml.attics.find { |f| f.attic_type == HPXML::AtticTypeVented }
|
2645
2383
|
if not vented_attic.vented_attic_sla.nil?
|
2646
2384
|
sla = vented_attic.vented_attic_sla
|
2647
2385
|
else
|
@@ -2915,32 +2653,32 @@ class HVACSizing
|
|
2915
2653
|
return [1.21005458, -0.00664200, 0.00000000, 0.00348246, 0.00000000, 0.00000000]
|
2916
2654
|
end
|
2917
2655
|
|
2918
|
-
def self.gshp_hx_pipe_rvalue(
|
2656
|
+
def self.gshp_hx_pipe_rvalue(hvac_cooling_ap)
|
2919
2657
|
# Thermal Resistance of Pipe
|
2920
|
-
return Math.log(
|
2658
|
+
return Math.log(hvac_cooling_ap.pipe_od / hvac_cooling_ap.pipe_id) / 2.0 / Math::PI / hvac_cooling_ap.pipe_cond
|
2921
2659
|
end
|
2922
2660
|
|
2923
|
-
def self.gshp_hxbore_ft_per_ton(weather,
|
2924
|
-
if
|
2661
|
+
def self.gshp_hxbore_ft_per_ton(weather, hvac_cooling_ap, bore_spacing, pipe_r_value)
|
2662
|
+
if hvac_cooling_ap.u_tube_spacing_type == 'b'
|
2925
2663
|
beta_0 = 17.4427
|
2926
2664
|
beta_1 = -0.6052
|
2927
|
-
elsif
|
2665
|
+
elsif hvac_cooling_ap.u_tube_spacing_type == 'c'
|
2928
2666
|
beta_0 = 21.9059
|
2929
2667
|
beta_1 = -0.3796
|
2930
|
-
elsif
|
2668
|
+
elsif hvac_cooling_ap.u_tube_spacing_type == 'as'
|
2931
2669
|
beta_0 = 20.1004
|
2932
2670
|
beta_1 = -0.94467
|
2933
2671
|
end
|
2934
2672
|
|
2935
|
-
r_value_ground = Math.log(bore_spacing /
|
2936
|
-
r_value_grout = 1.0 /
|
2673
|
+
r_value_ground = Math.log(bore_spacing / hvac_cooling_ap.bore_diameter * 12.0) / 2.0 / Math::PI / @hpxml.site.ground_conductivity
|
2674
|
+
r_value_grout = 1.0 / hvac_cooling_ap.grout_conductivity / beta_0 / ((hvac_cooling_ap.bore_diameter / hvac_cooling_ap.pipe_od)**beta_1)
|
2937
2675
|
r_value_bore = r_value_grout + pipe_r_value / 2.0 # Note: Convection resistance is negligible when calculated against Glhepro (Jeffrey D. Spitler, 2000)
|
2938
2676
|
|
2939
2677
|
rtf_DesignMon_Heat = [0.25, (71.0 - weather.data.MonthlyAvgDrybulbs[0]) / @htd].max
|
2940
2678
|
rtf_DesignMon_Cool = [0.25, (weather.data.MonthlyAvgDrybulbs[6] - 76.0) / @ctd].max
|
2941
2679
|
|
2942
|
-
nom_length_heat = (1.0 -
|
2943
|
-
nom_length_cool = (1.0 +
|
2680
|
+
nom_length_heat = (1.0 - hvac_cooling_ap.heat_rated_eirs[0]) * (r_value_bore + r_value_ground * rtf_DesignMon_Heat) / (weather.data.AnnualAvgDrybulb - (2.0 * hvac_cooling_ap.design_hw - hvac_cooling_ap.design_delta_t) / 2.0) * UnitConversions.convert(1.0, 'ton', 'Btu/hr')
|
2681
|
+
nom_length_cool = (1.0 + hvac_cooling_ap.cool_rated_eirs[0]) * (r_value_bore + r_value_ground * rtf_DesignMon_Cool) / ((2.0 * hvac_cooling_ap.design_chw + hvac_cooling_ap.design_delta_t) / 2.0 - weather.data.AnnualAvgDrybulb) * UnitConversions.convert(1.0, 'ton', 'Btu/hr')
|
2944
2682
|
|
2945
2683
|
return nom_length_heat, nom_length_cool
|
2946
2684
|
end
|
@@ -3388,6 +3126,42 @@ class HVACSizing
|
|
3388
3126
|
|
3389
3127
|
return f_values.sum() / f_values.size
|
3390
3128
|
end
|
3129
|
+
|
3130
|
+
def self.set_hvac_types(hvac_heating, hvac_cooling)
|
3131
|
+
if hvac_heating.nil?
|
3132
|
+
@heating_type = nil
|
3133
|
+
elsif hvac_heating.is_a? HPXML::HeatingSystem
|
3134
|
+
@heating_type = hvac_heating.heating_system_type
|
3135
|
+
else
|
3136
|
+
@heating_type = hvac_heating.heat_pump_type
|
3137
|
+
end
|
3138
|
+
if hvac_cooling.nil?
|
3139
|
+
@cooling_type = nil
|
3140
|
+
elsif hvac_cooling.is_a? HPXML::CoolingSystem
|
3141
|
+
@cooling_type = hvac_cooling.cooling_system_type
|
3142
|
+
else
|
3143
|
+
@cooling_type = hvac_cooling.heat_pump_type
|
3144
|
+
end
|
3145
|
+
end
|
3146
|
+
|
3147
|
+
def self.set_fractions_load_served(hvac_heating, hvac_cooling)
|
3148
|
+
if hvac_cooling.is_a?(HPXML::CoolingSystem) && hvac_cooling.has_integrated_heating
|
3149
|
+
@fraction_heat_load_served = hvac_cooling.integrated_heating_system_fraction_heat_load_served
|
3150
|
+
elsif hvac_heating.nil?
|
3151
|
+
@fraction_heat_load_served = 0
|
3152
|
+
elsif hvac_heating.is_a?(HPXML::HeatingSystem) && hvac_heating.is_heat_pump_backup_system
|
3153
|
+
# Use the same load fractions as the heat pump
|
3154
|
+
heat_pump = @hpxml.heat_pumps.find { |hp| hp.backup_system_idref == hvac_heating.id }
|
3155
|
+
@fraction_heat_load_served = heat_pump.fraction_heat_load_served
|
3156
|
+
else
|
3157
|
+
@fraction_heat_load_served = hvac_heating.fraction_heat_load_served
|
3158
|
+
end
|
3159
|
+
if hvac_cooling.nil?
|
3160
|
+
@fraction_cool_load_served = 0
|
3161
|
+
else
|
3162
|
+
@fraction_cool_load_served = hvac_cooling.fraction_cool_load_served
|
3163
|
+
end
|
3164
|
+
end
|
3391
3165
|
end
|
3392
3166
|
|
3393
3167
|
class DesignLoads
|
@@ -3395,7 +3169,7 @@ class DesignLoads
|
|
3395
3169
|
end
|
3396
3170
|
attr_accessor(:Cool_Sens, :Cool_Lat, :Cool_Tot, :Heat_Tot, :Heat_Ducts, :Cool_Ducts_Sens, :Cool_Ducts_Lat,
|
3397
3171
|
:Cool_Windows, :Cool_Skylights, :Cool_Doors, :Cool_Walls, :Cool_Roofs, :Cool_Floors,
|
3398
|
-
:Cool_Ceilings, :
|
3172
|
+
:Cool_Ceilings, :Cool_InfilVent_Sens, :Cool_InfilVent_Lat, :Cool_IntGains_Sens, :Cool_IntGains_Lat,
|
3399
3173
|
:Heat_Windows, :Heat_Skylights, :Heat_Doors, :Heat_Walls, :Heat_Roofs, :Heat_Floors,
|
3400
3174
|
:Heat_Slabs, :Heat_Ceilings, :Heat_InfilVent)
|
3401
3175
|
end
|
@@ -3410,46 +3184,6 @@ class HVACSizingValues
|
|
3410
3184
|
:GSHP_Loop_flow, :GSHP_Bore_Holes, :GSHP_Bore_Depth, :GSHP_G_Functions)
|
3411
3185
|
end
|
3412
3186
|
|
3413
|
-
class HVACInfo
|
3414
|
-
# Model info for HVAC
|
3415
|
-
def initialize
|
3416
|
-
self.NumSpeedsCooling = 0
|
3417
|
-
self.NumSpeedsHeating = 0
|
3418
|
-
self.HeatingLoadFraction = 0.0
|
3419
|
-
self.CoolingLoadFraction = 0.0
|
3420
|
-
self.CapacityRatioCooling = [1.0]
|
3421
|
-
self.CapacityRatioHeating = [1.0]
|
3422
|
-
self.OverSizeLimit = 1.15
|
3423
|
-
self.OverSizeDelta = 15000.0
|
3424
|
-
self.Ducts = []
|
3425
|
-
self.AirflowDefectRatioCooling = 0.0
|
3426
|
-
self.AirflowDefectRatioHeating = 0.0
|
3427
|
-
end
|
3428
|
-
|
3429
|
-
attr_accessor(:HeatType, :CoolType, :Ducts, :NumSpeedsCooling, :NumSpeedsHeating,
|
3430
|
-
:FixedCoolingCapacity, :FixedHeatingCapacity, :FixedSuppHeatingCapacity,
|
3431
|
-
:AirflowDefectRatioCooling, :AirflowDefectRatioHeating,
|
3432
|
-
:RatedCFMperTonCooling, :RatedCFMperTonHeating, :ChargeDefectRatio,
|
3433
|
-
:COOL_CAP_FT_SPEC, :HEAT_CAP_FT_SPEC, :COOL_SH_FT_SPEC,
|
3434
|
-
:COOL_CAP_FFLOW_SPEC, :HEAT_CAP_FFLOW_SPEC,
|
3435
|
-
:COOL_CAP_CURVE_SPEC, :COOL_SH_CURVE_SPEC, :HEAT_CAP_CURVE_SPEC,
|
3436
|
-
:SHRRated, :CapacityRatioCooling, :CapacityRatioHeating,
|
3437
|
-
:OverSizeLimit, :OverSizeDelta, :hvac_system,
|
3438
|
-
:HeatingEIR, :CoolingEIR, :SizingSpeed, :HeatingCOP,
|
3439
|
-
:GSHP_SpacingType, :EvapCoolerEffectiveness, :SwitchoverTemperature, :LeavingAirTemp,
|
3440
|
-
:HeatingLoadFraction, :CoolingLoadFraction, :SupplyAirTemp, :BackupSupplyAirTemp,
|
3441
|
-
:GSHP_design_chw, :GSHP_design_delta_t, :GSHP_design_hw, :GSHP_bore_d,
|
3442
|
-
:GSHP_pipe_od, :GSHP_pipe_id, :GSHP_pipe_cond, :GSHP_grout_k, :HasIntegratedHeating)
|
3443
|
-
end
|
3444
|
-
|
3445
|
-
class DuctInfo
|
3446
|
-
# Model info for a duct
|
3447
|
-
# FUTURE: Remove class; use either airflow.rb Duct class or HPXML Ducts class directly
|
3448
|
-
def initial
|
3449
|
-
end
|
3450
|
-
attr_accessor(:LeakageFrac, :LeakageCFM25, :LeakageCFM50, :Area, :Rvalue, :Location, :Side)
|
3451
|
-
end
|
3452
|
-
|
3453
3187
|
class Numeric
|
3454
3188
|
def deg2rad
|
3455
3189
|
self * Math::PI / 180
|