urbanopt-cli 0.5.1 → 0.5.2

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