urbanopt-cli 0.6.4 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1045) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +9 -0
  3. data/CMakeLists.txt +7 -7
  4. data/FindOpenStudioSDK.cmake +6 -6
  5. data/example_files/mappers/Baseline.rb +27 -27
  6. data/example_files/mappers/CreateBar.rb +7 -0
  7. data/example_files/mappers/HighEfficiency.rb +5 -4
  8. data/example_files/measures/BuildResidentialModel/measure.rb +109 -76
  9. data/example_files/residential/enclosure.tsv +102 -102
  10. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +22 -16
  11. data/example_files/resources/hpxml-measures/.gitignore +3 -7
  12. data/example_files/resources/hpxml-measures/.rubocop.yml +67 -8
  13. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1752 -1455
  14. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +3229 -5431
  15. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +386 -553
  16. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +1075 -363
  17. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +212 -0
  18. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +898 -0
  19. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules.rb +109 -188
  20. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_README.md +0 -0
  21. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_dryer_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_dryer_consumption_dist.csv} +0 -0
  22. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_dryer_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_dryer_duration_dist.csv} +0 -0
  23. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_washer_consumption_dist.csv} +0 -0
  24. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_clothes_washer_duration_dist.csv} +0 -0
  25. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.json +2 -2
  26. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.md +0 -0
  27. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_consumption_dist.csv} +0 -0
  28. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_duration_dist.csv} +0 -0
  29. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_consumption_dist.csv} +0 -0
  30. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_duration_dist.csv} +0 -0
  31. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_cluster_size_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_clothes_washer_cluster_size_probability.csv} +0 -0
  32. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_clothes_washer_event_duration_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_clothes_washer_event_duration_probability.csv} +0 -0
  33. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_cluster_size_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_dishwasher_cluster_size_probability.csv} +0 -0
  34. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_event_duration_probability.csv → BuildResidentialScheduleFile/resources/schedules_hot_water_dishwasher_event_duration_probability.csv} +0 -0
  35. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_cluster_size_probability.csv +0 -0
  36. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_event_duration_probability.csv +0 -0
  37. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  38. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  39. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  40. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  41. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  42. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  43. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  44. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  45. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  46. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  47. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  48. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  49. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  50. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  51. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  52. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  53. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  54. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  55. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  56. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  57. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  58. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  59. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  60. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  61. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  62. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  63. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  64. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  65. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  66. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  67. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  68. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  69. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  70. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  71. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  72. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  73. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  74. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  75. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  76. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  77. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  78. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  79. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  80. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  81. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  82. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  83. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  84. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  85. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +0 -0
  86. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +0 -0
  87. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +0 -0
  88. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +0 -0
  89. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +0 -0
  90. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +0 -0
  91. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +0 -0
  92. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +0 -0
  93. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +0 -0
  94. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  95. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  96. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  97. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  98. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  99. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  100. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  101. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  102. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  103. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  104. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  105. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  106. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  107. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  108. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  109. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  110. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  111. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  112. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  113. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  114. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  115. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  116. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  117. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  118. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  119. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  120. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  121. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  122. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  123. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  124. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  125. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  126. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  127. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  128. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  129. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  130. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  131. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  132. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  133. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  134. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  135. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  136. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  137. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  138. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  139. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  140. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  141. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  142. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +0 -0
  143. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +0 -0
  144. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +0 -0
  145. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +0 -0
  146. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +0 -0
  147. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +0 -0
  148. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +0 -0
  149. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +0 -0
  150. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +0 -0
  151. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +526 -0
  152. data/example_files/resources/hpxml-measures/Changelog.md +84 -8
  153. data/example_files/resources/hpxml-measures/Gemfile +4 -1
  154. data/example_files/resources/hpxml-measures/Gemfile.lock +17 -6
  155. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +387 -387
  156. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +167 -251
  157. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +275 -59
  158. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +471 -247
  159. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXML.xsd +1 -1
  160. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +171 -79
  161. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +155 -78
  162. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +188 -141
  163. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +83 -0
  164. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +99 -11
  165. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +558 -342
  166. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +2 -0
  167. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +64 -72
  168. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +96 -93
  169. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +965 -350
  170. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +887 -216
  171. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +664 -760
  172. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +306 -287
  173. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +20 -29
  174. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +0 -20
  175. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_hvac_equipment_efficiency.csv +493 -0
  176. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_water_heater_efficiency.csv +157 -0
  177. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +156 -108
  178. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +41 -3
  179. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +14 -2
  180. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +18 -18
  181. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +14 -7
  182. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/smooth.csv +8761 -0
  183. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic-vacancy.csv +8761 -0
  184. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic.csv +8761 -0
  185. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +431 -428
  186. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +21 -12
  187. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +3 -3
  188. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +245 -234
  189. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +10 -5
  190. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +19 -8
  191. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +44 -23
  192. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +241 -0
  193. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1374 -297
  194. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +702 -55
  195. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +0 -1
  196. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  197. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +238 -40
  198. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +2 -2
  199. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +0 -2
  200. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +186 -0
  201. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +955 -176
  202. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +47 -61
  203. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +1 -1
  204. data/example_files/resources/hpxml-measures/LICENSE.md +1 -1
  205. data/example_files/resources/hpxml-measures/README.md +12 -9
  206. data/example_files/resources/hpxml-measures/Rakefile +1 -1
  207. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +448 -0
  208. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +81 -0
  209. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +71 -0
  210. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +232 -0
  211. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +1977 -0
  212. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/measure.xml +682 -31
  213. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/resources/constants.rb +20 -2
  214. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/tests/output_report_test.rb +83 -218
  215. data/example_files/resources/hpxml-measures/docs/source/index.rst +1 -2
  216. data/example_files/resources/hpxml-measures/docs/source/intro.rst +6 -3
  217. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +73 -0
  218. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +915 -494
  219. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +263 -111
  220. data/example_files/resources/hpxml-measures/tasks.rb +3830 -6981
  221. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +35 -0
  222. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC.epw +8768 -0
  223. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +25 -5
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +102 -91
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +93 -83
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +93 -83
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +93 -83
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +93 -83
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +102 -91
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +103 -97
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +96 -85
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +102 -91
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +102 -91
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +102 -91
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +96 -125
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +119 -104
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +94 -89
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +93 -83
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +104 -95
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +104 -95
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-outside.xml +584 -0
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +99 -68
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +119 -79
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +99 -68
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +99 -68
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +99 -68
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +97 -66
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +97 -66
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +97 -66
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +100 -69
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +100 -69
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +94 -65
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +94 -65
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +94 -65
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +94 -65
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +97 -68
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +94 -65
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +94 -65
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +94 -65
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +97 -68
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +97 -68
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +98 -67
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +96 -64
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +105 -84
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +108 -77
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +100 -69
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +100 -69
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +98 -67
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +97 -66
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +97 -66
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +97 -66
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-facility-type-surfaces.xml → base-bldgtype-single-family-attached-2stories.xml} +152 -167
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +124 -114
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +102 -95
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +102 -95
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +102 -95
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +104 -94
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +105 -96
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +102 -95
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +102 -95
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +102 -95
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +104 -95
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +102 -95
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +102 -95
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +102 -95
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +104 -97
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +102 -95
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +104 -95
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +104 -95
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +104 -95
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +102 -95
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +104 -95
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +108 -101
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +96 -85
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +104 -95
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +104 -95
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +104 -95
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +104 -95
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +104 -95
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +106 -97
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +106 -97
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +106 -97
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +106 -97
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +106 -97
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +106 -97
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +104 -95
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +105 -96
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +104 -95
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +574 -0
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +105 -96
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +104 -95
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +104 -95
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +105 -97
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +106 -97
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +106 -97
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +104 -95
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +104 -95
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +104 -95
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +104 -95
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +104 -95
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +104 -95
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +104 -95
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +106 -97
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +106 -97
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +104 -95
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +104 -95
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +131 -119
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +120 -99
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +104 -95
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +104 -95
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +104 -95
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +104 -95
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +131 -118
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +104 -95
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +104 -95
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +104 -95
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +104 -95
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +104 -95
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +579 -0
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +110 -101
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +213 -95
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-id.xml → base-enclosure-skylights-physical-properties.xml} +123 -105
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +114 -105
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +112 -103
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +92 -82
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +533 -547
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +545 -559
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/generator-output-greater-than-consumption.xml → base-enclosure-thermal-mass.xml} +117 -111
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +239 -109
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +88 -79
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +584 -0
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +115 -106
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +89 -79
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +123 -110
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +119 -172
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +104 -95
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +107 -95
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +572 -0
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +119 -128
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +92 -82
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +117 -110
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +106 -91
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +107 -98
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +105 -97
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +108 -98
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +108 -98
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +115 -110
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +101 -94
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +103 -95
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +104 -94
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +104 -94
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +590 -0
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +589 -0
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +104 -94
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +104 -94
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +105 -94
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-manual-s-oversize-allowances.xml +103 -93
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +106 -93
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-manual-s-oversize-allowances.xml +103 -93
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed.xml +106 -93
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-invalid-distribution-system-type.xml → base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml} +587 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-manual-s-oversize-allowances.xml +103 -93
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed.xml +106 -93
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +102 -95
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +103 -94
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +101 -94
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +101 -94
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +101 -94
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +101 -94
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +108 -95
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +106 -93
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +106 -93
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +99 -92
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +103 -94
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +99 -92
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +102 -95
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +104 -95
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +104 -95
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +101 -94
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +103 -94
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +104 -94
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +105 -94
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml +103 -93
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump.xml +106 -93
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +101 -94
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +104 -94
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +105 -94
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +103 -93
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +106 -93
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +541 -0
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-relatedhvac-dhw-indirect.xml → base-hvac-autosize-ptac-with-heating.xml} +528 -517
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/boiler-invalid-afue.xml → base-hvac-autosize-ptac.xml} +109 -113
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp.xml +531 -0
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +99 -92
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +99 -92
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +100 -93
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +104 -95
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +101 -94
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +102 -95
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +103 -94
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +101 -94
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +101 -94
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +101 -94
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +101 -94
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +101 -94
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +101 -94
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +101 -94
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +106 -96
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +104 -95
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +104 -94
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +104 -94
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +104 -94
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +104 -94
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +104 -94
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/unattached-solar-thermal-system.xml → base-hvac-ducts-area-fractions.xml} +596 -577
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.xml → base-hvac-ducts-leakage-cfm50.xml} +108 -106
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +104 -95
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +99 -92
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +103 -94
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +101 -94
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +99 -92
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +99 -92
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +99 -92
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +99 -92
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +101 -94
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +104 -95
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +102 -95
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +104 -95
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +104 -95
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +101 -94
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +103 -94
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +101 -94
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +101 -94
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +101 -94
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +104 -95
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +101 -94
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +102 -94
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +103 -93
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.xml → base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml} +104 -94
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.xml → base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml} +104 -94
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.xml → base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml} +104 -94
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.xml → base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml} +104 -95
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.xml → base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml} +104 -95
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.xml → base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml} +104 -95
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-furnace-gas-only.xml → base-hvac-install-quality-furnace-gas-only.xml} +101 -94
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-ground-to-air-heat-pump.xml → base-hvac-install-quality-ground-to-air-heat-pump.xml} +104 -94
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.xml → base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml} +101 -94
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-all-mini-split-heat-pump-ducted.xml → base-hvac-install-quality-mini-split-heat-pump-ducted.xml} +104 -94
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +101 -94
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +99 -92
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +101 -94
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +103 -95
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +104 -94
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +542 -0
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +101 -92
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +124 -100
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +94 -89
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +99 -92
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +104 -95
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +104 -95
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/cfis-with-hydronic-distribution.xml → base-hvac-ptac-with-heating.xml} +530 -532
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-distribution-return-duct-leakage-missing.xml → base-hvac-ptac.xml} +515 -528
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +531 -0
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +99 -92
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +516 -0
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +99 -92
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +584 -0
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +104 -95
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +99 -92
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +99 -92
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +104 -95
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +104 -95
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +100 -93
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +110 -96
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +586 -0
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +95 -86
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +104 -95
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +108 -98
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-foundation-wall-properties.xml → base-location-capetown-zaf.xml} +134 -127
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +92 -82
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +105 -98
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +104 -95
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +92 -82
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +92 -82
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +92 -82
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +108 -98
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +106 -97
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +106 -97
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +107 -98
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +104 -97
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +107 -98
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +106 -97
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +106 -97
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +105 -96
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +106 -97
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +106 -97
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +106 -97
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +141 -114
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +106 -97
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +105 -96
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +101 -101
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +105 -96
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +157 -112
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +157 -112
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +96 -87
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +108 -99
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +104 -95
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +113 -102
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +318 -291
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +608 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/enclosure-garage-missing-roof-ceiling.xml → base-pv-battery-garage.xml} +678 -626
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/multifamily-reference-surface.xml → base-pv-battery-outside-degrades.xml} +610 -575
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-outside.xml +608 -0
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +105 -96
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.xml → base-schedules-detailed-smooth.xml} +105 -101
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.xml → base-schedules-detailed-stochastic-vacancy.xml} +105 -98
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-install-quality-blower-efficiency-furnace-gas-central-ac-1-speed.xml → base-schedules-detailed-stochastic.xml} +105 -101
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-lighting-detailed.xml → base-schedules-simple.xml} +625 -585
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +104 -95
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +104 -95
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +104 -95
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +104 -95
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +104 -95
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +104 -95
  545. data/example_files/resources/hpxml-measures/workflow/template-build-hpxml-and-stocastic-schedules.osw +129 -0
  546. data/example_files/resources/hpxml-measures/workflow/template-stochastic-schedules.osw +53 -0
  547. data/example_files/resources/hpxml-measures/workflow/template.osw +7 -2
  548. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +75 -44
  549. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +75 -44
  550. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +75 -44
  551. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +75 -44
  552. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +75 -44
  553. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +75 -44
  554. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +75 -44
  555. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +75 -44
  556. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +63 -32
  557. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +63 -32
  558. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +66 -35
  559. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +66 -35
  560. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +66 -35
  561. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +66 -35
  562. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +69 -38
  563. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +69 -38
  564. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +75 -44
  565. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +75 -44
  566. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +75 -44
  567. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +75 -44
  568. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +75 -44
  569. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +75 -44
  570. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +78 -47
  571. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +78 -47
  572. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +114 -103
  573. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +126 -103
  574. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +321 -294
  575. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +26 -26
  576. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +320 -293
  577. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +351 -0
  578. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +253 -260
  579. data/example_files/visualization/input_visualization_feature.html +12 -3
  580. data/example_files/visualization/input_visualization_scenario.html +10 -4
  581. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.ddy +17 -17
  582. data/lib/uo_cli/version.rb +1 -1
  583. data/lib/uo_cli.rb +10 -3
  584. data/uo_cli.gemspec +6 -6
  585. metadata +217 -639
  586. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -59
  587. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +0 -337
  588. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +0 -337
  589. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +0 -337
  590. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +0 -337
  591. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +0 -337
  592. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +0 -337
  593. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +0 -337
  594. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +0 -337
  595. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +0 -337
  596. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +0 -337
  597. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +0 -337
  598. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +0 -337
  599. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +0 -337
  600. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +0 -337
  601. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +0 -341
  602. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +0 -341
  603. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +0 -348
  604. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +0 -342
  605. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +0 -341
  606. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +0 -341
  607. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +0 -341
  608. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +0 -339
  609. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +0 -337
  610. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +0 -337
  611. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +0 -337
  612. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +0 -337
  613. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +0 -337
  614. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +0 -337
  615. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +0 -337
  616. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +0 -337
  617. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +0 -337
  618. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +0 -337
  619. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +0 -337
  620. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +0 -337
  621. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +0 -337
  622. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +0 -337
  623. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +0 -337
  624. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +0 -337
  625. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +0 -337
  626. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +0 -337
  627. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +0 -337
  628. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +0 -337
  629. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +0 -337
  630. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +0 -337
  631. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +0 -337
  632. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +0 -337
  633. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +0 -337
  634. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +0 -338
  635. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +0 -337
  636. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +0 -338
  637. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +0 -337
  638. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +0 -337
  639. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +0 -338
  640. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +0 -337
  641. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +0 -337
  642. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +0 -337
  643. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +0 -337
  644. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +0 -337
  645. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +0 -337
  646. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +0 -337
  647. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +0 -337
  648. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +0 -337
  649. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +0 -337
  650. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +0 -337
  651. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +0 -337
  652. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +0 -337
  653. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +0 -337
  654. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +0 -337
  655. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +0 -337
  656. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +0 -337
  657. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +0 -337
  658. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +0 -337
  659. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +0 -337
  660. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +0 -337
  661. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +0 -337
  662. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +0 -337
  663. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +0 -337
  664. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +0 -337
  665. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +0 -337
  666. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +0 -337
  667. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +0 -337
  668. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +0 -337
  669. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +0 -337
  670. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +0 -338
  671. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +0 -337
  672. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +0 -337
  673. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +0 -337
  674. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +0 -337
  675. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +0 -337
  676. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +0 -337
  677. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +0 -337
  678. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +0 -337
  679. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +0 -337
  680. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +0 -337
  681. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +0 -337
  682. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +0 -337
  683. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +0 -337
  684. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +0 -337
  685. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +0 -337
  686. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +0 -337
  687. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +0 -337
  688. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +0 -337
  689. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +0 -337
  690. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +0 -337
  691. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +0 -338
  692. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +0 -338
  693. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +0 -338
  694. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +0 -338
  695. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +0 -338
  696. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +0 -337
  697. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +0 -337
  698. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +0 -335
  699. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +0 -335
  700. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +0 -335
  701. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +0 -337
  702. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +0 -337
  703. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +0 -337
  704. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +0 -337
  705. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +0 -337
  706. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +0 -337
  707. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +0 -337
  708. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +0 -337
  709. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +0 -337
  710. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +0 -336
  711. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +0 -337
  712. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +0 -337
  713. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +0 -337
  714. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +0 -336
  715. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +0 -336
  716. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +0 -336
  717. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +0 -339
  718. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +0 -339
  719. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +0 -339
  720. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +0 -339
  721. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +0 -340
  722. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +0 -340
  723. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +0 -340
  724. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +0 -338
  725. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +0 -338
  726. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +0 -338
  727. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +0 -339
  728. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +0 -338
  729. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +0 -340
  730. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +0 -336
  731. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +0 -336
  732. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +0 -337
  733. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +0 -337
  734. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +0 -337
  735. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +0 -337
  736. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +0 -337
  737. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +0 -337
  738. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +0 -337
  739. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +0 -336
  740. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +0 -336
  741. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +0 -337
  742. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +0 -337
  743. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +0 -337
  744. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +0 -337
  745. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +0 -337
  746. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +0 -337
  747. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +0 -337
  748. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +0 -337
  749. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +0 -337
  750. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +0 -337
  751. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +0 -337
  752. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +0 -337
  753. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +0 -337
  754. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +0 -337
  755. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +0 -337
  756. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +0 -337
  757. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +0 -337
  758. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +0 -345
  759. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +0 -335
  760. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +0 -337
  761. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +0 -337
  762. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +0 -337
  763. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +0 -337
  764. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +0 -337
  765. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +0 -337
  766. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +0 -337
  767. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +0 -337
  768. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +0 -337
  769. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +0 -324
  770. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +0 -337
  771. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +0 -337
  772. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +0 -337
  773. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +0 -337
  774. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +0 -337
  775. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +0 -337
  776. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic-vacant.osw +0 -341
  777. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +0 -337
  778. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +0 -338
  779. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +0 -338
  780. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +0 -342
  781. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +0 -338
  782. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +0 -341
  783. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +0 -337
  784. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +0 -337
  785. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +0 -337
  786. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +0 -341
  787. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +0 -341
  788. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +0 -341
  789. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +0 -341
  790. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +0 -341
  791. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +0 -341
  792. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +0 -341
  793. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +0 -341
  794. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +0 -341
  795. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +0 -341
  796. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +0 -341
  797. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +0 -341
  798. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +0 -341
  799. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +0 -341
  800. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +0 -341
  801. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +0 -341
  802. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +0 -341
  803. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +0 -341
  804. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +0 -341
  805. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +0 -341
  806. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +0 -341
  807. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +0 -341
  808. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +0 -341
  809. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +0 -341
  810. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +0 -341
  811. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  812. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +0 -341
  813. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  814. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +0 -341
  815. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  816. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +0 -341
  817. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  818. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +0 -341
  819. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  820. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +0 -341
  821. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  822. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +0 -341
  823. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  824. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +0 -341
  825. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  826. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +0 -341
  827. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  828. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +0 -341
  829. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +0 -341
  830. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +0 -341
  831. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  832. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +0 -341
  833. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  834. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +0 -341
  835. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  836. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +0 -341
  837. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  838. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +0 -341
  839. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  840. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +0 -341
  841. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  842. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +0 -341
  843. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  844. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +0 -341
  845. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  846. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +0 -341
  847. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  848. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +0 -341
  849. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +0 -341
  850. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +0 -339
  851. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +0 -339
  852. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +0 -339
  853. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +0 -339
  854. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +0 -339
  855. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +0 -339
  856. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +0 -339
  857. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +0 -339
  858. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +0 -339
  859. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +0 -339
  860. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +0 -339
  861. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +0 -339
  862. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +0 -339
  863. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +0 -339
  864. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +0 -339
  865. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +0 -339
  866. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +0 -339
  867. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +0 -339
  868. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +0 -337
  869. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +0 -337
  870. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +0 -337
  871. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +0 -337
  872. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +0 -337
  873. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +0 -339
  874. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +0 -337
  875. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +0 -337
  876. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +0 -337
  877. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +0 -338
  878. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +0 -336
  879. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +0 -337
  880. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +0 -337
  881. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heating-system.osw +0 -337
  882. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +0 -337
  883. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heating-system.osw +0 -337
  884. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +0 -337
  885. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +0 -337
  886. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +0 -337
  887. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +0 -337
  888. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +0 -337
  889. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +0 -337
  890. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +0 -337
  891. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +0 -337
  892. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +0 -337
  893. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +0 -337
  894. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +0 -337
  895. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +0 -337
  896. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +0 -337
  897. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +0 -337
  898. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +0 -341
  899. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +0 -341
  900. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +0 -338
  901. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +0 -337
  902. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +0 -337
  903. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +0 -337
  904. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +0 -337
  905. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +0 -337
  906. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +0 -337
  907. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +0 -337
  908. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +0 -337
  909. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +0 -337
  910. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +0 -337
  911. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +0 -337
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +0 -339
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +0 -337
  914. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +0 -337
  915. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +0 -337
  916. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +0 -337
  917. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +0 -337
  918. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +0 -337
  919. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +0 -337
  920. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  921. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +0 -337
  922. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  923. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +0 -337
  924. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +0 -8761
  925. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +0 -8761
  926. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +0 -8761
  927. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_1bed.csv +0 -369
  928. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_2bed.csv +0 -465
  929. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_3bed.csv +0 -611
  930. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_4bed.csv +0 -685
  931. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_5bed.csv +0 -767
  932. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_1bed.csv +0 -637
  933. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_2bed.csv +0 -744
  934. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_3bed.csv +0 -929
  935. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_4bed.csv +0 -1044
  936. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_5bed.csv +0 -1250
  937. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_1bed.csv +0 -754
  938. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_2bed.csv +0 -961
  939. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_3bed.csv +0 -1102
  940. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_4bed.csv +0 -1293
  941. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_5bed.csv +0 -1508
  942. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_1bed.csv +0 -13097
  943. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_2bed.csv +0 -15977
  944. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_3bed.csv +0 -18624
  945. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_4bed.csv +0 -22075
  946. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_5bed.csv +0 -25005
  947. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_max_flows.csv +0 -6
  948. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +0 -2444
  949. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +0 -110
  950. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +0 -57
  951. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +0 -564
  952. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +0 -564
  953. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +0 -564
  954. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +0 -563
  955. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +0 -563
  956. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +0 -563
  957. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +0 -535
  958. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +0 -535
  959. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -576
  960. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +0 -563
  961. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +0 -564
  962. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +0 -563
  963. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +0 -563
  964. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +0 -563
  965. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +0 -563
  966. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +0 -563
  967. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +0 -563
  968. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +0 -547
  969. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +0 -544
  970. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +0 -547
  971. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +0 -563
  972. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +0 -448
  973. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +0 -614
  974. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +0 -611
  975. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +0 -551
  976. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +0 -473
  977. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +0 -489
  978. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +0 -760
  979. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +0 -759
  980. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +0 -761
  981. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +0 -759
  982. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +0 -563
  983. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +0 -460
  984. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +0 -560
  985. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +0 -921
  986. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +0 -921
  987. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -547
  988. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -547
  989. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +0 -921
  990. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +0 -569
  991. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +0 -407
  992. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +0 -563
  993. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +0 -563
  994. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +0 -563
  995. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +0 -563
  996. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +0 -570
  997. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +0 -563
  998. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +0 -563
  999. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +0 -466
  1000. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +0 -591
  1001. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +0 -563
  1002. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +0 -565
  1003. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +0 -576
  1004. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +0 -465
  1005. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +0 -563
  1006. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +0 -451
  1007. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +0 -551
  1008. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +0 -565
  1009. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +0 -563
  1010. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +0 -473
  1011. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +0 -563
  1012. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +0 -583
  1013. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +0 -563
  1014. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +0 -917
  1015. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +0 -561
  1016. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +0 -563
  1017. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +0 -563
  1018. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +0 -563
  1019. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +0 -1657
  1020. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +0 -1657
  1021. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +0 -432
  1022. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +0 -434
  1023. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +0 -591
  1024. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +0 -563
  1025. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +0 -563
  1026. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +0 -547
  1027. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +0 -563
  1028. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +0 -569
  1029. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +0 -569
  1030. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +0 -564
  1031. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -527
  1032. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +0 -571
  1033. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -532
  1034. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +0 -566
  1035. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -532
  1036. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +0 -576
  1037. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +0 -563
  1038. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +0 -563
  1039. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +0 -466
  1040. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +0 -466
  1041. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +0 -591
  1042. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +0 -563
  1043. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +0 -563
  1044. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +0 -563
  1045. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +0 -130
@@ -1,13 +1,8 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  class Geometry
4
- def self.get_abs_azimuth(azimuth_type, relative_azimuth, building_orientation, offset = 180.0)
5
- azimuth = nil
6
- if azimuth_type == Constants.CoordRelative
7
- azimuth = relative_azimuth + building_orientation + offset
8
- elsif azimuth_type == Constants.CoordAbsolute
9
- azimuth = relative_azimuth + offset
10
- end
4
+ def self.get_abs_azimuth(relative_azimuth, building_orientation)
5
+ azimuth = relative_azimuth + building_orientation
11
6
 
12
7
  # Ensure azimuth is >=0 and <=360
13
8
  while azimuth < 0.0
@@ -21,6 +16,85 @@ class Geometry
21
16
  return azimuth
22
17
  end
23
18
 
19
+ def self.get_absolute_tilt(tilt_str, roof_pitch, epw_file)
20
+ tilt_str = tilt_str.downcase
21
+ if tilt_str.start_with? 'roofpitch'
22
+ roof_angle = Math.atan(roof_pitch / 12.0) * 180.0 / Math::PI
23
+ return Float(eval(tilt_str.gsub('roofpitch', roof_angle.to_s)))
24
+ elsif tilt_str.start_with? 'latitude'
25
+ return Float(eval(tilt_str.gsub('latitude', epw_file.latitude.to_s)))
26
+ else
27
+ return Float(tilt_str)
28
+ end
29
+ end
30
+
31
+ def self.get_surface_azimuth(surface:,
32
+ orientation:)
33
+ facade = get_facade_for_surface(surface)
34
+ return get_azimuth_from_facade(facade: facade, orientation: orientation)
35
+ end
36
+
37
+ def self.get_azimuth_from_facade(facade:,
38
+ orientation:)
39
+ if facade == Constants.FacadeFront
40
+ azimuth = get_abs_azimuth(0, orientation)
41
+ elsif facade == Constants.FacadeBack
42
+ azimuth = get_abs_azimuth(180, orientation)
43
+ elsif facade == Constants.FacadeLeft
44
+ azimuth = get_abs_azimuth(90, orientation)
45
+ elsif facade == Constants.FacadeRight
46
+ azimuth = get_abs_azimuth(270, orientation)
47
+ else
48
+ fail 'Unexpected facade.'
49
+ end
50
+ end
51
+
52
+ def self.get_unexposed_garage_perimeter(geometry_garage_protrusion:,
53
+ geometry_garage_width:,
54
+ geometry_garage_depth:,
55
+ **remainder)
56
+ protrusion = geometry_garage_protrusion
57
+ width = geometry_garage_width
58
+ depth = geometry_garage_depth
59
+ # this is perimeter adjacent to a 100% protruding garage that is not exposed
60
+ # we need this because it's difficult to set this surface to Adiabatic using our geometry methods
61
+ if (protrusion == 1.0) && (width * depth > 0)
62
+ return width
63
+ end
64
+
65
+ return 0
66
+ end
67
+
68
+ def self.get_adiabatic_adjacent_surface(model:,
69
+ surface:)
70
+ return if surface.outsideBoundaryCondition != 'Adiabatic'
71
+
72
+ adjacentSurfaceType = 'Wall'
73
+ if surface.surfaceType == 'RoofCeiling'
74
+ adjacentSurfaceType = 'Floor'
75
+ elsif surface.surfaceType == 'Floor'
76
+ adjacentSurfaceType = 'RoofCeiling'
77
+ end
78
+
79
+ model.getSurfaces.sort.each do |adjacent_surface|
80
+ next if surface == adjacent_surface
81
+ next if adjacent_surface.surfaceType != adjacentSurfaceType
82
+ next if adjacent_surface.outsideBoundaryCondition != 'Adiabatic'
83
+ next unless Geometry.has_same_vertices(surface, adjacent_surface)
84
+
85
+ return adjacent_surface
86
+ end
87
+ return
88
+ end
89
+
90
+ def self.get_adjacent_to(surface:)
91
+ space = surface.space.get
92
+ st = space.spaceType.get
93
+ space_type = st.standardsSpaceType.get
94
+
95
+ return space_type
96
+ end
97
+
24
98
  def self.add_rim_joist(model, polygon, space, rim_joist_height, z)
25
99
  if rim_joist_height > 0
26
100
  # make polygons
@@ -56,10 +130,10 @@ class Geometry
56
130
 
57
131
  def self.create_single_family_detached(runner:,
58
132
  model:,
59
- geometry_cfa:,
60
- geometry_wall_height:,
61
- geometry_num_floors_above_grade:,
62
- geometry_aspect_ratio:,
133
+ geometry_unit_cfa:,
134
+ geometry_average_ceiling_height:,
135
+ geometry_unit_num_floors_above_grade:,
136
+ geometry_unit_aspect_ratio:,
63
137
  geometry_garage_width:,
64
138
  geometry_garage_depth:,
65
139
  geometry_garage_protrusion:,
@@ -71,10 +145,10 @@ class Geometry
71
145
  geometry_roof_type:,
72
146
  geometry_roof_pitch:,
73
147
  **remainder)
74
- cfa = geometry_cfa
75
- wall_height = geometry_wall_height
76
- num_floors = geometry_num_floors_above_grade
77
- aspect_ratio = geometry_aspect_ratio
148
+ cfa = geometry_unit_cfa
149
+ average_ceiling_height = geometry_average_ceiling_height
150
+ num_floors = geometry_unit_num_floors_above_grade
151
+ aspect_ratio = geometry_unit_aspect_ratio
78
152
  garage_width = geometry_garage_width
79
153
  garage_depth = geometry_garage_depth
80
154
  garage_protrusion = geometry_garage_protrusion
@@ -83,6 +157,9 @@ class Geometry
83
157
  foundation_height = geometry_foundation_height
84
158
  rim_joist_height = geometry_rim_joist_height
85
159
  attic_type = geometry_attic_type
160
+ if attic_type == HPXML::AtticTypeConditioned
161
+ num_floors -= 1
162
+ end
86
163
  roof_type = geometry_roof_type
87
164
  roof_pitch = geometry_roof_pitch
88
165
 
@@ -110,7 +187,7 @@ class Geometry
110
187
 
111
188
  # Convert to SI
112
189
  cfa = UnitConversions.convert(cfa, 'ft^2', 'm^2')
113
- wall_height = UnitConversions.convert(wall_height, 'ft', 'm')
190
+ average_ceiling_height = UnitConversions.convert(average_ceiling_height, 'ft', 'm')
114
191
  garage_width = UnitConversions.convert(garage_width, 'ft', 'm')
115
192
  garage_depth = UnitConversions.convert(garage_depth, 'ft', 'm')
116
193
  foundation_height = UnitConversions.convert(foundation_height, 'ft', 'm')
@@ -175,7 +252,7 @@ class Geometry
175
252
  foundation_polygon_with_wrong_zs = nil
176
253
  for floor in (0..num_floors - 1)
177
254
 
178
- z = wall_height * floor + foundation_offset + rim_joist_height
255
+ z = average_ceiling_height * floor + foundation_offset + rim_joist_height
179
256
 
180
257
  if has_garage && (z == foundation_offset + rim_joist_height) # first floor and has garage
181
258
 
@@ -200,7 +277,7 @@ class Geometry
200
277
  end
201
278
 
202
279
  # make space
203
- garage_space = OpenStudio::Model::Space::fromFloorPrint(garage_polygon, wall_height, model)
280
+ garage_space = OpenStudio::Model::Space::fromFloorPrint(garage_polygon, average_ceiling_height, model)
204
281
  garage_space = garage_space.get
205
282
  garage_space.setName(garage_space_name)
206
283
  garage_space_type = OpenStudio::Model::SpaceType.new(model)
@@ -291,7 +368,7 @@ class Geometry
291
368
  end
292
369
 
293
370
  # make space
294
- living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, wall_height, model)
371
+ living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, average_ceiling_height, model)
295
372
  living_space = living_space.get
296
373
  if floor > 0
297
374
  living_space_name = "#{HPXML::LocationLivingSpace}|story #{floor + 1}"
@@ -314,9 +391,9 @@ class Geometry
314
391
  end
315
392
 
316
393
  # Attic
317
- if roof_type != 'flat'
394
+ if attic_type != HPXML::AtticTypeFlatRoof
318
395
 
319
- z += wall_height
396
+ z += average_ceiling_height
320
397
 
321
398
  # calculate the dimensions of the attic
322
399
  if length >= width
@@ -424,7 +501,12 @@ class Geometry
424
501
  end
425
502
 
426
503
  # Foundation
427
- if [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned, HPXML::FoundationTypeBasementConditioned, HPXML::FoundationTypeAmbient].include? foundation_type
504
+ if [HPXML::FoundationTypeCrawlspaceVented,
505
+ HPXML::FoundationTypeCrawlspaceUnvented,
506
+ HPXML::FoundationTypeCrawlspaceConditioned,
507
+ HPXML::FoundationTypeBasementUnconditioned,
508
+ HPXML::FoundationTypeBasementConditioned,
509
+ HPXML::FoundationTypeAmbient].include? foundation_type
428
510
 
429
511
  z = -foundation_height + foundation_offset
430
512
 
@@ -445,6 +527,8 @@ class Geometry
445
527
  foundation_space_name = HPXML::LocationCrawlspaceVented
446
528
  elsif foundation_type == HPXML::FoundationTypeCrawlspaceUnvented
447
529
  foundation_space_name = HPXML::LocationCrawlspaceUnvented
530
+ elsif foundation_type == HPXML::FoundationTypeCrawlspaceConditioned
531
+ foundation_space_name = HPXML::LocationCrawlspaceConditioned
448
532
  elsif foundation_type == HPXML::FoundationTypeBasementUnconditioned
449
533
  foundation_space_name = HPXML::LocationBasementUnconditioned
450
534
  elsif foundation_type == HPXML::FoundationTypeBasementConditioned
@@ -494,7 +578,7 @@ class Geometry
494
578
  OpenStudio::Model.intersectSurfaces(spaces)
495
579
  OpenStudio::Model.matchSurfaces(spaces)
496
580
 
497
- if has_garage && (roof_type != 'flat')
581
+ if has_garage && attic_type != HPXML::AtticTypeFlatRoof
498
582
  if num_floors > 1
499
583
  space_with_roof_over_garage = living_space
500
584
  else
@@ -557,15 +641,15 @@ class Geometry
557
641
 
558
642
  if num_floors == 1
559
643
  if not attic_type == HPXML::AtticTypeConditioned
560
- roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, living_space.zOrigin + wall_height + garage_attic_height)
561
- roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, living_space.zOrigin + wall_height + garage_attic_height)
644
+ roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, living_space.zOrigin + average_ceiling_height + garage_attic_height)
645
+ roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, living_space.zOrigin + average_ceiling_height + garage_attic_height)
562
646
  else
563
- roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, garage_attic_height + wall_height)
564
- roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, garage_attic_height + wall_height)
647
+ roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, garage_attic_height + average_ceiling_height)
648
+ roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, garage_attic_height + average_ceiling_height)
565
649
  end
566
650
  else
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)
651
+ roof_n_point = OpenStudio::Point3d.new((nw_point.x + ne_point.x) / 2, nw_point.y + garage_attic_height / roof_pitch, num_floors * average_ceiling_height + garage_attic_height + rim_joist_height)
652
+ roof_s_point = OpenStudio::Point3d.new((sw_point.x + se_point.x) / 2, sw_point.y, num_floors * average_ceiling_height + garage_attic_height + rim_joist_height)
569
653
  end
570
654
 
571
655
  polygon_w_roof = make_polygon(nw_point, sw_point, roof_s_point, roof_n_point)
@@ -709,11 +793,13 @@ class Geometry
709
793
  end
710
794
 
711
795
  def self.has_same_vertices(surface1, surface2)
712
- if getSurfaceXValues([surface1]) == getSurfaceXValues([surface2]) &&
713
- getSurfaceYValues([surface1]) == getSurfaceYValues([surface2]) &&
714
- getSurfaceZValues([surface1]) == getSurfaceZValues([surface2])
796
+ if getSurfaceXValues([surface1]).sort == getSurfaceXValues([surface2]).sort &&
797
+ getSurfaceYValues([surface1]).sort == getSurfaceYValues([surface2]).sort &&
798
+ getSurfaceZValues([surface1]).sort == getSurfaceZValues([surface2]).sort &&
799
+ surface1.space.get.zOrigin.round(5) == surface2.space.get.zOrigin.round(5)
715
800
  return true
716
801
  end
802
+
717
803
  return false
718
804
  end
719
805
 
@@ -795,7 +881,7 @@ class Geometry
795
881
  window_areas[Constants.FacadeBack] = window_area_back
796
882
  window_areas[Constants.FacadeLeft] = window_area_left
797
883
  window_areas[Constants.FacadeRight] = window_area_right
798
- # width_extension = UnitConversions.convert(runner.getDoubleArgumentValue("width_extension",user_arguments), "ft", "m")
884
+
799
885
  skylight_areas = {}
800
886
  skylight_areas[Constants.FacadeFront] = skylight_area_front
801
887
  skylight_areas[Constants.FacadeBack] = skylight_area_back
@@ -803,83 +889,38 @@ class Geometry
803
889
  skylight_areas[Constants.FacadeRight] = skylight_area_right
804
890
  skylight_areas['none'] = 0
805
891
 
806
- # Remove existing windows and store surfaces that should get windows by facade
892
+ # Store surfaces that should get windows by facade
807
893
  wall_surfaces = { Constants.FacadeFront => [], Constants.FacadeBack => [],
808
894
  Constants.FacadeLeft => [], Constants.FacadeRight => [] }
809
895
  roof_surfaces = { Constants.FacadeFront => [], Constants.FacadeBack => [],
810
896
  Constants.FacadeLeft => [], Constants.FacadeRight => [],
811
897
  'none' => [] }
812
- # flat_roof_surfaces = []
813
- constructions = {}
814
- window_warn_msg = nil
815
- skylight_warn_msg = nil
898
+
816
899
  get_conditioned_spaces(model.getSpaces).each do |space|
817
900
  space.surfaces.each do |surface|
818
- if (surface.surfaceType.downcase == 'wall') && (surface.outsideBoundaryCondition.downcase == 'outdoors')
819
- next if (90 - surface.tilt * 180 / Math::PI).abs > 0.01 # Not a vertical wall
901
+ next unless (surface.surfaceType.downcase == 'wall') && (surface.outsideBoundaryCondition.downcase == 'outdoors')
902
+ next if (90 - surface.tilt * 180 / Math::PI).abs > 0.01 # Not a vertical wall
820
903
 
821
- win_removed = false
822
- construction = nil
823
- surface.subSurfaces.each do |sub_surface|
824
- next if sub_surface.subSurfaceType.downcase != 'fixedwindow'
904
+ facade = get_facade_for_surface(surface)
905
+ next if facade.nil?
825
906
 
826
- if sub_surface.construction.is_initialized
827
- if (not construction.nil?) && (construction != sub_surface.construction.get)
828
- window_warn_msg = 'Multiple constructions found. An arbitrary construction may be assigned to new window(s).'
829
- end
830
- construction = sub_surface.construction.get
831
- end
832
- sub_surface.remove
833
- win_removed = true
834
- end
835
- if win_removed
836
- runner.registerInfo("Removed fixed window(s) from #{surface.name}.")
837
- end
838
- facade = get_facade_for_surface(surface)
839
- next if facade.nil?
907
+ wall_surfaces[facade] << surface
908
+ end
909
+ end
910
+ model.getSpaces.each do |space|
911
+ space.surfaces.each do |surface|
912
+ next unless (surface.surfaceType.downcase == 'roofceiling') && (surface.outsideBoundaryCondition.downcase == 'outdoors')
840
913
 
841
- wall_surfaces[facade] << surface
842
- if (not construction.nil?) && (not constructions.keys.include? facade)
843
- constructions[facade] = construction
844
- end
845
- elsif (surface.surfaceType.downcase == 'roofceiling') && (surface.outsideBoundaryCondition.downcase == 'outdoors')
846
- sky_removed = false
847
- construction = nil
848
- surface.subSurfaces.each do |sub_surface|
849
- next if sub_surface.subSurfaceType.downcase != 'skylight'
850
-
851
- if sub_surface.construction.is_initialized
852
- if (not construction.nil?) && (construction != sub_surface.construction.get)
853
- skylight_warn_msg = 'Multiple constructions found. An arbitrary construction may be assigned to new skylight(s).'
854
- end
855
- construction = sub_surface.construction.get
856
- end
857
- sub_surface.remove
858
- sky_removed = true
859
- end
860
- if sky_removed
861
- runner.registerInfo("Removed fixed skylight(s) from #{surface.name}.")
862
- end
863
- facade = get_facade_for_surface(surface)
864
- if facade.nil?
865
- if surface.tilt == 0 # flat roof
866
- roof_surfaces['none'] << surface
867
- end
868
- next
869
- end
870
- roof_surfaces[facade] << surface
871
- if (not construction.nil?) && (not constructions.keys.include? facade)
872
- constructions[facade] = construction
914
+ facade = get_facade_for_surface(surface)
915
+ if facade.nil?
916
+ if surface.tilt == 0 # flat roof
917
+ roof_surfaces['none'] << surface
873
918
  end
919
+ next
874
920
  end
921
+ roof_surfaces[facade] << surface
875
922
  end
876
923
  end
877
- if not window_warn_msg.nil?
878
- runner.registerWarning(window_warn_msg)
879
- end
880
- if not skylight_warn_msg.nil?
881
- runner.registerWarning(skylight_warn_msg)
882
- end
883
924
 
884
925
  # error checking
885
926
  facades.each do |facade|
@@ -904,20 +945,14 @@ class Geometry
904
945
 
905
946
  # Split any surfaces that have doors so that we can ignore them when adding windows
906
947
  facades.each do |facade|
907
- surfaces_to_add = []
908
948
  wall_surfaces[facade].each do |surface|
909
949
  next if surface.subSurfaces.size == 0
910
950
 
911
951
  new_surfaces = surface.splitSurfaceForSubSurfaces
912
952
  new_surfaces.each do |new_surface|
913
- next if new_surface.subSurfaces.size > 0
914
-
915
- surfaces_to_add << new_surface
953
+ wall_surfaces[facade] << new_surface
916
954
  end
917
955
  end
918
- surfaces_to_add.each do |surface_to_add|
919
- wall_surfaces[facade] << surface_to_add
920
- end
921
956
  end
922
957
 
923
958
  # Windows
@@ -927,7 +962,7 @@ class Geometry
927
962
  max_single_window_area = 12.0 # sqft
928
963
  window_gap_y = 1.0 # ft; distance from top of wall
929
964
  window_gap_x = 0.2 # ft; distance between windows in a two-window group
930
- min_wall_height_for_window = Math.sqrt(max_single_window_area * window_aspect_ratio) + window_gap_y * 1.05 # allow some wall area above/below
965
+ min_average_ceiling_height_for_window = Math.sqrt(max_single_window_area * window_aspect_ratio) + window_gap_y * 1.05 # allow some wall area above/below
931
966
  min_window_width = Math.sqrt(min_single_window_area / window_aspect_ratio) * 1.05 # allow some wall area to the left/right
932
967
 
933
968
  # Calculate available area for each wall, facade
@@ -939,9 +974,8 @@ class Geometry
939
974
  if not surface_avail_area.include? surface
940
975
  surface_avail_area[surface] = 0
941
976
  end
942
- next if surface.subSurfaces.size > 0
943
977
 
944
- area = get_wall_area_for_windows(surface, min_wall_height_for_window, min_window_width, runner)
978
+ area = get_wall_area_for_windows(surface, min_average_ceiling_height_for_window, min_window_width, runner)
945
979
  surface_avail_area[surface] += area
946
980
  facade_avail_area[facade] += area
947
981
  end
@@ -968,69 +1002,124 @@ class Geometry
968
1002
  else
969
1003
  target_facade_areas[facade] += window_areas[facade]
970
1004
  end
1005
+ end
971
1006
 
972
- next if target_facade_areas[facade] == 0
973
-
974
- if target_facade_areas[facade] < min_single_window_area
975
- # If the total window area for the facade is less than the minimum window area,
976
- # set all of the window area to the surface with the greatest available wall area on any facade
977
- surface = surface_avail_area.max_by { |k, v| v }[0]
978
- next if get_facade_for_surface(surface) == facade
979
- next if surface_avail_area[surface] == facade_avail_area[facade]
980
-
981
- surface_window_area[surface] += target_facade_areas[facade]
982
-
983
- new_facade = get_facade_for_surface(surface)
984
- area_moved = target_facade_areas[facade]
985
- target_facade_areas[facade] = 0
986
- target_facade_areas[new_facade] = surface_window_area[surface]
987
-
988
- runner.registerWarning("The #{facade} facade window area (#{area_moved.round(2)} ft2) is less than the minimum window area allowed (#{min_single_window_area.round(2)} ft2), and has been added to the #{new_facade} facade.")
989
- next
990
- end
991
-
1007
+ facades.each do |facade|
992
1008
  # Initial guess for wall of this facade
1009
+ next if facade_avail_area[facade] == 0
1010
+
993
1011
  wall_surfaces[facade].each do |surface|
994
1012
  surface_window_area[surface] += surface_avail_area[surface] / facade_avail_area[facade] * target_facade_areas[facade]
995
1013
  end
996
1014
 
997
1015
  # If window area for a surface is less than the minimum window area,
998
1016
  # set the window area to zero and proportionally redistribute to the
999
- # other surfaces.
1000
- wall_surfaces[facade].each_with_index do |surface, surface_num|
1001
- next if surface_window_area[surface] >= min_single_window_area
1017
+ # other surfaces on that facade and unit.
1018
+
1019
+ # Check wall surface areas (by unit/space)
1020
+ model.getBuildingUnits.each do |unit|
1021
+ wall_surfaces[facade].each_with_index do |surface, surface_num|
1022
+ next if surface_window_area[surface] == 0
1023
+ next unless unit.spaces.include? surface.space.get # surface belongs to this unit
1024
+ next unless surface_window_area[surface] < min_single_window_area
1025
+
1026
+ # Future surfaces are those that have not yet been compared to min_single_window_area
1027
+ future_surfaces_area = 0
1028
+ wall_surfaces[facade].each_with_index do |future_surface, future_surface_num|
1029
+ next if future_surface_num <= surface_num
1030
+ next unless unit.spaces.include? future_surface.space.get
1031
+
1032
+ future_surfaces_area += surface_avail_area[future_surface]
1033
+ end
1034
+ next if future_surfaces_area == 0
1002
1035
 
1003
- removed_window_area = surface_window_area[surface]
1004
- surface_window_area[surface] = 0
1036
+ removed_window_area = surface_window_area[surface]
1037
+ surface_window_area[surface] = 0
1005
1038
 
1006
- # Future surfaces are those that have not yet been compared to min_single_window_area
1007
- future_surfaces_area = 0
1008
- wall_surfaces[facade].each_with_index do |future_surface, future_surface_num|
1009
- next if future_surface_num <= surface_num
1039
+ wall_surfaces[facade].each_with_index do |future_surface, future_surface_num|
1040
+ next if future_surface_num <= surface_num
1041
+ next unless unit.spaces.include? future_surface.space.get
1010
1042
 
1011
- future_surfaces_area += surface_avail_area[future_surface]
1043
+ surface_window_area[future_surface] += removed_window_area * surface_avail_area[future_surface] / future_surfaces_area
1044
+ end
1012
1045
  end
1013
- next if future_surfaces_area == 0
1046
+ end
1047
+ end
1014
1048
 
1015
- wall_surfaces[facade].each_with_index do |future_surface, future_surface_num|
1016
- next if future_surface_num <= surface_num
1049
+ # Calculate facade areas for each unit
1050
+ unit_facade_areas = {}
1051
+ unit_wall_surfaces = {}
1052
+ model.getBuildingUnits.each do |unit|
1053
+ unit_facade_areas[unit] = {}
1054
+ unit_wall_surfaces[unit] = {}
1055
+ facades.each do |facade|
1056
+ unit_facade_areas[unit][facade] = 0
1057
+ unit_wall_surfaces[unit][facade] = []
1058
+ wall_surfaces[facade].each do |surface|
1059
+ next unless unit.spaces.include? surface.space.get
1017
1060
 
1018
- surface_window_area[future_surface] += removed_window_area * surface_window_area[future_surface] / future_surfaces_area
1061
+ unit_facade_areas[unit][facade] += surface_window_area[surface]
1062
+ unit_wall_surfaces[unit][facade] << surface
1019
1063
  end
1020
1064
  end
1065
+ end
1021
1066
 
1022
- # Because the above process is calculated based on the order of surfaces, it's possible
1023
- # that we have less area for this facade than we should. If so, redistribute proportionally
1024
- # to all surfaces that have window area.
1025
- sum_window_area = 0
1026
- wall_surfaces[facade].each do |surface|
1027
- sum_window_area += surface_window_area[surface]
1067
+ # if the sum of the window areas on the facade are < minimum, move to different facade
1068
+ facades.each do |facade|
1069
+ model.getBuildingUnits.each do |unit|
1070
+ next if unit_facade_areas[unit][facade] == 0
1071
+ next unless unit_facade_areas[unit][facade] < min_single_window_area
1072
+
1073
+ new_facade = unit_facade_areas[unit].max_by { |k, v| v }[0] # move to facade with largest window area
1074
+ next if new_facade == facade # can't move to same facade
1075
+ next if unit_facade_areas[unit][new_facade] <= unit_facade_areas[unit][facade] # only move to facade with >= window area
1076
+
1077
+ area_moved = unit_facade_areas[unit][facade]
1078
+ unit_facade_areas[unit][facade] = 0
1079
+ wall_surfaces[facade].each do |surface|
1080
+ next unless unit.spaces.include? surface.space.get # surface is in this unit
1081
+
1082
+ surface_window_area[surface] = 0
1083
+ end
1084
+
1085
+ unit_facade_areas[unit][new_facade] += area_moved
1086
+ sum_window_area = 0
1087
+ wall_surfaces[new_facade].each do |surface|
1088
+ next unless unit.spaces.include? surface.space.get # surface is in this unit
1089
+
1090
+ sum_window_area += UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2')
1091
+ end
1092
+
1093
+ wall_surfaces[new_facade].each do |surface|
1094
+ next unless unit.spaces.include? surface.space.get # surface is in this unit
1095
+
1096
+ split_window_area = area_moved * UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2') / sum_window_area
1097
+ surface_window_area[surface] += split_window_area
1098
+ end
1099
+
1100
+ runner.registerWarning("The #{facade} facade window area (#{area_moved.round(2)} ft2) is less than the minimum window area allowed (#{min_single_window_area.round(2)} ft2), and has been added to the #{new_facade} facade.")
1028
1101
  end
1029
- next if sum_window_area == 0
1030
- next if target_facade_areas[facade] < sum_window_area # for cases where window area was added from different facade
1102
+ end
1031
1103
 
1032
- wall_surfaces[facade].each do |surface|
1033
- surface_window_area[surface] += surface_window_area[surface] / sum_window_area * (target_facade_areas[facade] - sum_window_area)
1104
+ facades.each do |facade|
1105
+ model.getBuildingUnits.each do |unit|
1106
+ # Because the above process is calculated based on the order of surfaces, it's possible
1107
+ # that we have less area for this facade than we should. If so, redistribute proportionally
1108
+ # to all surfaces that have window area.
1109
+ sum_window_area = 0
1110
+ wall_surfaces[facade].each do |surface|
1111
+ next unless unit.spaces.include? surface.space.get
1112
+
1113
+ sum_window_area += surface_window_area[surface]
1114
+ end
1115
+ next if sum_window_area == 0
1116
+ next if unit_facade_areas[unit][facade] < sum_window_area # for cases where window area was added from different facade
1117
+
1118
+ wall_surfaces[facade].each do |surface|
1119
+ next unless unit.spaces.include? surface.space.get
1120
+
1121
+ surface_window_area[surface] += surface_window_area[surface] / sum_window_area * (unit_facade_areas[unit][facade] - sum_window_area)
1122
+ end
1034
1123
  end
1035
1124
  end
1036
1125
 
@@ -1039,7 +1128,7 @@ class Geometry
1039
1128
  facade_win_area = 0
1040
1129
  wall_surfaces[facade].each do |surface|
1041
1130
  next if surface_window_area[surface] == 0
1042
- if not add_windows_to_wall(surface, surface_window_area[surface], window_gap_y, window_gap_x, window_aspect_ratio, max_single_window_area, facade, constructions, model, runner)
1131
+ if not add_windows_to_wall(surface, surface_window_area[surface], window_gap_y, window_gap_x, window_aspect_ratio, max_single_window_area, facade, model, runner)
1043
1132
  return false
1044
1133
  end
1045
1134
 
@@ -1115,10 +1204,6 @@ class Geometry
1115
1204
  sub_surface.setName("#{surface.name} - Skylight")
1116
1205
  sub_surface.setSurface(surface)
1117
1206
 
1118
- if not constructions[facade].nil?
1119
- sub_surface.setConstruction(constructions[facade])
1120
- end
1121
-
1122
1207
  tot_sky_area += skylight_area
1123
1208
  end
1124
1209
  end
@@ -1130,7 +1215,12 @@ class Geometry
1130
1215
  return true
1131
1216
  end
1132
1217
 
1133
- def self.get_wall_area_for_windows(surface, min_wall_height_for_window, min_window_width, runner)
1218
+ def self.get_wall_area_for_windows(surface, min_average_ceiling_height_for_window, min_window_width, runner)
1219
+ # Skip surfaces with doors
1220
+ if surface.subSurfaces.size > 0
1221
+ return 0.0
1222
+ end
1223
+
1134
1224
  # Only allow on gable and rectangular walls
1135
1225
  if not (is_rectangular_wall(surface) || is_gable_wall(surface))
1136
1226
  return 0.0
@@ -1142,22 +1232,22 @@ class Geometry
1142
1232
  end
1143
1233
 
1144
1234
  # Wall too short?
1145
- if min_wall_height_for_window > get_surface_height(surface)
1235
+ if min_average_ceiling_height_for_window > get_surface_height(surface)
1146
1236
  return 0.0
1147
1237
  end
1148
1238
 
1149
1239
  # Gable too short?
1150
1240
  # TODO: super crude safety factor of 1.5
1151
- if is_gable_wall(surface) && (min_wall_height_for_window > get_surface_height(surface) / 1.5)
1241
+ if is_gable_wall(surface) && (min_average_ceiling_height_for_window > get_surface_height(surface) / 1.5)
1152
1242
  return 0.0
1153
1243
  end
1154
1244
 
1155
1245
  return UnitConversions.convert(surface.grossArea, 'm^2', 'ft^2')
1156
1246
  end
1157
1247
 
1158
- def self.add_windows_to_wall(surface, window_area, window_gap_y, window_gap_x, window_aspect_ratio, max_single_window_area, facade, constructions, model, runner)
1248
+ def self.add_windows_to_wall(surface, window_area, window_gap_y, window_gap_x, window_aspect_ratio, max_single_window_area, facade, model, runner)
1159
1249
  wall_width = get_surface_length(surface)
1160
- wall_height = get_surface_height(surface)
1250
+ average_ceiling_height = get_surface_height(surface)
1161
1251
 
1162
1252
  # Calculate number of windows needed
1163
1253
  num_windows = (window_area / max_single_window_area).ceil
@@ -1175,7 +1265,7 @@ class Geometry
1175
1265
  end
1176
1266
 
1177
1267
  # Position window from top of surface
1178
- win_top = wall_height - window_gap_y
1268
+ win_top = average_ceiling_height - window_gap_y
1179
1269
  if is_gable_wall(surface)
1180
1270
  # For gable surfaces, position windows from bottom of surface so they fit
1181
1271
  win_top = window_height + window_gap_y
@@ -1192,20 +1282,20 @@ class Geometry
1192
1282
  if not ((i == num_window_groups) && (num_windows % 2 == 1))
1193
1283
  # Two windows in group
1194
1284
  win_num += 1
1195
- add_window_to_wall(surface, window_width, window_height, group_cx - window_width / 2.0 - window_gap_x / 2.0, group_cy, win_num, facade, constructions, model, runner)
1285
+ add_window_to_wall(surface, window_width, window_height, group_cx - window_width / 2.0 - window_gap_x / 2.0, group_cy, win_num, facade, model, runner)
1196
1286
  win_num += 1
1197
- add_window_to_wall(surface, window_width, window_height, group_cx + window_width / 2.0 + window_gap_x / 2.0, group_cy, win_num, facade, constructions, model, runner)
1287
+ add_window_to_wall(surface, window_width, window_height, group_cx + window_width / 2.0 + window_gap_x / 2.0, group_cy, win_num, facade, model, runner)
1198
1288
  else
1199
1289
  # One window in group
1200
1290
  win_num += 1
1201
- add_window_to_wall(surface, window_width, window_height, group_cx, group_cy, win_num, facade, constructions, model, runner)
1291
+ add_window_to_wall(surface, window_width, window_height, group_cx, group_cy, win_num, facade, model, runner)
1202
1292
  end
1203
1293
  end
1204
1294
 
1205
1295
  return true
1206
1296
  end
1207
1297
 
1208
- def self.add_window_to_wall(surface, win_width, win_height, win_center_x, win_center_y, win_num, facade, constructions, model, runner)
1298
+ def self.add_window_to_wall(surface, win_width, win_height, win_center_x, win_center_y, win_num, facade, model, runner)
1209
1299
  # Create window vertices in relative coordinates, ft
1210
1300
  upperleft = [win_center_x - win_width / 2.0, win_center_y + win_height / 2.0]
1211
1301
  upperright = [win_center_x + win_width / 2.0, win_center_y + win_height / 2.0]
@@ -1246,9 +1336,6 @@ class Geometry
1246
1336
  sub_surface.setName("#{surface.name} - Window #{win_num}")
1247
1337
  sub_surface.setSurface(surface)
1248
1338
  sub_surface.setSubSurfaceType('FixedWindow')
1249
- if not constructions[facade].nil?
1250
- sub_surface.setConstruction(constructions[facade])
1251
- end
1252
1339
  end
1253
1340
 
1254
1341
  def self.get_conditioned_spaces(spaces)
@@ -1310,24 +1397,6 @@ class Geometry
1310
1397
  model:,
1311
1398
  door_area:,
1312
1399
  **remainder)
1313
- construction = nil
1314
- warn_msg = nil
1315
- model.getSubSurfaces.each do |sub_surface|
1316
- next if sub_surface.subSurfaceType.downcase != 'door'
1317
-
1318
- if sub_surface.construction.is_initialized
1319
- if not construction.nil?
1320
- warn_msg = 'Multiple constructions found. An arbitrary construction may be assigned to new door(s).'
1321
- end
1322
- construction = sub_surface.construction.get
1323
- end
1324
- runner.registerInfo("Removed door(s) from #{sub_surface.surface.get.name}.")
1325
- sub_surface.remove
1326
- end
1327
- if not warn_msg.nil?
1328
- runner.registerWarning(warn_msg)
1329
- end
1330
-
1331
1400
  # error checking
1332
1401
  if door_area < 0
1333
1402
  runner.registerError('Invalid door area.')
@@ -1349,8 +1418,8 @@ class Geometry
1349
1418
  next if space_is_below_grade(space)
1350
1419
 
1351
1420
  space.surfaces.each do |surface|
1352
- next if get_facade_for_surface(surface) != facade
1353
- next if surface.outsideBoundaryCondition.downcase != 'outdoors'
1421
+ next unless get_facade_for_surface(surface) == Constants.FacadeFront
1422
+ next unless (surface.outsideBoundaryCondition.downcase == 'outdoors') || (surface.outsideBoundaryCondition.downcase == 'adiabatic')
1354
1423
  next if (90 - surface.tilt * 180 / Math::PI).abs > 0.01 # Not a vertical wall
1355
1424
 
1356
1425
  avail_walls << surface
@@ -1374,45 +1443,6 @@ class Geometry
1374
1443
  end
1375
1444
  end
1376
1445
 
1377
- # Get all corridor walls
1378
- corridor_walls = []
1379
- get_conditioned_spaces(model.getSpaces).each do |space|
1380
- space.surfaces.each do |surface|
1381
- next unless surface.surfaceType.downcase == 'wall'
1382
- next unless surface.outsideBoundaryCondition.downcase == 'adiabatic'
1383
-
1384
- model.getSpaces.each do |potential_corridor_space|
1385
- next unless potential_corridor_space.spaceType.get.standardsSpaceType.get == HPXML::LocationOtherHousingUnit
1386
-
1387
- potential_corridor_space.surfaces.each do |potential_corridor_surface|
1388
- next unless surface.reverseEqualVertices(potential_corridor_surface)
1389
-
1390
- corridor_walls << potential_corridor_surface
1391
- end
1392
- end
1393
- end
1394
- end
1395
-
1396
- # Get subset of corridor walls on lowest story
1397
- min_story_corridor_walls = []
1398
- min_story_corridor_wall_minz = 99999
1399
- corridor_walls.each do |corridor_wall|
1400
- zvalues = getSurfaceZValues([corridor_wall])
1401
- minz = zvalues.min + corridor_wall.space.get.zOrigin
1402
- if minz < min_story_corridor_wall_minz
1403
- min_story_corridor_walls.clear
1404
- min_story_corridor_walls << corridor_wall
1405
- min_story_corridor_wall_minz = minz
1406
- elsif (minz - min_story_corridor_wall_minz).abs < 0.001
1407
- min_story_corridor_walls << corridor_wall
1408
- end
1409
- end
1410
-
1411
- # Prioritize corridor surfaces if available
1412
- unless min_story_corridor_walls.size == 0
1413
- min_story_avail_walls = min_story_corridor_walls
1414
- end
1415
-
1416
1446
  unit_has_door = true
1417
1447
  if min_story_avail_walls.size == 0
1418
1448
  runner.registerWarning('Could not find appropriate surface for the door. No door was added.')
@@ -1483,9 +1513,6 @@ class Geometry
1483
1513
  door_sub_surface.setName("#{min_story_avail_wall.name} - Door")
1484
1514
  door_sub_surface.setSurface(min_story_avail_wall)
1485
1515
  door_sub_surface.setSubSurfaceType('Door')
1486
- if not construction.nil?
1487
- door_sub_surface.setConstruction(construction)
1488
- end
1489
1516
 
1490
1517
  break
1491
1518
  end
@@ -1510,86 +1537,67 @@ class Geometry
1510
1537
 
1511
1538
  def self.create_single_family_attached(runner:,
1512
1539
  model:,
1513
- geometry_cfa:,
1514
- geometry_wall_height:,
1540
+ geometry_unit_cfa:,
1541
+ geometry_average_ceiling_height:,
1515
1542
  geometry_building_num_units:,
1516
- geometry_num_floors_above_grade:,
1517
- geometry_aspect_ratio:,
1518
- geometry_horizontal_location:,
1519
- geometry_corridor_position:,
1543
+ geometry_unit_num_floors_above_grade:,
1544
+ geometry_unit_aspect_ratio:,
1520
1545
  geometry_foundation_type:,
1521
1546
  geometry_foundation_height:,
1522
1547
  geometry_rim_joist_height:,
1523
1548
  geometry_attic_type:,
1524
1549
  geometry_roof_type:,
1525
1550
  geometry_roof_pitch:,
1551
+ geometry_unit_left_wall_is_adiabatic:,
1552
+ geometry_unit_right_wall_is_adiabatic:,
1553
+ geometry_unit_front_wall_is_adiabatic:,
1554
+ geometry_unit_back_wall_is_adiabatic:,
1526
1555
  **remainder)
1527
1556
 
1528
- cfa = geometry_cfa
1529
- wall_height = geometry_wall_height
1557
+ cfa = geometry_unit_cfa
1558
+ average_ceiling_height = geometry_average_ceiling_height
1530
1559
  num_units = geometry_building_num_units.get
1531
- num_floors = geometry_num_floors_above_grade
1532
- aspect_ratio = geometry_aspect_ratio
1533
- horizontal_location = geometry_horizontal_location.get
1534
- corridor_position = geometry_corridor_position
1560
+ num_floors = geometry_unit_num_floors_above_grade
1561
+ aspect_ratio = geometry_unit_aspect_ratio
1535
1562
  foundation_type = geometry_foundation_type
1536
1563
  foundation_height = geometry_foundation_height
1537
1564
  rim_joist_height = geometry_rim_joist_height
1538
1565
  attic_type = geometry_attic_type
1566
+ if attic_type == HPXML::AtticTypeConditioned
1567
+ num_floors -= 1
1568
+ end
1539
1569
  roof_type = geometry_roof_type
1540
1570
  roof_pitch = geometry_roof_pitch
1541
-
1542
- has_rear_units = false
1543
- if corridor_position == 'Double Exterior'
1544
- has_rear_units = true
1545
- end
1546
- offset = 0
1547
-
1548
- num_units_actual = num_units
1549
- num_floors_actual = num_floors
1550
- if has_rear_units
1551
- unit_width = num_units / 2
1552
- else
1553
- unit_width = num_units
1554
- end
1571
+ adiabatic_left_wall = geometry_unit_left_wall_is_adiabatic
1572
+ adiabatic_right_wall = geometry_unit_right_wall_is_adiabatic
1573
+ adiabatic_front_wall = geometry_unit_front_wall_is_adiabatic
1574
+ adiabatic_back_wall = geometry_unit_back_wall_is_adiabatic
1555
1575
 
1556
1576
  # error checking
1557
1577
  if model.getSpaces.size > 0
1558
1578
  runner.registerError('Starting model is not empty.')
1559
1579
  return false
1560
1580
  end
1561
- if foundation_type.downcase.include?('crawlspace') && ((foundation_height < 1.5) || (foundation_height > 5.0))
1562
- runner.registerError('The crawlspace height can be set between 1.5 and 5 ft.')
1563
- return false
1564
- end
1565
- if (num_units == 1) && has_rear_units
1566
- runner.registerError("Specified building as having rear units, but didn't specify enough units.")
1567
- return false
1568
- end
1569
1581
  if aspect_ratio < 0
1570
1582
  runner.registerError('Invalid aspect ratio entered.')
1571
1583
  return false
1572
1584
  end
1573
- if has_rear_units && (num_units % 2 != 0)
1574
- runner.registerError('Specified a building with rear units and an odd number of units.')
1585
+ if adiabatic_left_wall && adiabatic_right_wall && adiabatic_front_wall && adiabatic_back_wall
1586
+ runner.registerError('At least one wall must be set to non-adiabatic')
1575
1587
  return false
1576
1588
  end
1577
- if (unit_width < 3) && (horizontal_location == 'Middle')
1578
- runner.registerError('Invalid horizontal location entered, no middle location exists.')
1589
+ if foundation_type == HPXML::FoundationTypeAboveApartment
1590
+ runner.registerError('Single-family attached buildings cannot be above another unit')
1579
1591
  return false
1580
1592
  end
1581
- if (unit_width > 1) && (horizontal_location == 'None')
1582
- runner.registerError('Invalid horizontal location entered.')
1593
+ if attic_type == HPXML::AtticTypeBelowApartment
1594
+ runner.registerError('Single-family attached buildings cannot be below another unit')
1583
1595
  return false
1584
1596
  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
1589
1597
 
1590
1598
  # Convert to SI
1591
1599
  cfa = UnitConversions.convert(cfa, 'ft^2', 'm^2')
1592
- wall_height = UnitConversions.convert(wall_height, 'ft', 'm')
1600
+ average_ceiling_height = UnitConversions.convert(average_ceiling_height, 'ft', 'm')
1593
1601
  foundation_height = UnitConversions.convert(foundation_height, 'ft', 'm')
1594
1602
  rim_joist_height = UnitConversions.convert(rim_joist_height, 'ft', 'm')
1595
1603
 
@@ -1626,7 +1634,7 @@ class Geometry
1626
1634
 
1627
1635
  # first floor front
1628
1636
  living_spaces_front = []
1629
- living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, wall_height, model)
1637
+ living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, average_ceiling_height, model)
1630
1638
  living_space = living_space.get
1631
1639
  living_space.setName(HPXML::LocationLivingSpace)
1632
1640
  living_space_type = OpenStudio::Model::SpaceType.new(model)
@@ -1637,20 +1645,16 @@ class Geometry
1637
1645
  living_spaces_front << living_space
1638
1646
 
1639
1647
  # Adiabatic surfaces for walls
1640
- # Map unit location to adiabatic surfaces (#if `key` unit then make `value(s)` adiabatic)
1641
- horz_hash = { 'Left' => ['right'], 'Right' => ['left'], 'Middle' => ['left', 'right'], 'None' => [] }
1642
- adb_facade = horz_hash[horizontal_location]
1643
- if (has_rear_units == true)
1644
- adb_facade += ['back']
1645
- end
1648
+ adb_facade_hash = { 'left' => adiabatic_left_wall, 'right' => adiabatic_right_wall, 'front' => adiabatic_front_wall, 'back' => adiabatic_back_wall }
1649
+ adb_facades = adb_facade_hash.select { |_, v| v == true }.keys
1646
1650
 
1647
- adiabatic_surf = adb_facade
1648
1651
  # Make surfaces adiabatic
1649
1652
  model.getSpaces.each do |space|
1650
1653
  space.surfaces.each do |surface|
1651
1654
  os_facade = get_facade_for_surface(surface)
1652
1655
  next unless surface.surfaceType == 'Wall'
1653
- next unless adb_facade.include? os_facade
1656
+ next unless adb_facades.include? os_facade
1657
+
1654
1658
  x_ft = UnitConversions.convert(x, 'm', 'ft')
1655
1659
  max_x = getSurfaceXValues([surface]).max
1656
1660
  min_x = getSurfaceXValues([surface]).min
@@ -1671,7 +1675,7 @@ class Geometry
1671
1675
  new_living_space.setSpaceType(living_space_type)
1672
1676
 
1673
1677
  m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 0))
1674
- m[2, 3] = wall_height * (story - 1)
1678
+ m[2, 3] = average_ceiling_height * (story - 1)
1675
1679
  new_living_space.setTransformation(OpenStudio::Transformation.new(m))
1676
1680
  new_living_space.setThermalZone(living_zone)
1677
1681
 
@@ -1679,8 +1683,8 @@ class Geometry
1679
1683
  end
1680
1684
 
1681
1685
  # attic
1682
- if roof_type != 'flat'
1683
- attic_space = get_attic_space(model, x, y, wall_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height)
1686
+ if attic_type != HPXML::AtticTypeFlatRoof
1687
+ attic_space = get_attic_space(model, x, y, average_ceiling_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height)
1684
1688
  if attic_type == HPXML::AtticTypeConditioned
1685
1689
  attic_space.setName("#{attic_type} space")
1686
1690
  attic_space.setThermalZone(living_zone)
@@ -1707,13 +1711,19 @@ class Geometry
1707
1711
  foundation_space.setYOrigin(0)
1708
1712
  foundation_space.setZOrigin(0)
1709
1713
 
1710
- if foundation_type == HPXML::FoundationTypeBasementConditioned
1714
+ if [HPXML::FoundationTypeBasementConditioned,
1715
+ HPXML::FoundationTypeCrawlspaceConditioned].include? foundation_type
1716
+ if foundation_type == HPXML::FoundationTypeCrawlspaceConditioned
1717
+ foundation_space_name = HPXML::LocationCrawlspaceConditioned
1718
+ elsif foundation_type == HPXML::FoundationTypeBasementConditioned
1719
+ foundation_space_name = HPXML::LocationBasementConditioned
1720
+ end
1711
1721
  foundation_zone = OpenStudio::Model::ThermalZone.new(model)
1712
- foundation_space.setName(HPXML::FoundationTypeBasementConditioned)
1713
- foundation_zone.setName(HPXML::FoundationTypeBasementConditioned)
1722
+ foundation_space.setName(foundation_type)
1723
+ foundation_zone.setName(foundation_type)
1714
1724
  foundation_space.setThermalZone(foundation_zone)
1715
1725
  foundation_space_type = OpenStudio::Model::SpaceType.new(model)
1716
- foundation_space_type.setStandardsSpaceType(HPXML::LocationBasementConditioned)
1726
+ foundation_space_type.setStandardsSpaceType(foundation_space_name)
1717
1727
  foundation_space.setSpaceType(foundation_space_type)
1718
1728
  end
1719
1729
 
@@ -1733,7 +1743,9 @@ class Geometry
1733
1743
  OpenStudio::Model.intersectSurfaces(spaces)
1734
1744
  OpenStudio::Model.matchSurfaces(spaces)
1735
1745
 
1736
- if [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include? foundation_type
1746
+ if [HPXML::FoundationTypeCrawlspaceVented,
1747
+ HPXML::FoundationTypeCrawlspaceUnvented,
1748
+ HPXML::FoundationTypeBasementUnconditioned].include? foundation_type
1737
1749
  # create foundation zone
1738
1750
  foundation_zone = OpenStudio::Model::ThermalZone.new(model)
1739
1751
 
@@ -1759,12 +1771,13 @@ class Geometry
1759
1771
  spaces = model.getSpaces
1760
1772
  spaces.each do |space|
1761
1773
  next unless get_space_floor_z(space) + UnitConversions.convert(space.zOrigin, 'm', 'ft') < 0
1774
+
1762
1775
  surfaces = space.surfaces
1763
1776
  surfaces.each do |surface|
1764
1777
  next if surface.surfaceType.downcase != 'wall'
1765
1778
 
1766
1779
  os_facade = get_facade_for_surface(surface)
1767
- if adb_facade.include? os_facade
1780
+ if adb_facades.include? os_facade
1768
1781
  surface.setOutsideBoundaryCondition('Adiabatic')
1769
1782
  elsif getSurfaceZValues([surface]).min < 0
1770
1783
  surface.setOutsideBoundaryCondition('Foundation')
@@ -1786,15 +1799,11 @@ class Geometry
1786
1799
  OpenStudio::Model.intersectSurfaces(spaces)
1787
1800
  OpenStudio::Model.matchSurfaces(spaces)
1788
1801
 
1789
- if [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(attic_type) && (roof_type != 'flat')
1790
- if offset == 0
1791
- attic_spaces.each do |attic_space|
1792
- attic_space.remove
1793
- end
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)
1795
- else
1796
- attic_space = make_one_space_from_multiple_spaces(model, attic_spaces)
1802
+ if [HPXML::AtticTypeVented, HPXML::AtticTypeUnvented].include?(attic_type)
1803
+ attic_spaces.each do |attic_space|
1804
+ attic_space.remove
1797
1805
  end
1806
+ attic_space = get_attic_space(model, x, y, average_ceiling_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height)
1798
1807
 
1799
1808
  # set these to the attic zone
1800
1809
  if (attic_type == HPXML::AtticTypeVented) || (attic_type == HPXML::AtticTypeUnvented)
@@ -1820,7 +1829,8 @@ class Geometry
1820
1829
  attic_space.surfaces.each do |surface|
1821
1830
  os_facade = get_facade_for_surface(surface)
1822
1831
  next unless surface.surfaceType == 'Wall'
1823
- next unless adb_facade.include? os_facade
1832
+ next unless adb_facades.include? os_facade
1833
+
1824
1834
  x_ft = UnitConversions.convert(x, 'm', 'ft')
1825
1835
  max_x = getSurfaceXValues([surface]).max
1826
1836
  min_x = getSurfaceXValues([surface]).min
@@ -1850,24 +1860,24 @@ class Geometry
1850
1860
  return true
1851
1861
  end
1852
1862
 
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)
1863
+ def self.get_attic_space(model, x, y, average_ceiling_height, num_floors, num_units, roof_pitch, roof_type, rim_joist_height)
1854
1864
  y_rear = 0
1855
1865
  y_peak = -y / 2
1856
1866
  y_tot = y
1857
1867
  x_tot = x * num_units
1858
1868
 
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)
1869
+ nw_point = OpenStudio::Point3d.new(0, 0, average_ceiling_height * num_floors + rim_joist_height)
1870
+ ne_point = OpenStudio::Point3d.new(x, 0, average_ceiling_height * num_floors + rim_joist_height)
1871
+ sw_point = OpenStudio::Point3d.new(0, -y, average_ceiling_height * num_floors + rim_joist_height)
1872
+ se_point = OpenStudio::Point3d.new(x, -y, average_ceiling_height * num_floors + rim_joist_height)
1863
1873
  attic_polygon = make_polygon(sw_point, nw_point, ne_point, se_point)
1864
1874
 
1865
1875
  attic_height = (y_tot / 2.0) * roof_pitch + rim_joist_height # Roof always has same orientation
1866
1876
 
1867
1877
  side_type = nil
1868
1878
  if roof_type == 'gable'
1869
- roof_w_point = OpenStudio::Point3d.new(0, y_peak, wall_height * num_floors + attic_height)
1870
- roof_e_point = OpenStudio::Point3d.new(x, y_peak, wall_height * num_floors + attic_height)
1879
+ roof_w_point = OpenStudio::Point3d.new(0, y_peak, average_ceiling_height * num_floors + attic_height)
1880
+ roof_e_point = OpenStudio::Point3d.new(x, y_peak, average_ceiling_height * num_floors + attic_height)
1871
1881
  polygon_w_roof = make_polygon(roof_w_point, roof_e_point, ne_point, nw_point)
1872
1882
  polygon_e_roof = make_polygon(roof_e_point, roof_w_point, sw_point, se_point)
1873
1883
  polygon_s_wall = make_polygon(roof_w_point, nw_point, sw_point)
@@ -1876,15 +1886,15 @@ class Geometry
1876
1886
  elsif roof_type == 'hip'
1877
1887
  if y > 0
1878
1888
  if x <= (y + y_rear)
1879
- roof_n_point = OpenStudio::Point3d.new(x / 2.0, y_rear - x / 2.0, wall_height * num_floors + attic_height)
1880
- roof_s_point = OpenStudio::Point3d.new(x / 2.0, -y + x / 2.0, wall_height * num_floors + attic_height)
1889
+ roof_n_point = OpenStudio::Point3d.new(x / 2.0, y_rear - x / 2.0, average_ceiling_height * num_floors + attic_height)
1890
+ roof_s_point = OpenStudio::Point3d.new(x / 2.0, -y + x / 2.0, average_ceiling_height * num_floors + attic_height)
1881
1891
  polygon_w_roof = make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1882
1892
  polygon_e_roof = make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1883
1893
  polygon_s_wall = make_polygon(roof_s_point, sw_point, se_point)
1884
1894
  polygon_n_wall = make_polygon(roof_n_point, ne_point, nw_point)
1885
1895
  else
1886
- roof_w_point = OpenStudio::Point3d.new((y + y_rear) / 2.0, (y_rear - y) / 2.0, wall_height * num_floors + attic_height)
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
+ roof_w_point = OpenStudio::Point3d.new((y + y_rear) / 2.0, (y_rear - y) / 2.0, average_ceiling_height * num_floors + attic_height)
1897
+ roof_e_point = OpenStudio::Point3d.new(x - (y + y_rear) / 2.0, (y_rear - y) / 2.0, average_ceiling_height * num_floors + attic_height)
1888
1898
  polygon_w_roof = make_polygon(roof_w_point, sw_point, se_point, roof_e_point)
1889
1899
  polygon_e_roof = make_polygon(roof_e_point, ne_point, nw_point, roof_w_point)
1890
1900
  polygon_s_wall = make_polygon(roof_e_point, se_point, ne_point)
@@ -1892,15 +1902,15 @@ class Geometry
1892
1902
  end
1893
1903
  else
1894
1904
  if x <= y.abs
1895
- roof_n_point = OpenStudio::Point3d.new(x / 2.0, -y - x / 2.0, wall_height * num_floors + attic_height)
1896
- roof_s_point = OpenStudio::Point3d.new(x / 2.0, x / 2.0, wall_height * num_floors + attic_height)
1905
+ roof_n_point = OpenStudio::Point3d.new(x / 2.0, -y - x / 2.0, average_ceiling_height * num_floors + attic_height)
1906
+ roof_s_point = OpenStudio::Point3d.new(x / 2.0, x / 2.0, average_ceiling_height * num_floors + attic_height)
1897
1907
  polygon_w_roof = make_polygon(roof_n_point, nw_point, sw_point, roof_s_point)
1898
1908
  polygon_e_roof = make_polygon(roof_s_point, se_point, ne_point, roof_n_point)
1899
1909
  polygon_s_wall = make_polygon(roof_s_point, sw_point, se_point)
1900
1910
  polygon_n_wall = make_polygon(roof_n_point, ne_point, nw_point)
1901
1911
  else
1902
- roof_w_point = OpenStudio::Point3d.new(-y / 2.0, -y / 2.0, wall_height * num_floors + attic_height)
1903
- roof_e_point = OpenStudio::Point3d.new(x + y / 2.0, -y / 2.0, wall_height * num_floors + attic_height)
1912
+ roof_w_point = OpenStudio::Point3d.new(-y / 2.0, -y / 2.0, average_ceiling_height * num_floors + attic_height)
1913
+ roof_e_point = OpenStudio::Point3d.new(x + y / 2.0, -y / 2.0, average_ceiling_height * num_floors + attic_height)
1904
1914
  polygon_w_roof = make_polygon(roof_w_point, sw_point, se_point, roof_e_point)
1905
1915
  polygon_e_roof = make_polygon(roof_e_point, ne_point, nw_point, roof_w_point)
1906
1916
  polygon_s_wall = make_polygon(roof_e_point, se_point, ne_point)
@@ -1939,15 +1949,11 @@ class Geometry
1939
1949
 
1940
1950
  def self.create_multifamily(runner:,
1941
1951
  model:,
1942
- geometry_cfa:,
1943
- geometry_wall_height:,
1952
+ geometry_unit_cfa:,
1953
+ geometry_average_ceiling_height:,
1944
1954
  geometry_building_num_units:,
1945
- geometry_num_floors_above_grade:,
1946
- geometry_aspect_ratio:,
1947
- geometry_level:,
1948
- geometry_horizontal_location:,
1949
- geometry_corridor_position:,
1950
- geometry_corridor_width:,
1955
+ geometry_unit_num_floors_above_grade:,
1956
+ geometry_unit_aspect_ratio:,
1951
1957
  geometry_inset_width:,
1952
1958
  geometry_inset_depth:,
1953
1959
  geometry_inset_position:,
@@ -1955,17 +1961,17 @@ class Geometry
1955
1961
  geometry_foundation_type:,
1956
1962
  geometry_foundation_height:,
1957
1963
  geometry_rim_joist_height:,
1964
+ geometry_attic_type:,
1965
+ geometry_unit_left_wall_is_adiabatic:,
1966
+ geometry_unit_right_wall_is_adiabatic:,
1967
+ geometry_unit_front_wall_is_adiabatic:,
1968
+ geometry_unit_back_wall_is_adiabatic:,
1958
1969
  **remainder)
1959
1970
 
1960
- cfa = geometry_cfa
1961
- wall_height = geometry_wall_height
1971
+ cfa = geometry_unit_cfa
1972
+ average_ceiling_height = geometry_average_ceiling_height
1962
1973
  num_units = geometry_building_num_units.get
1963
- num_floors = geometry_num_floors_above_grade
1964
- aspect_ratio = geometry_aspect_ratio
1965
- level = geometry_level.get
1966
- horz_location = geometry_horizontal_location.get
1967
- corridor_position = geometry_corridor_position
1968
- corridor_width = geometry_corridor_width
1974
+ aspect_ratio = geometry_unit_aspect_ratio
1969
1975
  inset_width = geometry_inset_width
1970
1976
  inset_depth = geometry_inset_depth
1971
1977
  inset_position = geometry_inset_position
@@ -1973,89 +1979,43 @@ class Geometry
1973
1979
  foundation_type = geometry_foundation_type
1974
1980
  foundation_height = geometry_foundation_height
1975
1981
  rim_joist_height = geometry_rim_joist_height
1982
+ attic_type = geometry_attic_type
1983
+ adiabatic_left_wall = geometry_unit_left_wall_is_adiabatic
1984
+ adiabatic_right_wall = geometry_unit_right_wall_is_adiabatic
1985
+ adiabatic_front_wall = geometry_unit_front_wall_is_adiabatic
1986
+ adiabatic_back_wall = geometry_unit_back_wall_is_adiabatic
1976
1987
 
1977
- if level != 'Bottom'
1988
+ if foundation_type == HPXML::FoundationTypeAboveApartment
1978
1989
  foundation_type = HPXML::LocationOtherHousingUnit
1979
1990
  foundation_height = 0.0
1980
1991
  rim_joist_height = 0.0
1981
1992
  end
1982
-
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
1986
-
1987
- if (num_floors > 1) && (level != 'Bottom') && (foundation_height != 0.0)
1988
- runner.registerWarning('Unit is not on the bottom floor, setting foundation height to 0.')
1989
- foundation_height = 0.0
1990
- end
1991
-
1992
- if num_floors == 1
1993
- level = 'Bottom'
1994
- end
1995
-
1996
- if (num_units_per_floor % 2 == 0) && ((corridor_position == 'Double-Loaded Interior') || (corridor_position == 'Double Exterior'))
1997
- unit_depth = 2
1998
- unit_width = num_units_per_floor / 2
1999
- has_rear_units = true
2000
- else
2001
- unit_depth = 1
2002
- unit_width = num_units_per_floor
2003
- has_rear_units = false
1993
+ if attic_type == HPXML::AtticTypeBelowApartment
1994
+ attic_type = HPXML::LocationOtherHousingUnit
2004
1995
  end
2005
1996
 
2006
- # error checking
1997
+ # Error checking
2007
1998
  if model.getSpaces.size > 0
2008
1999
  runner.registerError('Starting model is not empty.')
2009
2000
  return false
2010
2001
  end
2011
- if foundation_type.downcase.include?('crawlspace') && ((foundation_height < 1.5) || (foundation_height > 5.0))
2012
- runner.registerError('The crawlspace height can be set between 1.5 and 5 ft.')
2013
- return false
2014
- end
2015
- if num_units % num_floors != 0
2016
- runner.registerError("The number of units (#{num_units}) must be divisible by the number of floors (#{num_floors}).")
2017
- return false
2018
- end
2019
- if !has_rear_units && ((corridor_position == 'Double-Loaded Interior') || (corridor_position == 'Double Exterior'))
2020
- runner.registerWarning("Specified incompatible corridor; setting corridor position to 'Single Exterior (Front)'.")
2021
- corridor_position = 'Single Exterior (Front)'
2022
- end
2023
2002
  if aspect_ratio < 0
2024
2003
  runner.registerError('Invalid aspect ratio entered.')
2025
2004
  return false
2026
2005
  end
2027
- if (corridor_width == 0) && (corridor_position != 'None')
2028
- corridor_position = 'None'
2029
- end
2030
- if corridor_position == 'None'
2031
- corridor_width = 0
2032
- end
2033
- if corridor_width < 0
2034
- runner.registerError('Invalid corridor width entered.')
2035
- return false
2036
- end
2037
2006
  if (balcony_depth > 0) && (inset_width * inset_depth == 0)
2038
2007
  runner.registerWarning('Specified a balcony, but there is no inset.')
2039
2008
  balcony_depth = 0
2040
2009
  end
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')
2050
- runner.registerError('No middle horizontal location exists.')
2010
+ if adiabatic_left_wall && adiabatic_right_wall && adiabatic_front_wall && adiabatic_back_wall
2011
+ runner.registerError('At least one wall must be set to non-adiabatic')
2051
2012
  return false
2052
2013
  end
2053
2014
 
2054
2015
  # Convert to SI
2055
2016
  cfa = UnitConversions.convert(cfa, 'ft^2', 'm^2')
2056
- wall_height = UnitConversions.convert(wall_height, 'ft', 'm')
2017
+ average_ceiling_height = UnitConversions.convert(average_ceiling_height, 'ft', 'm')
2057
2018
  foundation_height = UnitConversions.convert(foundation_height, 'ft', 'm')
2058
- corridor_width = UnitConversions.convert(corridor_width, 'ft', 'm')
2059
2019
  inset_width = UnitConversions.convert(inset_width, 'ft', 'm')
2060
2020
  inset_depth = UnitConversions.convert(inset_depth, 'ft', 'm')
2061
2021
  balcony_depth = UnitConversions.convert(balcony_depth, 'ft', 'm')
@@ -2066,10 +2026,6 @@ class Geometry
2066
2026
  x = Math.sqrt(footprint / aspect_ratio)
2067
2027
  y = footprint / x
2068
2028
 
2069
- story_hash = { 'Bottom' => 0, 'Middle' => 1, 'Top' => num_floors - 1 }
2070
- z = wall_height * story_hash[level]
2071
-
2072
- foundation_corr_polygon = nil
2073
2029
  foundation_front_polygon = nil
2074
2030
  foundation_back_polygon = nil
2075
2031
 
@@ -2088,10 +2044,10 @@ class Geometry
2088
2044
  living_polygon = make_polygon(sw_point, nw_point, ne_point, side_point, inset_point, front_point)
2089
2045
  # unit balcony
2090
2046
  if balcony_depth > 0
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)
2047
+ inset_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y, average_ceiling_height + rim_joist_height)
2048
+ side_point = OpenStudio::Point3d.new(x, inset_depth - y, average_ceiling_height + rim_joist_height)
2049
+ se_point = OpenStudio::Point3d.new(x, inset_depth - y - balcony_depth, average_ceiling_height + rim_joist_height)
2050
+ front_point = OpenStudio::Point3d.new(x - inset_width, inset_depth - y - balcony_depth, average_ceiling_height + rim_joist_height)
2095
2051
  shading_surface = OpenStudio::Model::ShadingSurface.new(OpenStudio::Point3dVector.new([front_point, se_point, side_point, inset_point]), model)
2096
2052
  end
2097
2053
  else
@@ -2102,10 +2058,10 @@ class Geometry
2102
2058
  living_polygon = make_polygon(side_point, nw_point, ne_point, se_point, front_point, inset_point)
2103
2059
  # unit balcony
2104
2060
  if balcony_depth > 0
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)
2061
+ inset_point = OpenStudio::Point3d.new(inset_width, inset_depth - y, average_ceiling_height + rim_joist_height)
2062
+ side_point = OpenStudio::Point3d.new(0, inset_depth - y, average_ceiling_height + rim_joist_height)
2063
+ sw_point = OpenStudio::Point3d.new(0, inset_depth - y - balcony_depth, average_ceiling_height + rim_joist_height)
2064
+ front_point = OpenStudio::Point3d.new(inset_width, inset_depth - y - balcony_depth, average_ceiling_height + rim_joist_height)
2109
2065
  shading_surface = OpenStudio::Model::ShadingSurface.new(OpenStudio::Point3dVector.new([front_point, sw_point, side_point, inset_point]), model)
2110
2066
  end
2111
2067
  end
@@ -2124,7 +2080,7 @@ class Geometry
2124
2080
 
2125
2081
  # first floor front
2126
2082
  living_spaces_front = []
2127
- living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, wall_height, model)
2083
+ living_space = OpenStudio::Model::Space::fromFloorPrint(living_polygon, average_ceiling_height, model)
2128
2084
  living_space = living_space.get
2129
2085
  living_space.setName(HPXML::LocationLivingSpace)
2130
2086
  living_space_type = OpenStudio::Model::SpaceType.new(model)
@@ -2140,27 +2096,25 @@ class Geometry
2140
2096
  end
2141
2097
  living_spaces_front << living_space
2142
2098
 
2143
- # Map unit location to adiabatic surfaces
2144
- horz_hash = { 'Left' => ['right'], 'Right' => ['left'], 'Middle' => ['left', 'right'], 'None' => [] }
2145
- level_hash = { 'Bottom' => ['RoofCeiling'], 'Top' => ['Floor'], 'Middle' => ['RoofCeiling', 'Floor'], 'None' => [] }
2146
- adb_facade = horz_hash[horz_location]
2147
- adb_level = level_hash[level]
2099
+ # Map surface facades to adiabatic walls
2100
+ adb_facade_hash = { 'left' => adiabatic_left_wall, 'right' => adiabatic_right_wall, 'front' => adiabatic_front_wall, 'back' => adiabatic_back_wall }
2101
+ adb_facades = adb_facade_hash.select { |_, v| v == true }.keys
2148
2102
 
2149
- # Check levels
2150
- if num_floors == 1
2151
- adb_level = []
2103
+ # Adiabatic floor/ceiling
2104
+ adb_levels = []
2105
+ if attic_type == HPXML::LocationOtherHousingUnit
2106
+ adb_levels += ['RoofCeiling']
2152
2107
  end
2153
- if (has_rear_units == true)
2154
- adb_facade += ['back']
2108
+ if foundation_type == HPXML::LocationOtherHousingUnit
2109
+ adb_levels += ['Floor']
2155
2110
  end
2156
2111
 
2157
- adiabatic_surf = adb_facade + adb_level
2158
2112
  # Make living space surfaces adiabatic
2159
2113
  model.getSpaces.each do |space|
2160
2114
  space.surfaces.each do |surface|
2161
2115
  os_facade = get_facade_for_surface(surface)
2162
2116
  if surface.surfaceType == 'Wall'
2163
- if adb_facade.include? os_facade
2117
+ if adb_facades.include? os_facade
2164
2118
  x_ft = UnitConversions.convert(x, 'm', 'ft')
2165
2119
  max_x = getSurfaceXValues([surface]).max
2166
2120
  min_x = getSurfaceXValues([surface]).min
@@ -2169,7 +2123,7 @@ class Geometry
2169
2123
  surface.setOutsideBoundaryCondition('Adiabatic')
2170
2124
  end
2171
2125
  else
2172
- if (adb_level.include? surface.surfaceType)
2126
+ if (adb_levels.include? surface.surfaceType)
2173
2127
  surface.setOutsideBoundaryCondition('Adiabatic')
2174
2128
  end
2175
2129
 
@@ -2177,69 +2131,10 @@ class Geometry
2177
2131
  end
2178
2132
  end
2179
2133
 
2180
- if (corridor_position == 'Double-Loaded Interior')
2181
- interior_corridor_width = corridor_width / 2 # Only half the corridor is attached to a unit
2182
- # corridors
2183
- if corridor_width > 0
2184
- # create the prototype corridor
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)
2189
- corr_polygon = make_polygon(sw_point, nw_point, ne_point, se_point)
2190
-
2191
- if (foundation_height > 0) && foundation_corr_polygon.nil?
2192
- foundation_corr_polygon = corr_polygon
2193
- end
2194
-
2195
- # create corridor zone
2196
- corridor_zone = OpenStudio::Model::ThermalZone.new(model)
2197
- corridor_zone.setName(HPXML::LocationOtherHousingUnit)
2198
- corridor_space = OpenStudio::Model::Space::fromFloorPrint(corr_polygon, wall_height, model)
2199
- corridor_space = corridor_space.get
2200
- corridor_space.setName(HPXML::LocationOtherHousingUnit)
2201
- corridor_space_type = OpenStudio::Model::SpaceType.new(model)
2202
- corridor_space_type.setStandardsSpaceType(HPXML::LocationOtherHousingUnit)
2203
-
2204
- corridor_space.setSpaceType(corridor_space_type)
2205
- corridor_space.setThermalZone(corridor_zone)
2206
- end
2207
-
2208
- elsif (corridor_position == 'Double Exterior') || (corridor_position == 'Single Exterior (Front)')
2209
- interior_corridor_width = 0
2210
- # front access
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)
2215
-
2216
- shading_surface = OpenStudio::Model::ShadingSurface.new(OpenStudio::Point3dVector.new([sw_point, se_point, ne_point, nw_point]), model)
2217
- shading_surface_group = OpenStudio::Model::ShadingSurfaceGroup.new(model)
2218
- shading_surface.setShadingSurfaceGroup(shading_surface_group)
2219
- shading_surface.setName('Corridor shading')
2220
- end
2221
-
2222
2134
  # foundation
2223
2135
  if foundation_height > 0
2224
2136
  foundation_spaces = []
2225
2137
 
2226
- # foundation corridor
2227
- foundation_corridor_space = nil
2228
- if (corridor_width > 0) && (corridor_position == 'Double-Loaded Interior')
2229
- foundation_corridor_space = OpenStudio::Model::Space::fromFloorPrint(foundation_corr_polygon, foundation_height, model)
2230
- foundation_corridor_space = foundation_corridor_space.get
2231
- m = initialize_transformation_matrix(OpenStudio::Matrix.new(4, 4, 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
2238
-
2239
- # Rim Joist
2240
- add_rim_joist(model, foundation_corr_polygon, foundation_corridor_space, rim_joist_height, 0)
2241
- end
2242
-
2243
2138
  # foundation front
2244
2139
  foundation_space_front = []
2245
2140
  foundation_space = OpenStudio::Model::Space::fromFloorPrint(foundation_front_polygon, foundation_height, model)
@@ -2254,8 +2149,11 @@ class Geometry
2254
2149
  foundation_space_front << foundation_space
2255
2150
  foundation_spaces << foundation_space
2256
2151
 
2257
- foundation_spaces.each do |foundation_space| # (corridor and foundation)
2258
- next unless [HPXML::FoundationTypeCrawlspaceVented, HPXML::FoundationTypeCrawlspaceUnvented, HPXML::FoundationTypeBasementUnconditioned].include?(foundation_type)
2152
+ foundation_spaces.each do |foundation_space|
2153
+ next unless [HPXML::FoundationTypeCrawlspaceVented,
2154
+ HPXML::FoundationTypeCrawlspaceUnvented,
2155
+ HPXML::FoundationTypeBasementUnconditioned].include?(foundation_type)
2156
+
2259
2157
  # create foundation zone
2260
2158
  foundation_zone = OpenStudio::Model::ThermalZone.new(model)
2261
2159
 
@@ -2292,14 +2190,13 @@ class Geometry
2292
2190
  # Foundation space boundary conditions
2293
2191
  model.getSpaces.each do |space|
2294
2192
  next unless get_space_floor_z(space) + UnitConversions.convert(space.zOrigin, 'm', 'ft') < 0 # Foundation
2295
- next if space.name.get.include? 'corridor'
2296
2193
 
2297
2194
  surfaces = space.surfaces
2298
2195
  surfaces.each do |surface|
2299
2196
  next unless surface.surfaceType.downcase == 'wall'
2300
2197
 
2301
2198
  os_facade = get_facade_for_surface(surface)
2302
- if adb_facade.include?(os_facade) && (os_facade != 'RoofCeiling') && (os_facade != 'Floor')
2199
+ if adb_facades.include?(os_facade) && (os_facade != 'RoofCeiling') && (os_facade != 'Floor')
2303
2200
  surface.setOutsideBoundaryCondition('Adiabatic')
2304
2201
  elsif getSurfaceZValues([surface]).min < 0
2305
2202
  surface.setOutsideBoundaryCondition('Foundation')
@@ -2308,37 +2205,6 @@ class Geometry
2308
2205
  end
2309
2206
  end
2310
2207
  end
2311
-
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'
2317
-
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
2324
- end
2325
- end
2326
- end
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
2342
2208
  end
2343
2209
 
2344
2210
  # put all of the spaces in the model into a vector
@@ -2351,29 +2217,6 @@ class Geometry
2351
2217
  OpenStudio::Model.intersectSurfaces(spaces)
2352
2218
  OpenStudio::Model.matchSurfaces(spaces)
2353
2219
 
2354
- # make corridor floors adiabatic if no exterior walls to avoid exposed perimeter error
2355
- exterior_obcs = ['Foundation', 'Ground', 'Outdoors']
2356
- obcs_hash = {}
2357
- model.getSpaces.each do |space|
2358
- next unless space.name.get.include? 'corridor' # corridor and foundation corridor spaces
2359
-
2360
- space_name = space.name
2361
- obcs_hash[space_name] = []
2362
- space.surfaces.each do |surface|
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')
2374
- end
2375
- end
2376
-
2377
2220
  # set foundation outside boundary condition to Kiva "foundation"
2378
2221
  model.getSurfaces.each do |surface|
2379
2222
  next if surface.outsideBoundaryCondition.downcase != 'ground'
@@ -2381,25 +2224,9 @@ class Geometry
2381
2224
  surface.setOutsideBoundaryCondition('Foundation')
2382
2225
  end
2383
2226
 
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
-
2396
2227
  return true
2397
2228
  end
2398
2229
 
2399
- def self.is_corridor(space_or_zone)
2400
- return space_or_zone_is_of_type(space_or_zone, HPXML::LocationOtherHousingUnit)
2401
- end
2402
-
2403
2230
  # Returns true if space is either fully or partially below grade
2404
2231
  def self.space_is_below_grade(space)
2405
2232
  space.surfaces.each do |surface|
@@ -2450,7 +2277,12 @@ class Geometry
2450
2277
  floor_vertices.each_with_index do |fv1, fidx|
2451
2278
  fv2 = floor_vertices[fidx - 1]
2452
2279
  # Wall within floor edge?
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])
2280
+ next unless (is_point_between([wv1.x, wv1.y, wv1.z + wall_surface.space.get.zOrigin],
2281
+ [fv1.x, fv1.y, fv1.z + floor_surface.space.get.zOrigin],
2282
+ [fv2.x, fv2.y, fv2.z + floor_surface.space.get.zOrigin]) \
2283
+ && is_point_between([wv2.x, wv2.y, wv2.z + wall_surface.space.get.zOrigin],
2284
+ [fv1.x, fv1.y, fv1.z + floor_surface.space.get.zOrigin],
2285
+ [fv2.x, fv2.y, fv2.z + floor_surface.space.get.zOrigin]))
2454
2286
 
2455
2287
  if not adjacent_wall_surfaces.include? wall_surface
2456
2288
  adjacent_wall_surfaces << wall_surface
@@ -2609,7 +2441,7 @@ class Geometry
2609
2441
  xValueArray = []
2610
2442
  surfaceArray.each do |surface|
2611
2443
  surface.vertices.each do |vertex|
2612
- xValueArray << UnitConversions.convert(vertex.x, 'm', 'ft')
2444
+ xValueArray << UnitConversions.convert(vertex.x, 'm', 'ft').round(5)
2613
2445
  end
2614
2446
  end
2615
2447
  return xValueArray
@@ -2620,7 +2452,7 @@ class Geometry
2620
2452
  yValueArray = []
2621
2453
  surfaceArray.each do |surface|
2622
2454
  surface.vertices.each do |vertex|
2623
- yValueArray << UnitConversions.convert(vertex.y, 'm', 'ft')
2455
+ yValueArray << UnitConversions.convert(vertex.y, 'm', 'ft').round(5)
2624
2456
  end
2625
2457
  end
2626
2458
  return yValueArray
@@ -2672,6 +2504,7 @@ class Geometry
2672
2504
  def self.surface_is_rim_joist(surface, height)
2673
2505
  return false unless (height - Geometry.get_surface_height(surface)).abs < 0.00001
2674
2506
  return false unless Geometry.getSurfaceZValues([surface]).max > 0
2507
+
2675
2508
  return true
2676
2509
  end
2677
2510
  end