urbanopt-cli 0.6.1 → 0.7.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (1062) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +34 -0
  4. data/CMakeLists.txt +7 -7
  5. data/FindOpenStudioSDK.cmake +6 -6
  6. data/Gemfile +11 -5
  7. data/example_files/Gemfile +6 -3
  8. data/example_files/base_workflow_res.osw +10 -0
  9. data/example_files/example_project_combined.json +13 -3
  10. data/example_files/example_project_with_PV.json +751 -0
  11. data/example_files/example_project_with_streets.json +826 -0
  12. data/example_files/mappers/Baseline.rb +52 -31
  13. data/example_files/mappers/CreateBar.rb +37 -0
  14. data/example_files/mappers/FlexibleHotWater.rb +69 -0
  15. data/example_files/mappers/Floorspace.rb +30 -0
  16. data/example_files/mappers/HighEfficiency.rb +5 -4
  17. data/example_files/mappers/base_workflow.osw +5 -0
  18. data/example_files/mappers/createbar_workflow.osw +3 -1
  19. data/example_files/mappers/floorspace_workflow.osw +2 -1
  20. data/example_files/measures/BuildResidentialModel/measure.rb +109 -76
  21. data/example_files/osm_building/7.osm +0 -307
  22. data/example_files/osm_building/8.osm +0 -419
  23. data/example_files/osm_building/9.osm +0 -664
  24. data/example_files/reopt/base_assumptions.json +3 -3
  25. data/example_files/reopt/multiPV_assumptions.json +2 -2
  26. data/example_files/residential/enclosure.tsv +102 -102
  27. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +22 -16
  28. data/example_files/resources/hpxml-measures/.gitignore +3 -7
  29. data/example_files/resources/hpxml-measures/.rubocop.yml +67 -8
  30. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1752 -1455
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +3229 -5431
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +386 -553
  33. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +1075 -363
  34. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +212 -0
  35. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +898 -0
  36. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules.rb +109 -188
  37. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_README.md +0 -0
  38. 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
  39. 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
  40. 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
  41. 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
  42. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.json +2 -2
  43. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.md +0 -0
  44. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_consumption_dist.csv} +0 -0
  45. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_duration_dist.csv} +0 -0
  46. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_consumption_dist.csv} +0 -0
  47. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_duration_dist.csv} +0 -0
  48. 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
  49. 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
  50. 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
  51. 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
  52. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_cluster_size_probability.csv +0 -0
  53. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_event_duration_probability.csv +0 -0
  54. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  55. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  56. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  57. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  58. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  59. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  60. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  61. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  62. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  63. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  64. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  65. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  66. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  67. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  68. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  69. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  70. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  71. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  72. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  73. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  74. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  75. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  76. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  77. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  78. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  79. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  80. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  81. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  82. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  83. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  84. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  85. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  86. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  87. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  88. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  89. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  90. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  91. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  92. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  93. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  94. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  95. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  96. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  97. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  98. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  99. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  100. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  101. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  102. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +0 -0
  103. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +0 -0
  104. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +0 -0
  105. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +0 -0
  106. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +0 -0
  107. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +0 -0
  108. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +0 -0
  109. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +0 -0
  110. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +0 -0
  111. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  112. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  113. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  114. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  115. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  116. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  117. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  118. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  119. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  120. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  121. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  122. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  123. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  124. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  125. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  126. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  127. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  128. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  129. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  130. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  131. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  132. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  133. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  134. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  135. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  136. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  137. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  138. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  139. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  140. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  141. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  142. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  143. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  144. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  145. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  146. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  147. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  148. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  149. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  150. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  151. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  152. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  153. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  154. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  155. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  156. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  157. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  158. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  159. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +0 -0
  160. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +0 -0
  161. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +0 -0
  162. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +0 -0
  163. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +0 -0
  164. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +0 -0
  165. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +0 -0
  166. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +0 -0
  167. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +0 -0
  168. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +526 -0
  169. data/example_files/resources/hpxml-measures/Changelog.md +84 -8
  170. data/example_files/resources/hpxml-measures/Gemfile +3 -0
  171. data/example_files/resources/hpxml-measures/Gemfile.lock +3 -11
  172. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +387 -387
  173. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +167 -251
  174. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +275 -59
  175. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +471 -247
  176. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXML.xsd +1 -1
  177. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +171 -79
  178. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +155 -78
  179. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +188 -141
  180. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +83 -0
  181. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +99 -11
  182. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +558 -342
  183. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +2 -0
  184. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +64 -72
  185. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +96 -93
  186. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +965 -350
  187. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +887 -216
  188. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +664 -760
  189. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +306 -287
  190. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +20 -29
  191. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +0 -20
  192. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_hvac_equipment_efficiency.csv +493 -0
  193. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_water_heater_efficiency.csv +157 -0
  194. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +156 -108
  195. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +41 -3
  196. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +14 -2
  197. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +18 -18
  198. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +14 -7
  199. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/smooth.csv +8761 -0
  200. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic-vacancy.csv +8761 -0
  201. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic.csv +8761 -0
  202. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +431 -428
  203. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +21 -12
  204. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +3 -3
  205. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +245 -234
  206. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +10 -5
  207. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +19 -8
  208. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +44 -23
  209. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +241 -0
  210. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1374 -297
  211. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +702 -55
  212. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +0 -1
  213. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  214. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +238 -40
  215. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +2 -2
  216. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +0 -2
  217. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +186 -0
  218. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +955 -176
  219. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +47 -61
  220. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +1 -1
  221. data/example_files/resources/hpxml-measures/LICENSE.md +1 -1
  222. data/example_files/resources/hpxml-measures/README.md +12 -9
  223. data/example_files/resources/hpxml-measures/Rakefile +1 -1
  224. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +448 -0
  225. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +81 -0
  226. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +71 -0
  227. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +232 -0
  228. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +1977 -0
  229. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/measure.xml +682 -31
  230. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/resources/constants.rb +20 -2
  231. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/tests/output_report_test.rb +83 -218
  232. data/example_files/resources/hpxml-measures/docs/source/index.rst +1 -2
  233. data/example_files/resources/hpxml-measures/docs/source/intro.rst +6 -3
  234. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +73 -0
  235. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +915 -494
  236. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +263 -111
  237. data/example_files/resources/hpxml-measures/tasks.rb +3830 -6981
  238. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +35 -0
  239. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC.epw +8768 -0
  240. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +25 -5
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +102 -91
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +93 -83
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +93 -83
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +93 -83
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +93 -83
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +102 -91
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +103 -97
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +96 -85
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +102 -91
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +102 -91
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +102 -91
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +96 -125
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +119 -104
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +94 -89
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +93 -83
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +104 -95
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +104 -95
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-outside.xml +584 -0
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +99 -68
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +119 -79
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +99 -68
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +99 -68
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +99 -68
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +97 -66
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +97 -66
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +97 -66
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +100 -69
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +100 -69
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +94 -65
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +94 -65
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +94 -65
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +94 -65
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +97 -68
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +94 -65
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +94 -65
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +94 -65
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +97 -68
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +97 -68
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +98 -67
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +96 -64
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +105 -84
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +108 -77
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +100 -69
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +100 -69
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +98 -67
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +97 -66
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +97 -66
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +97 -66
  289. 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
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +124 -114
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +102 -95
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +102 -95
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +102 -95
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +104 -94
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +105 -96
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +102 -95
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +102 -95
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +102 -95
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +104 -95
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +102 -95
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +102 -95
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +102 -95
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +104 -97
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +102 -95
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +104 -95
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +104 -95
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +104 -95
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +102 -95
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +104 -95
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +108 -101
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +96 -85
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +104 -95
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +104 -95
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +104 -95
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +104 -95
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +104 -95
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +106 -97
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +106 -97
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +106 -97
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +106 -97
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +106 -97
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +106 -97
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +104 -95
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +105 -96
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +104 -95
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +574 -0
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +105 -96
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +104 -95
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +104 -95
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +105 -97
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +106 -97
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +106 -97
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +104 -95
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +104 -95
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +104 -95
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +104 -95
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +104 -95
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +104 -95
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +104 -95
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +106 -97
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +106 -97
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +104 -95
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +104 -95
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +131 -119
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +120 -99
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +104 -95
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +104 -95
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +104 -95
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +104 -95
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +131 -118
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +104 -95
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +104 -95
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +104 -95
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +104 -95
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +104 -95
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +579 -0
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +110 -101
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +213 -95
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-id.xml → base-enclosure-skylights-physical-properties.xml} +123 -105
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +114 -105
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +112 -103
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +92 -82
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +533 -547
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +545 -559
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/generator-output-greater-than-consumption.xml → base-enclosure-thermal-mass.xml} +117 -111
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +239 -109
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +88 -79
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +584 -0
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +115 -106
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +89 -79
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +123 -110
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +119 -172
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +104 -95
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +107 -95
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +572 -0
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +119 -128
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +92 -82
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +117 -110
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +106 -91
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +107 -98
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +105 -97
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +108 -98
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +108 -98
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +115 -110
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +101 -94
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +103 -95
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +104 -94
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +104 -94
  389. 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
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +589 -0
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +104 -94
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +104 -94
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +105 -94
  394. 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
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +106 -93
  396. 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
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed.xml +106 -93
  398. 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
  399. 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
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed.xml +106 -93
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +102 -95
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +103 -94
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +101 -94
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +101 -94
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +101 -94
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +101 -94
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +108 -95
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +106 -93
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +106 -93
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +99 -92
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +103 -94
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +99 -92
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +102 -95
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +104 -95
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +104 -95
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +101 -94
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +103 -94
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +104 -94
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +105 -94
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml +103 -93
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump.xml +106 -93
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +101 -94
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +104 -94
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +105 -94
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +103 -93
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +106 -93
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +541 -0
  428. 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
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/boiler-invalid-afue.xml → base-hvac-autosize-ptac.xml} +109 -113
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp.xml +531 -0
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +99 -92
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +99 -92
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +100 -93
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +104 -95
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +101 -94
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +102 -95
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +103 -94
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +101 -94
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +101 -94
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +101 -94
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +101 -94
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +101 -94
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +101 -94
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +101 -94
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +106 -96
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +104 -95
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +104 -94
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +104 -94
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +104 -94
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +104 -94
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +104 -94
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/unattached-solar-thermal-system.xml → base-hvac-ducts-area-fractions.xml} +596 -577
  453. 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
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +104 -95
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +99 -92
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +103 -94
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +101 -94
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +99 -92
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +99 -92
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +99 -92
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +99 -92
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +101 -94
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +104 -95
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +102 -95
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +104 -95
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +104 -95
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +101 -94
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +103 -94
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +101 -94
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +101 -94
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +101 -94
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +104 -95
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +101 -94
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +102 -94
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +103 -93
  476. 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
  477. 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
  478. 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
  479. 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
  480. 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
  481. 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
  482. 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
  483. 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
  484. 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
  485. 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
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +101 -94
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +99 -92
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +101 -94
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +103 -95
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +104 -94
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +542 -0
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +101 -92
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +124 -100
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +94 -89
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +99 -92
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +104 -95
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +104 -95
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/cfis-with-hydronic-distribution.xml → base-hvac-ptac-with-heating.xml} +530 -532
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-distribution-return-duct-leakage-missing.xml → base-hvac-ptac.xml} +515 -528
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +531 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +99 -92
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +516 -0
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +99 -92
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +584 -0
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +104 -95
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +99 -92
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +99 -92
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +104 -95
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +104 -95
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +100 -93
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +110 -96
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +586 -0
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +95 -86
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +104 -95
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +108 -98
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-foundation-wall-properties.xml → base-location-capetown-zaf.xml} +134 -127
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +92 -82
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +105 -98
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +104 -95
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +92 -82
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +92 -82
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +92 -82
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +108 -98
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +106 -97
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +106 -97
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +107 -98
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +104 -97
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +107 -98
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +106 -97
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +106 -97
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +105 -96
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +106 -97
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +106 -97
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +106 -97
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +141 -114
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +106 -97
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +105 -96
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +101 -101
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +105 -96
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +157 -112
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +157 -112
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +96 -87
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +108 -99
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +104 -95
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +113 -102
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +318 -291
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +608 -0
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/enclosure-garage-missing-roof-ceiling.xml → base-pv-battery-garage.xml} +678 -626
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/multifamily-reference-surface.xml → base-pv-battery-outside-degrades.xml} +610 -575
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-outside.xml +608 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +105 -96
  552. 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
  553. 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
  554. 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
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-lighting-detailed.xml → base-schedules-simple.xml} +625 -585
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +104 -95
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +104 -95
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +104 -95
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +104 -95
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +104 -95
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +104 -95
  562. data/example_files/resources/hpxml-measures/workflow/template-build-hpxml-and-stocastic-schedules.osw +129 -0
  563. data/example_files/resources/hpxml-measures/workflow/template-stochastic-schedules.osw +53 -0
  564. data/example_files/resources/hpxml-measures/workflow/template.osw +7 -2
  565. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +75 -44
  566. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +75 -44
  567. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +75 -44
  568. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +75 -44
  569. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +75 -44
  570. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +75 -44
  571. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +75 -44
  572. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +75 -44
  573. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +63 -32
  574. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +63 -32
  575. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +66 -35
  576. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +66 -35
  577. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +66 -35
  578. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +66 -35
  579. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +69 -38
  580. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +69 -38
  581. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +75 -44
  582. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +75 -44
  583. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +75 -44
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +75 -44
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +75 -44
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +75 -44
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +78 -47
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +78 -47
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +114 -103
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +126 -103
  591. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +321 -294
  592. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +26 -26
  593. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +320 -293
  594. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +351 -0
  595. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +253 -260
  596. data/example_files/visualization/input_visualization_feature.html +25 -17
  597. data/example_files/visualization/input_visualization_scenario.html +23 -12
  598. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.ddy +17 -17
  599. data/lib/uo_cli/version.rb +1 -1
  600. data/lib/uo_cli.rb +146 -28
  601. data/uo_cli.gemspec +6 -5
  602. metadata +232 -637
  603. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -59
  604. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +0 -337
  605. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +0 -337
  606. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +0 -337
  607. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +0 -337
  608. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +0 -337
  609. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +0 -337
  610. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +0 -337
  611. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +0 -337
  612. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +0 -337
  613. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +0 -337
  614. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +0 -337
  615. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +0 -337
  616. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +0 -337
  617. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +0 -337
  618. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +0 -341
  619. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +0 -341
  620. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +0 -348
  621. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +0 -342
  622. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +0 -341
  623. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +0 -341
  624. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +0 -341
  625. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +0 -339
  626. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +0 -337
  627. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +0 -337
  628. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +0 -337
  629. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +0 -337
  630. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +0 -337
  631. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +0 -337
  632. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +0 -337
  633. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +0 -337
  634. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +0 -337
  635. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +0 -337
  636. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +0 -337
  637. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +0 -337
  638. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +0 -337
  639. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +0 -337
  640. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +0 -337
  641. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +0 -337
  642. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +0 -337
  643. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +0 -337
  644. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +0 -337
  645. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +0 -337
  646. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +0 -337
  647. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +0 -337
  648. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +0 -337
  649. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +0 -337
  650. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +0 -337
  651. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +0 -338
  652. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +0 -337
  653. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +0 -338
  654. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +0 -337
  655. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +0 -337
  656. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +0 -338
  657. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +0 -337
  658. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +0 -337
  659. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +0 -337
  660. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +0 -337
  661. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +0 -337
  662. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +0 -337
  663. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +0 -337
  664. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +0 -337
  665. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +0 -337
  666. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +0 -337
  667. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +0 -337
  668. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +0 -337
  669. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +0 -337
  670. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +0 -337
  671. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +0 -337
  672. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +0 -337
  673. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +0 -337
  674. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +0 -337
  675. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +0 -337
  676. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +0 -337
  677. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +0 -337
  678. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +0 -337
  679. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +0 -337
  680. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +0 -337
  681. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +0 -337
  682. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +0 -337
  683. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +0 -337
  684. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +0 -337
  685. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +0 -337
  686. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +0 -337
  687. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +0 -338
  688. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +0 -337
  689. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +0 -337
  690. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +0 -337
  691. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +0 -337
  692. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +0 -337
  693. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +0 -337
  694. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +0 -337
  695. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +0 -337
  696. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +0 -337
  697. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +0 -337
  698. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +0 -337
  699. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +0 -337
  700. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +0 -337
  701. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +0 -337
  702. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +0 -337
  703. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +0 -337
  704. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +0 -337
  705. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +0 -337
  706. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +0 -337
  707. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +0 -337
  708. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +0 -338
  709. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +0 -338
  710. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +0 -338
  711. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +0 -338
  712. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +0 -338
  713. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +0 -337
  714. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +0 -337
  715. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +0 -335
  716. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +0 -335
  717. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +0 -335
  718. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +0 -337
  719. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +0 -337
  720. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +0 -337
  721. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +0 -337
  722. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +0 -337
  723. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +0 -337
  724. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +0 -337
  725. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +0 -337
  726. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +0 -337
  727. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +0 -336
  728. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +0 -337
  729. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +0 -337
  730. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +0 -337
  731. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +0 -336
  732. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +0 -336
  733. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +0 -336
  734. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +0 -339
  735. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +0 -339
  736. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +0 -339
  737. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +0 -339
  738. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +0 -340
  739. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +0 -340
  740. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +0 -340
  741. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +0 -338
  742. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +0 -338
  743. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +0 -338
  744. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +0 -339
  745. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +0 -338
  746. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +0 -340
  747. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +0 -336
  748. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +0 -336
  749. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +0 -337
  750. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +0 -337
  751. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +0 -337
  752. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +0 -337
  753. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +0 -337
  754. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +0 -337
  755. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +0 -337
  756. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +0 -336
  757. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +0 -336
  758. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +0 -337
  759. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +0 -337
  760. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +0 -337
  761. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +0 -337
  762. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +0 -337
  763. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +0 -337
  764. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +0 -337
  765. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +0 -337
  766. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +0 -337
  767. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +0 -337
  768. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +0 -337
  769. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +0 -337
  770. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +0 -337
  771. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +0 -337
  772. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +0 -337
  773. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +0 -337
  774. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +0 -337
  775. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +0 -345
  776. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +0 -335
  777. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +0 -337
  778. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +0 -337
  779. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +0 -337
  780. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +0 -337
  781. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +0 -337
  782. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +0 -337
  783. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +0 -337
  784. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +0 -337
  785. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +0 -337
  786. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +0 -324
  787. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +0 -337
  788. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +0 -337
  789. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +0 -337
  790. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +0 -337
  791. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +0 -337
  792. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +0 -337
  793. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic-vacant.osw +0 -341
  794. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +0 -337
  795. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +0 -338
  796. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +0 -338
  797. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +0 -342
  798. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +0 -338
  799. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +0 -341
  800. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +0 -337
  801. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +0 -337
  802. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +0 -337
  803. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +0 -341
  804. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +0 -341
  805. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +0 -341
  806. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +0 -341
  807. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +0 -341
  808. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +0 -341
  809. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +0 -341
  810. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +0 -341
  811. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +0 -341
  812. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +0 -341
  813. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +0 -341
  814. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +0 -341
  815. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +0 -341
  816. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +0 -341
  817. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +0 -341
  818. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +0 -341
  819. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +0 -341
  820. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +0 -341
  821. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +0 -341
  822. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +0 -341
  823. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +0 -341
  824. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +0 -341
  825. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +0 -341
  826. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +0 -341
  827. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +0 -341
  828. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  829. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +0 -341
  830. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  831. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +0 -341
  832. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  833. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +0 -341
  834. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  835. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +0 -341
  836. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  837. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +0 -341
  838. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  839. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +0 -341
  840. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  841. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +0 -341
  842. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  843. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +0 -341
  844. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  845. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +0 -341
  846. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +0 -341
  847. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +0 -341
  848. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  849. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +0 -341
  850. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  851. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +0 -341
  852. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  853. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +0 -341
  854. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  855. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +0 -341
  856. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  857. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +0 -341
  858. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  859. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +0 -341
  860. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  861. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +0 -341
  862. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  863. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +0 -341
  864. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  865. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +0 -341
  866. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +0 -341
  867. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +0 -339
  868. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +0 -339
  869. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +0 -339
  870. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +0 -339
  871. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +0 -339
  872. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +0 -339
  873. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +0 -339
  874. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +0 -339
  875. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +0 -339
  876. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +0 -339
  877. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +0 -339
  878. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +0 -339
  879. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +0 -339
  880. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +0 -339
  881. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +0 -339
  882. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +0 -339
  883. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +0 -339
  884. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +0 -339
  885. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +0 -337
  886. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +0 -337
  887. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +0 -337
  888. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +0 -337
  889. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +0 -337
  890. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +0 -339
  891. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +0 -337
  892. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +0 -337
  893. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +0 -337
  894. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +0 -338
  895. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +0 -336
  896. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +0 -337
  897. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +0 -337
  898. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heating-system.osw +0 -337
  899. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +0 -337
  900. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heating-system.osw +0 -337
  901. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +0 -337
  902. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +0 -337
  903. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +0 -337
  904. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +0 -337
  905. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +0 -337
  906. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +0 -337
  907. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +0 -337
  908. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +0 -337
  909. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +0 -337
  910. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +0 -337
  911. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +0 -337
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +0 -337
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +0 -337
  914. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +0 -337
  915. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +0 -341
  916. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +0 -341
  917. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +0 -338
  918. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +0 -337
  919. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +0 -337
  920. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +0 -337
  921. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +0 -337
  922. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +0 -337
  923. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +0 -337
  924. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +0 -337
  925. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +0 -337
  926. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +0 -337
  927. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +0 -337
  928. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +0 -337
  929. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +0 -339
  930. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +0 -337
  931. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +0 -337
  932. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +0 -337
  933. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +0 -337
  934. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +0 -337
  935. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +0 -337
  936. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +0 -337
  937. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  938. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +0 -337
  939. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  940. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +0 -337
  941. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +0 -8761
  942. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +0 -8761
  943. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +0 -8761
  944. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_1bed.csv +0 -369
  945. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_2bed.csv +0 -465
  946. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_3bed.csv +0 -611
  947. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_4bed.csv +0 -685
  948. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_5bed.csv +0 -767
  949. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_1bed.csv +0 -637
  950. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_2bed.csv +0 -744
  951. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_3bed.csv +0 -929
  952. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_4bed.csv +0 -1044
  953. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_5bed.csv +0 -1250
  954. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_1bed.csv +0 -754
  955. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_2bed.csv +0 -961
  956. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_3bed.csv +0 -1102
  957. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_4bed.csv +0 -1293
  958. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_5bed.csv +0 -1508
  959. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_1bed.csv +0 -13097
  960. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_2bed.csv +0 -15977
  961. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_3bed.csv +0 -18624
  962. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_4bed.csv +0 -22075
  963. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_5bed.csv +0 -25005
  964. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_max_flows.csv +0 -6
  965. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +0 -2444
  966. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +0 -110
  967. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +0 -57
  968. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +0 -564
  969. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +0 -564
  970. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +0 -564
  971. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +0 -563
  972. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +0 -563
  973. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +0 -563
  974. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +0 -535
  975. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +0 -535
  976. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -576
  977. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +0 -563
  978. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +0 -564
  979. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +0 -563
  980. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +0 -563
  981. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +0 -563
  982. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +0 -563
  983. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +0 -563
  984. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +0 -563
  985. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +0 -547
  986. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +0 -544
  987. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +0 -547
  988. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +0 -563
  989. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +0 -448
  990. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +0 -614
  991. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +0 -611
  992. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +0 -551
  993. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +0 -473
  994. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +0 -489
  995. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +0 -760
  996. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +0 -759
  997. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +0 -761
  998. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +0 -759
  999. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +0 -563
  1000. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +0 -460
  1001. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +0 -560
  1002. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +0 -921
  1003. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +0 -921
  1004. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -547
  1005. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -547
  1006. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +0 -921
  1007. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +0 -569
  1008. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +0 -407
  1009. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +0 -563
  1010. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +0 -563
  1011. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +0 -563
  1012. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +0 -563
  1013. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +0 -570
  1014. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +0 -563
  1015. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +0 -563
  1016. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +0 -466
  1017. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +0 -591
  1018. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +0 -563
  1019. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +0 -565
  1020. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +0 -576
  1021. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +0 -465
  1022. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +0 -563
  1023. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +0 -451
  1024. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +0 -551
  1025. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +0 -565
  1026. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +0 -563
  1027. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +0 -473
  1028. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +0 -563
  1029. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +0 -583
  1030. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +0 -563
  1031. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +0 -917
  1032. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +0 -561
  1033. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +0 -563
  1034. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +0 -563
  1035. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +0 -563
  1036. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +0 -1657
  1037. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +0 -1657
  1038. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +0 -432
  1039. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +0 -434
  1040. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +0 -591
  1041. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +0 -563
  1042. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +0 -563
  1043. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +0 -547
  1044. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +0 -563
  1045. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +0 -569
  1046. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +0 -569
  1047. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +0 -564
  1048. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -527
  1049. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +0 -571
  1050. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -532
  1051. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +0 -566
  1052. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -532
  1053. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +0 -576
  1054. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +0 -563
  1055. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +0 -563
  1056. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +0 -466
  1057. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +0 -466
  1058. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +0 -591
  1059. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +0 -563
  1060. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +0 -563
  1061. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +0 -563
  1062. 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