urbanopt-cli 0.9.2 → 0.10.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (641) hide show
  1. checksums.yaml +4 -4
  2. data/.github/workflows/{nightly_build.yml → nightly_ci_build.yml} +6 -5
  3. data/CHANGELOG.md +16 -2
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +8 -7
  6. data/LICENSE.md +18 -15
  7. data/README.md +2 -1
  8. data/Rakefile +2 -37
  9. data/example_files/Gemfile +10 -8
  10. data/example_files/mappers/Baseline.rb +170 -191
  11. data/example_files/mappers/ChilledWaterStorage.rb +8 -30
  12. data/example_files/mappers/ClassProject.rb +2 -27
  13. data/example_files/mappers/CreateBar.rb +2 -28
  14. data/example_files/mappers/EvCharging.rb +2 -27
  15. data/example_files/mappers/FlexibleHotWater.rb +2 -27
  16. data/example_files/mappers/Floorspace.rb +2 -27
  17. data/example_files/mappers/HighEfficiency.rb +2 -27
  18. data/example_files/mappers/HighEfficiencyCreateBar.rb +2 -27
  19. data/example_files/mappers/HighEfficiencyFloorspace.rb +2 -27
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +4 -27
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +4 -27
  22. data/example_files/mappers/ThermalStorage.rb +2 -28
  23. data/example_files/measures/BuildResidentialModel/measure.rb +30 -60
  24. data/example_files/measures/BuildResidentialModel/measure.xml +253 -84
  25. data/example_files/measures/BuildResidentialModel/resources/util.rb +45 -45
  26. data/example_files/python_deps/dependencies.json +3 -3
  27. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +1 -1
  28. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +28 -19
  29. data/example_files/resources/hpxml-measures/.gitignore +0 -997
  30. data/example_files/resources/hpxml-measures/.readthedocs.yml +9 -0
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +476 -230
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +244 -75
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +42 -15
  34. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +24 -9
  35. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +11 -33
  36. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +23 -50
  37. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +2 -2
  38. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +119 -0
  39. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +67 -290
  40. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.md +6 -5
  41. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +78 -349
  42. data/example_files/resources/hpxml-measures/Changelog.md +80 -10
  43. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +212 -144
  44. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +164 -170
  45. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +238 -167
  46. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +1 -1
  47. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +12 -4
  48. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +36 -6
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +33 -0
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +9 -7
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +79 -61
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +387 -124
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +427 -196
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +11515 -2
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/README.md +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +224 -85
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +334 -319
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +572 -838
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +162 -68
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +4 -20
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +12 -10
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +34 -37
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +8 -101
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +31 -40
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +1 -1
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +8761 -0
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-10-mins.csv +52561 -52561
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic.csv +8761 -8761
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +384 -155
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +1 -1
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +2 -2
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +68 -90
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +34 -223
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +1 -1
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +16 -4
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +94 -40
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +765 -302
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +119 -69
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +8 -8
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +51 -11
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +196 -9
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +36 -13
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +3 -3
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +2 -2
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +571 -61
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +190 -81
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +11 -11
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +188 -50
  92. data/example_files/resources/hpxml-measures/README.md +3 -3
  93. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +659 -815
  94. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +301 -1112
  95. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +605 -350
  96. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +18 -14
  97. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +15 -15
  98. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +13 -3
  99. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +3 -3
  100. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +894 -596
  101. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +127 -76
  102. data/example_files/resources/hpxml-measures/tasks.rb +185 -2802
  103. data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +3401 -0
  104. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +0 -1
  105. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +0 -1
  106. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +0 -1
  107. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +0 -1
  108. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +0 -1
  109. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +1 -3
  110. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +0 -1
  111. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +1 -3
  112. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +0 -1
  113. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +1 -3
  114. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +0 -1
  115. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +0 -1
  116. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +0 -1
  117. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +0 -1
  118. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +0 -1
  119. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +3 -4
  120. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +17 -4
  121. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +2 -3
  122. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +3 -4
  123. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +3 -4
  124. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +4 -5
  125. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +3 -4
  126. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +3 -4
  127. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +3 -4
  128. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +3 -4
  129. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +1 -1
  130. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +1 -1
  131. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +1 -1
  132. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +1 -1
  133. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +0 -1
  134. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +4 -5
  135. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +3 -3
  136. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +3 -3
  137. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +3 -4
  138. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +3 -3
  139. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +3 -4
  140. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +3 -3
  141. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +3 -4
  142. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +3 -3
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +3 -4
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +0 -1
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +0 -1
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +0 -1
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +0 -1
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +0 -1
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +1 -0
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +1 -0
  151. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +12 -8
  152. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +10 -40
  153. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +10 -40
  154. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +10 -40
  155. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +10 -40
  156. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +10 -40
  157. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +10 -40
  158. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +10 -40
  159. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +10 -40
  160. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +10 -40
  161. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +10 -40
  162. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +10 -40
  163. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +10 -40
  164. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +10 -40
  165. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +10 -40
  166. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +9 -39
  167. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -39
  168. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -40
  169. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +10 -40
  170. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +10 -40
  171. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +10 -40
  172. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +10 -40
  173. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached-2stories.xml → base-bldgtype-attached-2stories.xml} +610 -639
  174. 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
  175. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-attached-infil-compartmentalization-test.xml +611 -0
  176. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-single-family-attached.xml → base-bldgtype-attached.xml} +610 -639
  177. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +10 -39
  178. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +10 -39
  179. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +10 -39
  180. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +10 -39
  181. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +10 -39
  182. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-infil-compartmentalization-test.xml +462 -0
  183. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-calctype-operational.xml → base-bldgtype-multifamily-residents-1.xml} +453 -480
  184. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +10 -39
  185. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +10 -39
  186. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +10 -39
  187. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +10 -39
  188. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +10 -39
  189. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +10 -39
  190. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +10 -39
  191. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +10 -39
  192. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +10 -39
  193. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +10 -39
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +10 -39
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +10 -39
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +10 -39
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +10 -39
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +10 -39
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +11 -40
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +10 -39
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +10 -39
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +10 -39
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +10 -39
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +10 -39
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +10 -39
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +15 -40
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +10 -39
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +10 -39
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +10 -39
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +10 -40
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +10 -40
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +10 -40
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +10 -40
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +10 -40
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +10 -40
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +10 -40
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +10 -40
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +10 -40
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +10 -40
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +10 -40
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +10 -40
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +10 -40
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +10 -40
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +10 -40
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +10 -40
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +10 -40
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +10 -40
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +10 -40
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +10 -40
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +10 -40
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +10 -40
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +10 -40
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +10 -40
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +10 -40
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +10 -40
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +10 -40
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +10 -40
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +10 -40
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +10 -40
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +10 -40
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +10 -40
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +10 -40
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +10 -40
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +10 -40
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +10 -40
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +10 -40
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +10 -40
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +10 -40
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +10 -40
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +10 -40
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +11 -43
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +10 -40
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +10 -40
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +10 -40
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +10 -40
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +10 -40
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +10 -40
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +10 -40
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +10 -40
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +10 -40
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +10 -40
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +10 -40
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +10 -40
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +10 -40
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +10 -40
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +10 -40
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +10 -40
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +10 -40
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +10 -40
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +19 -25
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +10 -40
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +10 -40
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +10 -40
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +10 -40
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +10 -40
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +10 -40
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +10 -40
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +18 -24
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +11 -41
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +11 -41
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +10 -40
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +549 -0
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +13 -43
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +10 -40
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +552 -0
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +10 -40
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +10 -40
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +17 -47
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +10 -40
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +10 -40
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +10 -40
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +10 -40
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -40
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +10 -40
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +10 -40
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +10 -40
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +10 -40
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +10 -40
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +559 -0
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +10 -40
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +10 -40
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -40
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +19 -25
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +10 -40
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +10 -40
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +10 -40
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +10 -40
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +10 -40
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -40
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +10 -40
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +10 -40
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +10 -40
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +10 -40
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +10 -40
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +10 -40
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +10 -40
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml +557 -0
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +16 -41
  319. 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
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +16 -41
  321. 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
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +16 -41
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +16 -41
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +16 -41
  325. 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
  326. 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
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +16 -41
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +16 -41
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +16 -41
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +10 -40
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +10 -40
  332. 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
  333. 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
  334. 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
  335. 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
  336. 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
  337. 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
  338. 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
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +10 -40
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +10 -40
  341. 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
  342. 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
  343. 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
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +10 -40
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +10 -40
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +10 -40
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +10 -40
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +10 -40
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +10 -40
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +10 -40
  351. 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
  352. 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
  353. 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
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml +553 -0
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +11 -41
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +10 -40
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +10 -40
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +10 -40
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +10 -40
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +10 -40
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +10 -40
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +10 -40
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +10 -40
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +10 -40
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +10 -40
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +10 -40
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +10 -40
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +10 -40
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +10 -40
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +10 -40
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +10 -40
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +10 -40
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +10 -40
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +10 -40
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +519 -0
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +10 -40
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +10 -40
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +10 -40
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +16 -40
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +16 -40
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +16 -40
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +10 -40
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +10 -40
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +16 -40
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +16 -40
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +16 -40
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +566 -0
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +10 -40
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +10 -40
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +10 -40
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +10 -40
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +10 -40
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +10 -40
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +513 -0
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +10 -40
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +10 -40
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +10 -40
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +10 -40
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +10 -40
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +10 -40
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +10 -40
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +10 -40
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +16 -41
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-crankcase-heater-40w.xml +556 -0
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +10 -40
  406. 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
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +17 -42
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +17 -42
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +17 -42
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +17 -42
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +10 -40
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +10 -40
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +555 -0
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +553 -0
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +10 -40
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +10 -40
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +10 -40
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +10 -40
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +10 -40
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +10 -40
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +10 -40
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +10 -40
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +506 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +10 -40
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +10 -40
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +10 -40
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +10 -40
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +10 -40
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +10 -40
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +10 -40
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +542 -0
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +10 -40
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +10 -40
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +10 -40
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +10 -40
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +10 -40
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +10 -40
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +10 -40
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +10 -40
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +10 -40
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +14 -41
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +14 -41
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +14 -41
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +10 -40
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +10 -40
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +10 -40
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +10 -40
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +10 -40
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +10 -40
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +14 -41
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +10 -40
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +10 -40
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +16 -41
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +16 -41
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +16 -41
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +525 -0
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +564 -0
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +16 -41
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +506 -0
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -41
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +10 -40
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -40
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +10 -40
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +10 -40
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +10 -40
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +10 -40
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +513 -0
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +16 -40
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +10 -40
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +10 -40
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +10 -40
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +10 -40
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +10 -40
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +16 -40
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +10 -40
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +10 -40
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +10 -40
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +10 -40
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +10 -40
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +10 -40
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +10 -40
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +10 -40
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +10 -40
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +11 -41
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +10 -40
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +529 -0
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +537 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +516 -0
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +1 -7
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +10 -40
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +10 -40
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +10 -40
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -40
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +10 -40
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +10 -40
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -40
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -40
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -40
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +10 -40
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +10 -40
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +12 -42
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +10 -40
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +10 -40
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +10 -40
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +10 -40
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +10 -40
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +10 -40
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +10 -40
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +10 -40
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +10 -40
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +10 -40
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +10 -40
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +10 -40
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +14 -44
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +10 -40
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +10 -40
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +10 -38
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +10 -40
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +16 -42
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +16 -42
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +16 -42
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +10 -40
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +14 -37
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +16 -42
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +12 -42
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +12 -42
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +12 -42
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +10 -40
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +10 -38
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +10 -38
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +10 -40
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +509 -0
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +10 -40
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +10 -40
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +10 -41
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +30 -138
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +16 -42
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +24 -26
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +16 -42
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +16 -42
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +16 -42
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +18 -44
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +18 -44
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +18 -44
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +16 -42
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +560 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +556 -0
  548. 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
  549. 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
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational.xml → base-residents-1.xml} +547 -575
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-calctype-operational-misc-defaults.xml → base-residents-5.xml} +515 -539
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +10 -40
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +10 -40
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +565 -0
  555. 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
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +21 -41
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +10 -40
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +10 -40
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +10 -40
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +10 -40
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-available.xml +565 -0
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage-natvent-unavailable.xml +565 -0
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +620 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +619 -0
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +619 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +10 -38
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +10 -40
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +10 -40
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +10 -40
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +10 -40
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +10 -40
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +10 -40
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +10 -40
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +10 -40
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +10 -40
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +10 -37
  577. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +16 -4
  578. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +16 -3
  579. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +16 -3
  580. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +16 -2
  581. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +386 -0
  582. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +381 -0
  583. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +370 -0
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +2 -2
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +2 -5
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +2 -5
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +2 -5
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +2 -5
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +2 -5
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +2 -5
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +2 -5
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +2 -5
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +2 -5
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +2 -5
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +2 -5
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +2 -5
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +2 -5
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +2 -5
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +2 -5
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +2 -12
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +2 -12
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +2 -5
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +2 -5
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +2 -5
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +2 -5
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +2 -5
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +2 -5
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -9
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -9
  610. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +475 -444
  611. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +475 -444
  612. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +177 -112
  613. data/example_files/resources/meta_measure.rb +2 -27
  614. data/example_files/xml_building/17/README.md +3 -3
  615. data/lib/uo_cli/version.rb +3 -38
  616. data/lib/uo_cli.rb +3 -38
  617. data/uo_cli.gemspec +6 -7
  618. metadata +70 -51
  619. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules_config.json +0 -388
  620. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +0 -6136
  621. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +0 -4846
  622. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-smooth.csv +0 -8761
  623. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-vacancy.csv +0 -8761
  624. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +0 -35
  625. data/example_files/resources/hpxml-measures/weather/USA_CO_Colorado.Springs-Peterson.Field.724660_TMY3-cache.csv +0 -35
  626. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +0 -35
  627. data/example_files/resources/hpxml-measures/weather/USA_DE_Wilmington-New.Castle.County.AP.724089_TMY3-cache.csv +0 -35
  628. data/example_files/resources/hpxml-measures/weather/USA_FL_Miami.Intl.AP.722020_TMY3-cache.csv +0 -35
  629. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +0 -35
  630. data/example_files/resources/hpxml-measures/weather/USA_MD_Baltimore-Washington.Intl.AP.724060_TMY3-cache.csv +0 -35
  631. data/example_files/resources/hpxml-measures/weather/USA_MN_Duluth.Intl.AP.727450_TMY3-cache.csv +0 -35
  632. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +0 -35
  633. data/example_files/resources/hpxml-measures/weather/USA_NC_Charlotte-Douglas.Intl.AP.723140_TMY3-cache.csv +0 -35
  634. data/example_files/resources/hpxml-measures/weather/USA_NJ_Cape.May.County.AP.745966_TMY3-cache.csv +0 -35
  635. data/example_files/resources/hpxml-measures/weather/USA_NV_Las.Vegas-McCarran.Intl.AP.723860_TMY3-cache.csv +0 -35
  636. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +0 -35
  637. data/example_files/resources/hpxml-measures/weather/USA_TX_Dallas-Fort.Worth.Intl.AP.722590_TMY3-cache.csv +0 -35
  638. data/example_files/resources/hpxml-measures/weather/US_CO_Boulder_AMY_2012-cache.csv +0 -35
  639. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +0 -35
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +0 -2508
  641. 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, nbeds, hvac_systems)
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, weather)
35
- process_load_roofs(bldg_design_loads, weather)
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
- hvac = get_hvac_information(hvac_system)
50
- next if is_system_to_skip(hvac)
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
- apply_hvac_temperatures(hvac, system_design_loads)
54
- ducts_heat_load = calculate_load_ducts_heating(system_design_loads, hvac)
55
- ducts_cool_load_sens, ducts_cool_load_lat = calculate_load_ducts_cooling(system_design_loads, weather, hvac)
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(hvac, hvac_sizing_values, system_design_loads, ducts_heat_load, ducts_cool_load_sens, ducts_cool_load_lat)
60
- apply_hvac_heat_pump_logic(hvac_sizing_values, hvac)
61
- apply_hvac_equipment_adjustments(hvac_sizing_values, weather, hvac)
62
- apply_hvac_installation_quality(hvac_sizing_values, weather, hvac)
63
- apply_hvac_fixed_capacities(hvac_sizing_values, hvac)
64
- apply_hvac_ground_loop(hvac_sizing_values, weather, hvac)
65
- apply_hvac_finalize_airflows(hvac_sizing_values, hvac)
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 = 75.0
85
- @heat_setpoint = 70.0
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 = [weather.design.CoolingDrybulb - @cool_setpoint, 0.0].max
91
- @htd = [@heat_setpoint - weather.design.HeatingDrybulb, 0.0].max
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
- pwsat = UnitConversions.convert(0.430075, 'psi', 'kPa') # Calculated for 75degF indoor temperature
113
- rh_indoor_cooling = 0.55 # Manual J is vague on the indoor RH. 55% corresponds to BA goals
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, weather.design.CoolingDrybulb, weather.data.GroundMonthlyTemps.max)
148
- @heat_design_temps[location] = calculate_scheduled_space_design_temps(location, @heat_setpoint, weather.design.HeatingDrybulb, weather.data.GroundMonthlyTemps.min)
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] = weather.design.CoolingDrybulb
151
- @heat_design_temps[location] = weather.design.HeatingDrybulb
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 = weather.design.HeatingDrybulb + 13.0
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 = weather.design.HeatingDrybulb
184
+ heat_temp = @hpxml.header.manualj_heating_design_temp
182
185
  else
183
- heat_temp = calculate_space_design_temps(location, weather, @heat_setpoint, weather.design.HeatingDrybulb, weather.data.GroundMonthlyTemps.min)
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 = weather.design.HeatingDrybulb
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, weather.design.HeatingDrybulb, weather.data.GroundMonthlyTemps.min)
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 = (weather.design.CoolingDrybulb +
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 = (weather.design.CoolingDrybulb +
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 = (weather.design.CoolingDrybulb +
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 = weather.design.CoolingDrybulb + 40.0 # This is the number from a California study with dark shingle roof and similar ventilation.
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, weather.design.CoolingDrybulb, weather.data.GroundMonthlyTemps.max, true)
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 + (weather.design.CoolingDrybulb - 95.0) + @daily_range_temp_adjust[@daily_range_num]) * roof.net_area
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 + (weather.design.CoolingDrybulb - 95.0) + @daily_range_temp_adjust[@daily_range_num]) * roof.net_area
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 += (weather.design.CoolingDrybulb - 95.0) + @daily_range_temp_adjust[@daily_range_num]
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, weather.design.CoolingDrybulb, weather.data.GroundMonthlyTemps.max)
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, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # Initialize Hourly Aggregate Fenestration Load (AFL)
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..12
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, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] # Initialize Hourly Aggregate Fenestration Load (AFL)
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..12
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, weather)
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 += (weather.design.CoolingDrybulb - 95.0)
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, weather)
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 += (weather.design.CoolingDrybulb - 95.0) + @daily_range_temp_adjust[@daily_range_num]
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
- # FIXME: Assumes slab is uninsulated?
957
- k_soil = @hpxml.site.ground_conductivity
958
- r_other = Material.Concrete(4.0).rvalue + Material.AirFilmFloorAverage.rvalue
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
- u_value_mj8 = 0.85 * u_avg_bf
968
- bldg_design_loads.Heat_Slabs += u_value_mj8 * slab.area * @htd
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
- # FUTURE: Consolidate code w/ airflow.rb
979
- infil_volume = @hpxml.air_infiltration_measurements.select { |i| !i.infiltration_volume.nil? }[0].infiltration_volume
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
- cfm_Cool_Load_Sens = q_bal_Sens + (icfm_Cooling**2.0 + q_unb_cfm**2.0)**0.5 - q_precool - q_recirc
1016
- cfm_Cool_Load_Lat = q_bal_Lat + (icfm_Cooling**2.0 + q_unb_cfm**2.0)**0.5 - q_recirc
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.Cool_Infil_Sens = 1.1 * @acf * cfm_Cool_Load_Sens * @ctd
1021
- bldg_design_loads.Cool_Infil_Lat = 0.68 * @acf * cfm_Cool_Load_Lat * (@cool_design_grains - @cool_indoor_grains)
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
- # Per ANSI/RESNET/ICC 301
1030
- n_occupants = @nbeds + 1
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.Cool_Infil_Sens +
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.Cool_Infil_Lat + bldg_design_loads.Cool_IntGains_Lat
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.Cool_Infil_Lat = 0.0
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(hvac, system_design_loads)
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 hvac.CoolType == HPXML::HVACTypeEvaporativeCooler
1068
+ if @cooling_type == HPXML::HVACTypeEvaporativeCooler
1073
1069
  td_potential = @cool_design_temps[HPXML::LocationOutside] - @wetbulb_outdoor_cooling
1074
- td = td_potential * hvac.EvapCoolerEffectiveness
1075
- hvac.LeavingAirTemp = @cool_design_temps[HPXML::LocationOutside] - td
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
- hvac.LeavingAirTemp = 54.0 # F
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
- hvac.LeavingAirTemp = ((58.0 - 54.0) / (0.85 - 0.80)) * (shr - 0.8) + 54.0 # F
1081
+ @leaving_air_temp = ((58.0 - 54.0) / (0.85 - 0.80)) * (shr - 0.8) + 54.0 # F
1086
1082
  else
1087
- hvac.LeavingAirTemp = 58.0 # F
1083
+ @leaving_air_temp = 58.0 # F
1088
1084
  end
1089
1085
  end
1090
1086
 
1091
1087
  # Calculate Supply Air Temperature
1092
- if [HPXML::HVACTypeHeatPumpAirToAir,
1093
- HPXML::HVACTypeHeatPumpMiniSplit,
1094
- HPXML::HVACTypeHeatPumpGroundToAir,
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
- hvac.SupplyAirTemp = 120.0 # F
1092
+ @supply_air_temp = 120.0 # F
1102
1093
  end
1103
1094
  end
1104
1095
 
1105
- def self.apply_hvac_loads(hvac, system_design_loads, bldg_design_loads, ducts_heat_load, ducts_cool_load_sens, ducts_cool_load_lat)
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 * hvac.HeatingLoadFraction
1110
- if hvac.HeatType == HPXML::HVACTypeHeatPumpWaterLoopToAir
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 / hvac.HeatingCOP)
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 * hvac.CoolingLoadFraction
1119
- system_design_loads.Cool_Load_Sens = bldg_design_loads.Cool_Sens * hvac.CoolingLoadFraction
1120
- system_design_loads.Cool_Load_Lat = bldg_design_loads.Cool_Lat * hvac.CoolingLoadFraction
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.apply_hvac_heat_pump_logic(hvac_sizing_values, hvac)
1131
- # If HERS/MaxLoad methodology, uses at least the larger of heating and cooling loads for heat pump sizing (required for ERI).
1132
- if [HPXML::HVACTypeHeatPumpAirToAir,
1133
- HPXML::HVACTypeHeatPumpMiniSplit,
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
- # Override Manual S oversize allowances:
1147
- hvac.OverSizeLimit = 1.0
1148
- hvac.OverSizeDelta = 0.0
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.Location
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.Location
1164
- space_values = Geometry.get_temperature_scheduled_space_values(duct.Location)
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.Location
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.Location) }
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.Location }
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.Location == HPXML::LocationBasementUnconditioned
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.Location == HPXML::LocationCrawlspaceVented
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.Location == HPXML::LocationCrawlspaceUnvented
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.Location
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.Location
1214
+ elsif [HPXML::LocationGarage].include? duct.duct_location
1213
1215
  dse_Fregain = 0.05
1214
1216
 
1215
- elsif HPXML::conditioned_locations.include? duct.Location
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, hvac)
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) || (hvac.HeatingLoadFraction == 0) || hvac.Ducts.empty?
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 * hvac.HeatingLoadFraction
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
- # ASHRAE 152 6.5.2
1240
- # For systems with ducts in several locations, F_regain shall be weighted by the fraction of exposed duct area
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, (hvac.SupplyAirTemp - @heat_setpoint))
1250
+ heat_cfm = calc_airflow_rate_manual_s(heat_load_next, (@supply_air_temp - @heat_setpoint))
1260
1251
 
1261
- dse_Qs, dse_Qr = calc_ducts_leakages(hvac.Ducts, heat_cfm)
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, dse_Tamb_heating_s, dse_Tamb_heating_r, dse_As, dse_Ar, @heat_setpoint, dse_Fregain_s, dse_Fregain_r, supply_r, return_r)
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, hvac)
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
- init_cool_load_sens = system_design_loads.Cool_Sens * hvac.CoolingLoadFraction
1283
- init_cool_load_lat = system_design_loads.Cool_Lat * hvac.CoolingLoadFraction
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
- design_temp_values = { HPXML::DuctTypeSupply => @cool_design_temps, HPXML::DuctTypeReturn => @cool_design_temps }
1290
- dse_Tamb_cooling_s, dse_Tamb_cooling_r = calc_ducts_area_weighted_average(hvac.Ducts, design_temp_values)
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(dse_Tamb_cooling_r, 'F', 'C') + weather.design.CoolingHumidityRatio * (2501.0 + 1.86 * UnitConversions.convert(dse_Tamb_cooling_r, 'F', 'C'))) * UnitConversions.convert(1.0, 'kJ', 'Btu') * UnitConversions.convert(1.0, 'lbm', 'kg')
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 - hvac.LeavingAirTemp))
1310
- _dse_Qs, dse_Qr = calc_ducts_leakages(hvac.Ducts, cool_cfm)
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 - hvac.LeavingAirTemp))
1302
+ cool_cfm = calc_airflow_rate_manual_s(cool_load_sens, (@cool_setpoint - @leaving_air_temp))
1322
1303
 
1323
- dse_Qs, dse_Qr = calc_ducts_leakages(hvac.Ducts, cool_cfm)
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, hvac.LeavingAirTemp, cool_cfm, cool_load_sens, dse_Tamb_cooling_s, dse_Tamb_cooling_r, dse_As, dse_Ar, @cool_setpoint, dse_Fregain_s, dse_Fregain_r, cool_load_tot, dse_h_r, supply_r, return_r)
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, hvac)
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 - hvac.LeavingAirTemp))
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? hvac.CoolType
1350
+ HPXML::HVACTypeHeatPumpAirToAir].include? @cooling_type
1368
1351
 
1369
- enteringTemp = weather.design.CoolingDrybulb
1370
- coefficients = hvac.COOL_CAP_FT_SPEC[hvac.SizingSpeed]
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
- totalCap_CurveValue = MathTools.biquadratic(@wetbulb_indoor_cooling, enteringTemp, coefficients)
1373
- coolCap_Rated = hvac_sizing_values.Cool_Load_Tot / totalCap_CurveValue
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
- sensCap_Rated = coolCap_Rated * hvac.SHRRated[hvac.SizingSpeed]
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
- sensibleCap_CurveValue = process_curve_fit(hvac_sizing_values.Cool_Airflow, hvac_sizing_values.Cool_Load_Tot, enteringTemp)
1378
- sensCap_Design = sensCap_Rated * sensibleCap_CurveValue
1379
- latCap_Design = [hvac_sizing_values.Cool_Load_Tot - sensCap_Design, 1.0].max
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 latCap_Design < hvac_sizing_values.Cool_Load_Lat
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 = cool_Capacity_Design - cool_Load_SensCap_Design
1393
- # solve the following for cool_Capacity_Design: SensCap_Design = SHRRated * cool_Capacity_Design / TotalCap_CurveValue * function(CFM/cool_Capacity_Design, ODB)
1394
- # substituting in CFM = cool_Load_SensCap_Design / (1.1 * ACF * (cool_setpoint - LAT))
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
- cool_Load_SensCap_Design = hvac_sizing_values.Cool_Load_Lat / ((totalCap_CurveValue / hvac.SHRRated[hvac.SizingSpeed] - \
1397
- (UnitConversions.convert(b_sens, 'ton', 'Btu/hr') + UnitConversions.convert(d_sens, 'ton', 'Btu/hr') * enteringTemp) / \
1398
- (1.1 * @acf * (@cool_setpoint - hvac.LeavingAirTemp))) / \
1399
- (a_sens + c_sens * enteringTemp) - 1.0)
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
- cool_Capacity_Design = cool_Load_SensCap_Design + hvac_sizing_values.Cool_Load_Lat
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
- sHR_design = cool_Load_SensCap_Design / cool_Capacity_Design
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 (cool_Capacity_Design < 0) || (cool_Load_SensCap_Design < 0)
1409
- cool_Capacity_Design = hvac.OverSizeLimit * hvac_sizing_values.Cool_Load_Tot
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
- cool_Capacity_Design = [cool_Capacity_Design, hvac.OverSizeLimit * hvac_sizing_values.Cool_Load_Tot].min
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
- cool_Load_SensCap_Design = sHR_design * cool_Capacity_Design
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(cool_Load_SensCap_Design, (@cool_setpoint - hvac.LeavingAirTemp))
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 = cool_Capacity_Design / totalCap_CurveValue
1423
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
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 sensCap_Design < underSizeLimit * hvac_sizing_values.Cool_Load_Sens
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
- sensCap_Design = underSizeLimit * hvac_sizing_values.Cool_Load_Sens
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
- # SensCap_Design = SensCap_Rated * SensibleCap_CurveValue
1433
- # = SHRRated * cool_Capacity_Design / TotalCap_CurveValue * SensibleCap_CurveValue
1434
- # = SHRRated * cool_Capacity_Design / TotalCap_CurveValue * function(CFM/cool_Capacity_Design, ODB)
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
- cool_Capacity_Design = (sensCap_Design / (hvac.SHRRated[hvac.SizingSpeed] / totalCap_CurveValue) - \
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') * enteringTemp)) / \
1439
- (a_sens + c_sens * enteringTemp)
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
- cool_Capacity_Design = [cool_Capacity_Design, hvac.OverSizeLimit * hvac_sizing_values.Cool_Load_Tot].min
1427
+ cool_cap_design = [cool_cap_design, @oversize_limit * hvac_sizing_values.Cool_Load_Tot].min
1443
1428
 
1444
- hvac_sizing_values.Cool_Capacity = cool_Capacity_Design / totalCap_CurveValue
1445
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
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
- cool_Load_SensCap_Design = hvac_sizing_values.Cool_Capacity_Sens * sensibleCap_CurveValue
1449
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_Load_SensCap_Design, (@cool_setpoint - hvac.LeavingAirTemp))
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 / totalCap_CurveValue
1453
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
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
- cool_Load_SensCap_Design = hvac_sizing_values.Cool_Capacity_Sens * sensibleCap_CurveValue
1456
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_Load_SensCap_Design, (@cool_setpoint - hvac.LeavingAirTemp))
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? hvac.CoolType
1453
+ HPXML::HVACTypeMiniSplitAirConditioner].include? @cooling_type
1469
1454
 
1470
- enteringTemp = weather.design.CoolingDrybulb
1471
- coefficients = hvac.COOL_CAP_FT_SPEC[hvac.SizingSpeed]
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
- totalCap_CurveValue = MathTools.biquadratic(@wetbulb_indoor_cooling, enteringTemp, coefficients)
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 / totalCap_CurveValue)
1476
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
1477
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_user(hvac_sizing_values.Cool_Capacity, hvac.RatedCFMperTonCooling[-1], hvac.CapacityRatioCooling[-1])
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? hvac.CoolType
1469
+ HPXML::HVACTypeHeatPumpRoom].include? @cooling_type
1483
1470
 
1484
- enteringTemp = weather.design.CoolingDrybulb
1485
- totalCap_CurveValue = MathTools.biquadratic(@wetbulb_indoor_cooling, enteringTemp, hvac.COOL_CAP_FT_SPEC[hvac.SizingSpeed])
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 / totalCap_CurveValue
1488
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
1489
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_user(hvac_sizing_values.Cool_Capacity, hvac.RatedCFMperTonCooling[hvac.SizingSpeed], 1.0)
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 hvac.CoolType == HPXML::HVACTypeHeatPumpGroundToAir
1480
+ elsif HPXML::HVACTypeHeatPumpGroundToAir == @cooling_type
1492
1481
  coil_bf = gshp_coil_bf
1493
- enteringTemp = hvac.GSHP_design_chw
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(enteringTemp, 'f', 'k')
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
- totalCap_CurveValue, sensibleCap_CurveValue = calc_gshp_clg_curve_value(hvac, design_wb_temp, design_db_temp, design_w_temp, design_vfr_air, nil)
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
- bypassFactor_CurveValue = MathTools.biquadratic(@wetbulb_indoor_cooling, @cool_setpoint, gshp_coil_bf_ft_spec)
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 / totalCap_CurveValue # Note: cool_Capacity_Design = hvac_sizing_values.Cool_Load_Tot
1506
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
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
- cool_Load_SensCap_Design = (hvac_sizing_values.Cool_Capacity_Sens * sensibleCap_CurveValue /
1509
- (1.0 + (1.0 - coil_bf * bypassFactor_CurveValue) *
1510
- (80.0 - @cool_setpoint) / (@cool_setpoint - hvac.LeavingAirTemp)))
1511
- cool_Load_LatCap_Design = hvac_sizing_values.Cool_Load_Tot - cool_Load_SensCap_Design
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 >= CoolingLoad_MJ8_Sens, and coil latent at design >= CoolingLoad_MJ8_Lat, and equipment SHRRated is maintained.
1514
- cool_Load_SensCap_Design = [cool_Load_SensCap_Design, hvac_sizing_values.Cool_Load_Sens].max
1515
- cool_Load_LatCap_Design = [cool_Load_LatCap_Design, hvac_sizing_values.Cool_Load_Lat].max
1516
- cool_Capacity_Design = cool_Load_SensCap_Design + cool_Load_LatCap_Design
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
- cool_Capacity_Design = [cool_Capacity_Design, hvac.OverSizeLimit * hvac_sizing_values.Cool_Load_Tot].min
1520
- hvac_sizing_values.Cool_Capacity = cool_Capacity_Design / totalCap_CurveValue
1521
- hvac_sizing_values.Cool_Capacity_Sens = hvac_sizing_values.Cool_Capacity * hvac.SHRRated[hvac.SizingSpeed]
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
- cool_Load_SensCap_Design = (hvac_sizing_values.Cool_Capacity_Sens * sensibleCap_CurveValue /
1525
- (1.0 + (1.0 - coil_bf * bypassFactor_CurveValue) *
1526
- (80.0 - @cool_setpoint) / (@cool_setpoint - hvac.LeavingAirTemp)))
1527
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_Load_SensCap_Design, (@cool_setpoint - hvac.LeavingAirTemp))
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 hvac.CoolType == HPXML::HVACTypeEvaporativeCooler
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 - hvac.LeavingAirTemp > 0
1534
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Cool_Load_Sens, (@cool_setpoint - hvac.LeavingAirTemp))
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 hvac.CoolType == HPXML::HVACTypeHeatPumpWaterLoopToAir
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 hvac.CoolType.nil?
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: #{hvac.CoolType}."
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? hvac.HeatType
1570
- process_heat_pump_adjustment(hvac_sizing_values, weather, hvac, totalCap_CurveValue)
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 hvac.HeatType == HPXML::HVACTypeHeatPumpAirToAir
1573
- hvac_sizing_values.Heat_Airflow = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity, (hvac.SupplyAirTemp - @heat_setpoint))
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, hvac.RatedCFMperTonHeating[-1], hvac.CapacityRatioHeating[-1])
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, (hvac.BackupSupplyAirTemp - @heat_setpoint))
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? hvac.HeatType
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 * hvac.SHRRated[hvac.SizingSpeed]
1595
- cool_Load_SensCap_Design = (hvac_sizing_values.Cool_Capacity_Sens * sensibleCap_CurveValue /
1596
- (1.0 + (1.0 - gshp_coil_bf * bypassFactor_CurveValue) *
1597
- (80.0 - @cool_setpoint) / (@cool_setpoint - hvac.LeavingAirTemp)))
1598
- hvac_sizing_values.Cool_Airflow = calc_airflow_rate_manual_s(cool_Load_SensCap_Design, (@cool_setpoint - hvac.LeavingAirTemp))
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, (hvac.SupplyAirTemp - @heat_setpoint))
1604
- hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (hvac.BackupSupplyAirTemp - @heat_setpoint))
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? hvac.HeatType
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, (hvac.SupplyAirTemp - @heat_setpoint))
1612
- hvac_sizing_values.Heat_Airflow_Supp = calc_airflow_rate_manual_s(hvac_sizing_values.Heat_Capacity_Supp, (hvac.BackupSupplyAirTemp - @heat_setpoint))
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 (hvac.HeatType == HPXML::HVACTypeFurnace) || hvac.HasIntegratedHeating
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, (hvac.SupplyAirTemp - @heat_setpoint))
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? hvac.HeatType
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 hvac.RatedCFMperTonHeating[0] > 0
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') * hvac.RatedCFMperTonHeating[0]
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, (hvac.SupplyAirTemp - @heat_setpoint))
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? hvac.HeatType
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 hvac.HeatType.nil?
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: #{hvac.HeatType}."
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, weather, hvac)
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
- return unless [HPXML::HVACTypeCentralAirConditioner,
1669
- HPXML::HVACTypeHeatPumpAirToAir,
1670
- HPXML::HVACTypeHeatPumpMiniSplit,
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
- tin_cool = UnitConversions.convert(@cool_setpoint, 'F', 'C')
1676
- tout_cool = UnitConversions.convert(weather.design.CoolingDrybulb, 'F', 'C')
1677
- tout_heat = UnitConversions.convert(weather.design.HeatingDrybulb, 'F', 'C')
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
- f_ch = hvac.ChargeDefectRatio.round(3)
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?(hvac.CoolType) && hvac.CoolingLoadFraction > 0
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
- cool_cfm_m3s = UnitConversions.convert(hvac_sizing_values.Cool_Airflow, 'cfm', 'm^3/s')
1691
- if hvac.CoolType != HPXML::HVACTypeHeatPumpGroundToAir
1692
- for speed in 0..(hvac.NumSpeedsCooling - 1)
1693
- cool_airflow_rated_ratio << cool_cfm_m3s / HVAC.calc_rated_airflow(hvac_sizing_values.Cool_Capacity, hvac.RatedCFMperTonCooling[speed], hvac.CapacityRatioCooling[speed])
1694
- cool_airflow_rated_defect_ratio << cool_cfm_m3s * (1 + hvac.AirflowDefectRatioCooling) / HVAC.calc_rated_airflow(hvac_sizing_values.Cool_Capacity, hvac.RatedCFMperTonCooling[speed], hvac.CapacityRatioCooling[speed])
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 + hvac.AirflowDefectRatioCooling]
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..(hvac.NumSpeedsCooling - 1)
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 * tin_cool
1718
- q2_CH = a3_CH_Qgr_c * tout_cool
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 * hvac.SHRRated[hvac.SizingSpeed]
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?(hvac.HeatType) && hvac.HeatingLoadFraction > 0
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
- heat_cfm_m3s = UnitConversions.convert(hvac_sizing_values.Heat_Airflow, 'cfm', 'm^3/s')
1758
- if hvac.HeatType != HPXML::HVACTypeHeatPumpGroundToAir
1759
- for speed in 0..(hvac.NumSpeedsHeating - 1)
1760
- heat_airflow_rated_ratio << heat_cfm_m3s / HVAC.calc_rated_airflow(hvac_sizing_values.Heat_Capacity, hvac.RatedCFMperTonHeating[speed], hvac.CapacityRatioHeating[speed])
1761
- heat_airflow_rated_defect_ratio << heat_cfm_m3s * (1 + hvac.AirflowDefectRatioHeating) / HVAC.calc_rated_airflow(hvac_sizing_values.Heat_Capacity, hvac.RatedCFMperTonHeating[speed], hvac.CapacityRatioHeating[speed])
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 + hvac.AirflowDefectRatioHeating]
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..(hvac.NumSpeedsHeating - 1)
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 * tout_heat
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, hvac)
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 (not hvac.FixedCoolingCapacity.nil?) && (hvac_sizing_values.Cool_Capacity > 0)
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 = hvac.FixedCoolingCapacity
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 (not hvac.FixedHeatingCapacity.nil?) && (hvac_sizing_values.Heat_Capacity > 0)
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 = hvac.FixedHeatingCapacity
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 (not hvac.FixedSuppHeatingCapacity.nil?) && (hvac_sizing_values.Heat_Capacity_Supp > 0)
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 = hvac.FixedSuppHeatingCapacity
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, hvac)
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 unless hvac.CoolType == HPXML::HVACTypeHeatPumpGroundToAir
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(hvac)
1856
- nom_length_heat, nom_length_cool = gshp_hxbore_ft_per_ton(weather, hvac, bore_spacing, pipe_r_value)
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 valid_field_found
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, hvac)
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 hvac_sizing_values.Heat_Airflow > 0
1945
- hvac_sizing_values.Heat_Airflow *= (1.0 + hvac.AirflowDefectRatioHeating)
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 hvac_sizing_values.Cool_Airflow > 0
1949
- hvac_sizing_values.Cool_Airflow *= (1.0 + hvac.AirflowDefectRatioCooling)
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, hvac, totalCap_CurveValue)
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
- if hvac.NumSpeedsHeating > 1
1958
- coefficients = hvac.HEAT_CAP_FT_SPEC[hvac.NumSpeedsHeating - 1]
1959
- capacity_ratio = hvac.CapacityRatioHeating[hvac.NumSpeedsHeating - 1]
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 = hvac.HEAT_CAP_FT_SPEC[0]
2000
+ coefficients = hvac_heating_ap.heat_cap_ft_spec[0]
1962
2001
  capacity_ratio = 1.0
1963
2002
  end
1964
2003
 
1965
- if (not hvac.SwitchoverTemperature.nil?) && (hvac.SwitchoverTemperature > weather.design.HeatingDrybulb)
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
- switchover_weather = Marshal.load(Marshal.dump(weather))
1968
- switchover_weather.design.HeatingDrybulb = hvac.SwitchoverTemperature
1969
- _switchover_bldg_design_loads, switchover_all_hvac_sizing_values = calculate(switchover_weather, @hpxml, @cfa, @nbeds, [hvac.hvac_system])
1970
- heating_load = switchover_all_hvac_sizing_values[hvac.hvac_system].Heat_Load
1971
- heating_db = switchover_weather.design.HeatingDrybulb
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 = weather.design.HeatingDrybulb
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 totalCap_CurveValue.nil? # Heat pump has no cooling
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 = [(hvac.OverSizeLimit * hvac_sizing_values.Cool_Load_Tot) / totalCap_CurveValue, heat_cap_rated].min
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 + hvac.OverSizeDelta) / totalCap_CurveValue, heat_cap_rated].min
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(hvac, wb_temp, db_temp, w_temp, vfr_air, loop_flow = nil, rated_vfr_air = nil)
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 = hvac.COOL_CAP_CURVE_SPEC[hvac.SizingSpeed][0]
2089
- a_2 = hvac.COOL_CAP_CURVE_SPEC[hvac.SizingSpeed][1]
2090
- a_3 = hvac.COOL_CAP_CURVE_SPEC[hvac.SizingSpeed][2]
2091
- a_4 = hvac.COOL_CAP_CURVE_SPEC[hvac.SizingSpeed][3]
2092
- a_5 = hvac.COOL_CAP_CURVE_SPEC[hvac.SizingSpeed][4]
2093
- b_1 = hvac.COOL_SH_CURVE_SPEC[hvac.SizingSpeed][0]
2094
- b_2 = hvac.COOL_SH_CURVE_SPEC[hvac.SizingSpeed][1]
2095
- b_3 = hvac.COOL_SH_CURVE_SPEC[hvac.SizingSpeed][2]
2096
- b_4 = hvac.COOL_SH_CURVE_SPEC[hvac.SizingSpeed][3]
2097
- b_5 = hvac.COOL_SH_CURVE_SPEC[hvac.SizingSpeed][4]
2098
- b_6 = hvac.COOL_SH_CURVE_SPEC[hvac.SizingSpeed][5]
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
- def self.calc_gshp_htg_curve_value(hvac, db_temp, w_temp, vfr_air, loop_flow)
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
- a_1 = hvac.HEAT_CAP_FT_SPEC[hvac.SizingSpeed][0]
2118
- a_2 = hvac.HEAT_CAP_FT_SPEC[hvac.SizingSpeed][1]
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
- cap_CurveValue = a_1 + db_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
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, dse_a_s, dse_a_r, 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)
2132
- dse_DE = _calc_dse_DE_heating(dse_a_s, dse_Bs, dse_a_r, dse_Br, dse_dT_s, dse_dT_r, dse_dTe)
2133
- dse_DEcorr = _calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br, dse_a_r, dse_dT_r, dse_dTe)
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, leavingAirTemp, 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)
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, dse_a_s, dse_a_r, 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)
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, coolingLoad_Ducts_Sens = _calc_dse_DE_cooling(dse_a_s, system_cfm, load_total, dse_a_r, dse_h_r, dse_Br, dse_dT_r, dse_Bs, leavingAirTemp, dse_Tamb_s, load_sens, air_dens, air_cp, h_in)
2145
- dse_DEcorr = _calc_dse_DEcorr(dse_DE, dse_Fregain_s, dse_Fregain_r, dse_Br, dse_a_r, dse_dT_r, dse_dTe)
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, coolingLoad_Ducts_Sens
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
- dse_a_s = (system_cfm - dse_Qs) / system_cfm
2156
- dse_a_r = (system_cfm - dse_Qr) / system_cfm
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, dse_a_s, dse_a_r, dse_dTe, dse_dT_s, dse_dT_r
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(dse_a_s, system_cfm, load_total, dse_a_r, dse_h_r, dse_Br, dse_dT_r, dse_Bs, leavingAirTemp, dse_Tamb_s, load_sens, air_dens, air_cp, h_in)
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 = ((dse_a_s * 60.0 * system_cfm * air_dens) / (-1.0 * load_total)) * \
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 - dse_a_r) * (dse_h_r - h_in) + \
2170
- dse_a_r * air_cp * (dse_Br - 1.0) * dse_dT_r + \
2171
- air_cp * (dse_Bs - 1.0) * (leavingAirTemp - dse_Tamb_s))
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
- coolingLoad_Ducts_Sens = (1.0 - [dse_DE, 0.0].max) * load_sens
2202
+ cooling_load_ducts_sens = (1.0 - [dse_DE, 0.0].max) * load_sens
2175
2203
 
2176
- return dse_DE, coolingLoad_Ducts_Sens
2204
+ return dse_DE, cooling_load_ducts_sens
2177
2205
  end
2178
2206
 
2179
- def self._calc_dse_DE_heating(dse_a_s, dse_Bs, dse_a_r, dse_Br, dse_dT_s, dse_dT_r, dse_dTe)
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 = (dse_a_s * dse_Bs -
2182
- dse_a_s * dse_Bs * (1.0 - dse_a_r * dse_Br) * (dse_dT_r / dse_dTe) -
2183
- dse_a_s * (1.0 - dse_Bs) * (dse_dT_s / dse_dTe))
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, dse_a_r, dse_dT_r, dse_dTe)
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 * (dse_a_r * dse_Fregain_s - dse_Fregain_r)) * dse_dT_r / dse_dTe)
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, coolingLoadLat)
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
- dse_Cool_Load_Latent = [0.0, 0.68 * @acf * return_leakage_cfm * (@cool_design_grains - @cool_indoor_grains)].max
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
- cool_Load_Lat = coolingLoadLat + dse_Cool_Load_Latent
2206
- cool_Load_Sens = cool_load_tot - cool_Load_Lat
2233
+ cool_load_lat += dse_cool_load_latent
2234
+ cool_load_sens = cool_load_tot - cool_load_lat
2207
2235
 
2208
- return cool_Load_Lat, cool_Load_Sens
2236
+ return cool_load_lat, cool_load_sens
2209
2237
  end
2210
2238
 
2211
- def self.calc_ducts_area_weighted_average(ducts, values)
2212
- '''
2213
- Calculate area-weighted average values for unconditioned duct(s)
2214
- '''
2215
- uncond_area = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
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
- value = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
2223
- ducts.each do |duct|
2224
- next if HPXML::conditioned_locations_this_unit.include? duct.Location
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
- if uncond_area[duct.Side] > 0
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
- return value[HPXML::DuctTypeSupply], value[HPXML::DuctTypeReturn]
2234
- end
2235
-
2236
- def self.calc_ducts_areas(ducts)
2237
- '''
2238
- Calculate total supply & return duct areas in unconditioned space
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
- areas = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
2242
- ducts.each do |duct|
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
- areas[duct.Side] += duct.Area
2246
- end
2266
+ # Calculate area-weighted values:
2247
2267
 
2248
- return areas[HPXML::DuctTypeSupply], areas[HPXML::DuctTypeReturn]
2249
- end
2268
+ duct_area_fraction = duct_area / total_area
2250
2269
 
2251
- def self.calc_ducts_leakages(ducts, system_cfm)
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
- cfms = { HPXML::DuctTypeSupply => 0.0, HPXML::DuctTypeReturn => 0.0 }
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
- if duct.LeakageFrac.to_f > 0
2261
- cfms[duct.Side] += duct.LeakageFrac * system_cfm
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 cfms[HPXML::DuctTypeSupply], cfms[HPXML::DuctTypeReturn]
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.calc_ducts_rvalues(ducts)
2285
+ def self.calc_duct_leakages_cfm25(distribution_system, system_cfm)
2273
2286
  '''
2274
- Calculate UA-weighted average R-value for supply & return ducts.
2287
+ Calculate supply & return duct leakage in cfm25.
2275
2288
  '''
2276
2289
 
2277
- u_factors = { HPXML::DuctTypeSupply => {}, HPXML::DuctTypeReturn => {} }
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
- # WLHP
2464
- if hpxml_hvac.respond_to? :heating_efficiency_cop
2465
- hvac.HeatingCOP = hpxml_hvac.heating_efficiency_cop
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
- # GSHP
2469
- if hpxml_hvac_ap.respond_to? :u_tube_spacing_type
2470
- hvac.GSHP_SpacingType = hpxml_hvac_ap.u_tube_spacing_type
2471
- end
2472
- if hpxml_hvac_ap.respond_to? :cool_rated_eirs
2473
- hvac.CoolingEIR = hpxml_hvac_ap.cool_rated_eirs[0]
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
- if hpxml_hvac_ap.respond_to? :heat_rated_eirs
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
- if m.duct_leakage_units == HPXML::UnitsPercent && m.duct_type == HPXML::DuctTypeSupply
2504
- lto[:supply_percent] = m.duct_leakage_value
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
- d = DuctInfo.new
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(airFlowRate / capacity_tons, temp, get_shr_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(num_speeds_cooling, capacity_ratios_cooling)
2586
- if num_speeds_cooling > 1
2587
- sizingSpeed = num_speeds_cooling # Default
2588
- sizingSpeed_Test = 10 # Initialize
2589
- for speed in 0..(num_speeds_cooling - 1)
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
- temp = (capacity_ratios_cooling[speed] - 1).abs
2592
- if temp <= sizingSpeed_Test
2593
- sizingSpeed = speed
2594
- sizingSpeed_Test = temp
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 sizingSpeed
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.select { |f| f.foundation_type == HPXML::FoundationTypeCrawlspaceVented }[0]
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.select { |f| f.attic_type == HPXML::AtticTypeVented }[0]
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(hvac)
2656
+ def self.gshp_hx_pipe_rvalue(hvac_cooling_ap)
2919
2657
  # Thermal Resistance of Pipe
2920
- return Math.log(hvac.GSHP_pipe_od / hvac.GSHP_pipe_id) / 2.0 / Math::PI / hvac.GSHP_pipe_cond
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, hvac, bore_spacing, pipe_r_value)
2924
- if hvac.GSHP_SpacingType == 'b'
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 hvac.GSHP_SpacingType == 'c'
2665
+ elsif hvac_cooling_ap.u_tube_spacing_type == 'c'
2928
2666
  beta_0 = 21.9059
2929
2667
  beta_1 = -0.3796
2930
- elsif hvac.GSHP_SpacingType == 'as'
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 / hvac.GSHP_bore_d * 12.0) / 2.0 / Math::PI / @hpxml.site.ground_conductivity
2936
- r_value_grout = 1.0 / hvac.GSHP_grout_k / beta_0 / ((hvac.GSHP_bore_d / hvac.GSHP_pipe_od)**beta_1)
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 - hvac.HeatingEIR) * (r_value_bore + r_value_ground * rtf_DesignMon_Heat) / (weather.data.AnnualAvgDrybulb - (2.0 * hvac.GSHP_design_hw - hvac.GSHP_design_delta_t) / 2.0) * UnitConversions.convert(1.0, 'ton', 'Btu/hr')
2943
- nom_length_cool = (1.0 + hvac.CoolingEIR) * (r_value_bore + r_value_ground * rtf_DesignMon_Cool) / ((2.0 * hvac.GSHP_design_chw + hvac.GSHP_design_delta_t) / 2.0 - weather.data.AnnualAvgDrybulb) * UnitConversions.convert(1.0, 'ton', 'Btu/hr')
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, :Cool_Infil_Sens, :Cool_Infil_Lat, :Cool_IntGains_Sens, :Cool_IntGains_Lat,
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