urbanopt-cli 0.4.1 → 0.6.1

Sign up to get free protection for your applications and to get access to all the features.
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