urbanopt-cli 0.5.1 → 0.5.2

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