urbanopt-cli 0.4.1 → 0.6.1

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 (944) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +3 -1
  3. data/CHANGELOG.md +59 -0
  4. data/CMakeLists.txt +17 -17
  5. data/FindOpenStudioSDK.cmake +12 -7
  6. data/Gemfile +8 -10
  7. data/LICENSE.md +11 -1
  8. data/README.md +1 -0
  9. data/Rakefile +16 -6
  10. data/example_files/Gemfile +25 -9
  11. data/example_files/example_project.json +35 -20
  12. data/example_files/example_project_combined.json +100 -5
  13. data/example_files/example_project_with_electric_network.json +2116 -0
  14. data/example_files/mappers/Baseline.rb +111 -51
  15. data/example_files/mappers/CreateBar.rb +19 -7
  16. data/example_files/mappers/EvCharging.rb +141 -0
  17. data/example_files/mappers/Floorspace.rb +29 -17
  18. data/example_files/mappers/HighEfficiency.rb +20 -8
  19. data/example_files/mappers/HighEfficiencyCreateBar.rb +19 -8
  20. data/example_files/mappers/HighEfficiencyFloorspace.rb +19 -8
  21. data/example_files/mappers/ThermalStorage.rb +16 -6
  22. data/example_files/mappers/base_workflow.osw +26 -1
  23. data/example_files/mappers/floorspace_workflow.osw +9 -0
  24. data/example_files/measures/BuildResidentialModel/measure.rb +249 -134
  25. data/example_files/reopt/base_assumptions.json +2 -2
  26. data/example_files/reopt/multiPV_assumptions.json +4 -3
  27. data/example_files/residential/clothes_dryer.tsv +7 -7
  28. data/example_files/residential/clothes_washer.tsv +2 -2
  29. data/example_files/residential/cooling_system.tsv +42 -22
  30. data/example_files/residential/dishwasher.tsv +1 -1
  31. data/example_files/residential/exhaust.tsv +3 -0
  32. data/example_files/residential/heat_pump.tsv +62 -40
  33. data/example_files/residential/water_heater.tsv +1 -1
  34. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +14 -0
  35. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +116 -0
  36. data/example_files/resources/hpxml-measures/.gitignore +1 -8
  37. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1088 -1329
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +1819 -1383
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -8
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +450 -362
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules.rb +165 -112
  42. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.json +388 -0
  43. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.md +43 -0
  44. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +613 -0
  45. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +613 -0
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +56 -82
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-ief.osw → base-appliances-dehumidifier-ief-portable.osw} +57 -83
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-appliances-dehumidifier-50percent.osw → base-appliances-dehumidifier-ief-whole-home.osw} +59 -85
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +56 -82
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +56 -82
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +56 -82
  52. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +61 -87
  53. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +56 -82
  54. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +56 -82
  55. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +56 -82
  56. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +56 -82
  57. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +56 -82
  58. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +56 -82
  59. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +56 -82
  60. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +341 -0
  61. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +341 -0
  62. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared-preconditioning.osw → base-bldgtype-multifamily-shared-mechvent-preconditioning.osw} +70 -95
  63. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-mechvent-shared.osw → base-bldgtype-multifamily-shared-mechvent.osw} +70 -95
  64. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +341 -0
  65. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +341 -0
  66. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +341 -0
  67. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-single-family-attached.osw → base-bldgtype-single-family-attached.osw} +59 -85
  68. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +56 -82
  69. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +56 -82
  70. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +56 -82
  71. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +56 -82
  72. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +56 -82
  73. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +56 -82
  74. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +56 -82
  75. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +56 -82
  76. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +56 -82
  77. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +56 -82
  78. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +56 -82
  79. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +56 -82
  80. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +57 -83
  81. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +56 -82
  82. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +56 -82
  83. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +56 -82
  84. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +56 -82
  85. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +56 -82
  86. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +56 -82
  87. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +56 -82
  88. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +56 -82
  89. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +56 -82
  90. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +56 -82
  91. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +56 -82
  92. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +56 -82
  93. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +338 -0
  94. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +56 -82
  95. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +338 -0
  96. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +56 -82
  97. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +56 -82
  98. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +338 -0
  99. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +56 -82
  100. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +56 -82
  101. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +56 -82
  102. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +56 -82
  103. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +56 -82
  104. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +56 -83
  105. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +337 -0
  106. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +56 -82
  107. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +337 -0
  108. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +56 -82
  109. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +56 -82
  110. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +56 -82
  111. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +56 -82
  112. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +56 -82
  113. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +56 -82
  114. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +56 -82
  115. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +56 -82
  116. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +56 -82
  117. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +56 -82
  118. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +56 -82
  119. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +56 -82
  120. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +56 -82
  121. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +56 -82
  122. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +56 -82
  123. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +57 -83
  124. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +57 -83
  125. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +56 -82
  126. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +56 -82
  127. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +56 -82
  128. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +56 -82
  129. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +55 -81
  130. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +55 -81
  131. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +55 -81
  132. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +55 -81
  133. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +55 -81
  134. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +337 -0
  135. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +337 -0
  136. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +56 -82
  137. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +56 -82
  138. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +56 -82
  139. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +56 -82
  140. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +56 -82
  141. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +56 -82
  142. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +56 -82
  143. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +56 -82
  144. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +56 -82
  145. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +56 -82
  146. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +56 -82
  147. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +56 -82
  148. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +56 -82
  149. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +56 -82
  150. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +55 -81
  151. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +55 -81
  152. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +55 -81
  153. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +55 -81
  154. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +56 -82
  155. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +56 -82
  156. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +56 -82
  157. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +56 -82
  158. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +57 -83
  159. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +56 -82
  160. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +56 -82
  161. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +57 -83
  162. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +56 -82
  163. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +337 -0
  164. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +56 -82
  165. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +56 -82
  166. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +56 -82
  167. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +56 -82
  168. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +56 -82
  169. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +56 -82
  170. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +56 -82
  171. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +56 -82
  172. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +56 -82
  173. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +336 -0
  174. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +336 -0
  175. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +56 -84
  176. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +339 -0
  177. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +339 -0
  178. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +339 -0
  179. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +339 -0
  180. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +340 -0
  181. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +340 -0
  182. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +340 -0
  183. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +338 -0
  184. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +338 -0
  185. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +338 -0
  186. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +339 -0
  187. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +338 -0
  188. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +340 -0
  189. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +56 -82
  190. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +56 -82
  191. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +56 -82
  192. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +56 -82
  193. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +57 -83
  194. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +57 -83
  195. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +56 -82
  196. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +57 -83
  197. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +337 -0
  198. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +56 -82
  199. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +56 -82
  200. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +56 -82
  201. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +56 -82
  202. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +56 -82
  203. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +56 -82
  204. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +56 -82
  205. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +57 -83
  206. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +56 -82
  207. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +56 -82
  208. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +64 -90
  209. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +56 -82
  210. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +69 -95
  211. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +337 -0
  212. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +337 -0
  213. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +56 -82
  214. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +337 -0
  215. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +337 -0
  216. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +56 -82
  217. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +64 -92
  218. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +57 -83
  219. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +56 -82
  220. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +56 -82
  221. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +56 -82
  222. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +337 -0
  223. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +56 -82
  224. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +56 -82
  225. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +56 -82
  226. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +56 -82
  227. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +56 -82
  228. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +57 -83
  229. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +60 -86
  230. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +60 -86
  231. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +56 -82
  232. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +337 -0
  233. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +52 -78
  234. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +52 -78
  235. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-vacancy-6-months.osw → base-schedules-stochastic-vacant.osw} +59 -85
  236. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +56 -82
  237. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +56 -82
  238. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +56 -82
  239. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +56 -82
  240. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +56 -82
  241. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +56 -82
  242. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +56 -82
  243. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +56 -82
  244. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +71 -57
  245. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +56 -82
  246. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +341 -0
  247. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +341 -0
  248. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +341 -0
  249. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +341 -0
  250. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +341 -0
  251. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +341 -0
  252. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +341 -0
  253. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +341 -0
  254. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +341 -0
  255. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +341 -0
  256. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +341 -0
  257. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +341 -0
  258. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +341 -0
  259. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +341 -0
  260. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +341 -0
  261. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +341 -0
  262. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +341 -0
  263. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +341 -0
  264. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +341 -0
  265. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +341 -0
  266. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +341 -0
  267. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +341 -0
  268. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +341 -0
  269. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +341 -0
  270. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +341 -0
  271. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  272. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +341 -0
  273. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  274. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +341 -0
  275. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  276. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +341 -0
  277. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  278. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +341 -0
  279. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  280. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +341 -0
  281. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  282. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +341 -0
  283. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  284. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +341 -0
  285. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  286. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +341 -0
  287. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  288. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +341 -0
  289. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +341 -0
  290. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +341 -0
  291. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +341 -0
  292. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +341 -0
  293. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +341 -0
  294. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +341 -0
  295. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +341 -0
  296. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +341 -0
  297. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +341 -0
  298. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +341 -0
  299. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +341 -0
  300. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +341 -0
  301. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +341 -0
  302. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +341 -0
  303. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +341 -0
  304. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +341 -0
  305. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +341 -0
  306. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +341 -0
  307. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +341 -0
  308. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +341 -0
  309. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +341 -0
  310. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +339 -0
  311. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +339 -0
  312. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +339 -0
  313. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-pv-shared.osw → extra-bldgtype-single-family-attached-double-exterior.osw} +62 -89
  314. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +339 -0
  315. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-dhw-shared-water-heater.osw → extra-bldgtype-single-family-attached-single-exterior-front.osw} +60 -86
  316. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +339 -0
  317. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +339 -0
  318. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +339 -0
  319. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +339 -0
  320. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +339 -0
  321. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-multifamily.osw → extra-bldgtype-single-family-attached-unconditioned-basement.osw} +64 -91
  322. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +339 -0
  323. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +339 -0
  324. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +339 -0
  325. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +339 -0
  326. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +339 -0
  327. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +339 -0
  328. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +56 -82
  329. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +337 -0
  330. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +337 -0
  331. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +337 -0
  332. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +56 -82
  333. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +339 -0
  334. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +337 -0
  335. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +337 -0
  336. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +56 -82
  337. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +338 -0
  338. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +336 -0
  339. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +337 -0
  340. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +337 -0
  341. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-fireplace.osw → extra-second-heating-system-fireplace-to-heating-system.osw} +58 -84
  342. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +337 -0
  343. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{extra-second-heating-system-portable-heater.osw → extra-second-heating-system-portable-heater-to-heating-system.osw} +56 -82
  344. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +56 -82
  345. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +337 -0
  346. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +337 -0
  347. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +337 -0
  348. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +337 -0
  349. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +337 -0
  350. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +59 -85
  351. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +337 -0
  352. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +56 -82
  353. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +56 -82
  354. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +56 -82
  355. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +56 -82
  356. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +337 -0
  357. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +56 -82
  358. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +64 -89
  359. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +64 -89
  360. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +63 -88
  361. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-hvac-programmable-thermostat.osw → invalid_files/multipliers-without-fuel-loads.osw} +54 -80
  362. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +337 -0
  363. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +337 -0
  364. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{base-dhw-uef.osw → invalid_files/multipliers-without-vehicle-plug-loads.osw} +58 -84
  365. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +337 -0
  366. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +56 -82
  367. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +56 -82
  368. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +56 -82
  369. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +337 -0
  370. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +56 -82
  371. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +337 -0
  372. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +58 -84
  373. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +58 -84
  374. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +56 -82
  375. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +56 -82
  376. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +337 -0
  377. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +56 -82
  378. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +56 -82
  379. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +56 -82
  380. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +59 -85
  381. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +58 -84
  382. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +56 -82
  383. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +337 -0
  384. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +8761 -0
  385. data/example_files/resources/hpxml-measures/Changelog.md +249 -0
  386. data/example_files/resources/hpxml-measures/Gemfile +2 -5
  387. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +404 -1357
  388. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +247 -171
  389. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +11 -101
  390. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +824 -301
  391. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +18 -35
  392. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +526 -0
  393. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +135 -207
  394. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +14 -186
  395. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +549 -93
  396. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +12 -15
  397. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +78 -0
  398. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +413 -15
  399. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +48 -37
  400. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1627 -1227
  401. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +1192 -434
  402. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1555 -1616
  403. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +1436 -1479
  404. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +3 -2
  405. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +22 -10
  406. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +85 -19
  407. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +4 -26
  408. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +22 -46
  409. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +22 -21
  410. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +51 -14
  411. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +24 -7
  412. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +2 -0
  413. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +80 -19
  414. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +9 -2
  415. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +106 -75
  416. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +109 -34
  417. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +22 -36
  418. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1565 -768
  419. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +151 -0
  420. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +101 -0
  421. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +9 -18
  422. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +316 -28
  423. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +53 -0
  424. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +4 -2
  425. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +13 -11
  426. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +4 -2
  427. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +5 -3
  428. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +13 -11
  429. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +102 -62
  430. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +189 -35
  431. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +26 -0
  432. data/example_files/resources/hpxml-measures/README.md +5 -5
  433. data/example_files/resources/hpxml-measures/Rakefile +2 -10
  434. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +416 -299
  435. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.xml +364 -481
  436. data/example_files/resources/hpxml-measures/SimulationOutputReport/resources/constants.rb +1 -2
  437. data/example_files/resources/hpxml-measures/SimulationOutputReport/tests/output_report_test.rb +327 -320
  438. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +3 -3
  439. data/example_files/resources/hpxml-measures/docs/source/conf.py +11 -5
  440. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +6 -6
  441. data/example_files/resources/hpxml-measures/docs/source/index.rst +2 -2
  442. data/example_files/resources/hpxml-measures/docs/source/intro.rst +7 -109
  443. data/example_files/resources/hpxml-measures/docs/source/nstatic/stylesheet.css +13 -1
  444. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +2482 -0
  445. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +282 -0
  446. data/example_files/resources/hpxml-measures/tasks.rb +2494 -1248
  447. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3-cache.csv +35 -0
  448. data/example_files/resources/hpxml-measures/weather/USA_AZ_Phoenix-Sky.Harbor.Intl.AP.722780_TMY3.epw +8768 -0
  449. data/example_files/resources/hpxml-measures/weather/USA_CO_Denver.Intl.AP.725650_TMY3-cache.csv +10 -10
  450. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3-cache.csv +35 -0
  451. data/example_files/resources/hpxml-measures/weather/USA_HI_Honolulu.Intl.AP.911820_TMY3.epw +8768 -0
  452. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3-cache.csv +35 -0
  453. data/example_files/resources/hpxml-measures/weather/USA_MT_Helena.Rgnl.AP.727720_TMY3.epw +8768 -0
  454. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3-cache.csv +35 -0
  455. data/example_files/resources/hpxml-measures/weather/USA_OR_Portland.Intl.AP.726980_TMY3.epw +8768 -0
  456. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +96 -21
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +558 -559
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-ief.xml → base-appliances-dehumidifier-ief-portable.xml} +8 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-appliances-dehumidifier-50percent.xml → base-appliances-dehumidifier-ief-whole-home.xml} +10 -9
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +535 -0
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +525 -524
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +558 -559
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +564 -565
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +513 -513
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +558 -559
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +558 -559
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +558 -559
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +565 -566
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +633 -634
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +531 -532
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +517 -518
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +562 -563
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +565 -566
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-multifamily-buffer-space.xml → base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml} +34 -62
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +554 -0
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-non-freezing-space.xml → base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml} +34 -62
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-heated-space.xml → base-bldgtype-multifamily-adjacent-to-other-heated-space.xml} +34 -62
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-other-housing-unit.xml → base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml} +34 -62
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +425 -0
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +457 -0
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +427 -0
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +479 -0
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +474 -0
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +408 -0
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +439 -0
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +406 -0
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +409 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +457 -0
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +407 -0
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +438 -0
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +408 -0
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +456 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +451 -0
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +460 -0
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +451 -0
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +466 -0
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-mechvent-shared-multiple.xml → base-bldgtype-multifamily-shared-mechvent-multiple.xml} +43 -415
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +489 -0
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +473 -0
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +465 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +458 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +451 -0
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +448 -0
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +619 -0
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +516 -519
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +516 -519
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +550 -551
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +7 -9
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +563 -564
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +548 -549
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +550 -551
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +550 -551
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +567 -568
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +517 -520
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +517 -520
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +518 -521
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +525 -528
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +517 -520
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +567 -568
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +568 -569
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +566 -567
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +522 -525
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +562 -563
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +575 -578
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +497 -497
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +565 -566
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +565 -566
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +565 -566
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +565 -566
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +565 -566
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +577 -578
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +577 -578
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +577 -578
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +570 -571
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +577 -578
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +577 -578
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +563 -564
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +564 -0
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +563 -564
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +565 -0
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +563 -564
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +561 -562
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +564 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +569 -570
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +576 -577
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +561 -562
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +563 -564
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +563 -564
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +561 -562
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +561 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +560 -561
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +561 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +568 -569
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +575 -576
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +560 -561
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +560 -561
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +661 -664
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +575 -576
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +562 -563
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +562 -563
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +562 -563
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +562 -563
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +636 -639
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +562 -563
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +562 -563
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +562 -563
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +565 -566
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +561 -562
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +582 -578
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +590 -591
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +601 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +590 -591
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +517 -0
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +2474 -2493
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2475 -0
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +754 -755
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +504 -505
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-enclosure-windows-interior-shading.xml → base-enclosure-windows-shading.xml} +23 -9
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +498 -497
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +644 -0
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +724 -729
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +562 -563
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +562 -563
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +685 -688
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +516 -517
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +609 -610
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +558 -559
  588. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +573 -574
  589. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +573 -574
  590. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +573 -574
  591. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +576 -577
  592. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +627 -628
  593. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml} +8 -12
  594. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml} +9 -9
  595. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +561 -562
  596. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +561 -562
  597. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +561 -562
  598. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +553 -0
  599. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-1-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml} +5 -6
  600. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +561 -0
  601. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +558 -0
  602. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml} +4 -5
  603. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-2-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-2-speed.xml} +4 -5
  604. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml} +4 -5
  605. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-air-to-air-heat-pump-var-speed-autosize.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed.xml} +4 -5
  606. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-elec-only-autosize.xml → base-hvac-autosize-boiler-elec-only.xml} +2 -5
  607. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-central-ac-1-speed-autosize.xml → base-hvac-autosize-boiler-gas-central-ac-1-speed.xml} +4 -6
  608. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-boiler-gas-only-autosize.xml → base-hvac-autosize-boiler-gas-only.xml} +2 -5
  609. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-1-speed-autosize.xml → base-hvac-autosize-central-ac-only-1-speed.xml} +547 -548
  610. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-2-speed-autosize.xml → base-hvac-autosize-central-ac-only-2-speed.xml} +4 -5
  611. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-only-var-speed-autosize.xml → base-hvac-autosize-central-ac-only-var-speed.xml} +4 -5
  612. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-central-ac-plus-air-to-air-heat-pump-heating-autosize.xml → base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml} +570 -571
  613. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +559 -0
  614. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-dual-fuel-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml} +557 -558
  615. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-elec-resistance-only-autosize.xml → base-hvac-autosize-elec-resistance-only.xml} +2 -5
  616. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-evap-cooler-furnace-gas-autosize.xml → base-hvac-autosize-evap-cooler-furnace-gas.xml} +4 -5
  617. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-floor-furnace-propane-only-autosize.xml → base-hvac-autosize-floor-furnace-propane-only.xml} +5 -6
  618. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-elec-only-autosize.xml → base-hvac-autosize-furnace-elec-only.xml} +4 -5
  619. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-2-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-2-speed.xml} +4 -5
  620. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-central-ac-var-speed-autosize.xml → base-hvac-autosize-furnace-gas-central-ac-var-speed.xml} +4 -5
  621. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-only-autosize.xml → base-hvac-autosize-furnace-gas-only.xml} +4 -6
  622. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-furnace-gas-room-ac-autosize.xml → base-hvac-autosize-furnace-gas-room-ac.xml} +4 -5
  623. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +555 -0
  624. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +560 -0
  625. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize-manual-s-oversize-allowances.xml → base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml} +4 -6
  626. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-ground-to-air-heat-pump-autosize.xml → base-hvac-autosize-ground-to-air-heat-pump.xml} +4 -6
  627. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +547 -0
  628. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-cooling-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml} +551 -552
  629. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-heating-only-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml} +556 -557
  630. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +560 -0
  631. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize.xml → base-hvac-autosize-mini-split-heat-pump-ducted.xml} +556 -557
  632. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-room-ac-only-autosize.xml → base-hvac-autosize-room-ac-only.xml} +2 -5
  633. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-stove-oil-only-autosize.xml → base-hvac-autosize-stove-oil-only.xml} +5 -6
  634. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-wall-furnace-elec-only-autosize.xml → base-hvac-autosize-wall-furnace-elec-only.xml} +5 -6
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-autosize.xml → base-hvac-autosize.xml} +4 -5
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +518 -521
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +518 -521
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +571 -573
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +519 -522
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +518 -521
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +518 -521
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +518 -521
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +548 -549
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +548 -549
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +548 -549
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +575 -576
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +532 -535
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +562 -563
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +562 -563
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +562 -563
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +562 -563
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +561 -562
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +562 -563
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +509 -512
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +555 -555
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +536 -528
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +503 -505
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +6 -7
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +6 -57
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +6 -7
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +549 -0
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +562 -563
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +548 -549
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +562 -563
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +562 -563
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +5 -7
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +560 -561
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +548 -549
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +548 -549
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +548 -549
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +576 -579
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +557 -0
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +563 -0
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +7 -9
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-flowrate.xml → base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml} +8 -9
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/heat-pump-mixed-fixed-and-autosize-capacities2.xml → base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml} +13 -8
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml +567 -0
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml +567 -0
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml +572 -0
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml +572 -0
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml +572 -0
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-furnace-gas-only.xml +553 -0
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-all-ground-to-air-heat-pump.xml +566 -0
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-air-conditioner-only-ducted-autosize.xml → base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml} +10 -5
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/{hvac_autosizing/base-hvac-mini-split-heat-pump-ducted-autosize-manual-s-oversize-allowances.xml → base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml} +13 -8
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml +569 -0
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-misc-shelter-coefficient.xml → base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml} +9 -10
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml +570 -0
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +547 -548
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +508 -511
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +554 -555
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +560 -561
  693. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +560 -561
  694. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +515 -518
  695. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +21 -13
  696. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +486 -489
  697. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +6 -57
  698. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +567 -0
  699. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +570 -571
  700. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +508 -511
  701. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +508 -511
  702. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +562 -563
  703. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +6 -7
  704. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +6 -7
  705. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +565 -566
  706. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +562 -563
  707. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +6 -7
  708. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +573 -574
  709. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-detailed.xml +585 -586
  710. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +488 -489
  711. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +562 -563
  712. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +573 -563
  713. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +516 -517
  714. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +573 -563
  715. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +563 -0
  716. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +517 -0
  717. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +516 -517
  718. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +517 -0
  719. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +577 -0
  720. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +574 -575
  721. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +590 -591
  722. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +545 -548
  723. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +549 -541
  724. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +575 -576
  725. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +576 -577
  726. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +576 -577
  727. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +574 -575
  728. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +574 -575
  729. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +575 -576
  730. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +575 -576
  731. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +796 -795
  732. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +574 -575
  733. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +572 -573
  734. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +478 -495
  735. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +579 -0
  736. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +758 -833
  737. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +749 -820
  738. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +550 -559
  739. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +575 -576
  740. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-calendar-year.xml → base-misc-shielding-of-home.xml} +7 -8
  741. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +728 -725
  742. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1657 -0
  743. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +6 -7
  744. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +564 -0
  745. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +6 -7
  746. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +6 -7
  747. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +563 -564
  748. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +569 -570
  749. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +565 -566
  750. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +566 -567
  751. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +562 -563
  752. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +562 -563
  753. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/boiler-invalid-afue.xml +519 -0
  754. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cfis-with-hydronic-distribution.xml +532 -535
  755. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +562 -563
  756. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +562 -563
  757. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +562 -563
  758. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +535 -0
  759. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +535 -0
  760. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +575 -578
  761. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-uef.xml → invalid_files/dhw-invalid-ef-tank.xml} +7 -8
  762. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +564 -0
  763. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +562 -563
  764. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +563 -0
  765. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +563 -0
  766. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +562 -563
  767. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +562 -563
  768. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +562 -563
  769. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +546 -547
  770. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +543 -544
  771. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +546 -545
  772. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +563 -0
  773. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +448 -0
  774. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +613 -616
  775. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-roof-ceiling.xml +626 -629
  776. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +610 -611
  777. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +550 -551
  778. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +472 -473
  779. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +488 -534
  780. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +760 -0
  781. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +759 -0
  782. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +761 -0
  783. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +759 -0
  784. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +563 -0
  785. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +460 -0
  786. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-output-greater-than-consumption.xml +579 -0
  787. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +559 -560
  788. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +21 -13
  789. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +21 -13
  790. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-return-duct-leakage-missing.xml +528 -534
  791. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +546 -549
  792. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +546 -549
  793. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +21 -13
  794. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +569 -0
  795. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-invalid-distribution-system-type.xml +570 -571
  796. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +407 -0
  797. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +563 -0
  798. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +563 -0
  799. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +563 -0
  800. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +563 -0
  801. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +569 -567
  802. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +562 -563
  803. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +562 -563
  804. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +466 -0
  805. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-surfaces.xml +644 -0
  806. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{appliances-location-unconditioned-space.xml → invalid-foundation-wall-properties.xml} +39 -29
  807. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id.xml +591 -0
  808. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +591 -0
  809. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +563 -0
  810. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +565 -0
  811. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +575 -576
  812. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +465 -0
  813. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/{slab-zero-exposed-perimeter.xml → invalid-number-of-conditioned-floors.xml} +7 -8
  814. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +451 -0
  815. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +550 -551
  816. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-dhw-indirect.xml +517 -520
  817. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +564 -565
  818. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +563 -0
  819. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +473 -0
  820. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +562 -563
  821. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +582 -578
  822. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +562 -563
  823. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +21 -13
  824. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +560 -561
  825. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +562 -563
  826. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +562 -563
  827. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-surface.xml +575 -566
  828. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +562 -563
  829. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +1657 -0
  830. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +1657 -0
  831. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +432 -0
  832. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +434 -0
  833. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +590 -591
  834. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +562 -563
  835. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +563 -0
  836. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +546 -547
  837. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +562 -563
  838. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +568 -569
  839. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +568 -569
  840. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +563 -564
  841. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +526 -529
  842. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +571 -0
  843. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +531 -534
  844. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +565 -566
  845. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +531 -534
  846. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +575 -576
  847. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +562 -563
  848. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +562 -563
  849. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +465 -827
  850. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +465 -827
  851. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +590 -591
  852. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-solar-thermal-system.xml +577 -578
  853. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +562 -563
  854. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +562 -563
  855. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +562 -563
  856. data/example_files/resources/hpxml-measures/workflow/template.osw +5 -1
  857. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +6 -17
  858. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +6 -17
  859. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +6 -17
  860. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +6 -17
  861. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +6 -17
  862. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +6 -17
  863. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +6 -17
  864. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +6 -17
  865. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +6 -17
  866. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +6 -17
  867. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +6 -17
  868. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +6 -17
  869. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +6 -17
  870. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +6 -17
  871. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +6 -17
  872. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +6 -17
  873. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +6 -17
  874. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +6 -17
  875. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +6 -17
  876. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +6 -17
  877. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +6 -17
  878. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +6 -17
  879. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +6 -19
  880. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +6 -19
  881. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -19
  882. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -19
  883. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +294 -0
  884. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +27 -0
  885. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +294 -0
  886. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +130 -0
  887. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +522 -527
  888. data/example_files/{measures/BuildResidentialModel/resources → resources}/measure-info.json +0 -0
  889. data/example_files/{measures/BuildResidentialModel/resources → resources}/meta_measure.rb +53 -44
  890. data/example_files/validation_schema.yaml +149 -0
  891. data/example_files/visualization/input_visualization_feature.html +213 -56
  892. data/example_files/visualization/input_visualization_scenario.html +92 -30
  893. data/lib/uo_cli.rb +406 -128
  894. data/lib/uo_cli/version.rb +17 -7
  895. data/requirements.txt +2 -0
  896. data/scripts/setup-env-gitbash.sh +5 -5
  897. data/scripts/setup-env-unix.sh +4 -4
  898. data/scripts/setup-env.bat +14 -11
  899. data/scripts/setup-env.ps1 +13 -10
  900. data/uo_cli.gemspec +10 -8
  901. metadata +390 -130
  902. data/developer_nrel_key.rb +0 -31
  903. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.rb +0 -1005
  904. data/example_files/measures/ResidentialGeometryCreateMultifamily/measure.xml +0 -326
  905. data/example_files/measures/ResidentialGeometryCreateMultifamily/tests/create_residential_multifamily_geometry_test.rb +0 -477
  906. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.rb +0 -1039
  907. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/measure.xml +0 -393
  908. data/example_files/measures/ResidentialGeometryCreateSingleFamilyAttached/tests/create_residential_single_family_attached_geometry_test.rb +0 -456
  909. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.rb +0 -979
  910. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/measure.xml +0 -388
  911. data/example_files/measures/ResidentialGeometryCreateSingleFamilyDetached/tests/create_residential_single_family_detached_geometry_test.rb +0 -704
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/location.rb +0 -24
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/schedules_config.yml +0 -61
  914. data/example_files/resources/hpxml-measures/docs/source/hpxml_to_openstudio.rst +0 -1386
  915. data/example_files/resources/hpxml-measures/docs/source/simulation_output_report.rst +0 -252
  916. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-laundry-room.xml +0 -828
  917. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater-recirc.xml +0 -820
  918. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-shared-water-heater.xml +0 -813
  919. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-attached-multifamily.xml +0 -810
  920. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-common-surfaces.xml +0 -928
  921. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ideal-air.xml +0 -501
  922. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple2.xml +0 -838
  923. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-baseboard.xml +0 -777
  924. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil-ducted.xml +0 -808
  925. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-fan-coil.xml +0 -780
  926. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-chiller-water-loop-heat-pump.xml +0 -820
  927. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-cooling-tower-water-loop-heat-pump.xml +0 -815
  928. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-baseboard.xml +0 -760
  929. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-ducted.xml +0 -790
  930. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil-eae.xml +0 -759
  931. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-fan-coil.xml +0 -762
  932. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-boiler-only-water-loop-heat-pump.xml +0 -796
  933. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-baseboard.xml +0 -759
  934. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil-ducted.xml +0 -789
  935. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-fan-coil.xml +0 -761
  936. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-chiller-only-water-loop-heat-pump.xml +0 -796
  937. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-cooling-tower-only-water-loop-heat-pump.xml +0 -791
  938. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-shared-ground-loop-ground-to-air-heat-pump.xml +0 -814
  939. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared-preconditioning.xml +0 -851
  940. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-shared.xml +0 -835
  941. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-shared.xml +0 -827
  942. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/coal-for-non-boiler-heating.xml +0 -514
  943. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type.xml +0 -828
  944. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-interior-shading.xml +0 -564
@@ -49,14 +49,6 @@ class Constants
49
49
  return num_hours_in_year.to_f
50
50
  end
51
51
 
52
- def self.NumApplyUpgradeOptions
53
- return 25
54
- end
55
-
56
- def self.NumApplyUpgradesCostsPerOption
57
- return 2
58
- end
59
-
60
52
  def self.PeakFlowRate
61
53
  return 500 # gal/min
62
54
  end
@@ -21,6 +21,39 @@ class Geometry
21
21
  return azimuth
22
22
  end
23
23
 
24
+ def self.add_rim_joist(model, polygon, space, rim_joist_height, z)
25
+ if rim_joist_height > 0
26
+ # make polygons
27
+ p = OpenStudio::Point3dVector.new
28
+ polygon.each do |point|
29
+ p << OpenStudio::Point3d.new(point.x, point.y, z)
30
+ end
31
+ rim_joist_polygon = p
32
+
33
+ # make space
34
+ rim_joist_space = OpenStudio::Model::Space::fromFloorPrint(rim_joist_polygon, rim_joist_height, model)
35
+ rim_joist_space = rim_joist_space.get
36
+
37
+ space.surfaces.each do |surface|
38
+ next if surface.surfaceType.downcase != 'roofceiling'
39
+
40
+ surface.remove
41
+ end
42
+
43
+ rim_joist_space.surfaces.each do |surface|
44
+ next if surface.surfaceType.downcase != 'floor'
45
+
46
+ surface.remove
47
+ end
48
+
49
+ rim_joist_space.surfaces.each do |surface|
50
+ surface.setSpace(space)
51
+ end
52
+
53
+ rim_joist_space.remove
54
+ end
55
+ end
56
+
24
57
  def self.create_single_family_detached(runner:,
25
58
  model:,
26
59
  geometry_cfa:,
@@ -33,10 +66,10 @@ class Geometry
33
66
  geometry_garage_position:,
34
67
  geometry_foundation_type:,
35
68
  geometry_foundation_height:,
69
+ geometry_rim_joist_height:,
36
70
  geometry_attic_type:,
37
71
  geometry_roof_type:,
38
72
  geometry_roof_pitch:,
39
- geometry_roof_structure:,
40
73
  **remainder)
41
74
  cfa = geometry_cfa
42
75
  wall_height = geometry_wall_height
@@ -48,10 +81,10 @@ class Geometry
48
81
  garage_position = geometry_garage_position
49
82
  foundation_type = geometry_foundation_type
50
83
  foundation_height = geometry_foundation_height
84
+ rim_joist_height = geometry_rim_joist_height
51
85
  attic_type = geometry_attic_type
52
86
  roof_type = geometry_roof_type
53
87
  roof_pitch = geometry_roof_pitch
54
- roof_structure = geometry_roof_structure
55
88
 
56
89
  # error checking
57
90
  if model.getSpaces.size > 0
@@ -81,6 +114,7 @@ class Geometry
81
114
  garage_width = UnitConversions.convert(garage_width, 'ft', 'm')
82
115
  garage_depth = UnitConversions.convert(garage_depth, 'ft', 'm')
83
116
  foundation_height = UnitConversions.convert(foundation_height, 'ft', 'm')
117
+ rim_joist_height = UnitConversions.convert(rim_joist_height, 'ft', 'm')
84
118
 
85
119
  garage_area = garage_width * garage_depth
86
120
  has_garage = false
@@ -128,12 +162,9 @@ class Geometry
128
162
  return false
129
163
  end
130
164
 
131
- # starting spaces
132
- runner.registerInitialCondition("The building started with #{model.getSpaces.size} spaces.")
133
-
134
165
  # create living zone
135
166
  living_zone = OpenStudio::Model::ThermalZone.new(model)
136
- living_zone.setName('living zone')
167
+ living_zone.setName(HPXML::LocationLivingSpace)
137
168
 
138
169
  foundation_offset = 0.0
139
170
  if foundation_type == HPXML::FoundationTypeAmbient
@@ -144,13 +175,14 @@ class Geometry
144
175
  foundation_polygon_with_wrong_zs = nil
145
176
  for floor in (0..num_floors - 1)
146
177
 
147
- z = wall_height * floor + foundation_offset
178
+ z = wall_height * floor + foundation_offset + rim_joist_height
148
179
 
149
- if has_garage && (z == foundation_offset) # first floor and has garage
180
+ if has_garage && (z == foundation_offset + rim_joist_height) # first floor and has garage
150
181
 
151
182
  # create garage zone
183
+ garage_space_name = HPXML::LocationGarage
152
184
  garage_zone = OpenStudio::Model::ThermalZone.new(model)
153
- garage_zone.setName('garage zone')
185
+ garage_zone.setName(garage_space_name)
154
186
 
155
187
  # make points and polygons
156
188
  if garage_position == 'Right'
@@ -170,12 +202,10 @@ class Geometry
170
202
  # make space
171
203
  garage_space = OpenStudio::Model::Space::fromFloorPrint(garage_polygon, wall_height, model)
172
204
  garage_space = garage_space.get
173
- garage_space_name = 'garage space'
174
205
  garage_space.setName(garage_space_name)
175
206
  garage_space_type = OpenStudio::Model::SpaceType.new(model)
176
- garage_space_type.setStandardsSpaceType('garage')
207
+ garage_space_type.setStandardsSpaceType(garage_space_name)
177
208
  garage_space.setSpaceType(garage_space_type)
178
- runner.registerInfo("Set #{garage_space_name}.")
179
209
 
180
210
  # set this to the garage zone
181
211
  garage_space.setThermalZone(garage_zone)
@@ -214,14 +244,13 @@ class Geometry
214
244
  end
215
245
  end
216
246
  foundation_polygon_with_wrong_zs = living_polygon
217
-
218
247
  else # first floor without garage or above first floor
219
248
 
220
249
  if has_garage
221
- garage_se_point = OpenStudio::Point3d.new(garage_se_point.x, garage_se_point.y, wall_height * floor + foundation_offset)
222
- garage_sw_point = OpenStudio::Point3d.new(garage_sw_point.x, garage_sw_point.y, wall_height * floor + foundation_offset)
223
- garage_nw_point = OpenStudio::Point3d.new(garage_nw_point.x, garage_nw_point.y, wall_height * floor + foundation_offset)
224
- garage_ne_point = OpenStudio::Point3d.new(garage_ne_point.x, garage_ne_point.y, wall_height * floor + foundation_offset)
250
+ garage_se_point = OpenStudio::Point3d.new(garage_se_point.x, garage_se_point.y, z)
251
+ garage_sw_point = OpenStudio::Point3d.new(garage_sw_point.x, garage_sw_point.y, z)
252
+ garage_nw_point = OpenStudio::Point3d.new(garage_nw_point.x, garage_nw_point.y, z)
253
+ garage_ne_point = OpenStudio::Point3d.new(garage_ne_point.x, garage_ne_point.y, z)
225
254
  if garage_position == 'Right'
226
255
  sw_point = OpenStudio::Point3d.new(0, 0, z)
227
256
  nw_point = OpenStudio::Point3d.new(0, width, z)
@@ -253,7 +282,7 @@ class Geometry
253
282
  ne_point = OpenStudio::Point3d.new(length, width, z)
254
283
  se_point = OpenStudio::Point3d.new(length, 0, z)
255
284
  living_polygon = make_polygon(sw_point, nw_point, ne_point, se_point)
256
- if z == foundation_offset
285
+ if z == foundation_offset + rim_joist_height
257
286
  foundation_polygon_with_wrong_zs = living_polygon
258
287
  end
259
288
 
@@ -265,7 +294,7 @@ class Geometry
265
294
  living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, wall_height, model)
266
295
  living_space = living_space.get
267
296
  if floor > 0
268
- living_space_name = "living space|story #{floor + 1}"
297
+ living_space_name = "#{HPXML::LocationLivingSpace}|story #{floor + 1}"
269
298
  else
270
299
  living_space_name = HPXML::LocationLivingSpace
271
300
  end
@@ -273,7 +302,6 @@ class Geometry
273
302
  living_space_type = OpenStudio::Model::SpaceType.new(model)
274
303
  living_space_type.setStandardsSpaceType(HPXML::LocationLivingSpace)
275
304
  living_space.setSpaceType(living_space_type)
276
- runner.registerInfo("Set #{living_space_name}.")
277
305
 
278
306
  # set these to the living zone
279
307
  living_space.setThermalZone(living_zone)
@@ -283,7 +311,6 @@ class Geometry
283
311
  m[1, 3] = 0
284
312
  m[2, 3] = z
285
313
  living_space.changeTransformation(OpenStudio::Transformation.new(m))
286
-
287
314
  end
288
315
 
289
316
  # Attic
@@ -372,23 +399,21 @@ class Geometry
372
399
  if (attic_type == HPXML::AtticTypeVented) || (attic_type == HPXML::AtticTypeUnvented)
373
400
  # create attic zone
374
401
  attic_zone = OpenStudio::Model::ThermalZone.new(model)
375
- attic_zone.setName("#{attic_type} zone")
376
402
  attic_space.setThermalZone(attic_zone)
377
403
  if attic_type == HPXML::AtticTypeVented
378
- attic_space_type_name = 'vented attic'
379
- else
380
- attic_space_type_name = 'unvented attic'
404
+ attic_space_name = HPXML::LocationAtticVented
405
+ elsif attic_type == HPXML::AtticTypeUnvented
406
+ attic_space_name = HPXML::LocationAtticUnvented
381
407
  end
408
+ attic_zone.setName(attic_space_name)
382
409
  elsif attic_type == HPXML::AtticTypeConditioned
383
410
  attic_space.setThermalZone(living_zone)
384
- attic_space_type_name = 'living space'
411
+ attic_space_name = HPXML::LocationLivingSpace
385
412
  end
386
- attic_space_name = "#{attic_type} space"
387
413
  attic_space.setName(attic_space_name)
388
414
  attic_space_type = OpenStudio::Model::SpaceType.new(model)
389
- attic_space_type.setStandardsSpaceType(attic_space_type_name)
415
+ attic_space_type.setStandardsSpaceType(attic_space_name)
390
416
  attic_space.setSpaceType(attic_space_type)
391
- runner.registerInfo("Set #{attic_space_name}.")
392
417
 
393
418
  m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
394
419
  m[0, 3] = 0
@@ -405,8 +430,6 @@ class Geometry
405
430
 
406
431
  # create foundation zone
407
432
  foundation_zone = OpenStudio::Model::ThermalZone.new(model)
408
- foundation_zone_name = "#{foundation_type} zone"
409
- foundation_zone.setName(foundation_zone_name)
410
433
 
411
434
  # make polygons
412
435
  p = OpenStudio::Point3dVector.new
@@ -419,22 +442,21 @@ class Geometry
419
442
  foundation_space = OpenStudio::Model::Space::fromFloorPrint(foundation_polygon, foundation_height, model)
420
443
  foundation_space = foundation_space.get
421
444
  if foundation_type == HPXML::FoundationTypeCrawlspaceVented
422
- foundation_space_type_name = 'vented crawlspace'
445
+ foundation_space_name = HPXML::LocationCrawlspaceVented
423
446
  elsif foundation_type == HPXML::FoundationTypeCrawlspaceUnvented
424
- foundation_space_type_name = 'unvented crawlspace'
447
+ foundation_space_name = HPXML::LocationCrawlspaceUnvented
425
448
  elsif foundation_type == HPXML::FoundationTypeBasementUnconditioned
426
- foundation_space_type_name = 'unconditioned basement'
449
+ foundation_space_name = HPXML::LocationBasementUnconditioned
427
450
  elsif foundation_type == HPXML::FoundationTypeBasementConditioned
428
- foundation_space_type_name = 'living space'
451
+ foundation_space_name = HPXML::LocationBasementConditioned
429
452
  elsif foundation_type == HPXML::FoundationTypeAmbient
430
- foundation_space_type_name = 'ambient'
453
+ foundation_space_name = HPXML::LocationOutside
431
454
  end
432
- foundation_space_name = "#{foundation_type} space"
455
+ foundation_zone.setName(foundation_space_name)
433
456
  foundation_space.setName(foundation_space_name)
434
457
  foundation_space_type = OpenStudio::Model::SpaceType.new(model)
435
- foundation_space_type.setStandardsSpaceType(foundation_space_type_name)
458
+ foundation_space_type.setStandardsSpaceType(foundation_space_name)
436
459
  foundation_space.setSpaceType(foundation_space_type)
437
- runner.registerInfo("Set #{foundation_space_name}.")
438
460
 
439
461
  # set these to the foundation zone
440
462
  foundation_space.setThermalZone(foundation_zone)
@@ -458,6 +480,8 @@ class Geometry
458
480
  m[2, 3] = z
459
481
  foundation_space.changeTransformation(OpenStudio::Transformation.new(m))
460
482
 
483
+ # Rim Joist
484
+ add_rim_joist(model, foundation_polygon_with_wrong_zs, foundation_space, rim_joist_height, foundation_height)
461
485
  end
462
486
 
463
487
  # put all of the spaces in the model into a vector
@@ -516,10 +540,10 @@ class Geometry
516
540
  se_point = OpenStudio::Point3d.new(se_point.x, se_point.y, se_point.z - living_space.zOrigin)
517
541
  end
518
542
  else
519
- nw_point = OpenStudio::Point3d.new(nw_point.x, nw_point.y, num_floors * nw_point.z)
520
- ne_point = OpenStudio::Point3d.new(ne_point.x, ne_point.y, num_floors * ne_point.z)
521
- sw_point = OpenStudio::Point3d.new(sw_point.x, sw_point.y, num_floors * sw_point.z)
522
- se_point = OpenStudio::Point3d.new(se_point.x, se_point.y, num_floors * se_point.z)
543
+ nw_point = OpenStudio::Point3d.new(nw_point.x, nw_point.y, num_floors * nw_point.z + rim_joist_height)
544
+ ne_point = OpenStudio::Point3d.new(ne_point.x, ne_point.y, num_floors * ne_point.z + rim_joist_height)
545
+ sw_point = OpenStudio::Point3d.new(sw_point.x, sw_point.y, num_floors * sw_point.z + rim_joist_height)
546
+ se_point = OpenStudio::Point3d.new(se_point.x, se_point.y, num_floors * se_point.z + rim_joist_height)
523
547
  end
524
548
 
525
549
  garage_attic_height = (ne_point.x - nw_point.x) / 2 * roof_pitch
@@ -540,8 +564,8 @@ class Geometry
540
564
  roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, garage_attic_height + wall_height)
541
565
  end
542
566
  else
543
- roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, num_floors * wall_height + garage_attic_height)
544
- roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, num_floors * wall_height + garage_attic_height)
567
+ roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, num_floors * wall_height + garage_attic_height + rim_joist_height)
568
+ roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, num_floors * wall_height + garage_attic_height + rim_joist_height)
545
569
  end
546
570
 
547
571
  polygon_w_roof = make_polygon(nw_point, sw_point, roof_s_point, roof_n_point)
@@ -562,31 +586,29 @@ class Geometry
562
586
  wall_s.setOutsideBoundaryCondition('Outdoors')
563
587
 
564
588
  garage_attic_space = OpenStudio::Model::Space.new(model)
565
- garage_attic_space_name = 'garage attic space'
566
- garage_attic_space.setName(garage_attic_space_name)
567
589
  deck_w.setSpace(garage_attic_space)
568
590
  deck_e.setSpace(garage_attic_space)
569
591
  wall_n.setSpace(garage_attic_space)
570
592
  wall_s.setSpace(garage_attic_space)
571
593
 
572
594
  if attic_type == HPXML::AtticTypeConditioned
573
- garage_attic_space_type_name = 'living space'
595
+ garage_attic_space_name = attic_space_name
574
596
  garage_attic_space.setThermalZone(living_zone)
575
597
  else
576
598
  if num_floors > 1
577
- garage_attic_space_type_name = attic_space_type_name
599
+ garage_attic_space_name = attic_space_name
578
600
  garage_attic_space.setThermalZone(attic_zone)
579
601
  else
580
- garage_attic_space_type_name = 'garage'
602
+ garage_attic_space_name = garage_space_name
581
603
  garage_attic_space.setThermalZone(garage_zone)
582
604
  end
583
605
  end
584
606
 
585
607
  surface.createAdjacentSurface(garage_attic_space) # garage attic floor
608
+ garage_attic_space.setName(garage_attic_space_name)
586
609
  garage_attic_space_type = OpenStudio::Model::SpaceType.new(model)
587
- garage_attic_space_type.setStandardsSpaceType(garage_attic_space_type_name)
610
+ garage_attic_space_type.setStandardsSpaceType(garage_attic_space_name)
588
611
  garage_attic_space.setSpaceType(garage_attic_space_type)
589
- runner.registerInfo("Set #{garage_attic_space_name}.")
590
612
 
591
613
  # put all of the spaces in the model into a vector
592
614
  spaces = OpenStudio::Model::SpaceVector.new
@@ -622,15 +644,45 @@ class Geometry
622
644
 
623
645
  garage_attic_space.remove
624
646
 
647
+ # remove other unused surfaces
648
+ # TODO: remove this once geometry methods are fixed in openstudio 3.x
649
+ attic_space.surfaces.each do |surface1|
650
+ next if surface1.surfaceType != 'RoofCeiling'
651
+
652
+ attic_space.surfaces.each do |surface2|
653
+ next if surface2.surfaceType != 'RoofCeiling'
654
+ next if surface1 == surface2
655
+
656
+ if has_same_vertices(surface1, surface2)
657
+ surface1.remove
658
+ surface2.remove
659
+ end
660
+ end
661
+ end
662
+
625
663
  break
626
664
  end
627
665
  end
628
666
 
667
+ garage_spaces = get_garage_spaces(model.getSpaces)
668
+
629
669
  # set foundation outside boundary condition to Kiva "foundation"
630
670
  model.getSurfaces.each do |surface|
631
- next if surface.outsideBoundaryCondition.downcase != 'ground'
671
+ if surface.outsideBoundaryCondition.downcase == 'ground'
672
+ surface.setOutsideBoundaryCondition('Foundation')
673
+ elsif (UnitConversions.convert(rim_joist_height, 'm', 'ft') - get_surface_height(surface)).abs < 0.001
674
+ next if surface.surfaceType.downcase != 'wall'
632
675
 
633
- surface.setOutsideBoundaryCondition('Foundation')
676
+ garage_spaces.each do |garage_space|
677
+ garage_space.surfaces.each do |garage_surface|
678
+ next if garage_surface.surfaceType.downcase != 'floor'
679
+
680
+ if get_walls_connected_to_floor([surface], garage_surface, false).include? surface
681
+ surface.setOutsideBoundaryCondition('Foundation')
682
+ end
683
+ end
684
+ end
685
+ end
634
686
  end
635
687
 
636
688
  # set foundation walls adjacent to garage to adiabatic
@@ -641,7 +693,7 @@ class Geometry
641
693
 
642
694
  foundation_walls << surface
643
695
  end
644
- garage_spaces = get_garage_spaces(model.getSpaces)
696
+
645
697
  garage_spaces.each do |garage_space|
646
698
  garage_space.surfaces.each do |surface|
647
699
  next if surface.surfaceType.downcase != 'floor'
@@ -656,6 +708,15 @@ class Geometry
656
708
  return true
657
709
  end
658
710
 
711
+ def self.has_same_vertices(surface1, surface2)
712
+ if getSurfaceXValues([surface1]) == getSurfaceXValues([surface2]) &&
713
+ getSurfaceYValues([surface1]) == getSurfaceYValues([surface2]) &&
714
+ getSurfaceZValues([surface1]) == getSurfaceZValues([surface2])
715
+ return true
716
+ end
717
+ return false
718
+ end
719
+
659
720
  def self.make_one_space_from_multiple_spaces(model, spaces)
660
721
  new_space = OpenStudio::Model::Space.new(model)
661
722
  spaces.each do |space|
@@ -886,39 +947,51 @@ class Geometry
886
947
  end
887
948
  end
888
949
 
950
+ # Initialize
889
951
  surface_window_area = {}
890
952
  target_facade_areas = {}
891
953
  facades.each do |facade|
892
- # Initialize
954
+ target_facade_areas[facade] = 0.0
893
955
  wall_surfaces[facade].each do |surface|
894
956
  surface_window_area[surface] = 0
895
957
  end
958
+ end
896
959
 
960
+ facades.each do |facade|
897
961
  # Calculate target window area for this facade
898
- target_facade_areas[facade] = 0.0
899
962
  if wwrs[facade] > 0
900
963
  wall_area = 0
901
964
  wall_surfaces[facade].each do |surface|
902
965
  wall_area += UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2')
903
966
  end
904
- target_facade_areas[facade] = wall_area * wwrs[facade]
967
+ target_facade_areas[facade] += wall_area * wwrs[facade]
905
968
  else
906
- target_facade_areas[facade] = window_areas[facade]
969
+ target_facade_areas[facade] += window_areas[facade]
907
970
  end
908
971
 
909
972
  next if target_facade_areas[facade] == 0
910
973
 
911
974
  if target_facade_areas[facade] < min_single_window_area
912
975
  # If the total window area for the facade is less than the minimum window area,
913
- # set all of the window area to the surface with the greatest available wall area
914
- surface = my_hash.max_by { |k, v| v }[0]
915
- surface_window_area[surface] = target_facade_areas[facade]
976
+ # set all of the window area to the surface with the greatest available wall area on any facade
977
+ surface = surface_avail_area.max_by { |k, v| v }[0]
978
+ next if get_facade_for_surface(surface) == facade
979
+ next if surface_avail_area[surface] == facade_avail_area[facade]
980
+
981
+ surface_window_area[surface] += target_facade_areas[facade]
982
+
983
+ new_facade = get_facade_for_surface(surface)
984
+ area_moved = target_facade_areas[facade]
985
+ target_facade_areas[facade] = 0
986
+ target_facade_areas[new_facade] = surface_window_area[surface]
987
+
988
+ runner.registerWarning("The #{facade} facade window area (#{area_moved.round(2)} ft2) is less than the minimum window area allowed (#{min_single_window_area.round(2)} ft2), and has been added to the #{new_facade} facade.")
916
989
  next
917
990
  end
918
991
 
919
992
  # Initial guess for wall of this facade
920
993
  wall_surfaces[facade].each do |surface|
921
- surface_window_area[surface] = surface_avail_area[surface] / facade_avail_area[facade] * target_facade_areas[facade]
994
+ surface_window_area[surface] += surface_avail_area[surface] / facade_avail_area[facade] * target_facade_areas[facade]
922
995
  end
923
996
 
924
997
  # If window area for a surface is less than the minimum window area,
@@ -954,6 +1027,7 @@ class Geometry
954
1027
  sum_window_area += surface_window_area[surface]
955
1028
  end
956
1029
  next if sum_window_area == 0
1030
+ next if target_facade_areas[facade] < sum_window_area # for cases where window area was added from different facade
957
1031
 
958
1032
  wall_surfaces[facade].each do |surface|
959
1033
  surface_window_area[surface] += surface_window_area[surface] / sum_window_area * (target_facade_areas[facade] - sum_window_area)
@@ -1041,8 +1115,6 @@ class Geometry
1041
1115
  sub_surface.setName("#{surface.name} - Skylight")
1042
1116
  sub_surface.setSurface(surface)
1043
1117
 
1044
- runner.registerInfo("Added a skylight, totaling #{skylight_area.round(1)} ft^2, to #{surface.name}.")
1045
-
1046
1118
  if not constructions[facade].nil?
1047
1119
  sub_surface.setConstruction(constructions[facade])
1048
1120
  end
@@ -1129,7 +1201,7 @@ class Geometry
1129
1201
  add_window_to_wall(surface, window_width, window_height, group_cx, group_cy, win_num, facade, constructions, model, runner)
1130
1202
  end
1131
1203
  end
1132
- runner.registerInfo("Added #{num_windows} window(s), totaling #{window_area.round(1)} ft^2, to #{surface.name}.")
1204
+
1133
1205
  return true
1134
1206
  end
1135
1207
 
@@ -1310,7 +1382,7 @@ class Geometry
1310
1382
  next unless surface.outsideBoundaryCondition.downcase == 'adiabatic'
1311
1383
 
1312
1384
  model.getSpaces.each do |potential_corridor_space|
1313
- next unless potential_corridor_space.spaceType.get.standardsSpaceType.get == 'corridor'
1385
+ next unless potential_corridor_space.spaceType.get.standardsSpaceType.get == HPXML::LocationOtherHousingUnit
1314
1386
 
1315
1387
  potential_corridor_space.surfaces.each do |potential_corridor_surface|
1316
1388
  next unless surface.reverseEqualVertices(potential_corridor_surface)
@@ -1420,8 +1492,6 @@ class Geometry
1420
1492
 
1421
1493
  if door_sub_surface.nil? && unit_has_door
1422
1494
  runner.registerWarning('Could not find appropriate surface for the door. No door was added.')
1423
- elsif not door_sub_surface.nil?
1424
- runner.registerInfo("Added #{door_area.round(1)} ft^2 door.")
1425
1495
  end
1426
1496
 
1427
1497
  return true
@@ -1449,6 +1519,7 @@ class Geometry
1449
1519
  geometry_corridor_position:,
1450
1520
  geometry_foundation_type:,
1451
1521
  geometry_foundation_height:,
1522
+ geometry_rim_joist_height:,
1452
1523
  geometry_attic_type:,
1453
1524
  geometry_roof_type:,
1454
1525
  geometry_roof_pitch:,
@@ -1463,6 +1534,7 @@ class Geometry
1463
1534
  corridor_position = geometry_corridor_position
1464
1535
  foundation_type = geometry_foundation_type
1465
1536
  foundation_height = geometry_foundation_height
1537
+ rim_joist_height = geometry_rim_joist_height
1466
1538
  attic_type = geometry_attic_type
1467
1539
  roof_type = geometry_roof_type
1468
1540
  roof_pitch = geometry_roof_pitch
@@ -1510,14 +1582,16 @@ class Geometry
1510
1582
  runner.registerError('Invalid horizontal location entered.')
1511
1583
  return false
1512
1584
  end
1585
+ if (unit_width == 1) && (horizontal_location != 'None')
1586
+ runner.registerWarning("No #{horizontal_location} location exists, setting horizontal_location to 'None'")
1587
+ horizontal_location = 'None'
1588
+ end
1513
1589
 
1514
1590
  # Convert to SI
1515
1591
  cfa = UnitConversions.convert(cfa, 'ft^2', 'm^2')
1516
1592
  wall_height = UnitConversions.convert(wall_height, 'ft', 'm')
1517
1593
  foundation_height = UnitConversions.convert(foundation_height, 'ft', 'm')
1518
-
1519
- # starting spaces
1520
- runner.registerInitialCondition("The building started with #{model.getSpaces.size} spaces.")
1594
+ rim_joist_height = UnitConversions.convert(rim_joist_height, 'ft', 'm')
1521
1595
 
1522
1596
  if (foundation_type == HPXML::FoundationTypeBasementConditioned) && (attic_type == HPXML::AtticTypeConditioned)
1523
1597
  footprint = cfa / (num_floors + 2)
@@ -1535,11 +1609,11 @@ class Geometry
1535
1609
  foundation_back_polygon = nil
1536
1610
 
1537
1611
  # create the front prototype unit
1538
- nw_point = OpenStudio::Point3d.new(0, 0, 0)
1539
- ne_point = OpenStudio::Point3d.new(x, 0, 0)
1540
- sw_point = OpenStudio::Point3d.new(0, -y, 0)
1541
- se_point = OpenStudio::Point3d.new(x, -y, 0)
1542
- living_polygon = Geometry.make_polygon(sw_point, nw_point, ne_point, se_point)
1612
+ nw_point = OpenStudio::Point3d.new(0, 0, rim_joist_height)
1613
+ ne_point = OpenStudio::Point3d.new(x, 0, rim_joist_height)
1614
+ sw_point = OpenStudio::Point3d.new(0, -y, rim_joist_height)
1615
+ se_point = OpenStudio::Point3d.new(x, -y, rim_joist_height)
1616
+ living_polygon = make_polygon(sw_point, nw_point, ne_point, se_point)
1543
1617
 
1544
1618
  # foundation
1545
1619
  if (foundation_height > 0) && foundation_front_polygon.nil?
@@ -1563,7 +1637,6 @@ class Geometry
1563
1637
  living_spaces_front << living_space
1564
1638
 
1565
1639
  # Adiabatic surfaces for walls
1566
- ##############################################################################################
1567
1640
  # Map unit location to adiabatic surfaces (#if `key` unit then make `value(s)` adiabatic)
1568
1641
  horz_hash = { 'Left' => ['right'], 'Right' => ['left'], 'Middle' => ['left', 'right'], 'None' => [] }
1569
1642
  adb_facade = horz_hash[horizontal_location]
@@ -1571,35 +1644,21 @@ class Geometry
1571
1644
  adb_facade += ['back']
1572
1645
  end
1573
1646
 
1574
- if adb_facade.include? 'left'
1575
- left_neighbor_offset = 0
1576
- end
1577
- if adb_facade.include? 'right'
1578
- right_neighbor_offset = 0
1579
- end
1580
- if adb_facade.include? 'back'
1581
- back_neighbor_offset = 0
1582
- end
1583
- if adb_facade.include? 'front'
1584
- front_neighbor_offset = 0
1585
- end
1586
-
1587
1647
  adiabatic_surf = adb_facade
1588
1648
  # Make surfaces adiabatic
1589
1649
  model.getSpaces.each do |space|
1590
1650
  space.surfaces.each do |surface|
1591
- os_facade = Geometry.get_facade_for_surface(surface)
1651
+ os_facade = get_facade_for_surface(surface)
1592
1652
  next unless surface.surfaceType == 'Wall'
1593
1653
  next unless adb_facade.include? os_facade
1594
1654
  x_ft = UnitConversions.convert(x, 'm', 'ft')
1595
- max_x = Geometry.getSurfaceXValues([surface]).max
1596
- min_x = Geometry.getSurfaceXValues([surface]).min
1655
+ max_x = getSurfaceXValues([surface]).max
1656
+ min_x = getSurfaceXValues([surface]).min
1597
1657
  next if ((max_x - x_ft).abs >= 0.01) && (min_x > 0)
1598
1658
 
1599
1659
  surface.setOutsideBoundaryCondition('Adiabatic')
1600
1660
  end
1601
1661
  end
1602
- ##############################################################################################
1603
1662
 
1604
1663
  attic_space_front = nil
1605
1664
  attic_space_back = nil
@@ -1611,7 +1670,7 @@ class Geometry
1611
1670
  new_living_space.setName("living space|story #{story}")
1612
1671
  new_living_space.setSpaceType(living_space_type)
1613
1672
 
1614
- m = Geometry.initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
1673
+ m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
1615
1674
  m[2, 3] = wall_height * (story - 1)
1616
1675
  new_living_space.setTransformation(OpenStudio::Transformation.new(m))
1617
1676
  new_living_space.setThermalZone(living_zone)
@@ -1621,7 +1680,7 @@ class Geometry
1621
1680
 
1622
1681
  # attic
1623
1682
  if roof_type != 'flat'
1624
- attic_space = get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type)
1683
+ attic_space = get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height)
1625
1684
  if attic_type == HPXML::AtticTypeConditioned
1626
1685
  attic_space.setName("#{attic_type} space")
1627
1686
  attic_space.setThermalZone(living_zone)
@@ -1633,10 +1692,6 @@ class Geometry
1633
1692
  end
1634
1693
  end
1635
1694
 
1636
- # create the unit
1637
- unit_spaces_hash = {}
1638
- unit_spaces_hash[1] = [living_spaces_front, 1]
1639
-
1640
1695
  # foundation
1641
1696
  if foundation_height > 0
1642
1697
  foundation_spaces = []
@@ -1645,7 +1700,7 @@ class Geometry
1645
1700
  foundation_space_front = []
1646
1701
  foundation_space = OpenStudio::Model::Space::fromFloorPrint(foundation_front_polygon, foundation_height, model)
1647
1702
  foundation_space = foundation_space.get
1648
- m = Geometry.initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
1703
+ m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
1649
1704
  m[2, 3] = foundation_height
1650
1705
  foundation_space.changeTransformation(OpenStudio::Transformation.new(m))
1651
1706
  foundation_space.setXOrigin(0)
@@ -1654,20 +1709,19 @@ class Geometry
1654
1709
 
1655
1710
  if foundation_type == HPXML::FoundationTypeBasementConditioned
1656
1711
  foundation_zone = OpenStudio::Model::ThermalZone.new(model)
1657
- foundation_space.setName("#{foundation_type} space")
1658
- foundation_zone.setName("#{foundation_type} zone")
1712
+ foundation_space.setName(HPXML::FoundationTypeBasementConditioned)
1713
+ foundation_zone.setName(HPXML::FoundationTypeBasementConditioned)
1659
1714
  foundation_space.setThermalZone(foundation_zone)
1660
1715
  foundation_space_type = OpenStudio::Model::SpaceType.new(model)
1661
- foundation_space_type.setStandardsSpaceType('living space')
1716
+ foundation_space_type.setStandardsSpaceType(HPXML::LocationBasementConditioned)
1662
1717
  foundation_space.setSpaceType(foundation_space_type)
1663
1718
  end
1664
1719
 
1665
1720
  foundation_space_front << foundation_space
1666
1721
  foundation_spaces << foundation_space
1667
1722
 
1668
- if foundation_type == HPXML::FoundationTypeBasementConditioned
1669
- unit_spaces_hash[1][0] << foundation_space
1670
- end
1723
+ # Rim Joist
1724
+ add_rim_joist(model, foundation_front_polygon, foundation_space, rim_joist_height, 0)
1671
1725
 
1672
1726
  # put all of the spaces in the model into a vector
1673
1727
  spaces = OpenStudio::Model::SpaceVector.new
@@ -1680,46 +1734,42 @@ class Geometry
1680
1734
  OpenStudio::Model.matchSurfaces(spaces)
1681
1735
 
1682
1736
  if [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include? foundation_type
1683
- foundation_space = Geometry.make_one_space_from_multiple_spaces(model, foundation_spaces)
1737
+ # create foundation zone
1738
+ foundation_zone = OpenStudio::Model::ThermalZone.new(model)
1739
+
1740
+ foundation_space = make_one_space_from_multiple_spaces(model, foundation_spaces)
1684
1741
  if foundation_type == HPXML::FoundationTypeCrawlspaceVented
1685
- foundation_space_type_name = 'vented crawlspace'
1742
+ foundation_space_name = HPXML::LocationCrawlspaceVented
1686
1743
  elsif foundation_type == HPXML::FoundationTypeCrawlspaceUnvented
1687
- foundation_space_type_name = 'unvented crawlspace'
1744
+ foundation_space_name = HPXML::LocationCrawlspaceUnvented
1688
1745
  elsif foundation_type == HPXML::FoundationTypeBasementUnconditioned
1689
- foundation_space_type_name = 'unconditioned basement'
1690
- end
1691
- if [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented].include? foundation_type
1692
- foundation_space.setName("#{foundation_type} space")
1693
- foundation_zone = OpenStudio::Model::ThermalZone.new(model)
1694
- foundation_zone.setName('crawl zone')
1695
- foundation_space.setThermalZone(foundation_zone)
1696
- foundation_space_type = OpenStudio::Model::SpaceType.new(model)
1697
- foundation_space_type.setStandardsSpaceType(foundation_space_type_name)
1698
- foundation_space.setSpaceType(foundation_space_type)
1699
- elsif foundation_type == HPXML::FoundationTypeBasementUnconditioned
1700
- foundation_space.setName("#{foundation_type} space")
1701
- foundation_zone = OpenStudio::Model::ThermalZone.new(model)
1702
- foundation_zone.setName("#{foundation_type} zone")
1703
- foundation_space.setThermalZone(foundation_zone)
1704
- foundation_space_type = OpenStudio::Model::SpaceType.new(model)
1705
- foundation_space_type.setStandardsSpaceType(foundation_space_type_name)
1706
- foundation_space.setSpaceType(foundation_space_type)
1746
+ foundation_space_name = HPXML::LocationBasementUnconditioned
1707
1747
  end
1748
+ foundation_zone.setName(foundation_space_name)
1749
+ foundation_space.setName(foundation_space_name)
1750
+ foundation_space_type = OpenStudio::Model::SpaceType.new(model)
1751
+ foundation_space_type.setStandardsSpaceType(foundation_space_name)
1752
+ foundation_space.setSpaceType(foundation_space_type)
1753
+
1754
+ # set these to the foundation zone
1755
+ foundation_space.setThermalZone(foundation_zone)
1708
1756
  end
1709
1757
 
1710
1758
  # set foundation walls to ground
1711
1759
  spaces = model.getSpaces
1712
1760
  spaces.each do |space|
1713
- next unless Geometry.get_space_floor_z(space) + UnitConversions.convert(space.zOrigin, 'm', 'ft') < 0
1761
+ next unless get_space_floor_z(space) + UnitConversions.convert(space.zOrigin, 'm', 'ft') < 0
1714
1762
  surfaces = space.surfaces
1715
1763
  surfaces.each do |surface|
1716
1764
  next if surface.surfaceType.downcase != 'wall'
1717
1765
 
1718
- os_facade = Geometry.get_facade_for_surface(surface)
1766
+ os_facade = get_facade_for_surface(surface)
1719
1767
  if adb_facade.include? os_facade
1720
1768
  surface.setOutsideBoundaryCondition('Adiabatic')
1721
- else
1769
+ elsif getSurfaceZValues([surface]).min < 0
1722
1770
  surface.setOutsideBoundaryCondition('Foundation')
1771
+ else
1772
+ surface.setOutsideBoundaryCondition('Outdoors')
1723
1773
  end
1724
1774
  end
1725
1775
  end
@@ -1738,47 +1788,47 @@ class Geometry
1738
1788
 
1739
1789
  if [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(attic_type) && (roof_type != 'flat')
1740
1790
  if offset == 0
1741
- # x *= num_units
1742
- # if has_rear_units
1743
- # x /= 2
1744
- # end
1745
1791
  attic_spaces.each do |attic_space|
1746
1792
  attic_space.remove
1747
1793
  end
1748
- attic_space = get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type, has_rear_units)
1794
+ attic_space = get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height, has_rear_units)
1749
1795
  else
1750
- attic_space = Geometry.make_one_space_from_multiple_spaces(model, attic_spaces)
1796
+ attic_space = make_one_space_from_multiple_spaces(model, attic_spaces)
1751
1797
  end
1752
- attic_space_name = "#{attic_type} space"
1753
- attic_space.setName(attic_space_name)
1754
- attic_zone = OpenStudio::Model::ThermalZone.new(model)
1755
- attic_zone.setName("#{attic_type} zone")
1756
- attic_space.setThermalZone(attic_zone)
1757
- if attic_type == HPXML::AtticTypeVented
1758
- attic_space_type_name = 'vented attic'
1759
- else
1760
- attic_space_type_name = 'unvented attic'
1798
+
1799
+ # set these to the attic zone
1800
+ if (attic_type == HPXML::AtticTypeVented) || (attic_type == HPXML::AtticTypeUnvented)
1801
+ # create attic zone
1802
+ attic_zone = OpenStudio::Model::ThermalZone.new(model)
1803
+ attic_space.setThermalZone(attic_zone)
1804
+ if attic_type == HPXML::AtticTypeVented
1805
+ attic_space_name = HPXML::LocationAtticVented
1806
+ elsif attic_type == HPXML::AtticTypeUnvented
1807
+ attic_space_name = HPXML::LocationAtticUnvented
1808
+ end
1809
+ attic_zone.setName(attic_space_name)
1810
+ elsif attic_type == HPXML::AtticTypeConditioned
1811
+ attic_space.setThermalZone(living_zone)
1812
+ attic_space_name = HPXML::LocationLivingSpace
1761
1813
  end
1814
+ attic_space.setName(attic_space_name)
1762
1815
  attic_space_type = OpenStudio::Model::SpaceType.new(model)
1763
- attic_space_type.setStandardsSpaceType(attic_space_type_name)
1816
+ attic_space_type.setStandardsSpaceType(attic_space_name)
1764
1817
  attic_space.setSpaceType(attic_space_type)
1765
- end
1766
1818
 
1767
- # Adiabatic surfaces for attic walls
1768
- ################################################################
1769
- # Make surfaces adiabatic
1770
- attic_space.surfaces.each do |surface|
1771
- os_facade = Geometry.get_facade_for_surface(surface)
1772
- next unless surface.surfaceType == 'Wall'
1773
- next unless adb_facade.include? os_facade
1774
- x_ft = UnitConversions.convert(x, 'm', 'ft')
1775
- max_x = Geometry.getSurfaceXValues([surface]).max
1776
- min_x = Geometry.getSurfaceXValues([surface]).min
1777
- next if ((max_x - x_ft).abs >= 0.01) && (min_x > 0)
1819
+ # Adiabatic surfaces for attic walls
1820
+ attic_space.surfaces.each do |surface|
1821
+ os_facade = get_facade_for_surface(surface)
1822
+ next unless surface.surfaceType == 'Wall'
1823
+ next unless adb_facade.include? os_facade
1824
+ x_ft = UnitConversions.convert(x, 'm', 'ft')
1825
+ max_x = getSurfaceXValues([surface]).max
1826
+ min_x = getSurfaceXValues([surface]).min
1827
+ next if ((max_x - x_ft).abs >= 0.01) && (min_x > 0)
1778
1828
 
1779
- surface.setOutsideBoundaryCondition('Adiabatic')
1829
+ surface.setOutsideBoundaryCondition('Adiabatic')
1830
+ end
1780
1831
  end
1781
- ################################################################
1782
1832
 
1783
1833
  # put all of the spaces in the model into a vector
1784
1834
  spaces = OpenStudio::Model::SpaceVector.new
@@ -1800,108 +1850,61 @@ class Geometry
1800
1850
  return true
1801
1851
  end
1802
1852
 
1803
- def self.get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type, has_rear_units = false)
1853
+ def self.get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height, has_rear_units = false)
1804
1854
  y_rear = 0
1805
- if has_rear_units
1806
- y_tot = y * 2
1807
- y_peak = 0
1808
- x_tot = (x * num_units) / 2
1809
- else
1810
- y_peak = -y / 2
1811
- y_tot = y
1812
- x_tot = x * num_units
1813
- end
1814
- # if y > 0
1815
- nw_point = OpenStudio::Point3d.new(0, 0, wall_height * num_floors)
1816
- ne_point = OpenStudio::Point3d.new(x, 0, wall_height * num_floors)
1817
- sw_point = OpenStudio::Point3d.new(0, -y, wall_height * num_floors)
1818
- se_point = OpenStudio::Point3d.new(x, -y, wall_height * num_floors)
1819
- # else
1820
- # nw_point = OpenStudio::Point3d.new(0, -y, wall_height * num_floors)
1821
- # ne_point = OpenStudio::Point3d.new(x, -y, wall_height * num_floors)
1822
- # sw_point = OpenStudio::Point3d.new(0, 0, wall_height * num_floors)
1823
- # se_point = OpenStudio::Point3d.new(x, 0, wall_height * num_floors)
1824
- # end
1825
- attic_polygon = Geometry.make_polygon(sw_point, nw_point, ne_point, se_point)
1826
-
1827
- # if y_tot >= x_tot
1828
- # attic_height = (x_tot / 2.0) * roof_pitch
1829
- # else
1830
- # attic_height = (y_tot / 2.0) * roof_pitch
1831
- # end
1832
-
1833
- attic_height = (y_tot / 2.0) * roof_pitch # Roof always has same orientation
1855
+ y_peak = -y / 2
1856
+ y_tot = y
1857
+ x_tot = x * num_units
1858
+
1859
+ nw_point = OpenStudio::Point3d.new(0, 0, wall_height * num_floors + rim_joist_height)
1860
+ ne_point = OpenStudio::Point3d.new(x, 0, wall_height * num_floors + rim_joist_height)
1861
+ sw_point = OpenStudio::Point3d.new(0, -y, wall_height * num_floors + rim_joist_height)
1862
+ se_point = OpenStudio::Point3d.new(x, -y, wall_height * num_floors + rim_joist_height)
1863
+ attic_polygon = make_polygon(sw_point, nw_point, ne_point, se_point)
1864
+
1865
+ attic_height = (y_tot / 2.0) * roof_pitch + rim_joist_height # Roof always has same orientation
1834
1866
 
1835
1867
  side_type = nil
1836
1868
  if roof_type == 'gable'
1837
- # if y > 0
1838
- # if x <= (y + y_rear)
1839
- # roof_n_point = OpenStudio::Point3d.new(x / 2.0, y_rear, wall_height * num_floors + attic_height)
1840
- # roof_s_point = OpenStudio::Point3d.new(x / 2.0, -y, wall_height * num_floors + attic_height)
1841
- # polygon_w_roof = Geometry.make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1842
- # polygon_e_roof = Geometry.make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1843
- # polygon_s_wall = Geometry.make_polygon(roof_s_point, sw_point, se_point)
1844
- # polygon_n_wall = Geometry.make_polygon(roof_n_point, ne_point, nw_point)
1845
- # else
1846
- # roof_w_point = OpenStudio::Point3d.new(0, (y_rear - y) / 2.0, wall_height * num_floors + attic_height)
1847
- # roof_e_point = OpenStudio::Point3d.new(x, (y_rear - y) / 2.0, wall_height * num_floors + attic_height)
1848
1869
  roof_w_point = OpenStudio::Point3d.new(0, y_peak, wall_height * num_floors + attic_height)
1849
1870
  roof_e_point = OpenStudio::Point3d.new(x, y_peak, wall_height * num_floors + attic_height)
1850
- polygon_w_roof = Geometry.make_polygon(roof_w_point, roof_e_point, ne_point, nw_point)
1851
- polygon_e_roof = Geometry.make_polygon(roof_e_point, roof_w_point, sw_point, se_point)
1852
- polygon_s_wall = Geometry.make_polygon(roof_w_point, nw_point, sw_point)
1853
- polygon_n_wall = Geometry.make_polygon(roof_e_point, se_point, ne_point)
1854
- # end
1855
- # else
1856
- # if x <= y.abs
1857
- # roof_n_point = OpenStudio::Point3d.new(x / 2.0, -y, wall_height * num_floors + attic_height)
1858
- # roof_s_point = OpenStudio::Point3d.new(x / 2.0, 0, wall_height * num_floors + attic_height)
1859
- # polygon_w_roof = Geometry.make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1860
- # polygon_e_roof = Geometry.make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1861
- # polygon_s_wall = Geometry.make_polygon(roof_s_point, sw_point, se_point)
1862
- # polygon_n_wall = Geometry.make_polygon(roof_n_point, ne_point, nw_point)
1863
- # else
1864
- # roof_w_point = OpenStudio::Point3d.new(0, -y / 2.0, wall_height * num_floors + attic_height)
1865
- # roof_e_point = OpenStudio::Point3d.new(x, -y / 2.0, wall_height * num_floors + attic_height)
1866
- # polygon_w_roof = Geometry.make_polygon(roof_w_point, roof_e_point, ne_point, nw_point)
1867
- # polygon_e_roof = Geometry.make_polygon(roof_e_point, roof_w_point, sw_point, se_point)
1868
- # polygon_s_wall = Geometry.make_polygon(roof_w_point, nw_point, sw_point)
1869
- # polygon_n_wall = Geometry.make_polygon(roof_e_point, se_point, ne_point)
1870
- # end
1871
- # end
1871
+ polygon_w_roof = make_polygon(roof_w_point, roof_e_point, ne_point, nw_point)
1872
+ polygon_e_roof = make_polygon(roof_e_point, roof_w_point, sw_point, se_point)
1873
+ polygon_s_wall = make_polygon(roof_w_point, nw_point, sw_point)
1874
+ polygon_n_wall = make_polygon(roof_e_point, se_point, ne_point)
1872
1875
  side_type = 'Wall'
1873
- elsif roof_type == 'hip' # TO-DO: not yet implemented for single unit approach
1876
+ elsif roof_type == 'hip'
1874
1877
  if y > 0
1875
1878
  if x <= (y + y_rear)
1876
1879
  roof_n_point = OpenStudio::Point3d.new(x / 2.0, y_rear - x / 2.0, wall_height * num_floors + attic_height)
1877
1880
  roof_s_point = OpenStudio::Point3d.new(x / 2.0, -y + x / 2.0, wall_height * num_floors + attic_height)
1878
- polygon_w_roof = Geometry.make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1879
- polygon_e_roof = Geometry.make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1880
- polygon_s_wall = Geometry.make_polygon(roof_s_point, sw_point, se_point)
1881
- polygon_n_wall = Geometry.make_polygon(roof_n_point, ne_point, nw_point)
1881
+ polygon_w_roof = make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1882
+ polygon_e_roof = make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1883
+ polygon_s_wall = make_polygon(roof_s_point, sw_point, se_point)
1884
+ polygon_n_wall = make_polygon(roof_n_point, ne_point, nw_point)
1882
1885
  else
1883
1886
  roof_w_point = OpenStudio::Point3d.new((y + y_rear) / 2.0, (y_rear - y) / 2.0, wall_height * num_floors + attic_height)
1884
1887
  roof_e_point = OpenStudio::Point3d.new(x - (y + y_rear) / 2.0, (y_rear - y) / 2.0, wall_height * num_floors + attic_height)
1885
- polygon_w_roof = Geometry.make_polygon(roof_w_point, sw_point, se_point, roof_e_point)
1886
- polygon_e_roof = Geometry.make_polygon(roof_e_point, ne_point, nw_point, roof_w_point)
1887
- polygon_s_wall = Geometry.make_polygon(roof_e_point, se_point, ne_point)
1888
- polygon_n_wall = Geometry.make_polygon(roof_w_point, nw_point, sw_point)
1888
+ polygon_w_roof = make_polygon(roof_w_point, sw_point, se_point, roof_e_point)
1889
+ polygon_e_roof = make_polygon(roof_e_point, ne_point, nw_point, roof_w_point)
1890
+ polygon_s_wall = make_polygon(roof_e_point, se_point, ne_point)
1891
+ polygon_n_wall = make_polygon(roof_w_point, nw_point, sw_point)
1889
1892
  end
1890
1893
  else
1891
1894
  if x <= y.abs
1892
1895
  roof_n_point = OpenStudio::Point3d.new(x / 2.0, -y - x / 2.0, wall_height * num_floors + attic_height)
1893
1896
  roof_s_point = OpenStudio::Point3d.new(x / 2.0, x / 2.0, wall_height * num_floors + attic_height)
1894
- polygon_w_roof = Geometry.make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1895
- polygon_e_roof = Geometry.make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1896
- polygon_s_wall = Geometry.make_polygon(roof_s_point, sw_point, se_point)
1897
- polygon_n_wall = Geometry.make_polygon(roof_n_point, ne_point, nw_point)
1897
+ polygon_w_roof = make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1898
+ polygon_e_roof = make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1899
+ polygon_s_wall = make_polygon(roof_s_point, sw_point, se_point)
1900
+ polygon_n_wall = make_polygon(roof_n_point, ne_point, nw_point)
1898
1901
  else
1899
1902
  roof_w_point = OpenStudio::Point3d.new(-y / 2.0, -y / 2.0, wall_height * num_floors + attic_height)
1900
1903
  roof_e_point = OpenStudio::Point3d.new(x + y / 2.0, -y / 2.0, wall_height * num_floors + attic_height)
1901
- polygon_w_roof = Geometry.make_polygon(roof_w_point, sw_point, se_point, roof_e_point)
1902
- polygon_e_roof = Geometry.make_polygon(roof_e_point, ne_point, nw_point, roof_w_point)
1903
- polygon_s_wall = Geometry.make_polygon(roof_e_point, se_point, ne_point)
1904
- polygon_n_wall = Geometry.make_polygon(roof_w_point, nw_point, sw_point)
1904
+ polygon_w_roof = make_polygon(roof_w_point, sw_point, se_point, roof_e_point)
1905
+ polygon_e_roof = make_polygon(roof_e_point, ne_point, nw_point, roof_w_point)
1906
+ polygon_s_wall = make_polygon(roof_e_point, se_point, ne_point)
1907
+ polygon_n_wall = make_polygon(roof_w_point, nw_point, sw_point)
1905
1908
  end
1906
1909
  end
1907
1910
  side_type = 'RoofCeiling'
@@ -1912,11 +1915,7 @@ class Geometry
1912
1915
  surface_floor.setOutsideBoundaryCondition('Surface')
1913
1916
  surface_w_roof = OpenStudio::Model::Surface.new(polygon_w_roof, model)
1914
1917
  surface_w_roof.setSurfaceType('RoofCeiling')
1915
- if has_rear_units
1916
- surface_w_roof.setOutsideBoundaryCondition('Adiabatic') ###
1917
- else
1918
- surface_w_roof.setOutsideBoundaryCondition('Outdoors') ###
1919
- end
1918
+ surface_w_roof.setOutsideBoundaryCondition('Outdoors')
1920
1919
  surface_e_roof = OpenStudio::Model::Surface.new(polygon_e_roof, model)
1921
1920
  surface_e_roof.setSurfaceType('RoofCeiling')
1922
1921
  surface_e_roof.setOutsideBoundaryCondition('Outdoors')
@@ -1955,6 +1954,7 @@ class Geometry
1955
1954
  geometry_balcony_depth:,
1956
1955
  geometry_foundation_type:,
1957
1956
  geometry_foundation_height:,
1957
+ geometry_rim_joist_height:,
1958
1958
  **remainder)
1959
1959
 
1960
1960
  cfa = geometry_cfa
@@ -1963,7 +1963,7 @@ class Geometry
1963
1963
  num_floors = geometry_num_floors_above_grade
1964
1964
  aspect_ratio = geometry_aspect_ratio
1965
1965
  level = geometry_level.get
1966
- horizontal_location = geometry_horizontal_location.get
1966
+ horz_location = geometry_horizontal_location.get
1967
1967
  corridor_position = geometry_corridor_position
1968
1968
  corridor_width = geometry_corridor_width
1969
1969
  inset_width = geometry_inset_width
@@ -1972,20 +1972,27 @@ class Geometry
1972
1972
  balcony_depth = geometry_balcony_depth
1973
1973
  foundation_type = geometry_foundation_type
1974
1974
  foundation_height = geometry_foundation_height
1975
+ rim_joist_height = geometry_rim_joist_height
1975
1976
 
1976
1977
  if level != 'Bottom'
1977
1978
  foundation_type = HPXML::LocationOtherHousingUnit
1978
1979
  foundation_height = 0.0
1980
+ rim_joist_height = 0.0
1979
1981
  end
1980
1982
 
1981
1983
  num_units_per_floor = num_units / num_floors
1982
1984
  num_units_per_floor_actual = num_units_per_floor
1985
+ above_ground_floors = num_floors
1983
1986
 
1984
1987
  if (num_floors > 1) && (level != 'Bottom') && (foundation_height != 0.0)
1985
1988
  runner.registerWarning('Unit is not on the bottom floor, setting foundation height to 0.')
1986
1989
  foundation_height = 0.0
1987
1990
  end
1988
1991
 
1992
+ if num_floors == 1
1993
+ level = 'Bottom'
1994
+ end
1995
+
1989
1996
  if (num_units_per_floor % 2 == 0) && ((corridor_position == 'Double-Loaded Interior') || (corridor_position == 'Double Exterior'))
1990
1997
  unit_depth = 2
1991
1998
  unit_width = num_units_per_floor / 2
@@ -2031,7 +2038,15 @@ class Geometry
2031
2038
  runner.registerWarning('Specified a balcony, but there is no inset.')
2032
2039
  balcony_depth = 0
2033
2040
  end
2034
- if (unit_width < 3) && (horizontal_location == 'Middle')
2041
+ if (unit_width == 1) && (horz_location != 'None')
2042
+ runner.registerWarning("No #{horz_location} location exists, setting horizontal location to 'None'")
2043
+ horz_location = 'None'
2044
+ end
2045
+ if (unit_width > 1) && (horz_location == 'None')
2046
+ runner.registerError('Specified incompatible horizontal location for the corridor and unit configuration.')
2047
+ return false
2048
+ end
2049
+ if (unit_width < 3) && (horz_location == 'Middle')
2035
2050
  runner.registerError('No middle horizontal location exists.')
2036
2051
  return false
2037
2052
  end
@@ -2040,52 +2055,57 @@ class Geometry
2040
2055
  cfa = UnitConversions.convert(cfa, 'ft^2', 'm^2')
2041
2056
  wall_height = UnitConversions.convert(wall_height, 'ft', 'm')
2042
2057
  foundation_height = UnitConversions.convert(foundation_height, 'ft', 'm')
2043
-
2044
- # starting spaces
2045
- runner.registerInitialCondition("The building started with #{model.getSpaces.size} spaces.")
2058
+ corridor_width = UnitConversions.convert(corridor_width, 'ft', 'm')
2059
+ inset_width = UnitConversions.convert(inset_width, 'ft', 'm')
2060
+ inset_depth = UnitConversions.convert(inset_depth, 'ft', 'm')
2061
+ balcony_depth = UnitConversions.convert(balcony_depth, 'ft', 'm')
2062
+ rim_joist_height = UnitConversions.convert(rim_joist_height, 'ft', 'm')
2046
2063
 
2047
2064
  # calculate the dimensions of the unit
2048
2065
  footprint = cfa + inset_width * inset_depth
2049
2066
  x = Math.sqrt(footprint / aspect_ratio)
2050
2067
  y = footprint / x
2051
2068
 
2069
+ story_hash = { 'Bottom' => 0, 'Middle' => 1, 'Top' => num_floors - 1 }
2070
+ z = wall_height * story_hash[level]
2071
+
2052
2072
  foundation_corr_polygon = nil
2053
2073
  foundation_front_polygon = nil
2054
2074
  foundation_back_polygon = nil
2055
2075
 
2056
2076
  # create the front prototype unit footprint
2057
- nw_point = OpenStudio::Point3d.new(0, 0, 0)
2058
- ne_point = OpenStudio::Point3d.new(x, 0, 0)
2059
- sw_point = OpenStudio::Point3d.new(0, -y, 0)
2060
- se_point = OpenStudio::Point3d.new(x, -y, 0)
2077
+ nw_point = OpenStudio::Point3d.new(0, 0, rim_joist_height)
2078
+ ne_point = OpenStudio::Point3d.new(x, 0, rim_joist_height)
2079
+ sw_point = OpenStudio::Point3d.new(0, -y, rim_joist_height)
2080
+ se_point = OpenStudio::Point3d.new(x, -y, rim_joist_height)
2061
2081
 
2062
2082
  if inset_width * inset_depth > 0
2063
2083
  if inset_position == 'Right'
2064
2084
  # unit footprint
2065
- inset_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y, 0)
2066
- front_point = OpenStudio::Point3d.new(x - inset_width, -y, 0)
2067
- side_point = OpenStudio::Point3d.new(x, inset_depth - y, 0)
2085
+ inset_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y, rim_joist_height)
2086
+ front_point = OpenStudio::Point3d.new(x - inset_width, -y, rim_joist_height)
2087
+ side_point = OpenStudio::Point3d.new(x, inset_depth - y, rim_joist_height)
2068
2088
  living_polygon = make_polygon(sw_point, nw_point, ne_point, side_point, inset_point, front_point)
2069
2089
  # unit balcony
2070
2090
  if balcony_depth > 0
2071
- inset_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y, wall_height)
2072
- side_point = OpenStudio::Point3d.new(x, inset_depth - y, wall_height)
2073
- se_point = OpenStudio::Point3d.new(x, inset_depth - y - balcony_depth, wall_height)
2074
- front_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y - balcony_depth, wall_height)
2091
+ inset_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y, wall_height + rim_joist_height)
2092
+ side_point = OpenStudio::Point3d.new(x, inset_depth - y, wall_height + rim_joist_height)
2093
+ se_point = OpenStudio::Point3d.new(x, inset_depth - y - balcony_depth, wall_height + rim_joist_height)
2094
+ front_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y - balcony_depth, wall_height + rim_joist_height)
2075
2095
  shading_surface = OpenStudio::Model::ShadingSurface.new(OpenStudio::Point3dVector.new([front_point, se_point, side_point, inset_point]), model)
2076
2096
  end
2077
2097
  else
2078
2098
  # unit footprint
2079
- inset_point = OpenStudio::Point3d.new(inset_width, inset_depth - y, 0)
2080
- front_point = OpenStudio::Point3d.new(inset_width, -y, 0)
2081
- side_point = OpenStudio::Point3d.new(0, inset_depth - y, 0)
2099
+ inset_point = OpenStudio::Point3d.new(inset_width, inset_depth - y, rim_joist_height)
2100
+ front_point = OpenStudio::Point3d.new(inset_width, -y, rim_joist_height)
2101
+ side_point = OpenStudio::Point3d.new(0, inset_depth - y, rim_joist_height)
2082
2102
  living_polygon = make_polygon(side_point, nw_point, ne_point, se_point, front_point, inset_point)
2083
2103
  # unit balcony
2084
2104
  if balcony_depth > 0
2085
- inset_point = OpenStudio::Point3d.new(inset_width, inset_depth - y, wall_height)
2086
- side_point = OpenStudio::Point3d.new(0, inset_depth - y, wall_height)
2087
- sw_point = OpenStudio::Point3d.new(0, inset_depth - y - balcony_depth, wall_height)
2088
- front_point = OpenStudio::Point3d.new(inset_width, inset_depth - y - balcony_depth, wall_height)
2105
+ inset_point = OpenStudio::Point3d.new(inset_width, inset_depth - y, wall_height + rim_joist_height)
2106
+ side_point = OpenStudio::Point3d.new(0, inset_depth - y, wall_height + rim_joist_height)
2107
+ sw_point = OpenStudio::Point3d.new(0, inset_depth - y - balcony_depth, wall_height + rim_joist_height)
2108
+ front_point = OpenStudio::Point3d.new(inset_width, inset_depth - y - balcony_depth, wall_height + rim_joist_height)
2089
2109
  shading_surface = OpenStudio::Model::ShadingSurface.new(OpenStudio::Point3dVector.new([front_point, sw_point, side_point, inset_point]), model)
2090
2110
  end
2091
2111
  end
@@ -2120,29 +2140,23 @@ class Geometry
2120
2140
  end
2121
2141
  living_spaces_front << living_space
2122
2142
 
2123
- ##############################################################################################
2124
2143
  # Map unit location to adiabatic surfaces
2125
2144
  horz_hash = { 'Left' => ['right'], 'Right' => ['left'], 'Middle' => ['left', 'right'], 'None' => [] }
2126
2145
  level_hash = { 'Bottom' => ['RoofCeiling'], 'Top' => ['Floor'], 'Middle' => ['RoofCeiling', 'Floor'], 'None' => [] }
2127
- adb_facade = horz_hash[horizontal_location]
2146
+ adb_facade = horz_hash[horz_location]
2128
2147
  adb_level = level_hash[level]
2129
2148
 
2130
2149
  # Check levels
2131
2150
  if num_floors == 1
2132
2151
  adb_level = []
2133
2152
  end
2134
- # Check for exposed left and right facades
2135
- if (num_units_per_floor == 1) || ((num_units_per_floor == 2) && (has_rear_units == true))
2136
- adb_facade = []
2137
- end
2138
2153
  if (has_rear_units == true)
2139
2154
  adb_facade += ['back']
2140
2155
  end
2141
2156
 
2142
- adiabatic_surf = adb_facade + horz_hash[horizontal_location] + level_hash[level]
2143
- # Make surfaces adiabatic
2157
+ adiabatic_surf = adb_facade + adb_level
2158
+ # Make living space surfaces adiabatic
2144
2159
  model.getSpaces.each do |space|
2145
- # Store has_rear_units to call in the door geometry measure
2146
2160
  space.surfaces.each do |surface|
2147
2161
  os_facade = get_facade_for_surface(surface)
2148
2162
  if surface.surfaceType == 'Wall'
@@ -2158,20 +2172,20 @@ class Geometry
2158
2172
  if (adb_level.include? surface.surfaceType)
2159
2173
  surface.setOutsideBoundaryCondition('Adiabatic')
2160
2174
  end
2175
+
2161
2176
  end
2162
2177
  end
2163
2178
  end
2164
- ##############################################################################################
2165
2179
 
2166
2180
  if (corridor_position == 'Double-Loaded Interior')
2167
2181
  interior_corridor_width = corridor_width / 2 # Only half the corridor is attached to a unit
2168
2182
  # corridors
2169
2183
  if corridor_width > 0
2170
2184
  # create the prototype corridor
2171
- nw_point = OpenStudio::Point3d.new(0, interior_corridor_width, 0)
2172
- ne_point = OpenStudio::Point3d.new(x, interior_corridor_width, 0)
2173
- sw_point = OpenStudio::Point3d.new(0, 0, 0)
2174
- se_point = OpenStudio::Point3d.new(x, 0, 0)
2185
+ nw_point = OpenStudio::Point3d.new(0, interior_corridor_width, rim_joist_height)
2186
+ ne_point = OpenStudio::Point3d.new(x, interior_corridor_width, rim_joist_height)
2187
+ sw_point = OpenStudio::Point3d.new(0, 0, rim_joist_height)
2188
+ se_point = OpenStudio::Point3d.new(x, 0, rim_joist_height)
2175
2189
  corr_polygon = make_polygon(sw_point, nw_point, ne_point, se_point)
2176
2190
 
2177
2191
  if (foundation_height > 0) && foundation_corr_polygon.nil?
@@ -2180,32 +2194,24 @@ class Geometry
2180
2194
 
2181
2195
  # create corridor zone
2182
2196
  corridor_zone = OpenStudio::Model::ThermalZone.new(model)
2183
- corridor_zone.setName('corridor zone')
2197
+ corridor_zone.setName(HPXML::LocationOtherHousingUnit)
2184
2198
  corridor_space = OpenStudio::Model::Space::fromFloorPrint(corr_polygon, wall_height, model)
2185
2199
  corridor_space = corridor_space.get
2186
- corridor_space_name = 'corridor space'
2187
- corridor_space.setName(corridor_space_name)
2200
+ corridor_space.setName(HPXML::LocationOtherHousingUnit)
2188
2201
  corridor_space_type = OpenStudio::Model::SpaceType.new(model)
2189
- corridor_space_type.setStandardsSpaceType('corridor')
2202
+ corridor_space_type.setStandardsSpaceType(HPXML::LocationOtherHousingUnit)
2190
2203
 
2191
2204
  corridor_space.setSpaceType(corridor_space_type)
2192
2205
  corridor_space.setThermalZone(corridor_zone)
2193
-
2194
- # Make walls of corridor adiabatic
2195
- if has_rear_units == true
2196
- corridor_space.surfaces.each do |surface|
2197
- os_facade = get_facade_for_surface(surface)
2198
- end
2199
- end
2200
2206
  end
2201
2207
 
2202
2208
  elsif (corridor_position == 'Double Exterior') || (corridor_position == 'Single Exterior (Front)')
2203
2209
  interior_corridor_width = 0
2204
2210
  # front access
2205
- nw_point = OpenStudio::Point3d.new(0, -y, wall_height)
2206
- sw_point = OpenStudio::Point3d.new(0, -y - corridor_width, wall_height)
2207
- ne_point = OpenStudio::Point3d.new(x, -y, wall_height)
2208
- se_point = OpenStudio::Point3d.new(x, -y - corridor_width, wall_height)
2211
+ nw_point = OpenStudio::Point3d.new(0, -y, wall_height + rim_joist_height)
2212
+ sw_point = OpenStudio::Point3d.new(0, -y - corridor_width, wall_height + rim_joist_height)
2213
+ ne_point = OpenStudio::Point3d.new(x, -y, wall_height + rim_joist_height)
2214
+ se_point = OpenStudio::Point3d.new(x, -y - corridor_width, wall_height + rim_joist_height)
2209
2215
 
2210
2216
  shading_surface = OpenStudio::Model::ShadingSurface.new(OpenStudio::Point3dVector.new([sw_point, se_point, ne_point, nw_point]), model)
2211
2217
  shading_surface_group = OpenStudio::Model::ShadingSurfaceGroup.new(model)
@@ -2218,17 +2224,20 @@ class Geometry
2218
2224
  foundation_spaces = []
2219
2225
 
2220
2226
  # foundation corridor
2227
+ foundation_corridor_space = nil
2221
2228
  if (corridor_width > 0) && (corridor_position == 'Double-Loaded Interior')
2222
- corridor_space = OpenStudio::Model::Space::fromFloorPrint(foundation_corr_polygon, foundation_height, model)
2223
- corridor_space = corridor_space.get
2229
+ foundation_corridor_space = OpenStudio::Model::Space::fromFloorPrint(foundation_corr_polygon, foundation_height, model)
2230
+ foundation_corridor_space = foundation_corridor_space.get
2224
2231
  m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
2225
- m[2, 3] = foundation_height
2226
- corridor_space.changeTransformation(OpenStudio::Transformation.new(m))
2227
- corridor_space.setXOrigin(0)
2228
- corridor_space.setYOrigin(0)
2229
- corridor_space.setZOrigin(0)
2232
+ m[2, 3] = foundation_height + rim_joist_height
2233
+ foundation_corridor_space.changeTransformation(OpenStudio::Transformation.new(m))
2234
+ foundation_corridor_space.setXOrigin(0)
2235
+ foundation_corridor_space.setYOrigin(0)
2236
+ foundation_corridor_space.setZOrigin(0)
2237
+ foundation_spaces << foundation_corridor_space
2230
2238
 
2231
- foundation_spaces << corridor_space
2239
+ # Rim Joist
2240
+ add_rim_joist(model, foundation_corr_polygon, foundation_corridor_space, rim_joist_height, 0)
2232
2241
  end
2233
2242
 
2234
2243
  # foundation front
@@ -2236,7 +2245,7 @@ class Geometry
2236
2245
  foundation_space = OpenStudio::Model::Space::fromFloorPrint(foundation_front_polygon, foundation_height, model)
2237
2246
  foundation_space = foundation_space.get
2238
2247
  m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
2239
- m[2, 3] = foundation_height
2248
+ m[2, 3] = foundation_height + rim_joist_height
2240
2249
  foundation_space.changeTransformation(OpenStudio::Transformation.new(m))
2241
2250
  foundation_space.setXOrigin(0)
2242
2251
  foundation_space.setYOrigin(0)
@@ -2245,6 +2254,31 @@ class Geometry
2245
2254
  foundation_space_front << foundation_space
2246
2255
  foundation_spaces << foundation_space
2247
2256
 
2257
+ foundation_spaces.each do |foundation_space| # (corridor and foundation)
2258
+ next unless [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include?(foundation_type)
2259
+ # create foundation zone
2260
+ foundation_zone = OpenStudio::Model::ThermalZone.new(model)
2261
+
2262
+ if foundation_type == HPXML::FoundationTypeCrawlspaceVented
2263
+ foundation_space_name = HPXML::LocationCrawlspaceVented
2264
+ elsif foundation_type == HPXML::FoundationTypeCrawlspaceUnvented
2265
+ foundation_space_name = HPXML::LocationCrawlspaceUnvented
2266
+ elsif foundation_type == HPXML::FoundationTypeBasementUnconditioned
2267
+ foundation_space_name = HPXML::LocationBasementUnconditioned
2268
+ end
2269
+ foundation_zone.setName(foundation_space_name)
2270
+ foundation_space.setName(foundation_space_name)
2271
+ foundation_space_type = OpenStudio::Model::SpaceType.new(model)
2272
+ foundation_space_type.setStandardsSpaceType(foundation_space_name)
2273
+ foundation_space.setSpaceType(foundation_space_type)
2274
+
2275
+ # set these to the foundation zone
2276
+ foundation_space.setThermalZone(foundation_zone)
2277
+ end
2278
+
2279
+ # Rim Joist
2280
+ add_rim_joist(model, foundation_front_polygon, foundation_space, rim_joist_height, 0)
2281
+
2248
2282
  # put all of the spaces in the model into a vector
2249
2283
  spaces = OpenStudio::Model::SpaceVector.new
2250
2284
  model.getSpaces.each do |space|
@@ -2255,43 +2289,56 @@ class Geometry
2255
2289
  OpenStudio::Model.intersectSurfaces(spaces)
2256
2290
  OpenStudio::Model.matchSurfaces(spaces)
2257
2291
 
2258
- if ([HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include? foundation_type)
2259
- foundation_space = make_one_space_from_multiple_spaces(model, foundation_spaces)
2260
- if (foundation_type == HPXML::FoundationTypeCrawlspaceVented) || (foundation_type == HPXML::FoundationTypeCrawlspaceUnvented)
2261
- foundation_space.setName("#{foundation_type} space")
2262
- foundation_zone = OpenStudio::Model::ThermalZone.new(model)
2263
- foundation_zone.setName("#{foundation_type} zone")
2264
- foundation_space.setThermalZone(foundation_zone)
2265
- if foundation_type == HPXML::FoundationTypeCrawlspaceVented
2266
- foundation_space_type_name = 'vented crawlspace'
2292
+ # Foundation space boundary conditions
2293
+ model.getSpaces.each do |space|
2294
+ next unless get_space_floor_z(space) + UnitConversions.convert(space.zOrigin, 'm', 'ft') < 0 # Foundation
2295
+ next if space.name.get.include? 'corridor'
2296
+
2297
+ surfaces = space.surfaces
2298
+ surfaces.each do |surface|
2299
+ next unless surface.surfaceType.downcase == 'wall'
2300
+
2301
+ os_facade = get_facade_for_surface(surface)
2302
+ if adb_facade.include?(os_facade) && (os_facade != 'RoofCeiling') && (os_facade != 'Floor')
2303
+ surface.setOutsideBoundaryCondition('Adiabatic')
2304
+ elsif getSurfaceZValues([surface]).min < 0
2305
+ surface.setOutsideBoundaryCondition('Foundation')
2267
2306
  else
2268
- foundation_space_type_name = 'unvented crawlspace'
2307
+ surface.setOutsideBoundaryCondition('Outdoors')
2269
2308
  end
2270
- elsif foundation_type == HPXML::FoundationTypeBasementUnconditioned
2271
- foundation_space.setName("#{foundation_type} space")
2272
- foundation_zone = OpenStudio::Model::ThermalZone.new(model)
2273
- foundation_zone.setName("#{foundation_type} zone")
2274
- foundation_space.setThermalZone(foundation_zone)
2275
- foundation_space_type_name = 'unconditioned basement'
2276
2309
  end
2277
- foundation_space_type = OpenStudio::Model::SpaceType.new(model)
2278
- foundation_space_type.setStandardsSpaceType(foundation_space_type_name)
2279
- foundation_space.setSpaceType(foundation_space_type)
2280
2310
  end
2281
2311
 
2282
- # set foundation walls to ground
2283
- spaces = model.getSpaces
2284
- spaces.each do |space|
2285
- next unless get_space_floor_z(space) + UnitConversions.convert(space.zOrigin, 'm', 'ft') < 0
2286
-
2287
- surfaces = space.surfaces
2288
- surfaces.each do |surface|
2289
- next if surface.surfaceType.downcase != 'wall'
2312
+ # Foundation corridor space boundary conditions
2313
+ foundation_corr_obcs = []
2314
+ if not foundation_corridor_space.nil?
2315
+ foundation_corridor_space.surfaces.each do |surface|
2316
+ next unless surface.surfaceType.downcase == 'wall'
2290
2317
 
2291
- surface.setOutsideBoundaryCondition('Foundation')
2318
+ os_facade = get_facade_for_surface(surface)
2319
+ if adb_facade.include? os_facade
2320
+ surface.setOutsideBoundaryCondition('Adiabatic')
2321
+ else
2322
+ surface.setOutsideBoundaryCondition('Foundation')
2323
+ end
2292
2324
  end
2293
2325
  end
2326
+ end
2294
2327
 
2328
+ # Corridor space boundary conditions
2329
+ model.getSpaces.each do |space|
2330
+ next unless is_corridor(space)
2331
+
2332
+ space.surfaces.each do |surface|
2333
+ os_facade = get_facade_for_surface(surface)
2334
+ if adb_facade.include? os_facade
2335
+ surface.setOutsideBoundaryCondition('Adiabatic')
2336
+ end
2337
+
2338
+ if (adb_level.include? surface.surfaceType)
2339
+ surface.setOutsideBoundaryCondition('Adiabatic')
2340
+ end
2341
+ end
2295
2342
  end
2296
2343
 
2297
2344
  # put all of the spaces in the model into a vector
@@ -2304,15 +2351,26 @@ class Geometry
2304
2351
  OpenStudio::Model.intersectSurfaces(spaces)
2305
2352
  OpenStudio::Model.matchSurfaces(spaces)
2306
2353
 
2307
- # make all surfaces adjacent to corridor spaces into adiabatic surfaces
2354
+ # make corridor floors adiabatic if no exterior walls to avoid exposed perimeter error
2355
+ exterior_obcs = ['Foundation', 'Ground', 'Outdoors']
2356
+ obcs_hash = {}
2308
2357
  model.getSpaces.each do |space|
2309
- next unless space.spaceType.get.standardsSpaceType.get == 'corridor'
2358
+ next unless space.name.get.include? 'corridor' # corridor and foundation corridor spaces
2310
2359
 
2360
+ space_name = space.name
2361
+ obcs_hash[space_name] = []
2311
2362
  space.surfaces.each do |surface|
2312
- if surface.adjacentSurface.is_initialized # only set to adiabatic if the corridor surface is adjacent to another surface
2313
- surface.adjacentSurface.get.setOutsideBoundaryCondition('Adiabatic')
2314
- surface.setOutsideBoundaryCondition('Adiabatic')
2315
- end
2363
+ next unless surface.surfaceType.downcase == 'wall'
2364
+
2365
+ obcs_hash[space_name] << surface.outsideBoundaryCondition
2366
+ end
2367
+
2368
+ next if (obcs_hash[space_name] & exterior_obcs).any?
2369
+
2370
+ space.surfaces.each do |surface|
2371
+ next unless surface.surfaceType.downcase == 'floor'
2372
+
2373
+ surface.setOutsideBoundaryCondition('Adiabatic')
2316
2374
  end
2317
2375
  end
2318
2376
 
@@ -2323,9 +2381,25 @@ class Geometry
2323
2381
  surface.setOutsideBoundaryCondition('Foundation')
2324
2382
  end
2325
2383
 
2384
+ # set adjacent corridor walls to adiabatic
2385
+ model.getSpaces.each do |space|
2386
+ next unless is_corridor(space)
2387
+
2388
+ space.surfaces.each do |surface|
2389
+ if surface.adjacentSurface.is_initialized && (surface.surfaceType.downcase == 'wall')
2390
+ surface.adjacentSurface.get.setOutsideBoundaryCondition('Adiabatic')
2391
+ surface.setOutsideBoundaryCondition('Adiabatic')
2392
+ end
2393
+ end
2394
+ end
2395
+
2326
2396
  return true
2327
2397
  end
2328
2398
 
2399
+ def self.is_corridor(space_or_zone)
2400
+ return space_or_zone_is_of_type(space_or_zone, HPXML::LocationOtherHousingUnit)
2401
+ end
2402
+
2329
2403
  # Returns true if space is either fully or partially below grade
2330
2404
  def self.space_is_below_grade(space)
2331
2405
  space.surfaces.each do |surface|
@@ -2376,7 +2450,7 @@ class Geometry
2376
2450
  floor_vertices.each_with_index do |fv1, fidx|
2377
2451
  fv2 = floor_vertices[fidx - 1]
2378
2452
  # Wall within floor edge?
2379
- next unless is_point_between([wv1.x, wv1.y, wv1.z], [fv1.x, fv1.y, fv1.z], [fv2.x, fv2.y, fv2.z]) && is_point_between([wv2.x, wv2.y, wv2.z], [fv1.x, fv1.y, fv1.z], [fv2.x, fv2.y, fv2.z])
2453
+ next unless is_point_between([wv1.x, wv1.y, wv1.z + wall_surface.space.get.zOrigin], [fv1.x, fv1.y, fv1.z + floor_surface.space.get.zOrigin], [fv2.x, fv2.y, fv2.z + floor_surface.space.get.zOrigin]) && is_point_between([wv2.x, wv2.y, wv2.z + wall_surface.space.get.zOrigin], [fv1.x, fv1.y, fv1.z + floor_surface.space.get.zOrigin], [fv2.x, fv2.y, fv2.z + floor_surface.space.get.zOrigin])
2380
2454
 
2381
2455
  if not adjacent_wall_surfaces.include? wall_surface
2382
2456
  adjacent_wall_surfaces << wall_surface
@@ -2447,19 +2521,13 @@ class Geometry
2447
2521
  end
2448
2522
 
2449
2523
  def self.get_edges_for_surfaces(surfaces, use_top_edge)
2450
- top_z = -99999
2451
- bottom_z = 99999
2452
- surfaces.each do |surface|
2453
- top_z = [getSurfaceZValues([surface]).max, top_z].max
2454
- bottom_z = [getSurfaceZValues([surface]).min, bottom_z].min
2455
- end
2456
2524
  edges = []
2457
2525
  edge_counter = 0
2458
2526
  surfaces.each do |surface|
2459
2527
  if use_top_edge
2460
- matchz = top_z
2528
+ matchz = getSurfaceZValues([surface]).max
2461
2529
  else
2462
- matchz = bottom_z
2530
+ matchz = getSurfaceZValues([surface]).min
2463
2531
  end
2464
2532
 
2465
2533
  # get vertices
@@ -2558,17 +2626,6 @@ class Geometry
2558
2626
  return yValueArray
2559
2627
  end
2560
2628
 
2561
- # Return an array of z values for surfaces passed in. The values will be relative to the parent origin. This was intended for spaces.
2562
- def self.getSurfaceZValues(surfaceArray)
2563
- zValueArray = []
2564
- surfaceArray.each do |surface|
2565
- surface.vertices.each do |vertex|
2566
- zValueArray << UnitConversions.convert(vertex.z, 'm', 'ft')
2567
- end
2568
- end
2569
- return zValueArray
2570
- end
2571
-
2572
2629
  def self.get_surface_length(surface)
2573
2630
  xvalues = getSurfaceXValues([surface])
2574
2631
  yvalues = getSurfaceYValues([surface])
@@ -2586,4 +2643,35 @@ class Geometry
2586
2643
  zrange = zvalues.max - zvalues.min
2587
2644
  return zrange
2588
2645
  end
2646
+
2647
+ def self.get_conditioned_attic_height(spaces)
2648
+ # gable roof type
2649
+ get_conditioned_spaces(spaces).each do |space|
2650
+ space.surfaces.each do |surface|
2651
+ next if surface.vertices.size != 3
2652
+ next if surface.outsideBoundaryCondition != 'Outdoors'
2653
+ next if surface.surfaceType != 'Wall'
2654
+
2655
+ return get_height_of_spaces([space])
2656
+ end
2657
+ end
2658
+
2659
+ # hip roof type
2660
+ get_conditioned_spaces(spaces).each do |space|
2661
+ space.surfaces.each do |surface|
2662
+ next if surface.outsideBoundaryCondition != 'Outdoors'
2663
+ next if surface.surfaceType != 'RoofCeiling'
2664
+
2665
+ return get_height_of_spaces([space])
2666
+ end
2667
+ end
2668
+
2669
+ return false
2670
+ end
2671
+
2672
+ def self.surface_is_rim_joist(surface, height)
2673
+ return false unless (height - Geometry.get_surface_height(surface)).abs < 0.00001
2674
+ return false unless Geometry.getSurfaceZValues([surface]).max > 0
2675
+ return true
2676
+ end
2589
2677
  end