urbanopt-cli 0.6.2 → 0.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (1061) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGELOG.md +32 -0
  4. data/CMakeLists.txt +23 -23
  5. data/FindOpenStudioSDK.cmake +6 -6
  6. data/Gemfile +5 -5
  7. data/example_files/Gemfile +10 -7
  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/mappers/Baseline.rb +51 -30
  12. data/example_files/mappers/CreateBar.rb +37 -0
  13. data/example_files/mappers/FlexibleHotWater.rb +69 -0
  14. data/example_files/mappers/Floorspace.rb +30 -0
  15. data/example_files/mappers/HighEfficiency.rb +5 -4
  16. data/example_files/mappers/base_workflow.osw +5 -0
  17. data/example_files/mappers/createbar_workflow.osw +3 -1
  18. data/example_files/mappers/floorspace_workflow.osw +2 -1
  19. data/example_files/measures/BuildResidentialModel/measure.rb +109 -76
  20. data/example_files/osm_building/7.osm +0 -307
  21. data/example_files/osm_building/8.osm +0 -419
  22. data/example_files/osm_building/9.osm +0 -664
  23. data/example_files/reopt/base_assumptions.json +3 -3
  24. data/example_files/reopt/multiPV_assumptions.json +2 -2
  25. data/example_files/residential/enclosure.tsv +102 -102
  26. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +22 -16
  27. data/example_files/resources/hpxml-measures/.gitignore +3 -7
  28. data/example_files/resources/hpxml-measures/.rubocop.yml +67 -8
  29. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1752 -1455
  30. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +3229 -5431
  31. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +386 -553
  32. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +1075 -363
  33. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +212 -0
  34. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +898 -0
  35. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules.rb +109 -188
  36. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_README.md +0 -0
  37. 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
  38. 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
  39. 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
  40. 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
  41. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.json +2 -2
  42. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_config.md +0 -0
  43. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_consumption_dist.csv} +0 -0
  44. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_cooking_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_cooking_duration_dist.csv} +0 -0
  45. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_consumption_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_consumption_dist.csv} +0 -0
  46. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML/resources/schedules_dishwasher_power_duration_dist.csv → BuildResidentialScheduleFile/resources/schedules_dishwasher_duration_dist.csv} +0 -0
  47. 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
  48. 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
  49. 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
  50. 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
  51. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_cluster_size_probability.csv +0 -0
  52. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_shower_event_duration_probability.csv +0 -0
  53. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  54. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  55. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  56. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  57. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  58. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  59. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  60. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  61. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  62. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  63. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  64. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  65. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  66. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  67. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  68. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  69. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  70. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  71. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  72. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  73. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  74. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  75. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  76. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  77. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  78. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  79. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  80. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  81. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  82. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  83. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  84. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  85. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  86. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  87. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  88. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  89. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  90. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  91. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  92. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  93. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  94. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  95. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  96. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  97. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  98. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  99. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  100. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  101. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_0.csv +0 -0
  102. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_1.csv +0 -0
  103. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_2.csv +0 -0
  104. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_initial_prob_cluster_3.csv +0 -0
  105. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_0.csv +0 -0
  106. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_1.csv +0 -0
  107. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_2.csv +0 -0
  108. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_mkv_chain_transition_prob_cluster_3.csv +0 -0
  109. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekday_state_and_monthly_schedule_shift.csv +0 -0
  110. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_evening_duration_probability.csv +0 -0
  111. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_midday_duration_probability.csv +0 -0
  112. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_cooking_morning_duration_probability.csv +0 -0
  113. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_evening_duration_probability.csv +0 -0
  114. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_midday_duration_probability.csv +0 -0
  115. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_dishwashing_morning_duration_probability.csv +0 -0
  116. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_evening_duration_probability.csv +0 -0
  117. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_midday_duration_probability.csv +0 -0
  118. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_laundry_morning_duration_probability.csv +0 -0
  119. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_evening_duration_probability.csv +0 -0
  120. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_midday_duration_probability.csv +0 -0
  121. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_0_shower_morning_duration_probability.csv +0 -0
  122. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_evening_duration_probability.csv +0 -0
  123. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_midday_duration_probability.csv +0 -0
  124. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_cooking_morning_duration_probability.csv +0 -0
  125. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_evening_duration_probability.csv +0 -0
  126. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_midday_duration_probability.csv +0 -0
  127. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_dishwashing_morning_duration_probability.csv +0 -0
  128. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_evening_duration_probability.csv +0 -0
  129. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_midday_duration_probability.csv +0 -0
  130. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_laundry_morning_duration_probability.csv +0 -0
  131. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_evening_duration_probability.csv +0 -0
  132. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_midday_duration_probability.csv +0 -0
  133. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_1_shower_morning_duration_probability.csv +0 -0
  134. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_evening_duration_probability.csv +0 -0
  135. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_midday_duration_probability.csv +0 -0
  136. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_cooking_morning_duration_probability.csv +0 -0
  137. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_evening_duration_probability.csv +0 -0
  138. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_midday_duration_probability.csv +0 -0
  139. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_dishwashing_morning_duration_probability.csv +0 -0
  140. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_evening_duration_probability.csv +0 -0
  141. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_midday_duration_probability.csv +0 -0
  142. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_laundry_morning_duration_probability.csv +0 -0
  143. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_evening_duration_probability.csv +0 -0
  144. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_midday_duration_probability.csv +0 -0
  145. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_2_shower_morning_duration_probability.csv +0 -0
  146. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_evening_duration_probability.csv +0 -0
  147. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_midday_duration_probability.csv +0 -0
  148. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_cooking_morning_duration_probability.csv +0 -0
  149. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_evening_duration_probability.csv +0 -0
  150. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_midday_duration_probability.csv +0 -0
  151. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_dishwashing_morning_duration_probability.csv +0 -0
  152. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_evening_duration_probability.csv +0 -0
  153. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_midday_duration_probability.csv +0 -0
  154. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_laundry_morning_duration_probability.csv +0 -0
  155. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_evening_duration_probability.csv +0 -0
  156. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_midday_duration_probability.csv +0 -0
  157. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_duration_probability_cluster_3_shower_morning_duration_probability.csv +0 -0
  158. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_0.csv +0 -0
  159. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_1.csv +0 -0
  160. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_2.csv +0 -0
  161. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_initial_prob_cluster_3.csv +0 -0
  162. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_0.csv +0 -0
  163. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_1.csv +0 -0
  164. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_2.csv +0 -0
  165. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_mkv_chain_transition_prob_cluster_3.csv +0 -0
  166. data/example_files/resources/hpxml-measures/{BuildResidentialHPXML → BuildResidentialScheduleFile}/resources/schedules_weekend_state_and_monthly_schedule_shift.csv +0 -0
  167. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +526 -0
  168. data/example_files/resources/hpxml-measures/Changelog.md +84 -8
  169. data/example_files/resources/hpxml-measures/Gemfile +3 -0
  170. data/example_files/resources/hpxml-measures/Gemfile.lock +3 -11
  171. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +387 -387
  172. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +167 -251
  173. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/BaseElements.xsd +275 -59
  174. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/EPvalidator.xml +471 -247
  175. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXML.xsd +1 -1
  176. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLDataTypes.xsd +171 -79
  177. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/HPXMLvalidator.xml +155 -78
  178. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +188 -141
  179. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +83 -0
  180. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +99 -11
  181. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +558 -342
  182. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +2 -0
  183. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +64 -72
  184. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +96 -93
  185. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +965 -350
  186. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +887 -216
  187. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +664 -760
  188. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +306 -287
  189. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +20 -29
  190. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +0 -20
  191. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_hvac_equipment_efficiency.csv +493 -0
  192. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lu_water_heater_efficiency.csv +157 -0
  193. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +156 -108
  194. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +41 -3
  195. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +14 -2
  196. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +18 -18
  197. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +14 -7
  198. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/smooth.csv +8761 -0
  199. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic-vacancy.csv +8761 -0
  200. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/stochastic.csv +8761 -0
  201. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +431 -428
  202. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +21 -12
  203. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +3 -3
  204. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +245 -234
  205. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +10 -5
  206. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +19 -8
  207. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +44 -23
  208. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +241 -0
  209. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +1374 -297
  210. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +702 -55
  211. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +0 -1
  212. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +1 -1
  213. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +238 -40
  214. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +2 -2
  215. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +0 -2
  216. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +186 -0
  217. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +955 -176
  218. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +47 -61
  219. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +1 -1
  220. data/example_files/resources/hpxml-measures/LICENSE.md +1 -1
  221. data/example_files/resources/hpxml-measures/README.md +12 -9
  222. data/example_files/resources/hpxml-measures/Rakefile +1 -1
  223. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +448 -0
  224. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +81 -0
  225. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +71 -0
  226. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +232 -0
  227. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +1977 -0
  228. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/measure.xml +682 -31
  229. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/resources/constants.rb +20 -2
  230. data/example_files/resources/hpxml-measures/{SimulationOutputReport → ReportSimulationOutput}/tests/output_report_test.rb +83 -218
  231. data/example_files/resources/hpxml-measures/docs/source/index.rst +1 -2
  232. data/example_files/resources/hpxml-measures/docs/source/intro.rst +6 -3
  233. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +73 -0
  234. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +915 -494
  235. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +263 -111
  236. data/example_files/resources/hpxml-measures/tasks.rb +3830 -6981
  237. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC-cache.csv +35 -0
  238. data/example_files/resources/hpxml-measures/weather/ZAF_Cape.Town.688160_IWEC.epw +8768 -0
  239. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +25 -5
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +102 -91
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +93 -83
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +93 -83
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +93 -83
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +93 -83
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +102 -91
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +103 -97
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +96 -85
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +102 -91
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +102 -91
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +102 -91
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +96 -125
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +119 -104
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +94 -89
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +93 -83
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +104 -95
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +104 -95
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-outside.xml +584 -0
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +99 -68
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +119 -79
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +99 -68
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +99 -68
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +99 -68
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +97 -66
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +97 -66
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +97 -66
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +100 -69
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +100 -69
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +94 -65
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +94 -65
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +94 -65
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +94 -65
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +97 -68
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +94 -65
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +94 -65
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +94 -65
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +97 -68
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +97 -68
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +98 -67
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +96 -64
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +105 -84
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +108 -77
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +100 -69
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +100 -69
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +98 -67
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +97 -66
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +97 -66
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +97 -66
  288. 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
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +124 -114
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +102 -95
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +102 -95
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +102 -95
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +104 -94
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +105 -96
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +102 -95
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +102 -95
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +102 -95
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +104 -95
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +102 -95
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +102 -95
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +102 -95
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +104 -97
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +102 -95
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +104 -95
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +104 -95
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +104 -95
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +102 -95
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +104 -95
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +108 -101
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +96 -85
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +104 -95
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +104 -95
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +104 -95
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +104 -95
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +104 -95
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +106 -97
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +106 -97
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +106 -97
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +106 -97
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +106 -97
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +106 -97
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +104 -95
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +105 -96
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +104 -95
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +574 -0
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +105 -96
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +104 -95
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +104 -95
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +105 -97
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +106 -97
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +106 -97
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +104 -95
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +104 -95
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +104 -95
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +104 -95
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +104 -95
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +104 -95
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +104 -95
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +106 -97
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +106 -97
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +104 -95
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +104 -95
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +131 -119
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +120 -99
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +104 -95
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +104 -95
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +104 -95
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +104 -95
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +131 -118
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +104 -95
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +104 -95
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +104 -95
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +104 -95
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +104 -95
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +579 -0
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +110 -101
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +213 -95
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-id.xml → base-enclosure-skylights-physical-properties.xml} +123 -105
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +114 -105
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +112 -103
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +92 -82
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +533 -547
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +545 -559
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/generator-output-greater-than-consumption.xml → base-enclosure-thermal-mass.xml} +117 -111
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +239 -109
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +88 -79
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +584 -0
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +115 -106
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +89 -79
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +123 -110
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +119 -172
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +104 -95
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-interior-insulation.xml +107 -95
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +572 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +119 -128
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +92 -82
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +117 -110
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +106 -91
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +107 -98
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +105 -97
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +108 -98
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +108 -98
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +115 -110
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +101 -94
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +103 -95
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +104 -94
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +104 -94
  388. 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
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +589 -0
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +104 -94
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +104 -94
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +105 -94
  393. 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
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed.xml +106 -93
  395. 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
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed.xml +106 -93
  397. 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
  398. 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
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed.xml +106 -93
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +102 -95
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +103 -94
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +101 -94
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +101 -94
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +101 -94
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +101 -94
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +108 -95
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed.xml +106 -93
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +106 -93
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +99 -92
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +103 -94
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +99 -92
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +102 -95
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +104 -95
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +104 -95
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +101 -94
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +103 -94
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +104 -94
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +105 -94
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-manual-s-oversize-allowances.xml +103 -93
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump.xml +106 -93
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +101 -94
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +104 -94
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +105 -94
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-manual-s-oversize-allowances.xml +103 -93
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted.xml +106 -93
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +541 -0
  427. 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
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/boiler-invalid-afue.xml → base-hvac-autosize-ptac.xml} +109 -113
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp.xml +531 -0
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +99 -92
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +99 -92
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +100 -93
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +104 -95
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +101 -94
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +102 -95
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +103 -94
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +101 -94
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +101 -94
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +101 -94
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +101 -94
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +101 -94
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +101 -94
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +101 -94
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +106 -96
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +104 -95
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +104 -94
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +104 -94
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +104 -94
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +104 -94
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +104 -94
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/unattached-solar-thermal-system.xml → base-hvac-ducts-area-fractions.xml} +596 -577
  452. 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
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +104 -95
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +99 -92
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +103 -94
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +101 -94
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +99 -92
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +99 -92
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +99 -92
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +99 -92
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +101 -94
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +104 -95
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +102 -95
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +104 -95
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +104 -95
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +101 -94
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +103 -94
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +101 -94
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +101 -94
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +101 -94
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +104 -95
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +101 -94
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +102 -94
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +103 -93
  475. 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
  476. 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
  477. 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
  478. 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
  479. 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
  480. 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
  481. 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
  482. 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
  483. 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
  484. 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
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +101 -94
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +99 -92
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +101 -94
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +103 -95
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +104 -94
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +542 -0
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +101 -92
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +124 -100
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +94 -89
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +99 -92
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat-detailed.xml +104 -95
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-programmable-thermostat.xml +104 -95
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/cfis-with-hydronic-distribution.xml → base-hvac-ptac-with-heating.xml} +530 -532
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/hvac-distribution-return-duct-leakage-missing.xml → base-hvac-ptac.xml} +515 -528
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +531 -0
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +99 -92
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +516 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +99 -92
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +584 -0
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +104 -95
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +99 -92
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +99 -92
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +104 -95
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +104 -95
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +100 -93
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +110 -96
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +586 -0
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +95 -86
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +104 -95
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +108 -98
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/invalid-foundation-wall-properties.xml → base-location-capetown-zaf.xml} +134 -127
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +92 -82
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +105 -98
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +104 -95
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +92 -82
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +92 -82
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +92 -82
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +108 -98
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +106 -97
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +106 -97
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +107 -98
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +104 -97
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +107 -98
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +106 -97
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +106 -97
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +105 -96
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +106 -97
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +106 -97
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +106 -97
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +141 -114
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +106 -97
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +105 -96
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +101 -101
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +105 -96
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +157 -112
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +157 -112
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +96 -87
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +108 -99
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +104 -95
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +113 -102
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +318 -291
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +608 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/enclosure-garage-missing-roof-ceiling.xml → base-pv-battery-garage.xml} +678 -626
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/{invalid_files/multifamily-reference-surface.xml → base-pv-battery-outside-degrades.xml} +610 -575
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-outside.xml +608 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +105 -96
  551. 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
  552. 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
  553. 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
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-lighting-detailed.xml → base-schedules-simple.xml} +625 -585
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +104 -95
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +104 -95
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +104 -95
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +104 -95
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +104 -95
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +104 -95
  561. data/example_files/resources/hpxml-measures/workflow/template-build-hpxml-and-stocastic-schedules.osw +129 -0
  562. data/example_files/resources/hpxml-measures/workflow/template-stochastic-schedules.osw +53 -0
  563. data/example_files/resources/hpxml-measures/workflow/template.osw +7 -2
  564. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +75 -44
  565. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +75 -44
  566. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +75 -44
  567. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +75 -44
  568. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +75 -44
  569. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +75 -44
  570. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +75 -44
  571. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +75 -44
  572. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +63 -32
  573. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +63 -32
  574. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +66 -35
  575. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +66 -35
  576. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +66 -35
  577. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +66 -35
  578. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +69 -38
  579. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +69 -38
  580. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +75 -44
  581. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +75 -44
  582. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +75 -44
  583. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +75 -44
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +75 -44
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +75 -44
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +78 -47
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +78 -47
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +114 -103
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +126 -103
  590. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +321 -294
  591. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +26 -26
  592. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +320 -293
  593. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +351 -0
  594. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +253 -260
  595. data/example_files/visualization/input_visualization_feature.html +14 -5
  596. data/example_files/visualization/input_visualization_scenario.html +12 -6
  597. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3.ddy +17 -17
  598. data/lib/uo_cli/version.rb +1 -1
  599. data/lib/uo_cli.rb +66 -17
  600. data/uo_cli.gemspec +6 -6
  601. metadata +219 -639
  602. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/constants.rb +0 -59
  603. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-coal.osw +0 -337
  604. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-portable.osw +0 -337
  605. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier-ief-whole-home.osw +0 -337
  606. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-dehumidifier.osw +0 -337
  607. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-gas.osw +0 -337
  608. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-modified.osw +0 -337
  609. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-none.osw +0 -337
  610. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-oil.osw +0 -337
  611. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-propane.osw +0 -337
  612. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-appliances-wood.osw +0 -337
  613. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-flat.osw +0 -337
  614. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-radiant-barrier.osw +0 -337
  615. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-unvented-insulated-roof.osw +0 -337
  616. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-atticroof-vented.osw +0 -337
  617. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-baseboard.osw +0 -341
  618. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-boiler-only-fan-coil.osw +0 -341
  619. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent-preconditioning.osw +0 -348
  620. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-mechvent.osw +0 -342
  621. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-pv.osw +0 -341
  622. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily-shared-water-heater.osw +0 -341
  623. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-multifamily.osw +0 -341
  624. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-bldgtype-single-family-attached.osw +0 -339
  625. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless-outside.osw +0 -337
  626. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-combi-tankless.osw +0 -337
  627. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-dwhr.osw +0 -337
  628. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-outside.osw +0 -337
  629. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-standbyloss.osw +0 -337
  630. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect-with-solar-fraction.osw +0 -337
  631. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-indirect.osw +0 -337
  632. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-electric.osw +0 -337
  633. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-gas.osw +0 -337
  634. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-hpwh.osw +0 -337
  635. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-jacket-indirect.osw +0 -337
  636. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-low-flow-fixtures.osw +0 -337
  637. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-none.osw +0 -337
  638. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-demand.osw +0 -337
  639. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-manual.osw +0 -337
  640. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-nocontrol.osw +0 -337
  641. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-temperature.osw +0 -337
  642. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-recirc-timer.osw +0 -337
  643. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-evacuated-tube.osw +0 -337
  644. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-flat-plate.osw +0 -337
  645. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-direct-ics.osw +0 -337
  646. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-fraction.osw +0 -337
  647. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-indirect-flat-plate.osw +0 -337
  648. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-solar-thermosyphon-flat-plate.osw +0 -337
  649. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-coal.osw +0 -337
  650. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-elec-uef.osw +0 -338
  651. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-outside.osw +0 -337
  652. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas-uef.osw +0 -338
  653. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-gas.osw +0 -337
  654. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-outside.osw +0 -337
  655. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-uef.osw +0 -338
  656. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar-fraction.osw +0 -337
  657. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump-with-solar.osw +0 -337
  658. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-heat-pump.osw +0 -337
  659. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-oil.osw +0 -337
  660. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tank-wood.osw +0 -337
  661. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-outside.osw +0 -337
  662. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric-uef.osw +0 -337
  663. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-electric.osw +0 -337
  664. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-uef.osw +0 -337
  665. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar-fraction.osw +0 -337
  666. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas-with-solar.osw +0 -337
  667. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-gas.osw +0 -337
  668. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-dhw-tankless-propane.osw +0 -337
  669. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories-garage.osw +0 -337
  670. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-2stories.osw +0 -337
  671. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-1.osw +0 -337
  672. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-2.osw +0 -337
  673. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-4.osw +0 -337
  674. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-beds-5.osw +0 -337
  675. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-garage.osw +0 -337
  676. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-ach-house-pressure.osw +0 -337
  677. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm-house-pressure.osw +0 -337
  678. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-cfm50.osw +0 -337
  679. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-flue.osw +0 -337
  680. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-infil-natural-ach.osw +0 -337
  681. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-overhangs.osw +0 -337
  682. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-enclosure-windows-none.osw +0 -337
  683. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-ambient.osw +0 -337
  684. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-conditioned-basement-slab-insulation.osw +0 -337
  685. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-slab.osw +0 -337
  686. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-assembly-r.osw +0 -338
  687. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement-wall-insulation.osw +0 -337
  688. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unconditioned-basement.osw +0 -337
  689. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-unvented-crawlspace.osw +0 -337
  690. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-foundation-vented-crawlspace.osw +0 -337
  691. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.osw +0 -337
  692. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed-heating-only.osw +0 -337
  693. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-1-speed.osw +0 -337
  694. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-2-speed.osw +0 -337
  695. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-air-to-air-heat-pump-var-speed.osw +0 -337
  696. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-coal-only.osw +0 -337
  697. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-elec-only.osw +0 -337
  698. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-central-ac-1-speed.osw +0 -337
  699. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-gas-only.osw +0 -337
  700. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-oil-only.osw +0 -337
  701. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-propane-only.osw +0 -337
  702. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-boiler-wood-only.osw +0 -337
  703. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-1-speed.osw +0 -337
  704. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-2-speed.osw +0 -337
  705. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-only-var-speed.osw +0 -337
  706. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.osw +0 -337
  707. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.osw +0 -338
  708. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.osw +0 -338
  709. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.osw +0 -338
  710. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.osw +0 -338
  711. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-dual-fuel-mini-split-heat-pump-ducted.osw +0 -338
  712. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ducts-leakage-percent.osw +0 -337
  713. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-elec-resistance-only.osw +0 -337
  714. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-furnace-gas.osw +0 -335
  715. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only-ducted.osw +0 -335
  716. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-evap-cooler-only.osw +0 -335
  717. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fireplace-wood-only.osw +0 -337
  718. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-fixed-heater-gas-only.osw +0 -337
  719. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-floor-furnace-propane-only.osw +0 -337
  720. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-coal-only.osw +0 -337
  721. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-central-ac-1-speed.osw +0 -337
  722. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-elec-only.osw +0 -337
  723. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-2-speed.osw +0 -337
  724. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-central-ac-var-speed.osw +0 -337
  725. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-only.osw +0 -337
  726. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-gas-room-ac.osw +0 -336
  727. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-oil-only.osw +0 -337
  728. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-propane-only.osw +0 -337
  729. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-furnace-wood-only.osw +0 -337
  730. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-cooling-only.osw +0 -336
  731. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump-heating-only.osw +0 -336
  732. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-ground-to-air-heat-pump.osw +0 -336
  733. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-airflow-defect-furnace-gas-central-ac-1-speed.osw +0 -339
  734. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-1-speed.osw +0 -339
  735. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-2-speed.osw +0 -339
  736. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-air-to-air-heat-pump-var-speed.osw +0 -339
  737. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-1-speed.osw +0 -340
  738. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-2-speed.osw +0 -340
  739. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-central-ac-var-speed.osw +0 -340
  740. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-furnace-gas-only.osw +0 -338
  741. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-ground-to-air-heat-pump.osw +0 -338
  742. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-air-conditioner-only-ducted.osw +0 -338
  743. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-all-mini-split-heat-pump-ducted.osw +0 -339
  744. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-charge-defect-furnace-gas-central-ac-1-speed.osw +0 -338
  745. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-install-quality-none-furnace-gas-central-ac-1-speed.osw +0 -340
  746. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ducted.osw +0 -336
  747. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-air-conditioner-only-ductless.osw +0 -336
  748. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-cooling-only.osw +0 -337
  749. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted-heating-only.osw +0 -337
  750. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ducted.osw +0 -337
  751. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-mini-split-heat-pump-ductless.osw +0 -337
  752. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-none.osw +0 -337
  753. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-portable-heater-gas-only.osw +0 -337
  754. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-programmable-thermostat-detailed.osw +0 -337
  755. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only-33percent.osw +0 -336
  756. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-room-ac-only.osw +0 -336
  757. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-setpoints.osw +0 -337
  758. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-oil-only.osw +0 -337
  759. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-stove-wood-pellets-only.osw +0 -337
  760. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-undersized.osw +0 -337
  761. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-hvac-wall-furnace-elec-only.osw +0 -337
  762. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-ceiling-fans.osw +0 -337
  763. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-lighting-detailed.osw +0 -337
  764. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-AMY-2012.osw +0 -337
  765. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-baltimore-md.osw +0 -337
  766. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-dallas-tx.osw +0 -337
  767. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-duluth-mn.osw +0 -337
  768. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-helena-mt.osw +0 -337
  769. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-honolulu-hi.osw +0 -337
  770. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-miami-fl.osw +0 -337
  771. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-phoenix-az.osw +0 -337
  772. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-location-portland-or.osw +0 -337
  773. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-balanced.osw +0 -337
  774. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-bath-kitchen-fans.osw +0 -345
  775. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis-evap-cooler-only-ducted.osw +0 -335
  776. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-cfis.osw +0 -337
  777. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv-atre-asre.osw +0 -337
  778. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-erv.osw +0 -337
  779. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust-rated-flow-rate.osw +0 -337
  780. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-exhaust.osw +0 -337
  781. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv-asre.osw +0 -337
  782. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-hrv.osw +0 -337
  783. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-supply.osw +0 -337
  784. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-mechvent-whole-house-fan.osw +0 -337
  785. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-defaults.osw +0 -324
  786. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon.osw +0 -337
  787. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-loads-large-uncommon2.osw +0 -337
  788. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-neighbor-shading.osw +0 -337
  789. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-shielding-of-home.osw +0 -337
  790. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-misc-usage-multiplier.osw +0 -337
  791. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-pv.osw +0 -337
  792. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic-vacant.osw +0 -341
  793. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-stochastic.osw +0 -337
  794. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-schedules-user-specified.osw +0 -338
  795. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-calendar-year-custom.osw +0 -338
  796. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-custom.osw +0 -342
  797. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-daylight-saving-disabled.osw +0 -338
  798. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-runperiod-1-month.osw +0 -341
  799. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base-simcontrol-timestep-10-mins.osw +0 -337
  800. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/base.osw +0 -337
  801. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-auto.osw +0 -337
  802. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-exterior.osw +0 -341
  803. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-double-loaded-interior.osw +0 -341
  804. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-eaves.osw +0 -341
  805. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-single-exterior-front.osw +0 -341
  806. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-double-loaded-interior.osw +0 -341
  807. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom-double-loaded-interior.osw +0 -341
  808. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-bottom.osw +0 -341
  809. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle-double-loaded-interior.osw +0 -341
  810. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-middle.osw +0 -341
  811. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top-double-loaded-interior.osw +0 -341
  812. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-left-top.osw +0 -341
  813. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom-double-loaded-interior.osw +0 -341
  814. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-bottom.osw +0 -341
  815. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle-double-loaded-interior.osw +0 -341
  816. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-middle.osw +0 -341
  817. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top-double-loaded-interior.osw +0 -341
  818. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-middle-top.osw +0 -341
  819. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom-double-loaded-interior.osw +0 -341
  820. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-bottom.osw +0 -341
  821. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle-double-loaded-interior.osw +0 -341
  822. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-middle.osw +0 -341
  823. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top-double-loaded-interior.osw +0 -341
  824. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab-right-top.osw +0 -341
  825. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-slab.osw +0 -341
  826. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-double-loaded-interior.osw +0 -341
  827. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  828. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-bottom.osw +0 -341
  829. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  830. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-middle.osw +0 -341
  831. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  832. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-left-top.osw +0 -341
  833. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  834. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-bottom.osw +0 -341
  835. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  836. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-middle.osw +0 -341
  837. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  838. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-middle-top.osw +0 -341
  839. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  840. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-bottom.osw +0 -341
  841. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  842. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-middle.osw +0 -341
  843. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  844. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace-right-top.osw +0 -341
  845. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-unvented-crawlspace.osw +0 -341
  846. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-double-loaded-interior.osw +0 -341
  847. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom-double-loaded-interior.osw +0 -341
  848. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-bottom.osw +0 -341
  849. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle-double-loaded-interior.osw +0 -341
  850. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-middle.osw +0 -341
  851. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top-double-loaded-interior.osw +0 -341
  852. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-left-top.osw +0 -341
  853. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom-double-loaded-interior.osw +0 -341
  854. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-bottom.osw +0 -341
  855. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle-double-loaded-interior.osw +0 -341
  856. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-middle.osw +0 -341
  857. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top-double-loaded-interior.osw +0 -341
  858. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-middle-top.osw +0 -341
  859. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom-double-loaded-interior.osw +0 -341
  860. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-bottom.osw +0 -341
  861. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle-double-loaded-interior.osw +0 -341
  862. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-middle.osw +0 -341
  863. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top-double-loaded-interior.osw +0 -341
  864. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace-right-top.osw +0 -341
  865. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-multifamily-vented-crawlspace.osw +0 -341
  866. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-gable.osw +0 -339
  867. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-conditioned-eaves-hip.osw +0 -339
  868. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-atticroof-flat.osw +0 -339
  869. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-exterior.osw +0 -339
  870. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-double-loaded-interior.osw +0 -339
  871. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-single-exterior-front.osw +0 -339
  872. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-middle.osw +0 -339
  873. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab-right.osw +0 -339
  874. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-slab.osw +0 -339
  875. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-middle.osw +0 -339
  876. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement-right.osw +0 -339
  877. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unconditioned-basement.osw +0 -339
  878. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-middle.osw +0 -339
  879. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace-right.osw +0 -339
  880. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-unvented-crawlspace.osw +0 -339
  881. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-middle.osw +0 -339
  882. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace-right.osw +0 -339
  883. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-bldgtype-single-family-attached-vented-crawlspace.osw +0 -339
  884. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-dhw-solar-latitude.osw +0 -337
  885. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-gable.osw +0 -337
  886. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-atticroof-conditioned-eaves-hip.osw +0 -337
  887. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-atticroof-conditioned.osw +0 -337
  888. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-garage-partially-protruded.osw +0 -337
  889. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-enclosure-windows-shading.osw +0 -339
  890. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-hot-tub-heater-with-zero-kwh.osw +0 -337
  891. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-gas-pool-heater-with-zero-kwh.osw +0 -337
  892. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-pv-roofpitch.osw +0 -337
  893. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-schedules-random-seed.osw +0 -338
  894. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heat-pump.osw +0 -336
  895. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-boiler-to-heating-system.osw +0 -337
  896. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heat-pump.osw +0 -337
  897. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-fireplace-to-heating-system.osw +0 -337
  898. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heat-pump.osw +0 -337
  899. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-heating-system-portable-heater-to-heating-system.osw +0 -337
  900. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-second-refrigerator.osw +0 -337
  901. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-clothes-washer-kwh.osw +0 -337
  902. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-dishwasher-kwh.osw +0 -337
  903. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-extra-refrigerator-kwh.osw +0 -337
  904. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-freezer-kwh.osw +0 -337
  905. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/extra-zero-refrigerator-kwh.osw +0 -337
  906. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-floor-insulation.osw +0 -337
  907. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-attic-with-one-floor-above-grade.osw +0 -337
  908. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/conditioned-basement-with-ceiling-insulation.osw +0 -337
  909. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/cooling-system-and-heat-pump.osw +0 -337
  910. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/dhw-indirect-without-boiler.osw +0 -337
  911. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/ducts-location-and-areas-not-same-type.osw +0 -337
  912. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/foundation-wall-insulation-greater-than-height.osw +0 -337
  913. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/heating-system-and-heat-pump.osw +0 -337
  914. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-crawlspace-zero-foundation-height.osw +0 -341
  915. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-bottom-slab-non-zero-foundation-height.osw +0 -341
  916. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multifamily-no-building-orientation.osw +0 -338
  917. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-fuel-loads.osw +0 -337
  918. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-other-plug-loads.osw +0 -337
  919. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-tv-plug-loads.osw +0 -337
  920. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-vehicle-plug-loads.osw +0 -337
  921. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/multipliers-without-well-pump-plug-loads.osw +0 -337
  922. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-electric-heat-pump-water-heater.osw +0 -337
  923. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-ceiling-fan-quantity.osw +0 -337
  924. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/non-integer-geometry-num-bathrooms.osw +0 -337
  925. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-but-no-primary-heating.osw +0 -337
  926. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-majority-heat.osw +0 -337
  927. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/second-heating-system-serves-total-heat-load.osw +0 -337
  928. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-ambient.osw +0 -339
  929. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-attached-no-building-orientation.osw +0 -337
  930. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-finished-basement-zero-foundation-height.osw +0 -337
  931. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-slab-non-zero-foundation-height.osw +0 -337
  932. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/single-family-detached-with-shared-system.osw +0 -337
  933. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/slab-non-zero-foundation-height-above-grade.osw +0 -337
  934. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unconditioned-basement-with-wall-and-ceiling-insulation.osw +0 -337
  935. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-attic-with-floor-and-roof-insulation.osw +0 -337
  936. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/unvented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  937. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-attic-with-floor-and-roof-insulation.osw +0 -337
  938. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/vented-crawlspace-with-wall-and-ceiling-insulation.osw +0 -337
  939. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/invalid_files/zero-number-of-bedrooms.osw +0 -337
  940. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/stochastic.csv +0 -8761
  941. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/user-specified.csv +0 -8761
  942. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/schedules/vacant.csv +0 -8761
  943. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_1bed.csv +0 -369
  944. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_2bed.csv +0 -465
  945. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_3bed.csv +0 -611
  946. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_4bed.csv +0 -685
  947. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_bath_schedule_5bed.csv +0 -767
  948. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_1bed.csv +0 -637
  949. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_2bed.csv +0 -744
  950. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_3bed.csv +0 -929
  951. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_4bed.csv +0 -1044
  952. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_clotheswasher_schedule_5bed.csv +0 -1250
  953. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_1bed.csv +0 -754
  954. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_2bed.csv +0 -961
  955. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_3bed.csv +0 -1102
  956. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_4bed.csv +0 -1293
  957. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_dishwasher_schedule_5bed.csv +0 -1508
  958. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_1bed.csv +0 -13097
  959. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_2bed.csv +0 -15977
  960. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_3bed.csv +0 -18624
  961. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_4bed.csv +0 -22075
  962. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_fixtures_schedule_5bed.csv +0 -25005
  963. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data_hot_water_max_flows.csv +0 -6
  964. data/example_files/resources/hpxml-measures/SimulationOutputReport/measure.rb +0 -2444
  965. data/example_files/resources/hpxml-measures/docs/source/build_residential_hpxml.rst +0 -110
  966. data/example_files/resources/hpxml-measures/docs/source/getting_started.rst +0 -57
  967. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic-vacant.xml +0 -564
  968. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-stochastic.xml +0 -564
  969. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-user-specified.xml +0 -564
  970. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-dryer-location.xml +0 -563
  971. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/clothes-washer-location.xml +0 -563
  972. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/cooking-range-location.xml +0 -563
  973. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-fraction-served.xml +0 -535
  974. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dehumidifier-setpoints.xml +0 -535
  975. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-frac-load-served.xml +0 -576
  976. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-ef-tank.xml +0 -563
  977. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dhw-invalid-uef-tank-heat-pump.xml +0 -564
  978. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/dishwasher-location.xml +0 -563
  979. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-cfm25.xml +0 -563
  980. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-leakage-percent.xml +0 -563
  981. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location-unconditioned-space.xml +0 -563
  982. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duct-location.xml +0 -563
  983. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/duplicate-id.xml +0 -563
  984. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-attic-missing-roof.xml +0 -547
  985. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-exterior-foundation-wall.xml +0 -544
  986. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-basement-missing-slab.xml +0 -547
  987. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa.xml +0 -563
  988. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-floor-area-exceeds-cfa2.xml +0 -448
  989. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-exterior-wall.xml +0 -614
  990. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-garage-missing-slab.xml +0 -611
  991. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-ceiling-roof.xml +0 -551
  992. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-exterior-wall.xml +0 -473
  993. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/enclosure-living-missing-floor-slab.xml +0 -489
  994. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-fuel-load.xml +0 -760
  995. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-sensible-plug-load.xml +0 -759
  996. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-fuel-load.xml +0 -761
  997. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/frac-total-plug-load.xml +0 -759
  998. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/furnace-invalid-afue.xml +0 -563
  999. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/generator-number-of-bedrooms-served.xml +0 -460
  1000. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/heat-pump-mixed-fixed-and-autosize-capacities.xml +0 -560
  1001. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-cooling.xml +0 -921
  1002. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-distribution-multiple-attached-heating.xml +0 -921
  1003. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-cooling.xml +0 -547
  1004. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-dse-multiple-attached-heating.xml +0 -547
  1005. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-frac-load-served.xml +0 -921
  1006. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-inconsistent-fan-powers.xml +0 -569
  1007. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/hvac-shared-negative-seer-eq.xml +0 -407
  1008. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-assembly-effective-rvalue.xml +0 -563
  1009. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-boolean.xml +0 -563
  1010. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-float.xml +0 -563
  1011. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-datatype-integer.xml +0 -563
  1012. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-daylight-saving.xml +0 -570
  1013. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-distribution-cfa-served.xml +0 -563
  1014. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-epw-filepath.xml +0 -563
  1015. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-facility-type-equipment.xml +0 -466
  1016. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-id2.xml +0 -591
  1017. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-infiltration-volume.xml +0 -563
  1018. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-input-parameters.xml +0 -565
  1019. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-neighbor-shading-azimuth.xml +0 -576
  1020. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-bedrooms-served.xml +0 -465
  1021. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-conditioned-floors.xml +0 -563
  1022. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-number-of-units-served.xml +0 -451
  1023. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-relatedhvac-desuperheater.xml +0 -551
  1024. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-runperiod.xml +0 -565
  1025. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-schema-version.xml +0 -563
  1026. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-shared-vent-in-unit-flowrate.xml +0 -473
  1027. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-timestep.xml +0 -563
  1028. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/invalid-window-height.xml +0 -583
  1029. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/lighting-fractions.xml +0 -563
  1030. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-duct-location.xml +0 -917
  1031. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/missing-elements.xml +0 -561
  1032. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-appliance.xml +0 -563
  1033. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-duct.xml +0 -563
  1034. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multifamily-reference-water-heater.xml +0 -563
  1035. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-without-building-id.xml +0 -1657
  1036. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-buildings-wrong-building-id.xml +0 -1657
  1037. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-cooling-systems.xml +0 -432
  1038. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/multiple-shared-heating-systems.xml +0 -434
  1039. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-roof.xml +0 -591
  1040. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/net-area-negative-wall.xml +0 -563
  1041. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/num-bedrooms-exceeds-limit.xml +0 -563
  1042. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/orphaned-hvac-distribution.xml +0 -547
  1043. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerator-location.xml +0 -563
  1044. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-multiple-primary.xml +0 -569
  1045. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/refrigerators-no-primary.xml +0 -569
  1046. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-desuperheater.xml +0 -564
  1047. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/repeated-relatedhvac-dhw-indirect.xml +0 -527
  1048. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-fraction-one.xml +0 -571
  1049. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-combi-tankless.xml +0 -532
  1050. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-desuperheater.xml +0 -566
  1051. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/solar-thermal-system-with-dhw-indirect.xml +0 -532
  1052. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-cfis.xml +0 -576
  1053. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-door.xml +0 -563
  1054. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-hvac-distribution.xml +0 -563
  1055. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-clothes-washer-water-heater.xml +0 -466
  1056. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-shared-dishwasher-water-heater.xml +0 -466
  1057. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-skylight.xml +0 -591
  1058. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/unattached-window.xml +0 -563
  1059. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location-other.xml +0 -563
  1060. data/example_files/resources/hpxml-measures/workflow/sample_files/invalid_files/water-heater-location.xml +0 -563
  1061. data/example_files/resources/hpxml-measures/workflow/tests/compare.rb +0 -130
@@ -3,11 +3,11 @@
3
3
  class Constructions
4
4
  # Container class for walls, floors/ceilings, roofs, etc.
5
5
 
6
- def self.apply_wood_stud_wall(runner, model, surfaces, wall, constr_name,
6
+ def self.apply_wood_stud_wall(runner, model, surfaces, constr_name,
7
7
  cavity_r, install_grade, cavity_depth_in, cavity_filled,
8
- framing_factor, drywall_thick_in, osb_thick_in,
9
- rigid_r, mat_ext_finish, otherside_drywall_thick_in,
10
- inside_film, outside_film)
8
+ framing_factor, mat_int_finish, osb_thick_in,
9
+ rigid_r, mat_ext_finish, inside_film, outside_film,
10
+ solar_absorptance = nil, emittance = nil)
11
11
 
12
12
  return if surfaces.empty?
13
13
 
@@ -15,25 +15,25 @@ class Constructions
15
15
  if cavity_r > 0
16
16
  if cavity_filled
17
17
  # Insulation
18
- mat_cavity = Material.new(name = nil, thick_in = cavity_depth_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth_in / cavity_r)
18
+ mat_cavity = Material.new(thick_in: cavity_depth_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth_in / cavity_r)
19
19
  else
20
20
  # Insulation plus air gap when insulation thickness < cavity depth
21
- mat_cavity = Material.new(name = nil, thick_in = cavity_depth_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth_in / (cavity_r + Gas.AirGapRvalue))
21
+ mat_cavity = Material.new(thick_in: cavity_depth_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth_in / (cavity_r + Gas.AirGapRvalue))
22
22
  end
23
23
  else
24
24
  # Empty cavity
25
25
  mat_cavity = Material.AirCavityClosed(cavity_depth_in)
26
26
  end
27
- mat_framing = Material.new(name = nil, thick_in = cavity_depth_in, mat_base = BaseMaterial.Wood)
27
+ mat_framing = Material.new(thick_in: cavity_depth_in, mat_base: BaseMaterial.Wood)
28
28
  mat_gap = Material.AirCavityClosed(cavity_depth_in)
29
29
  mat_osb = nil
30
30
  if osb_thick_in > 0
31
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
31
+ mat_osb = Material.OSBSheathing(osb_thick_in)
32
32
  end
33
33
  mat_rigid = nil
34
34
  if rigid_r > 0
35
35
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
36
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
36
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
37
37
  end
38
38
 
39
39
  # Set paths
@@ -46,58 +46,60 @@ class Constructions
46
46
  if not mat_ext_finish.nil?
47
47
  constr.add_layer(mat_ext_finish)
48
48
  end
49
- if otherside_drywall_thick_in > 0 # E.g., interior partition wall
50
- constr.add_layer(Material.GypsumWall(otherside_drywall_thick_in))
51
- end
52
49
  if not mat_rigid.nil?
53
50
  constr.add_layer(mat_rigid)
54
51
  end
55
52
  if not mat_osb.nil?
56
53
  constr.add_layer(mat_osb)
57
54
  end
58
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'WallStudAndCavity')
59
- if drywall_thick_in > 0
60
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
55
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'wall stud and cavity')
56
+ if not mat_int_finish.nil?
57
+ constr.add_layer(mat_int_finish)
61
58
  end
62
59
  constr.add_layer(inside_film)
63
60
 
61
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
62
+ constr.set_interior_material_properties()
63
+
64
64
  # Create and assign construction to surfaces
65
65
  constr.create_and_assign_constructions(runner, surfaces, model)
66
66
  end
67
67
 
68
- def self.apply_double_stud_wall(runner, model, surfaces, wall, constr_name,
68
+ def self.apply_double_stud_wall(runner, model, surfaces, constr_name,
69
69
  cavity_r, install_grade, stud_depth_in, gap_depth_in,
70
70
  framing_factor, framing_spacing, is_staggered,
71
- drywall_thick_in, osb_thick_in, rigid_r,
72
- mat_ext_finish, inside_film, outside_film)
71
+ mat_int_finish, osb_thick_in, rigid_r,
72
+ mat_ext_finish, inside_film, outside_film,
73
+ solar_absorptance = nil, emittance = nil)
73
74
 
74
75
  return if surfaces.empty?
75
76
 
76
77
  # Define materials
77
78
  cavity_depth_in = 2.0 * stud_depth_in + gap_depth_in
78
- mat_ins_inner_outer = Material.new(name = nil, thick_in = stud_depth_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth_in / cavity_r)
79
- mat_ins_middle = Material.new(name = nil, thick_in = gap_depth_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth_in / cavity_r)
80
- mat_framing_inner_outer = Material.new(name = nil, thick_in = stud_depth_in, mat_base = BaseMaterial.Wood)
81
- mat_framing_middle = Material.new(name = nil, thick_in = gap_depth_in, mat_base = BaseMaterial.Wood)
82
- mat_stud = Material.new(name = nil, thick_in = stud_depth_in, mat_base = BaseMaterial.Wood)
79
+ mat_ins_inner_outer = Material.new(thick_in: stud_depth_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth_in / cavity_r)
80
+ mat_ins_middle = Material.new(thick_in: gap_depth_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth_in / cavity_r)
81
+ mat_framing_inner_outer = Material.new(thick_in: stud_depth_in, mat_base: BaseMaterial.Wood)
82
+ mat_framing_middle = Material.new(thick_in: gap_depth_in, mat_base: BaseMaterial.Wood)
83
+ mat_stud = Material.new(thick_in: stud_depth_in, mat_base: BaseMaterial.Wood)
83
84
  mat_gap_total = Material.AirCavityClosed(cavity_depth_in)
84
- mat_gap_inner_outer = Material.new(name = nil, thick_in = stud_depth_in, mat_base = nil, k_in = stud_depth_in / (mat_gap_total.rvalue * stud_depth_in / cavity_depth_in), rho = Gas.Air.rho, cp = Gas.Air.cp)
85
- mat_gap_middle = Material.new(name = nil, thick_in = gap_depth_in, mat_base = nil, k_in = gap_depth_in / (mat_gap_total.rvalue * gap_depth_in / cavity_depth_in), rho = Gas.Air.rho, cp = Gas.Air.cp)
85
+ mat_gap_inner_outer = Material.new(thick_in: stud_depth_in, k_in: stud_depth_in / (mat_gap_total.rvalue * stud_depth_in / cavity_depth_in), rho: Gas.Air.rho, cp: Gas.Air.cp)
86
+ mat_gap_middle = Material.new(thick_in: gap_depth_in, k_in: gap_depth_in / (mat_gap_total.rvalue * gap_depth_in / cavity_depth_in), rho: Gas.Air.rho, cp: Gas.Air.cp)
86
87
  mat_osb = nil
87
88
  if osb_thick_in > 0
88
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
89
+ mat_osb = Material.OSBSheathing(osb_thick_in)
89
90
  end
90
91
  mat_rigid = nil
91
92
  if rigid_r > 0
92
93
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
93
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
94
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
94
95
  end
95
96
 
96
97
  # Set paths
97
98
  stud_frac = 1.5 / framing_spacing
98
99
  misc_framing_factor = framing_factor - stud_frac
99
100
  if misc_framing_factor < 0
100
- fail "Framing Factor (#{framing_factor}) is less than the framing solely provided by the studs (#{stud_frac})."
101
+ stud_frac = framing_factor
102
+ misc_framing_factor = 0.0
101
103
  end
102
104
 
103
105
  dsGapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
@@ -116,52 +118,56 @@ class Constructions
116
118
  constr.add_layer(mat_osb)
117
119
  end
118
120
  if is_staggered
119
- constr.add_layer([mat_framing_inner_outer, mat_ins_inner_outer, mat_stud, mat_gap_inner_outer, mat_ins_inner_outer], 'WallStudandCavityOuter')
121
+ constr.add_layer([mat_framing_inner_outer, mat_ins_inner_outer, mat_stud, mat_gap_inner_outer, mat_ins_inner_outer], 'wall stud and cavity')
120
122
  else
121
- constr.add_layer([mat_framing_inner_outer, mat_stud, mat_ins_inner_outer, mat_gap_inner_outer, mat_ins_inner_outer], 'WallStudandCavityOuter')
123
+ constr.add_layer([mat_framing_inner_outer, mat_stud, mat_ins_inner_outer, mat_gap_inner_outer, mat_ins_inner_outer], 'wall stud and cavity')
122
124
  end
123
125
  if gap_depth_in > 0
124
- constr.add_layer([mat_framing_middle, mat_ins_middle, mat_ins_middle, mat_gap_middle, mat_ins_middle], 'WallCavity')
126
+ constr.add_layer([mat_framing_middle, mat_ins_middle, mat_ins_middle, mat_gap_middle, mat_ins_middle], 'wall cavity')
125
127
  end
126
- constr.add_layer([mat_framing_inner_outer, mat_stud, mat_ins_inner_outer, mat_gap_inner_outer, mat_ins_inner_outer], 'WallStudandCavityInner')
127
- if drywall_thick_in > 0
128
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
128
+ constr.add_layer([mat_framing_inner_outer, mat_stud, mat_ins_inner_outer, mat_gap_inner_outer, mat_ins_inner_outer], 'wall stud and cavity')
129
+ if not mat_int_finish.nil?
130
+ constr.add_layer(mat_int_finish)
129
131
  end
130
132
  constr.add_layer(inside_film)
131
133
 
134
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
135
+ constr.set_interior_material_properties()
136
+
132
137
  # Create and assign construction to surfaces
133
138
  constr.create_and_assign_constructions(runner, surfaces, model)
134
139
  end
135
140
 
136
- def self.apply_cmu_wall(runner, model, surfaces, wall, constr_name,
141
+ def self.apply_cmu_wall(runner, model, surfaces, constr_name,
137
142
  thick_in, conductivity, density, framing_factor,
138
143
  furring_r, furring_cavity_depth, furring_spacing,
139
- drywall_thick_in, osb_thick_in, rigid_r,
140
- mat_ext_finish, inside_film, outside_film)
144
+ mat_int_finish, osb_thick_in, rigid_r,
145
+ mat_ext_finish, inside_film, outside_film,
146
+ solar_absorptance = nil, emittance = nil)
141
147
 
142
148
  return if surfaces.empty?
143
149
 
144
150
  # Define materials
145
- mat_cmu = Material.new(name = nil, thick_in = thick_in, mat_base = BaseMaterial.Concrete, k_in = conductivity, rho = density)
146
- mat_framing = Material.new(name = nil, thick_in = thick_in, mat_base = BaseMaterial.Wood)
151
+ mat_cmu = Material.new(thick_in: thick_in, mat_base: BaseMaterial.Concrete, k_in: conductivity, rho: density)
152
+ mat_framing = Material.new(thick_in: thick_in, mat_base: BaseMaterial.Wood)
147
153
  mat_furring = nil
148
154
  mat_furring_cavity = nil
149
155
  if furring_cavity_depth != 0
150
- mat_furring = Material.new(name = nil, thick_in = furring_cavity_depth, mat_base = BaseMaterial.Wood)
156
+ mat_furring = Material.new(thick_in: furring_cavity_depth, mat_base: BaseMaterial.Wood)
151
157
  if furring_r == 0
152
158
  mat_furring_cavity = Material.AirCavityClosed(furring_cavity_depth)
153
159
  else
154
- mat_furring_cavity = Material.new(name = nil, thick_in = furring_cavity_depth, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = furring_cavity_depth / furring_r)
160
+ mat_furring_cavity = Material.new(thick_in: furring_cavity_depth, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: furring_cavity_depth / furring_r)
155
161
  end
156
162
  end
157
163
  mat_osb = nil
158
164
  if osb_thick_in > 0
159
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
165
+ mat_osb = Material.OSBSheathing(osb_thick_in)
160
166
  end
161
167
  mat_rigid = nil
162
168
  if rigid_r > 0
163
169
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
164
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
170
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
165
171
  end
166
172
 
167
173
  # Set paths
@@ -186,40 +192,44 @@ class Constructions
186
192
  constr.add_layer(mat_osb)
187
193
  end
188
194
  if not mat_furring.nil?
189
- constr.add_layer([mat_framing, mat_cmu, mat_cmu], 'WallCMU')
190
- constr.add_layer([mat_furring, mat_furring, mat_furring_cavity], 'WallFurring')
195
+ constr.add_layer([mat_framing, mat_cmu, mat_cmu], 'concrete block')
196
+ constr.add_layer([mat_furring, mat_furring, mat_furring_cavity], 'furring')
191
197
  else
192
- constr.add_layer([mat_framing, mat_cmu], 'WallCMU')
198
+ constr.add_layer([mat_framing, mat_cmu], 'concrete block')
193
199
  end
194
- if drywall_thick_in > 0
195
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
200
+ if not mat_int_finish.nil?
201
+ constr.add_layer(mat_int_finish)
196
202
  end
197
203
  constr.add_layer(inside_film)
198
204
 
205
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
206
+ constr.set_interior_material_properties()
207
+
199
208
  # Create and assign construction to surfaces
200
209
  constr.create_and_assign_constructions(runner, surfaces, model)
201
210
  end
202
211
 
203
- def self.apply_icf_wall(runner, model, surfaces, wall, constr_name,
212
+ def self.apply_icf_wall(runner, model, surfaces, constr_name,
204
213
  icf_r, ins_thick_in, concrete_thick_in, framing_factor,
205
- drywall_thick_in, osb_thick_in, rigid_r,
206
- mat_ext_finish, inside_film, outside_film)
214
+ mat_int_finish, osb_thick_in, rigid_r,
215
+ mat_ext_finish, inside_film, outside_film,
216
+ solar_absorptance = nil, emittance = nil)
207
217
 
208
218
  return if surfaces.empty?
209
219
 
210
220
  # Define materials
211
- mat_ins = Material.new(name = nil, thick_in = ins_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = ins_thick_in / icf_r)
212
- mat_conc = Material.new(name = nil, thick_in = concrete_thick_in, mat_base = BaseMaterial.Concrete)
213
- mat_framing_inner_outer = Material.new(name = nil, thick_in = ins_thick_in, mat_base = BaseMaterial.Wood)
214
- mat_framing_middle = Material.new(name = nil, thick_in = concrete_thick_in, mat_base = BaseMaterial.Wood)
221
+ mat_ins = Material.new(thick_in: ins_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: ins_thick_in / icf_r)
222
+ mat_conc = Material.new(thick_in: concrete_thick_in, mat_base: BaseMaterial.Concrete)
223
+ mat_framing_inner_outer = Material.new(thick_in: ins_thick_in, mat_base: BaseMaterial.Wood)
224
+ mat_framing_middle = Material.new(thick_in: concrete_thick_in, mat_base: BaseMaterial.Wood)
215
225
  mat_osb = nil
216
226
  if osb_thick_in > 0
217
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
227
+ mat_osb = Material.OSBSheathing(osb_thick_in)
218
228
  end
219
229
  mat_rigid = nil
220
230
  if rigid_r > 0
221
231
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
222
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
232
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
223
233
  end
224
234
 
225
235
  # Set paths
@@ -237,42 +247,46 @@ class Constructions
237
247
  if not mat_osb.nil?
238
248
  constr.add_layer(mat_osb)
239
249
  end
240
- constr.add_layer([mat_framing_inner_outer, mat_ins], 'WallICFInsFormOuter')
241
- constr.add_layer([mat_framing_middle, mat_conc], 'WallICFConcrete')
242
- constr.add_layer([mat_framing_inner_outer, mat_ins], 'WallICFInsFormInner')
243
- if drywall_thick_in > 0
244
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
250
+ constr.add_layer([mat_framing_inner_outer, mat_ins], 'wall ins form')
251
+ constr.add_layer([mat_framing_middle, mat_conc], 'wall concrete')
252
+ constr.add_layer([mat_framing_inner_outer, mat_ins], 'wall ins form')
253
+ if not mat_int_finish.nil?
254
+ constr.add_layer(mat_int_finish)
245
255
  end
246
256
  constr.add_layer(inside_film)
247
257
 
258
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
259
+ constr.set_interior_material_properties()
260
+
248
261
  # Create and assign construction to surfaces
249
262
  constr.create_and_assign_constructions(runner, surfaces, model)
250
263
  end
251
264
 
252
- def self.apply_sip_wall(runner, model, surfaces, wall, constr_name, sip_r,
265
+ def self.apply_sip_wall(runner, model, surfaces, constr_name, sip_r,
253
266
  sip_thick_in, framing_factor, sheathing_thick_in,
254
- drywall_thick_in, osb_thick_in, rigid_r,
255
- mat_ext_finish, inside_film, outside_film)
267
+ mat_int_finish, osb_thick_in, rigid_r,
268
+ mat_ext_finish, inside_film, outside_film,
269
+ solar_absorptance = nil, emittance = nil)
256
270
 
257
271
  return if surfaces.empty?
258
272
 
259
273
  # Define materials
260
274
  spline_thick_in = 0.5
261
275
  ins_thick_in = sip_thick_in - (2.0 * spline_thick_in) # in
262
- mat_int_sheath = Material.new(name = 'WallIntSheathing', thick_in = sheathing_thick_in, mat_base = BaseMaterial.Wood)
263
- mat_framing_inner_outer = Material.new(name = nil, thick_in = spline_thick_in, mat_base = BaseMaterial.Wood)
264
- mat_framing_middle = Material.new(name = nil, thick_in = ins_thick_in, mat_base = BaseMaterial.Wood)
265
- mat_spline = Material.new(name = nil, thick_in = spline_thick_in, mat_base = BaseMaterial.Wood)
266
- mat_ins_inner_outer = Material.new(name = nil, thick_in = spline_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = sip_thick_in / sip_r)
267
- mat_ins_middle = Material.new(name = nil, thick_in = ins_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = sip_thick_in / sip_r)
276
+ mat_int_sheath = Material.OSBSheathing(sheathing_thick_in)
277
+ mat_framing_inner_outer = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.Wood)
278
+ mat_framing_middle = Material.new(thick_in: ins_thick_in, mat_base: BaseMaterial.Wood)
279
+ mat_spline = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.Wood)
280
+ mat_ins_inner_outer = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: sip_thick_in / sip_r)
281
+ mat_ins_middle = Material.new(thick_in: ins_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: sip_thick_in / sip_r)
268
282
  mat_osb = nil
269
283
  if osb_thick_in > 0
270
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
284
+ mat_osb = Material.OSBSheathing(osb_thick_in)
271
285
  end
272
286
  mat_rigid = nil
273
287
  if rigid_r > 0
274
288
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
275
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
289
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
276
290
  end
277
291
 
278
292
  # Set paths
@@ -292,24 +306,28 @@ class Constructions
292
306
  if not mat_osb.nil?
293
307
  constr.add_layer(mat_osb)
294
308
  end
295
- constr.add_layer([mat_framing_inner_outer, mat_spline, mat_ins_inner_outer], 'WallSplineLayerOuter')
296
- constr.add_layer([mat_framing_middle, mat_ins_middle, mat_ins_middle], 'WallIns')
297
- constr.add_layer([mat_framing_inner_outer, mat_spline, mat_ins_inner_outer], 'WallSplineLayerInner')
309
+ constr.add_layer([mat_framing_inner_outer, mat_spline, mat_ins_inner_outer], 'wall spline layer')
310
+ constr.add_layer([mat_framing_middle, mat_ins_middle, mat_ins_middle], 'wall ins layer')
311
+ constr.add_layer([mat_framing_inner_outer, mat_spline, mat_ins_inner_outer], 'wall spline layer')
298
312
  constr.add_layer(mat_int_sheath)
299
- if drywall_thick_in > 0
300
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
313
+ if not mat_int_finish.nil?
314
+ constr.add_layer(mat_int_finish)
301
315
  end
302
316
  constr.add_layer(inside_film)
303
317
 
318
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
319
+ constr.set_interior_material_properties()
320
+
304
321
  # Create and assign construction to surfaces
305
322
  constr.create_and_assign_constructions(runner, surfaces, model)
306
323
  end
307
324
 
308
- def self.apply_steel_stud_wall(runner, model, surfaces, wall, constr_name,
325
+ def self.apply_steel_stud_wall(runner, model, surfaces, constr_name,
309
326
  cavity_r, install_grade, cavity_depth,
310
327
  cavity_filled, framing_factor, correction_factor,
311
- drywall_thick_in, osb_thick_in, rigid_r,
312
- mat_ext_finish, inside_film, outside_film)
328
+ mat_int_finish, osb_thick_in, rigid_r,
329
+ mat_ext_finish, inside_film, outside_film,
330
+ solar_absorptance = nil, emittance = nil)
313
331
 
314
332
  return if surfaces.empty?
315
333
 
@@ -318,10 +336,10 @@ class Constructions
318
336
  if eR > 0
319
337
  if cavity_filled
320
338
  # Insulation
321
- mat_cavity = Material.new(name = nil, thick_in = cavity_depth, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth / eR)
339
+ mat_cavity = Material.new(thick_in: cavity_depth, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth / eR)
322
340
  else
323
341
  # Insulation plus air gap when insulation thickness < cavity depth
324
- mat_cavity = Material.new(name = nil, thick_in = cavity_depth, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth / (eR + Gas.AirGapRvalue))
342
+ mat_cavity = Material.new(thick_in: cavity_depth, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth / (eR + Gas.AirGapRvalue))
325
343
  end
326
344
  else
327
345
  # Empty cavity
@@ -330,12 +348,12 @@ class Constructions
330
348
  mat_gap = Material.AirCavityClosed(cavity_depth)
331
349
  mat_osb = nil
332
350
  if osb_thick_in > 0
333
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
351
+ mat_osb = Material.OSBSheathing(osb_thick_in)
334
352
  end
335
353
  mat_rigid = nil
336
354
  if rigid_r > 0
337
355
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
338
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
356
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
339
357
  end
340
358
 
341
359
  # Set paths
@@ -354,20 +372,24 @@ class Constructions
354
372
  if not mat_osb.nil?
355
373
  constr.add_layer(mat_osb)
356
374
  end
357
- constr.add_layer([mat_cavity, mat_gap], 'WallStudAndCavity')
358
- if drywall_thick_in > 0
359
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
375
+ constr.add_layer([mat_cavity, mat_gap], 'wall stud and cavity')
376
+ if not mat_int_finish.nil?
377
+ constr.add_layer(mat_int_finish)
360
378
  end
361
379
  constr.add_layer(inside_film)
362
380
 
381
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
382
+ constr.set_interior_material_properties()
383
+
363
384
  # Create and assign construction to surfaces
364
385
  constr.create_and_assign_constructions(runner, surfaces, model)
365
386
  end
366
387
 
367
- def self.apply_generic_layered_wall(runner, model, surfaces, wall, constr_name,
388
+ def self.apply_generic_layered_wall(runner, model, surfaces, constr_name,
368
389
  thick_ins, conds, denss, specheats,
369
- drywall_thick_in, osb_thick_in, rigid_r,
370
- mat_ext_finish, inside_film, outside_film)
390
+ mat_int_finish, osb_thick_in, rigid_r,
391
+ mat_ext_finish, inside_film, outside_film,
392
+ solar_absorptance = nil, emittance = nil)
371
393
 
372
394
  return if surfaces.empty?
373
395
 
@@ -380,27 +402,27 @@ class Constructions
380
402
 
381
403
  # Define materials
382
404
  mats = []
383
- mats << Material.new(name = 'WallLayer1', thick_in = thick_ins[0], mat_base = nil, k_in = conds[0], rho = denss[0], cp = specheats[0])
405
+ mats << Material.new(name: 'wall layer 1', thick_in: thick_ins[0], k_in: conds[0], rho: denss[0], cp: specheats[0])
384
406
  if not thick_ins[1].nil?
385
- mats << Material.new(name = 'WallLayer2', thick_in = thick_ins[1], mat_base = nil, k_in = conds[1], rho = denss[1], cp = specheats[1])
407
+ mats << Material.new(name: 'wall layer 2', thick_in: thick_ins[1], k_in: conds[1], rho: denss[1], cp: specheats[1])
386
408
  end
387
409
  if not thick_ins[2].nil?
388
- mats << Material.new(name = 'WallLayer3', thick_in = thick_ins[2], mat_base = nil, k_in = conds[2], rho = denss[2], cp = specheats[2])
410
+ mats << Material.new(name: 'wall layer 3', thick_in: thick_ins[2], k_in: conds[2], rho: denss[2], cp: specheats[2])
389
411
  end
390
412
  if not thick_ins[3].nil?
391
- mats << Material.new(name = 'WallLayer4', thick_in = thick_ins[3], mat_base = nil, k_in = conds[3], rho = denss[3], cp = specheats[3])
413
+ mats << Material.new(name: 'wall layer 4', thick_in: thick_ins[3], k_in: conds[3], rho: denss[3], cp: specheats[3])
392
414
  end
393
415
  if not thick_ins[4].nil?
394
- mats << Material.new(name = 'WallLayer5', thick_in = thick_ins[4], mat_base = nil, k_in = conds[4], rho = denss[4], cp = specheats[4])
416
+ mats << Material.new(name: 'wall layer 5', thick_in: thick_ins[4], k_in: conds[4], rho: denss[4], cp: specheats[4])
395
417
  end
396
418
  mat_osb = nil
397
419
  if osb_thick_in > 0
398
- mat_osb = Material.new(name = 'WallSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
420
+ mat_osb = Material.OSBSheathing(osb_thick_in)
399
421
  end
400
422
  mat_rigid = nil
401
423
  if rigid_r > 0
402
424
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
403
- mat_rigid = Material.new(name = 'WallRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
425
+ mat_rigid = Material.new(name: 'wall rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
404
426
  end
405
427
 
406
428
  # Set paths
@@ -421,20 +443,23 @@ class Constructions
421
443
  mats.each do |mat|
422
444
  constr.add_layer(mat)
423
445
  end
424
- if drywall_thick_in > 0
425
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
446
+ if not mat_int_finish.nil?
447
+ constr.add_layer(mat_int_finish)
426
448
  end
427
449
  constr.add_layer(inside_film)
428
450
 
451
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
452
+ constr.set_interior_material_properties()
453
+
429
454
  # Create and assign construction to surfaces
430
455
  constr.create_and_assign_constructions(runner, surfaces, model)
431
456
  end
432
457
 
433
- def self.apply_rim_joist(runner, model, surfaces, rim_joist, constr_name,
458
+ def self.apply_rim_joist(runner, model, surfaces, constr_name,
434
459
  cavity_r, install_grade, framing_factor,
435
- drywall_thick_in, osb_thick_in,
460
+ mat_int_finish, osb_thick_in,
436
461
  rigid_r, mat_ext_finish, inside_film,
437
- outside_film)
462
+ outside_film, solar_absorptance = nil, emittance = nil)
438
463
 
439
464
  return if surfaces.empty?
440
465
 
@@ -444,21 +469,21 @@ class Constructions
444
469
  framing_thick_in = sill_plate_thick_in - rim_joist_thick_in # Extra non-continuous wood beyond rim joist thickness
445
470
  if cavity_r > 0
446
471
  # Insulation
447
- mat_cavity = Material.new(name = nil, thick_in = framing_thick_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = framing_thick_in / cavity_r)
472
+ mat_cavity = Material.new(thick_in: framing_thick_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: framing_thick_in / cavity_r)
448
473
  else
449
474
  # Empty cavity
450
475
  mat_cavity = Material.AirCavityOpen(framing_thick_in)
451
476
  end
452
- mat_framing = Material.new(name = nil, thick_in = framing_thick_in, mat_base = BaseMaterial.Wood)
477
+ mat_framing = Material.new(thick_in: framing_thick_in, mat_base: BaseMaterial.Wood)
453
478
  mat_gap = Material.AirCavityClosed(framing_thick_in)
454
479
  mat_osb = nil
455
480
  if osb_thick_in > 0
456
- mat_osb = Material.new(name = 'RimJoistSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
481
+ mat_osb = Material.OSBSheathing(osb_thick_in)
457
482
  end
458
483
  mat_rigid = nil
459
484
  if rigid_r > 0
460
485
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
461
- mat_rigid = Material.new(name = 'RimJoistRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
486
+ mat_rigid = Material.new(name: 'rim joist rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
462
487
  end
463
488
 
464
489
  # Set paths
@@ -477,12 +502,15 @@ class Constructions
477
502
  if not mat_osb.nil?
478
503
  constr.add_layer(mat_osb)
479
504
  end
480
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'RimJoistStudAndCavity')
481
- if drywall_thick_in > 0
482
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
505
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'rim joist stud and cavity')
506
+ if not mat_int_finish.nil?
507
+ constr.add_layer(mat_int_finish)
483
508
  end
484
509
  constr.add_layer(inside_film)
485
510
 
511
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
512
+ constr.set_interior_material_properties()
513
+
486
514
  # Create and assign construction to surfaces
487
515
  constr.create_and_assign_constructions(runner, surfaces, model)
488
516
  end
@@ -492,7 +520,8 @@ class Constructions
492
520
  framing_factor, framing_thick_in,
493
521
  osb_thick_in, rigid_r,
494
522
  mat_roofing, has_radiant_barrier,
495
- inside_film, outside_film, radiant_barrier_grade)
523
+ inside_film, outside_film, radiant_barrier_grade,
524
+ solar_absorptance = nil, emittance = nil)
496
525
 
497
526
  return if surfaces.empty?
498
527
 
@@ -505,23 +534,23 @@ class Constructions
505
534
  if cavity_ins_thick_in < framing_thick_in
506
535
  cavity_k = cavity_k * framing_thick_in / cavity_ins_thick_in
507
536
  end
508
- mat_cavity = Material.new(name = nil, thick_in = roof_ins_thickness_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_k)
537
+ mat_cavity = Material.new(thick_in: roof_ins_thickness_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_k)
509
538
  end
510
539
  if (cavity_ins_thick_in > framing_thick_in) && (framing_thick_in > 0)
511
540
  wood_k = BaseMaterial.Wood.k_in * cavity_ins_thick_in / framing_thick_in
512
541
  else
513
542
  wood_k = BaseMaterial.Wood.k_in
514
543
  end
515
- mat_framing = Material.new(name = nil, thick_in = roof_ins_thickness_in, mat_base = BaseMaterial.Wood, k_in = wood_k)
544
+ mat_framing = Material.new(thick_in: roof_ins_thickness_in, mat_base: BaseMaterial.Wood, k_in: wood_k)
516
545
  mat_gap = Material.AirCavityOpen(roof_ins_thickness_in)
517
546
  mat_osb = nil
518
547
  if osb_thick_in > 0
519
- mat_osb = Material.new(name = 'RoofSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
548
+ mat_osb = Material.OSBSheathing(osb_thick_in)
520
549
  end
521
550
  mat_rigid = nil
522
551
  if rigid_r > 0
523
552
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
524
- mat_rigid = Material.new(name = 'RoofRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
553
+ mat_rigid = Material.new(name: 'roof rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
525
554
  end
526
555
  mat_rb = nil
527
556
  if has_radiant_barrier
@@ -545,22 +574,26 @@ class Constructions
545
574
  constr.add_layer(mat_osb)
546
575
  end
547
576
  if framing_thick_in > 0
548
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'RoofStudAndCavity')
577
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'roof stud and cavity')
549
578
  end
550
579
  if not mat_rb.nil?
551
580
  constr.add_layer(mat_rb)
552
581
  end
553
582
  constr.add_layer(inside_film)
554
583
 
584
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
585
+ constr.set_interior_material_properties() unless has_radiant_barrier
586
+
555
587
  # Create and assign construction to roof surfaces
556
588
  constr.create_and_assign_constructions(runner, surfaces, model)
557
589
  end
558
590
 
559
591
  def self.apply_closed_cavity_roof(runner, model, surfaces, constr_name,
560
592
  cavity_r, install_grade, cavity_depth,
561
- filled_cavity, framing_factor, drywall_thick_in,
593
+ filled_cavity, framing_factor, mat_int_finish,
562
594
  osb_thick_in, rigid_r, mat_roofing, has_radiant_barrier,
563
- inside_film, outside_film, radiant_barrier_grade)
595
+ inside_film, outside_film, radiant_barrier_grade,
596
+ solar_absorptance = nil, emittance = nil)
564
597
 
565
598
  return if surfaces.empty?
566
599
 
@@ -568,25 +601,25 @@ class Constructions
568
601
  if cavity_r > 0
569
602
  if filled_cavity
570
603
  # Insulation
571
- mat_cavity = Material.new(name = nil, thick_in = cavity_depth, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth / cavity_r)
604
+ mat_cavity = Material.new(thick_in: cavity_depth, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth / cavity_r)
572
605
  else
573
606
  # Insulation plus air gap when insulation thickness < cavity depth
574
- mat_cavity = Material.new(name = nil, thick_in = cavity_depth, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = cavity_depth / (cavity_r + Gas.AirGapRvalue))
607
+ mat_cavity = Material.new(thick_in: cavity_depth, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: cavity_depth / (cavity_r + Gas.AirGapRvalue))
575
608
  end
576
609
  else
577
610
  # Empty cavity
578
611
  mat_cavity = Material.AirCavityClosed(cavity_depth)
579
612
  end
580
- mat_framing = Material.new(name = nil, thick_in = cavity_depth, mat_base = BaseMaterial.Wood)
613
+ mat_framing = Material.new(thick_in: cavity_depth, mat_base: BaseMaterial.Wood)
581
614
  mat_gap = Material.AirCavityClosed(cavity_depth)
582
615
  mat_osb = nil
583
616
  if osb_thick_in > 0
584
- mat_osb = Material.new(name = 'RoofSheathing', thick_in = osb_thick_in, mat_base = BaseMaterial.Wood)
617
+ mat_osb = Material.OSBSheathing(osb_thick_in)
585
618
  end
586
619
  mat_rigid = nil
587
620
  if rigid_r > 0
588
621
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
589
- mat_rigid = Material.new(name = 'RoofRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
622
+ mat_rigid = Material.new(name: 'roof rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
590
623
  end
591
624
  mat_rb = nil
592
625
  if has_radiant_barrier
@@ -609,48 +642,45 @@ class Constructions
609
642
  if not mat_osb.nil?
610
643
  constr.add_layer(mat_osb)
611
644
  end
612
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'RoofStudAndCavity')
613
- if drywall_thick_in > 0
614
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
645
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'roof stud and cavity')
646
+ if not mat_int_finish.nil?
647
+ constr.add_layer(mat_int_finish)
615
648
  end
616
649
  if not mat_rb.nil?
617
650
  constr.add_layer(mat_rb)
618
651
  end
619
652
  constr.add_layer(inside_film)
620
653
 
654
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
655
+ constr.set_interior_material_properties() unless has_radiant_barrier
656
+
621
657
  # Create and assign construction to surfaces
622
658
  constr.create_and_assign_constructions(runner, surfaces, model)
623
659
  end
624
660
 
625
661
  def self.apply_ceiling(runner, model, surfaces, constr_name,
626
- cavity_r, install_grade, ins_thick_in,
662
+ cavity_r, install_grade, addtl_r,
627
663
  framing_factor, joist_height_in,
628
- drywall_thick_in, inside_film, outside_film)
664
+ mat_int_finish, inside_film, outside_film)
629
665
 
630
- # Drywall below, open cavity above (e.g., attic floor)
666
+ # Interior finish below, open cavity above (e.g., attic floor)
631
667
 
632
668
  return if surfaces.empty?
633
669
 
634
670
  # Define materials
635
671
  mat_addtl_ins = nil
636
- if ins_thick_in >= joist_height_in
637
- # If the ceiling insulation thickness is greater than the joist thickness
638
- cavity_k = ins_thick_in / cavity_r
639
- if ins_thick_in > joist_height_in
672
+ if cavity_r == 0
673
+ mat_cavity = Material.AirCavityOpen(joist_height_in)
674
+ else
675
+ if addtl_r > 0
640
676
  # If there is additional insulation beyond the rafter height,
641
677
  # these inputs are used for defining an additional layer
642
- mat_addtl_ins = Material.new(name = 'CeilingAdditionalIns', thick_in = (ins_thick_in - joist_height_in), mat_base = BaseMaterial.InsulationGenericLoosefill, k_in = cavity_k)
643
- end
644
- mat_cavity = Material.new(name = nil, thick_in = joist_height_in, mat_base = BaseMaterial.InsulationGenericLoosefill, k_in = cavity_k)
645
- else
646
- # Else the joist thickness is greater than the ceiling insulation thickness
647
- if cavity_r == 0
648
- mat_cavity = Material.AirCavityOpen(joist_height_in)
649
- else
650
- mat_cavity = Material.new(name = nil, thick_in = joist_height_in, mat_base = BaseMaterial.InsulationGenericLoosefill, k_in = joist_height_in / cavity_r)
678
+ addtl_thick_in = addtl_r / 3.0 # Assume roughly R-3 per inch of loose-fill above cavity
679
+ mat_addtl_ins = Material.new(name: 'ceiling loosefill ins', thick_in: addtl_thick_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: addtl_thick_in / addtl_r)
651
680
  end
681
+ mat_cavity = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: joist_height_in / cavity_r)
652
682
  end
653
- mat_framing = Material.new(name = nil, thick_in = joist_height_in, mat_base = BaseMaterial.Wood)
683
+ mat_framing = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.Wood)
654
684
  mat_gap = Material.AirCavityOpen(joist_height_in)
655
685
 
656
686
  # Set paths
@@ -663,12 +693,14 @@ class Constructions
663
693
  if not mat_addtl_ins.nil?
664
694
  constr.add_layer(mat_addtl_ins)
665
695
  end
666
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'CeilingStudAndCavity')
667
- if drywall_thick_in > 0
668
- constr.add_layer(Material.GypsumWall(drywall_thick_in))
696
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'ceiling stud and cavity')
697
+ if not mat_int_finish.nil?
698
+ constr.add_layer(mat_int_finish)
669
699
  end
670
700
  constr.add_layer(inside_film)
671
701
 
702
+ constr.set_interior_material_properties(debug: true)
703
+
672
704
  # Create and assign construction to ceiling surfaces
673
705
  constr.create_and_assign_constructions(runner, surfaces, model)
674
706
  end
@@ -688,14 +720,14 @@ class Constructions
688
720
  if cavity_r == 0
689
721
  mat_cavity = Material.AirCavityOpen(mat_2x.thick_in)
690
722
  else
691
- mat_cavity = Material.new(name = nil, thick_in = mat_2x.thick_in, mat_base = BaseMaterial.InsulationGenericDensepack, k_in = mat_2x.thick_in / cavity_r)
723
+ mat_cavity = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: mat_2x.thick_in / cavity_r)
692
724
  end
693
- mat_framing = Material.new(name = nil, thick_in = mat_2x.thick_in, mat_base = BaseMaterial.Wood)
725
+ mat_framing = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.Wood)
694
726
  mat_gap = Material.AirCavityOpen(joist_height_in)
695
727
  mat_rigid = nil
696
728
  if rigid_r > 0
697
729
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
698
- mat_rigid = Material.new(name = 'FloorRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / rigid_r)
730
+ mat_rigid = Material.new(name: 'floor rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
699
731
  end
700
732
 
701
733
  # Set paths
@@ -705,48 +737,48 @@ class Constructions
705
737
  # Define construction
706
738
  constr = Construction.new(constr_name, path_fracs)
707
739
  constr.add_layer(outside_film)
708
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'FloorStudAndCavity')
740
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'floor stud and cavity')
709
741
  if not mat_rigid.nil?
710
742
  constr.add_layer(mat_rigid)
711
743
  end
712
744
  if plywood_thick_in > 0
713
- constr.add_layer(Material.Plywood(plywood_thick_in))
745
+ constr.add_layer(Material.OSBSheathing(plywood_thick_in))
714
746
  end
715
747
  if not mat_floor_covering.nil?
716
748
  constr.add_layer(mat_floor_covering)
717
749
  end
718
750
  constr.add_layer(inside_film)
719
751
 
752
+ constr.set_interior_material_properties()
753
+
720
754
  # Create and assign construction to surfaces
721
755
  constr.create_and_assign_constructions(runner, surfaces, model)
722
756
  end
723
757
 
724
- def self.apply_foundation_wall(runner, model, wall_surfaces, wall_constr_name,
758
+ def self.apply_foundation_wall(runner, model, surfaces, constr_name,
725
759
  ext_rigid_ins_offset, int_rigid_ins_offset, ext_rigid_ins_height,
726
- int_rigid_ins_height, ext_rigid_r, int_rigid_r, wall_drywall_thick_in, wall_concrete_thick_in, wall_height_above_grade)
760
+ int_rigid_ins_height, ext_rigid_r, int_rigid_r, mat_int_finish,
761
+ mat_wall, height_above_grade)
727
762
 
728
763
  # Create Kiva foundation
729
764
  foundation = apply_kiva_walled_foundation(model, ext_rigid_r, int_rigid_r, ext_rigid_ins_offset,
730
765
  int_rigid_ins_offset, ext_rigid_ins_height,
731
- int_rigid_ins_height, wall_height_above_grade,
732
- wall_concrete_thick_in, wall_drywall_thick_in)
733
-
734
- # Define materials
735
- mat_concrete = Material.Concrete(wall_concrete_thick_in)
766
+ int_rigid_ins_height, height_above_grade,
767
+ mat_wall.thick_in, mat_int_finish)
736
768
 
737
769
  # Define construction
738
- constr = Construction.new(wall_constr_name, [1])
739
- constr.add_layer(mat_concrete)
740
- if wall_drywall_thick_in > 0
741
- constr.add_layer(Material.GypsumWall(wall_drywall_thick_in))
770
+ constr = Construction.new(constr_name, [1])
771
+ constr.add_layer(mat_wall)
772
+ if not mat_int_finish.nil?
773
+ constr.add_layer(mat_int_finish)
742
774
  end
743
775
 
744
776
  # Create and assign construction to surfaces
745
- constr.create_and_assign_constructions(runner, wall_surfaces, model)
777
+ constr.create_and_assign_constructions(runner, surfaces, model)
746
778
 
747
779
  # Assign surfaces to Kiva foundation
748
- wall_surfaces.each do |wall_surface|
749
- wall_surface.setAdjacentFoundation(foundation)
780
+ surfaces.each do |surface|
781
+ surface.setAdjacentFoundation(foundation)
750
782
  end
751
783
  end
752
784
 
@@ -767,7 +799,7 @@ class Constructions
767
799
  else
768
800
  # Kiva foundation (for crawlspace/basement) exists
769
801
  if (under_r > 0) && (under_width > 0)
770
- int_horiz_mat = create_insulation_material(model, 'FoundationIntHorizIns', under_r)
802
+ int_horiz_mat = create_insulation_material(model, 'interior horizontal ins', under_r)
771
803
  foundation.setInteriorHorizontalInsulationMaterial(int_horiz_mat)
772
804
  foundation.setInteriorHorizontalInsulationDepth(0)
773
805
  foundation.setInteriorHorizontalInsulationWidth(UnitConversions.convert(under_width, 'ft', 'm'))
@@ -786,7 +818,7 @@ class Constructions
786
818
  mat_rigid = nil
787
819
  if whole_r > 0
788
820
  rigid_thick_in = whole_r * BaseMaterial.InsulationRigid.k_in
789
- mat_rigid = Material.new(name = 'SlabRigidIns', thick_in = rigid_thick_in, mat_base = BaseMaterial.InsulationRigid, k_in = rigid_thick_in / whole_r)
821
+ mat_rigid = Material.new(name: 'slab rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / whole_r)
790
822
  end
791
823
 
792
824
  # Define construction
@@ -818,7 +850,7 @@ class Constructions
818
850
  # Define materials
819
851
  door_Rvalue = 1.0 / ufactor - inside_film.rvalue - outside_film.rvalue
820
852
  door_thickness = 1.75 # in
821
- fin_door_mat = Material.new(name = 'DoorMaterial', thick_in = door_thickness, mat_base = BaseMaterial.Wood, k_in = 1.0 / door_Rvalue * door_thickness)
853
+ fin_door_mat = Material.new(name: 'door material', thick_in: door_thickness, mat_base: BaseMaterial.Wood, k_in: 1.0 / door_Rvalue * door_thickness)
822
854
 
823
855
  # Set paths
824
856
  path_fracs = [1]
@@ -839,19 +871,19 @@ class Constructions
839
871
  apply_window_skylight(runner, model, 'Skylight', subsurface, constr_name, ufactor, shgc)
840
872
  end
841
873
 
842
- def self.apply_partition_walls(runner, model, constr_name, drywall_thick_in, frac_of_ffa,
874
+ def self.apply_partition_walls(runner, model, constr_name, mat_int_finish, partition_wall_area,
843
875
  basement_frac_of_cfa, cond_base_surfaces, living_space)
844
876
 
845
877
  imdefs = []
846
878
 
847
879
  # Determine additional partition wall mass required
848
- addtl_surface_area_base = frac_of_ffa * living_space.floorArea * basement_frac_of_cfa
849
- addtl_surface_area_lv = frac_of_ffa * living_space.floorArea * (1.0 - basement_frac_of_cfa)
880
+ addtl_surface_area_base = partition_wall_area * basement_frac_of_cfa
881
+ addtl_surface_area_lv = partition_wall_area * (1.0 - basement_frac_of_cfa)
850
882
 
851
883
  if addtl_surface_area_lv > 0
852
884
  # Add remaining partition walls within spaces (those without geometric representation)
853
885
  # as internal mass object.
854
- obj_name = "#{living_space.name} Living Partition"
886
+ obj_name = 'partition wall mass above grade'
855
887
  imdef = create_os_int_mass_and_def(model, obj_name, living_space, addtl_surface_area_lv)
856
888
  imdefs << imdef
857
889
  end
@@ -859,21 +891,29 @@ class Constructions
859
891
  if addtl_surface_area_base > 0
860
892
  # Add remaining partition walls within spaces (those without geometric representation)
861
893
  # as internal mass object.
862
- obj_name = "#{living_space.name} Basement Partition"
894
+ obj_name = 'partition wall mass below grade'
863
895
  imdef = create_os_int_mass_and_def(model, obj_name, living_space, addtl_surface_area_base)
864
896
  cond_base_surfaces << imdef
865
897
  imdefs << imdef
866
898
  end
867
899
 
868
- apply_wood_stud_wall(runner, model, imdefs, nil, constr_name,
900
+ apply_wood_stud_wall(runner, model, imdefs, constr_name,
869
901
  0, 1, 3.5, false, 0.16,
870
- drywall_thick_in, 0, 0, nil, drywall_thick_in,
902
+ mat_int_finish, 0, 0, mat_int_finish,
871
903
  Material.AirFilmVertical,
872
904
  Material.AirFilmVertical)
873
905
  end
874
906
 
875
- def self.apply_furniture(runner, model, mass_lb_per_sqft, density_lb_per_cuft,
876
- mat, basement_frac_of_cfa, cond_base_surfaces, living_space)
907
+ def self.apply_furniture(runner, model, furniture_mass, cfa, ubfa, gfa,
908
+ basement_frac_of_cfa, cond_base_surfaces, living_space)
909
+
910
+ if furniture_mass.type == HPXML::FurnitureMassTypeLightWeight
911
+ mass_lb_per_sqft = 8.0
912
+ mat = BaseMaterial.FurnitureLightWeight
913
+ elsif furniture_mass.type == HPXML::FurnitureMassTypeHeavyWeight
914
+ mass_lb_per_sqft = 16.0
915
+ mat = BaseMaterial.FurnitureHeavyWeight
916
+ end
877
917
 
878
918
  # Add user-specified furniture mass
879
919
  model.getSpaces.each do |space|
@@ -881,13 +921,19 @@ class Constructions
881
921
  furnConductivity = mat.k_in
882
922
  furnSolarAbsorptance = 0.6
883
923
  furnSpecHeat = mat.cp
884
- furnDensity = density_lb_per_cuft
885
- if (space == living_space) || Geometry.is_unconditioned_basement(space)
886
- furnAreaFraction = 1.0
924
+ furnDensity = mat.rho
925
+ if space == living_space
926
+ furnAreaFraction = furniture_mass.area_fraction
927
+ furnMass = mass_lb_per_sqft
928
+ floor_area = cfa
929
+ elsif Geometry.is_unconditioned_basement(space)
930
+ furnAreaFraction = 0.4
887
931
  furnMass = mass_lb_per_sqft
932
+ floor_area = ubfa
888
933
  elsif Geometry.is_garage(space)
889
934
  furnAreaFraction = 0.1
890
935
  furnMass = 2.0
936
+ floor_area = gfa
891
937
  end
892
938
 
893
939
  next if furnAreaFraction.nil?
@@ -901,7 +947,7 @@ class Constructions
901
947
  furnThickness = UnitConversions.convert(furnMass / (furnDensity * furnAreaFraction), 'ft', 'in')
902
948
 
903
949
  # Define materials
904
- mat_fm = Material.new(name = mat_obj_name_space, thick_in = furnThickness, mat_base = nil, k_in = furnConductivity, rho = furnDensity, cp = furnSpecHeat, tAbs = 0.9, sAbs = furnSolarAbsorptance, vAbs = 0.1)
950
+ mat_fm = Material.new(name: mat_obj_name_space, thick_in: furnThickness, k_in: furnConductivity, rho: furnDensity, cp: furnSpecHeat, tAbs: 0.9, sAbs: furnSolarAbsorptance)
905
951
 
906
952
  # Set paths
907
953
  path_fracs = [1]
@@ -913,23 +959,23 @@ class Constructions
913
959
  imdefs = []
914
960
  if space == living_space
915
961
  # if living space, judge if includes conditioned basement, create furniture independently
916
- living_surface_area = furnAreaFraction * space.floorArea * (1 - basement_frac_of_cfa)
917
- base_surface_area = furnAreaFraction * space.floorArea * basement_frac_of_cfa
962
+ living_surface_area = furnAreaFraction * floor_area * (1 - basement_frac_of_cfa)
963
+ base_surface_area = furnAreaFraction * floor_area * basement_frac_of_cfa
918
964
  # living furniture mass
919
965
  if living_surface_area > 0
920
- living_obj_name = mass_obj_name_space + ' living'
966
+ living_obj_name = mass_obj_name_space + ' above grade'
921
967
  imdef = create_os_int_mass_and_def(model, living_obj_name, space, living_surface_area)
922
968
  imdefs << imdef
923
969
  end
924
970
  # basement furniture mass
925
971
  if base_surface_area > 0
926
- base_obj_name = mass_obj_name_space + ' basement'
972
+ base_obj_name = mass_obj_name_space + ' below grade'
927
973
  imdef = create_os_int_mass_and_def(model, base_obj_name, space, base_surface_area)
928
974
  cond_base_surfaces << imdef
929
975
  imdefs << imdef
930
976
  end
931
977
  else
932
- surface_area = furnAreaFraction * space.floorArea
978
+ surface_area = furnAreaFraction * floor_area
933
979
  imdef = create_os_int_mass_and_def(model, mass_obj_name_space, space, surface_area)
934
980
  imdefs << imdef
935
981
  end
@@ -943,7 +989,7 @@ class Constructions
943
989
  # then the user should input twice the area when defining the Internal Mass object.
944
990
  imdef = OpenStudio::Model::InternalMassDefinition.new(model)
945
991
  imdef.setName(object_name)
946
- imdef.setSurfaceArea(area)
992
+ imdef.setSurfaceArea(UnitConversions.convert(area, 'ft^2', 'm^2'))
947
993
 
948
994
  im = OpenStudio::Model::InternalMass.new(imdef)
949
995
  im.setName(object_name)
@@ -986,37 +1032,172 @@ class Constructions
986
1032
  return map[color]
987
1033
  end
988
1034
 
1035
+ def self.get_default_window_skylight_ufactor_shgc(window_or_skylight, type)
1036
+ if window_or_skylight.glass_layers == HPXML::WindowLayersSinglePane
1037
+ n_panes = 1
1038
+ elsif window_or_skylight.glass_layers == HPXML::WindowLayersDoublePane
1039
+ n_panes = 2
1040
+ elsif window_or_skylight.glass_layers == HPXML::WindowLayersTriplePane
1041
+ n_panes = 3
1042
+ elsif window_or_skylight.glass_layers == HPXML::WindowLayersGlassBlock
1043
+ return [0.6, 0.6] # From https://www.federalregister.gov/documents/2016/06/17/2016-13547/energy-conservation-standards-for-manufactured-housing
1044
+ end
1045
+
1046
+ if [HPXML::WindowFrameTypeAluminum,
1047
+ HPXML::WindowFrameTypeMetal].include? window_or_skylight.frame_type
1048
+ is_metal_frame = true
1049
+ elsif [HPXML::WindowFrameTypeWood,
1050
+ HPXML::WindowFrameTypeVinyl,
1051
+ HPXML::WindowFrameTypeFiberglass].include? window_or_skylight.frame_type
1052
+ is_metal_frame = false
1053
+ else
1054
+ fail "Unexpected #{type.downcase} frame type."
1055
+ end
1056
+
1057
+ if window_or_skylight.glass_type.nil?
1058
+ glass_type = 'clear'
1059
+ elsif [HPXML::WindowGlassTypeTinted,
1060
+ HPXML::WindowGlassTypeTintedReflective].include? window_or_skylight.glass_type
1061
+ glass_type = 'tinted'
1062
+ elsif [HPXML::WindowGlassTypeLowE].include? window_or_skylight.glass_type
1063
+ glass_type = 'low_e'
1064
+ elsif [HPXML::WindowGlassTypeReflective].include? window_or_skylight.glass_type
1065
+ glass_type = 'reflective'
1066
+ else
1067
+ fail "Unexpected #{type.downcase} glass type."
1068
+ end
1069
+
1070
+ if window_or_skylight.glass_layers == HPXML::WindowLayersSinglePane
1071
+ gas_fill = 'none'
1072
+ elsif [HPXML::WindowGasAir].include? window_or_skylight.gas_fill
1073
+ gas_fill = 'air'
1074
+ elsif [HPXML::WindowGasArgon,
1075
+ HPXML::WindowGasKrypton,
1076
+ HPXML::WindowGasXenon,
1077
+ HPXML::WindowGasNitrogen,
1078
+ HPXML::WindowGasOther].include? window_or_skylight.gas_fill
1079
+ gas_fill = 'gas'
1080
+ else
1081
+ fail "Unexpected #{type.downcase} gas type."
1082
+ end
1083
+
1084
+ # Lookup values
1085
+ # From http://hes-documentation.lbl.gov/calculation-methodology/calculation-of-energy-consumption/heating-and-cooling-calculation/building-envelope/window-skylight-construction-types
1086
+ key = [is_metal_frame, window_or_skylight.thermal_break, n_panes, glass_type, gas_fill]
1087
+ if type.downcase == 'window'
1088
+ vals = { [true, false, 1, 'clear', 'none'] => [1.27, 0.75], # Single-pane, clear, aluminum frame
1089
+ [false, nil, 1, 'clear', 'none'] => [0.89, 0.64], # Single-pane, clear, wood or vinyl frame
1090
+ [true, false, 1, 'tinted', 'none'] => [1.27, 0.64], # Single-pane, tinted, aluminum frame
1091
+ [false, nil, 1, 'tinted', 'none'] => [0.89, 0.54], # Single-pane, tinted, wood or vinyl frame
1092
+ [true, false, 2, 'clear', 'air'] => [0.81, 0.67], # Double-pane, clear, aluminum frame
1093
+ [true, true, 2, 'clear', 'air'] => [0.60, 0.67], # Double-pane, clear, aluminum frame w/ thermal break
1094
+ [false, nil, 2, 'clear', 'air'] => [0.51, 0.56], # Double-pane, clear, wood or vinyl frame
1095
+ [true, false, 2, 'tinted', 'air'] => [0.81, 0.55], # Double-pane, tinted, aluminum frame
1096
+ [true, true, 2, 'tinted', 'air'] => [0.60, 0.55], # Double-pane, tinted, aluminum frame w/ thermal break
1097
+ [false, nil, 2, 'tinted', 'air'] => [0.51, 0.46], # Double-pane, tinted, wood or vinyl frame
1098
+ [false, nil, 2, 'low_e', 'air'] => [0.42, 0.52], # Double-pane, insulating low-E, wood or vinyl frame
1099
+ [true, true, 2, 'low_e', 'gas'] => [0.47, 0.62], # Double-pane, insulating low-E, argon gas fill, aluminum frame w/ thermal break
1100
+ [false, nil, 2, 'low_e', 'gas'] => [0.39, 0.52], # Double-pane, insulating low-E, argon gas fill, wood or vinyl frame
1101
+ [true, false, 2, 'reflective', 'air'] => [0.67, 0.37], # Double-pane, solar-control low-E, aluminum frame
1102
+ [true, true, 2, 'reflective', 'air'] => [0.47, 0.37], # Double-pane, solar-control low-E, aluminum frame w/ thermal break
1103
+ [false, nil, 2, 'reflective', 'air'] => [0.39, 0.31], # Double-pane, solar-control low-E, wood or vinyl frame
1104
+ [false, nil, 2, 'reflective', 'gas'] => [0.36, 0.31], # Double-pane, solar-control low-E, argon gas fill, wood or vinyl frame
1105
+ [false, nil, 3, 'low_e', 'gas'] => [0.27, 0.31] }[key] # Triple-pane, insulating low-E, argon gas fill, wood or vinyl frame
1106
+ elsif type.downcase == 'skylight'
1107
+ vals = { [true, false, 1, 'clear', 'none'] => [1.98, 0.75], # Single-pane, clear, aluminum frame
1108
+ [false, nil, 1, 'clear', 'none'] => [1.47, 0.64], # Single-pane, clear, wood or vinyl frame
1109
+ [true, false, 1, 'tinted', 'none'] => [1.98, 0.64], # Single-pane, tinted, aluminum frame
1110
+ [false, nil, 1, 'tinted', 'none'] => [1.47, 0.54], # Single-pane, tinted, wood or vinyl frame
1111
+ [true, false, 2, 'clear', 'air'] => [1.30, 0.67], # Double-pane, clear, aluminum frame
1112
+ [true, true, 2, 'clear', 'air'] => [1.10, 0.67], # Double-pane, clear, aluminum frame w/ thermal break
1113
+ [false, nil, 2, 'clear', 'air'] => [0.84, 0.56], # Double-pane, clear, wood or vinyl frame
1114
+ [true, false, 2, 'tinted', 'air'] => [1.30, 0.55], # Double-pane, tinted, aluminum frame
1115
+ [true, true, 2, 'tinted', 'air'] => [1.10, 0.55], # Double-pane, tinted, aluminum frame w/ thermal break
1116
+ [false, nil, 2, 'tinted', 'air'] => [0.84, 0.46], # Double-pane, tinted, wood or vinyl frame
1117
+ [false, nil, 2, 'low_e', 'air'] => [0.74, 0.52], # Double-pane, insulating low-E, wood or vinyl frame
1118
+ [true, true, 2, 'low_e', 'gas'] => [0.95, 0.62], # Double-pane, insulating low-E, argon gas fill, aluminum frame w/ thermal break
1119
+ [false, nil, 2, 'low_e', 'gas'] => [0.68, 0.52], # Double-pane, insulating low-E, argon gas fill, wood or vinyl frame
1120
+ [true, false, 2, 'reflective', 'air'] => [1.17, 0.37], # Double-pane, solar-control low-E, aluminum frame
1121
+ [true, true, 2, 'reflective', 'air'] => [0.98, 0.37], # Double-pane, solar-control low-E, aluminum frame w/ thermal break
1122
+ [false, nil, 2, 'reflective', 'air'] => [0.71, 0.31], # Double-pane, solar-control low-E, wood or vinyl frame
1123
+ [false, nil, 2, 'reflective', 'gas'] => [0.65, 0.31], # Double-pane, solar-control low-E, argon gas fill, wood or vinyl frame
1124
+ [false, nil, 3, 'low_e', 'gas'] => [0.47, 0.31] }[key] # Triple-pane, insulating low-E, argon gas fill, wood or vinyl frame
1125
+ else
1126
+ fail 'Unexpected type.'
1127
+ end
1128
+ return vals if not vals.nil?
1129
+
1130
+ fail "Could not lookup UFactor and SHGC for #{type.downcase} '#{window_or_skylight.id}'."
1131
+ end
1132
+
989
1133
  private
990
1134
 
991
1135
  def self.get_roof_color_and_solar_absorptance_map
992
- return { [HPXML::ColorDark, HPXML::RoofTypeAsphaltShingles] => 0.92,
993
- [HPXML::ColorMediumDark, HPXML::RoofTypeAsphaltShingles] => 0.89,
994
- [HPXML::ColorMedium, HPXML::RoofTypeAsphaltShingles] => 0.85,
995
- [HPXML::ColorLight, HPXML::RoofTypeAsphaltShingles] => 0.75,
996
- [HPXML::ColorReflective, HPXML::RoofTypeAsphaltShingles] => 0.50,
997
- [HPXML::ColorDark, HPXML::RoofTypeWoodShingles] => 0.92,
998
- [HPXML::ColorMediumDark, HPXML::RoofTypeWoodShingles] => 0.89,
999
- [HPXML::ColorMedium, HPXML::RoofTypeWoodShingles] => 0.85,
1000
- [HPXML::ColorLight, HPXML::RoofTypeWoodShingles] => 0.75,
1001
- [HPXML::ColorReflective, HPXML::RoofTypeWoodShingles] => 0.50,
1002
- [HPXML::ColorDark, HPXML::RoofTypeClayTile] => 0.90,
1003
- [HPXML::ColorMediumDark, HPXML::RoofTypeClayTile] => 0.83,
1004
- [HPXML::ColorMedium, HPXML::RoofTypeClayTile] => 0.75,
1005
- [HPXML::ColorLight, HPXML::RoofTypeClayTile] => 0.60,
1006
- [HPXML::ColorReflective, HPXML::RoofTypeClayTile] => 0.30,
1007
- [HPXML::ColorDark, HPXML::RoofTypeMetal] => 0.90,
1008
- [HPXML::ColorMediumDark, HPXML::RoofTypeMetal] => 0.83,
1009
- [HPXML::ColorMedium, HPXML::RoofTypeMetal] => 0.75,
1010
- [HPXML::ColorLight, HPXML::RoofTypeMetal] => 0.60,
1011
- [HPXML::ColorReflective, HPXML::RoofTypeMetal] => 0.30 }
1136
+ return { # asphalt or fiberglass shingles
1137
+ [HPXML::ColorDark, HPXML::RoofTypeAsphaltShingles] => 0.92,
1138
+ [HPXML::ColorMediumDark, HPXML::RoofTypeAsphaltShingles] => 0.89,
1139
+ [HPXML::ColorMedium, HPXML::RoofTypeAsphaltShingles] => 0.85,
1140
+ [HPXML::ColorLight, HPXML::RoofTypeAsphaltShingles] => 0.75,
1141
+ [HPXML::ColorReflective, HPXML::RoofTypeAsphaltShingles] => 0.50,
1142
+ # wood shingles or shakes
1143
+ [HPXML::ColorDark, HPXML::RoofTypeWoodShingles] => 0.92,
1144
+ [HPXML::ColorMediumDark, HPXML::RoofTypeWoodShingles] => 0.89,
1145
+ [HPXML::ColorMedium, HPXML::RoofTypeWoodShingles] => 0.85,
1146
+ [HPXML::ColorLight, HPXML::RoofTypeWoodShingles] => 0.75,
1147
+ [HPXML::ColorReflective, HPXML::RoofTypeWoodShingles] => 0.50,
1148
+ # shingles
1149
+ [HPXML::ColorDark, HPXML::RoofTypeShingles] => 0.92,
1150
+ [HPXML::ColorMediumDark, HPXML::RoofTypeShingles] => 0.89,
1151
+ [HPXML::ColorMedium, HPXML::RoofTypeShingles] => 0.85,
1152
+ [HPXML::ColorLight, HPXML::RoofTypeShingles] => 0.75,
1153
+ [HPXML::ColorReflective, HPXML::RoofTypeShingles] => 0.50,
1154
+ # slate or tile shingles
1155
+ [HPXML::ColorDark, HPXML::RoofTypeClayTile] => 0.90,
1156
+ [HPXML::ColorMediumDark, HPXML::RoofTypeClayTile] => 0.83,
1157
+ [HPXML::ColorMedium, HPXML::RoofTypeClayTile] => 0.75,
1158
+ [HPXML::ColorLight, HPXML::RoofTypeClayTile] => 0.60,
1159
+ [HPXML::ColorReflective, HPXML::RoofTypeClayTile] => 0.30,
1160
+ # metal surfacing
1161
+ [HPXML::ColorDark, HPXML::RoofTypeMetal] => 0.90,
1162
+ [HPXML::ColorMediumDark, HPXML::RoofTypeMetal] => 0.83,
1163
+ [HPXML::ColorMedium, HPXML::RoofTypeMetal] => 0.75,
1164
+ [HPXML::ColorLight, HPXML::RoofTypeMetal] => 0.60,
1165
+ [HPXML::ColorReflective, HPXML::RoofTypeMetal] => 0.30,
1166
+ # plastic/rubber/synthetic sheeting
1167
+ [HPXML::ColorDark, HPXML::RoofTypePlasticRubber] => 0.90,
1168
+ [HPXML::ColorMediumDark, HPXML::RoofTypePlasticRubber] => 0.83,
1169
+ [HPXML::ColorMedium, HPXML::RoofTypePlasticRubber] => 0.75,
1170
+ [HPXML::ColorLight, HPXML::RoofTypePlasticRubber] => 0.60,
1171
+ [HPXML::ColorReflective, HPXML::RoofTypePlasticRubber] => 0.30,
1172
+ # expanded polystyrene sheathing
1173
+ [HPXML::ColorDark, HPXML::RoofTypeEPS] => 0.92,
1174
+ [HPXML::ColorMediumDark, HPXML::RoofTypeEPS] => 0.89,
1175
+ [HPXML::ColorMedium, HPXML::RoofTypeEPS] => 0.85,
1176
+ [HPXML::ColorLight, HPXML::RoofTypeEPS] => 0.75,
1177
+ [HPXML::ColorReflective, HPXML::RoofTypeEPS] => 0.50,
1178
+ # concrete
1179
+ [HPXML::ColorDark, HPXML::RoofTypeConcrete] => 0.90,
1180
+ [HPXML::ColorMediumDark, HPXML::RoofTypeConcrete] => 0.83,
1181
+ [HPXML::ColorMedium, HPXML::RoofTypeConcrete] => 0.75,
1182
+ [HPXML::ColorLight, HPXML::RoofTypeConcrete] => 0.65,
1183
+ [HPXML::ColorReflective, HPXML::RoofTypeConcrete] => 0.50,
1184
+ # cool roof
1185
+ [HPXML::ColorDark, HPXML::RoofTypeCool] => 0.30,
1186
+ [HPXML::ColorMediumDark, HPXML::RoofTypeCool] => 0.30,
1187
+ [HPXML::ColorMedium, HPXML::RoofTypeCool] => 0.30,
1188
+ [HPXML::ColorLight, HPXML::RoofTypeCool] => 0.30,
1189
+ [HPXML::ColorReflective, HPXML::RoofTypeCool] => 0.30,
1190
+ }
1012
1191
  end
1013
1192
 
1014
1193
  def self.get_wall_color_and_solar_absorptance_map
1015
- return { HPXML::ColorDark => 0.95,
1016
- HPXML::ColorMediumDark => 0.85,
1017
- HPXML::ColorMedium => 0.70,
1018
- HPXML::ColorLight => 0.50,
1019
- HPXML::ColorReflective => 0.30 }
1194
+ return {
1195
+ HPXML::ColorDark => 0.95,
1196
+ HPXML::ColorMediumDark => 0.85,
1197
+ HPXML::ColorMedium => 0.70,
1198
+ HPXML::ColorLight => 0.50,
1199
+ HPXML::ColorReflective => 0.30
1200
+ }
1020
1201
  end
1021
1202
 
1022
1203
  def self.get_gap_factor(install_grade, framing_factor, cavity_r)
@@ -1042,7 +1223,7 @@ class Constructions
1042
1223
 
1043
1224
  # Interior horizontal insulation
1044
1225
  if (int_horiz_r > 0) && (int_horiz_width > 0)
1045
- int_horiz_mat = create_insulation_material(model, 'FoundationIntHorizIns', int_horiz_r)
1226
+ int_horiz_mat = create_insulation_material(model, 'interior horizontal ins', int_horiz_r)
1046
1227
  foundation.setInteriorHorizontalInsulationMaterial(int_horiz_mat)
1047
1228
  foundation.setInteriorHorizontalInsulationDepth(0)
1048
1229
  foundation.setInteriorHorizontalInsulationWidth(UnitConversions.convert(int_horiz_width, 'ft', 'm'))
@@ -1050,14 +1231,14 @@ class Constructions
1050
1231
 
1051
1232
  # Interior vertical insulation
1052
1233
  if int_vert_r > 0
1053
- int_vert_mat = create_insulation_material(model, 'FoundationIntVertIns', int_vert_r)
1234
+ int_vert_mat = create_insulation_material(model, 'interior vertical ins', int_vert_r)
1054
1235
  foundation.setInteriorVerticalInsulationMaterial(int_vert_mat)
1055
1236
  foundation.setInteriorVerticalInsulationDepth(UnitConversions.convert(int_vert_depth, 'ft', 'm'))
1056
1237
  end
1057
1238
 
1058
1239
  # Exterior vertical insulation
1059
1240
  if (ext_vert_r > 0) && (ext_vert_depth > 0)
1060
- ext_vert_mat = create_insulation_material(model, 'FoundationExtVertIns', ext_vert_r)
1241
+ ext_vert_mat = create_insulation_material(model, 'exterior vertical ins', ext_vert_r)
1061
1242
  foundation.setExteriorVerticalInsulationMaterial(ext_vert_mat)
1062
1243
  foundation.setExteriorVerticalInsulationDepth(UnitConversions.convert(ext_vert_depth, 'ft', 'm'))
1063
1244
  end
@@ -1072,14 +1253,14 @@ class Constructions
1072
1253
 
1073
1254
  def self.apply_kiva_walled_foundation(model, ext_vert_r, int_vert_r,
1074
1255
  ext_vert_offset, int_vert_offset, ext_vert_depth, int_vert_depth,
1075
- wall_height_above_grade, wall_concrete_thick_in, wall_drywall_thick_in)
1256
+ wall_height_above_grade, wall_material_thick_in, wall_mat_int_finish)
1076
1257
 
1077
1258
  # Create the Foundation:Kiva object for crawl/basement foundations
1078
1259
  foundation = OpenStudio::Model::FoundationKiva.new(model)
1079
1260
 
1080
1261
  # Interior vertical insulation
1081
1262
  if (int_vert_r > 0) && (int_vert_depth > 0)
1082
- int_vert_mat = create_insulation_material(model, 'FoundationIntVertIns', int_vert_r)
1263
+ int_vert_mat = create_insulation_material(model, 'interior vertical ins', int_vert_r)
1083
1264
  foundation.addCustomBlock(int_vert_mat,
1084
1265
  UnitConversions.convert(int_vert_depth, 'ft', 'm'),
1085
1266
  -int_vert_mat.thickness,
@@ -1088,10 +1269,11 @@ class Constructions
1088
1269
 
1089
1270
  # Exterior vertical insulation
1090
1271
  if (ext_vert_r > 0) && (ext_vert_depth > 0)
1091
- ext_vert_mat = create_insulation_material(model, 'FoundationExtVertIns', ext_vert_r)
1272
+ ext_vert_mat = create_insulation_material(model, 'exterior vertical ins', ext_vert_r)
1273
+ wall_mat_int_finish_thick_in = wall_mat_int_finish.nil? ? 0.0 : wall_mat_int_finish.thick_in
1092
1274
  foundation.addCustomBlock(ext_vert_mat,
1093
1275
  UnitConversions.convert(ext_vert_depth, 'ft', 'm'),
1094
- UnitConversions.convert(wall_concrete_thick_in + wall_drywall_thick_in, 'in', 'm'),
1276
+ UnitConversions.convert(wall_material_thick_in + wall_mat_int_finish_thick_in, 'in', 'm'),
1095
1277
  UnitConversions.convert(ext_vert_offset, 'ft', 'm'))
1096
1278
  end
1097
1279
 
@@ -1156,7 +1338,7 @@ class Constructions
1156
1338
  # by 1.20." Thus we divide by 1.2 to get the vertical position value.
1157
1339
  ufactor /= 1.2
1158
1340
  end
1159
- glaz_mat = GlazingMaterial.new("#{type}Material", ufactor, shgc)
1341
+ glaz_mat = GlazingMaterial.new(name: "#{type}Material", ufactor: ufactor, shgc: shgc)
1160
1342
 
1161
1343
  # Set paths
1162
1344
  path_fracs = [1]
@@ -1234,29 +1416,35 @@ class Constructions
1234
1416
  def self.calc_non_cavity_r(film_r, constr_set)
1235
1417
  # Calculate R-value for all non-cavity layers
1236
1418
  non_cavity_r = film_r
1237
- if not constr_set.exterior_material.nil?
1238
- non_cavity_r += constr_set.exterior_material.rvalue
1419
+ if not constr_set.mat_ext_finish.nil?
1420
+ non_cavity_r += constr_set.mat_ext_finish.rvalue
1239
1421
  end
1240
1422
  if not constr_set.rigid_r.nil?
1241
1423
  non_cavity_r += constr_set.rigid_r
1242
1424
  end
1243
1425
  if not constr_set.osb_thick_in.nil?
1244
- non_cavity_r += Material.Plywood(constr_set.osb_thick_in).rvalue
1426
+ non_cavity_r += Material.OSBSheathing(constr_set.osb_thick_in).rvalue
1245
1427
  end
1246
- if not constr_set.drywall_thick_in.nil?
1247
- non_cavity_r += Material.GypsumWall(constr_set.drywall_thick_in).rvalue
1428
+ if not constr_set.mat_int_finish.nil?
1429
+ non_cavity_r += constr_set.mat_int_finish.rvalue
1248
1430
  end
1249
1431
  return non_cavity_r
1250
1432
  end
1251
1433
 
1252
- def self.apply_wall_construction(runner, model, surfaces, wall, wall_id, wall_type, assembly_r,
1253
- drywall_thick_in, inside_film, outside_film, mat_ext_finish)
1434
+ def self.apply_wall_construction(runner, model, surfaces, wall_id, wall_type, assembly_r,
1435
+ mat_int_finish, inside_film, outside_film, mat_ext_finish,
1436
+ solar_absorptance, emittance)
1254
1437
 
1255
1438
  film_r = inside_film.rvalue + outside_film.rvalue
1256
1439
  if mat_ext_finish.nil?
1257
1440
  fallback_mat_ext_finish = nil
1258
1441
  else
1259
- fallback_mat_ext_finish = Material.ExteriorFinishMaterial(mat_ext_finish.name, mat_ext_finish.tAbs, mat_ext_finish.sAbs, 0.1)
1442
+ fallback_mat_ext_finish = Material.ExteriorFinishMaterial(mat_ext_finish.name, 0.1) # Try thin material
1443
+ end
1444
+ if mat_int_finish.nil?
1445
+ fallback_mat_int_finish = nil
1446
+ else
1447
+ fallback_mat_int_finish = Material.InteriorFinishMaterial(mat_int_finish.name, 0.1) # Try thin material
1260
1448
  end
1261
1449
 
1262
1450
  if wall_type == HPXML::WallTypeWoodStud
@@ -1264,57 +1452,60 @@ class Constructions
1264
1452
  cavity_filled = true
1265
1453
 
1266
1454
  constr_sets = [
1267
- WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 20.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R20
1268
- WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R10
1269
- WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c.
1270
- WoodStudConstructionSet.new(Material.Stud2x4, 0.23, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 16" o.c.
1271
- WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
1455
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 20.0, 0.5, mat_int_finish, mat_ext_finish), # 2x6, 24" o.c. + R20
1456
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 10.0, 0.5, mat_int_finish, mat_ext_finish), # 2x6, 24" o.c. + R10
1457
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.20, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x6, 24" o.c.
1458
+ WoodStudConstructionSet.new(Material.Stud2x4, 0.23, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x4, 16" o.c.
1459
+ WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1272
1460
  ]
1273
1461
  match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1274
1462
 
1275
- apply_wood_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1463
+ apply_wood_stud_wall(runner, model, surfaces, "#{wall_id} construction",
1276
1464
  cavity_r, install_grade, constr_set.stud.thick_in,
1277
1465
  cavity_filled, constr_set.framing_factor,
1278
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
1279
- constr_set.rigid_r, constr_set.exterior_material,
1280
- 0, inside_film, outside_film)
1466
+ constr_set.mat_int_finish, constr_set.osb_thick_in,
1467
+ constr_set.rigid_r, constr_set.mat_ext_finish,
1468
+ inside_film, outside_film, solar_absorptance,
1469
+ emittance)
1281
1470
  elsif wall_type == HPXML::WallTypeSteelStud
1282
1471
  install_grade = 1
1283
1472
  cavity_filled = true
1284
1473
  corr_factor = 0.45
1285
1474
 
1286
1475
  constr_sets = [
1287
- SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R20
1288
- SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 10.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c. + R10
1289
- SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x6, 24" o.c.
1290
- SteelStudConstructionSet.new(3.5, corr_factor, 0.23, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 16" o.c.
1291
- SteelStudConstructionSet.new(3.5, 1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
1476
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 10.0, 0.5, mat_int_finish, mat_ext_finish), # 2x6, 24" o.c. + R20
1477
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 10.0, 0.5, mat_int_finish, mat_ext_finish), # 2x6, 24" o.c. + R10
1478
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.20, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x6, 24" o.c.
1479
+ SteelStudConstructionSet.new(3.5, corr_factor, 0.23, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x4, 16" o.c.
1480
+ SteelStudConstructionSet.new(3.5, 1.0, 0.01, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1292
1481
  ]
1293
1482
  match, constr_set, cavity_r = pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1294
1483
 
1295
- apply_steel_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1484
+ apply_steel_stud_wall(runner, model, surfaces, "#{wall_id} construction",
1296
1485
  cavity_r, install_grade, constr_set.cavity_thick_in,
1297
1486
  cavity_filled, constr_set.framing_factor,
1298
- constr_set.corr_factor, constr_set.drywall_thick_in,
1487
+ constr_set.corr_factor, constr_set.mat_int_finish,
1299
1488
  constr_set.osb_thick_in, constr_set.rigid_r,
1300
- constr_set.exterior_material, inside_film, outside_film)
1489
+ constr_set.mat_ext_finish, inside_film, outside_film,
1490
+ solar_absorptance, emittance)
1301
1491
  elsif wall_type == HPXML::WallTypeDoubleWoodStud
1302
1492
  install_grade = 1
1303
1493
  is_staggered = false
1304
1494
 
1305
1495
  constr_sets = [
1306
- DoubleStudConstructionSet.new(Material.Stud2x4, 0.23, 24.0, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # 2x4, 24" o.c.
1307
- DoubleStudConstructionSet.new(Material.Stud2x4, 0.01, 16.0, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
1496
+ DoubleStudConstructionSet.new(Material.Stud2x4, 0.23, 24.0, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x4, 24" o.c.
1497
+ DoubleStudConstructionSet.new(Material.Stud2x4, 0.01, 16.0, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1308
1498
  ]
1309
1499
  match, constr_set, cavity_r = pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1310
1500
 
1311
- apply_double_stud_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1501
+ apply_double_stud_wall(runner, model, surfaces, "#{wall_id} construction",
1312
1502
  cavity_r, install_grade, constr_set.stud.thick_in,
1313
1503
  constr_set.stud.thick_in, constr_set.framing_factor,
1314
1504
  constr_set.framing_spacing, is_staggered,
1315
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
1316
- constr_set.rigid_r, constr_set.exterior_material,
1317
- inside_film, outside_film)
1505
+ constr_set.mat_int_finish, constr_set.osb_thick_in,
1506
+ constr_set.rigid_r, constr_set.mat_ext_finish,
1507
+ inside_film, outside_film, solar_absorptance,
1508
+ emittance)
1318
1509
  elsif wall_type == HPXML::WallTypeCMU
1319
1510
  density = 119.0 # lb/ft^3
1320
1511
  furring_r = 0
@@ -1322,51 +1513,53 @@ class Constructions
1322
1513
  furring_spacing = 0
1323
1514
 
1324
1515
  constr_sets = [
1325
- CMUConstructionSet.new(8.0, 1.4, 0.08, 0.5, drywall_thick_in, mat_ext_finish), # 8" perlite-filled CMU
1326
- CMUConstructionSet.new(6.0, 5.29, 0.01, 0.0, 0.0, fallback_mat_ext_finish), # Fallback (6" hollow CMU)
1516
+ CMUConstructionSet.new(8.0, 1.4, 0.08, 0.5, mat_int_finish, mat_ext_finish), # 8" perlite-filled CMU
1517
+ CMUConstructionSet.new(6.0, 5.29, 0.01, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback (6" hollow CMU)
1327
1518
  ]
1328
1519
  match, constr_set, rigid_r = pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1329
1520
 
1330
- apply_cmu_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1521
+ apply_cmu_wall(runner, model, surfaces, "#{wall_id} construction",
1331
1522
  constr_set.thick_in, constr_set.cond_in, density,
1332
1523
  constr_set.framing_factor, furring_r,
1333
1524
  furring_cavity_depth_in, furring_spacing,
1334
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
1335
- rigid_r, constr_set.exterior_material, inside_film,
1336
- outside_film)
1525
+ constr_set.mat_int_finish, constr_set.osb_thick_in,
1526
+ rigid_r, constr_set.mat_ext_finish, inside_film,
1527
+ outside_film, solar_absorptance, emittance)
1337
1528
  elsif wall_type == HPXML::WallTypeSIP
1338
1529
  sheathing_thick_in = 0.44
1339
1530
 
1340
1531
  constr_sets = [
1341
- SIPConstructionSet.new(10.0, 0.16, 0.0, sheathing_thick_in, 0.5, drywall_thick_in, mat_ext_finish), # 10" SIP core
1342
- SIPConstructionSet.new(5.0, 0.16, 0.0, sheathing_thick_in, 0.5, drywall_thick_in, mat_ext_finish), # 5" SIP core
1343
- SIPConstructionSet.new(1.0, 0.01, 0.0, sheathing_thick_in, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
1532
+ SIPConstructionSet.new(10.0, 0.16, 0.0, sheathing_thick_in, 0.5, mat_int_finish, mat_ext_finish), # 10" SIP core
1533
+ SIPConstructionSet.new(5.0, 0.16, 0.0, sheathing_thick_in, 0.5, mat_int_finish, mat_ext_finish), # 5" SIP core
1534
+ SIPConstructionSet.new(1.0, 0.01, 0.0, sheathing_thick_in, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1344
1535
  ]
1345
1536
  match, constr_set, cavity_r = pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1346
1537
 
1347
- apply_sip_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1538
+ apply_sip_wall(runner, model, surfaces, "#{wall_id} construction",
1348
1539
  cavity_r, constr_set.thick_in, constr_set.framing_factor,
1349
- constr_set.sheath_thick_in, constr_set.drywall_thick_in,
1540
+ constr_set.sheath_thick_in, constr_set.mat_int_finish,
1350
1541
  constr_set.osb_thick_in, constr_set.rigid_r,
1351
- constr_set.exterior_material, inside_film, outside_film)
1542
+ constr_set.mat_ext_finish, inside_film, outside_film,
1543
+ solar_absorptance, emittance)
1352
1544
  elsif wall_type == HPXML::WallTypeICF
1353
1545
  constr_sets = [
1354
- ICFConstructionSet.new(2.0, 4.0, 0.08, 0.0, 0.5, drywall_thick_in, mat_ext_finish), # ICF w/4" concrete and 2" rigid ins layers
1355
- ICFConstructionSet.new(1.0, 1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
1546
+ ICFConstructionSet.new(2.0, 4.0, 0.08, 0.0, 0.5, mat_int_finish, mat_ext_finish), # ICF w/4" concrete and 2" rigid ins layers
1547
+ ICFConstructionSet.new(1.0, 1.0, 0.01, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1356
1548
  ]
1357
1549
  match, constr_set, icf_r = pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1358
1550
 
1359
- apply_icf_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1551
+ apply_icf_wall(runner, model, surfaces, "#{wall_id} construction",
1360
1552
  icf_r, constr_set.ins_thick_in,
1361
1553
  constr_set.concrete_thick_in, constr_set.framing_factor,
1362
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
1363
- constr_set.rigid_r, constr_set.exterior_material,
1364
- inside_film, outside_film)
1554
+ constr_set.mat_int_finish, constr_set.osb_thick_in,
1555
+ constr_set.rigid_r, constr_set.mat_ext_finish,
1556
+ inside_film, outside_film, solar_absorptance,
1557
+ emittance)
1365
1558
  elsif [HPXML::WallTypeConcrete, HPXML::WallTypeBrick, HPXML::WallTypeAdobe, HPXML::WallTypeStrawBale, HPXML::WallTypeStone, HPXML::WallTypeLog].include? wall_type
1366
1559
  constr_sets = [
1367
- GenericConstructionSet.new(10.0, 0.5, drywall_thick_in, mat_ext_finish), # w/R-10 rigid
1368
- GenericConstructionSet.new(0.0, 0.5, drywall_thick_in, mat_ext_finish), # Standard
1369
- GenericConstructionSet.new(0.0, 0.0, 0.0, fallback_mat_ext_finish), # Fallback
1560
+ GenericConstructionSet.new(10.0, 0.5, mat_int_finish, mat_ext_finish), # w/R-10 rigid
1561
+ GenericConstructionSet.new(0.0, 0.5, mat_int_finish, mat_ext_finish), # Standard
1562
+ GenericConstructionSet.new(0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1370
1563
  ]
1371
1564
  match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1372
1565
 
@@ -1398,11 +1591,12 @@ class Constructions
1398
1591
  denss = [base_mat.rho]
1399
1592
  specheats = [base_mat.cp]
1400
1593
 
1401
- apply_generic_layered_wall(runner, model, surfaces, wall, "#{wall_id} construction",
1594
+ apply_generic_layered_wall(runner, model, surfaces, "#{wall_id} construction",
1402
1595
  thick_ins, conds, denss, specheats,
1403
- constr_set.drywall_thick_in, constr_set.osb_thick_in,
1404
- constr_set.rigid_r, constr_set.exterior_material,
1405
- inside_film, outside_film)
1596
+ constr_set.mat_int_finish, constr_set.osb_thick_in,
1597
+ constr_set.rigid_r, constr_set.mat_ext_finish,
1598
+ inside_film, outside_film, solar_absorptance,
1599
+ emittance)
1406
1600
  else
1407
1601
  fail "Unexpected wall type '#{wall_type}'."
1408
1602
  end
@@ -1424,7 +1618,7 @@ class Constructions
1424
1618
  # Assumes installation quality 1
1425
1619
  cavity_frac = 1.0 - constr_set.framing_factor
1426
1620
  cavity_r = cavity_frac / (1.0 / assembly_r - constr_set.framing_factor / (constr_set.stud.rvalue + non_cavity_r)) - non_cavity_r
1427
- if cavity_r > 0 # Choose this construction set
1621
+ if cavity_r > 0 && cavity_r < Float::INFINITY # Choose this construction set
1428
1622
  return true, constr_set, cavity_r
1429
1623
  end
1430
1624
  end
@@ -1445,7 +1639,7 @@ class Constructions
1445
1639
  # Calculate effective cavity R-value
1446
1640
  # Assumes installation quality 1
1447
1641
  cavity_r = (assembly_r - non_cavity_r) / constr_set.corr_factor
1448
- if cavity_r > 0 # Choose this construction set
1642
+ if cavity_r > 0 && cavity_r < Float::INFINITY # Choose this construction set
1449
1643
  return true, constr_set, cavity_r
1450
1644
  end
1451
1645
  end
@@ -1476,7 +1670,7 @@ class Constructions
1476
1670
  e = misc_framing_factor
1477
1671
  cavity_r = ((3 * c + d) * Math.sqrt(4 * a**2 * b**2 + 12 * a**2 * b * e + 4 * a**2 * b + 9 * a**2 * e**2 - 6 * a**2 * e + a**2 - 48 * a * b * c - 16 * a * b * d - 36 * a * c * e + 12 * a * c - 12 * a * d * e + 4 * a * d + 36 * c**2 + 24 * c * d + 4 * d**2) + 6 * a * b * c + 2 * a * b * d + 3 * a * c * e + 3 * a * c + 3 * a * d * e + a * d - 18 * c**2 - 18 * c * d - 4 * d**2) / (2 * (-3 * a * e + 9 * c + 3 * d))
1478
1672
  cavity_r = 3 * cavity_r
1479
- if cavity_r > 0 # Choose this construction set
1673
+ if cavity_r > 0 && cavity_r < Float::INFINITY # Choose this construction set
1480
1674
  return true, constr_set, cavity_r
1481
1675
  end
1482
1676
  end
@@ -1493,14 +1687,14 @@ class Constructions
1493
1687
 
1494
1688
  film_r = inside_film.rvalue + outside_film.rvalue
1495
1689
  non_cavity_r = calc_non_cavity_r(film_r, constr_set)
1496
- non_cavity_r += Material.new(nil, constr_set.sheath_thick_in, BaseMaterial.Wood).rvalue
1690
+ non_cavity_r += Material.new(thick_in: constr_set.sheath_thick_in, mat_base: BaseMaterial.Wood).rvalue
1497
1691
 
1498
1692
  # Calculate effective SIP core R-value
1499
1693
  # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BD)+%2B+E%2F(2*F%2BG%2FH*x%2BD)+%2B+(1-B-E)%2F(x%2BD)
1500
1694
  spline_thick_in = 0.5 # in
1501
1695
  ins_thick_in = constr_set.thick_in - (2.0 * spline_thick_in) # in
1502
- framing_r = Material.new(nil, constr_set.thick_in, BaseMaterial.Wood).rvalue
1503
- spline_r = Material.new(nil, spline_thick_in, BaseMaterial.Wood).rvalue
1696
+ framing_r = Material.new(thick_in: constr_set.thick_in, mat_base: BaseMaterial.Wood).rvalue
1697
+ spline_r = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.Wood).rvalue
1504
1698
  spline_frac = 4.0 / 48.0 # One 4" spline for every 48" wide panel
1505
1699
  cavity_frac = 1.0 - (spline_frac + constr_set.framing_factor)
1506
1700
  a = assembly_r
@@ -1512,7 +1706,7 @@ class Constructions
1512
1706
  g = ins_thick_in
1513
1707
  h = constr_set.thick_in
1514
1708
  cavity_r = (Math.sqrt((a * b * c * g - a * b * d * h - 2 * a * b * f * h + a * c * e * g - a * c * e * h - a * c * g + a * d * e * g - a * d * e * h - a * d * g + c * d * g + c * d * h + 2 * c * f * h + d**2 * g + d**2 * h + 2 * d * f * h)**2 - 4 * (-a * b * g + c * g + d * g) * (a * b * c * d * h + 2 * a * b * c * f * h - a * c * d * h + 2 * a * c * e * f * h - 2 * a * c * f * h - a * d**2 * h + 2 * a * d * e * f * h - 2 * a * d * f * h + c * d**2 * h + 2 * c * d * f * h + d**3 * h + 2 * d**2 * f * h)) - a * b * c * g + a * b * d * h + 2 * a * b * f * h - a * c * e * g + a * c * e * h + a * c * g - a * d * e * g + a * d * e * h + a * d * g - c * d * g - c * d * h - 2 * c * f * h - g * d**2 - d**2 * h - 2 * d * f * h) / (2 * (-a * b * g + c * g + d * g))
1515
- if cavity_r > 0 # Choose this construction set
1709
+ if cavity_r > 0 && cavity_r < Float::INFINITY # Choose this construction set
1516
1710
  return true, constr_set, cavity_r
1517
1711
  end
1518
1712
  end
@@ -1535,11 +1729,11 @@ class Constructions
1535
1729
  # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BE%2Bx)+%2B+(1-B)%2F(D%2BE%2Bx)
1536
1730
  a = assembly_r
1537
1731
  b = constr_set.framing_factor
1538
- c = Material.new(nil, constr_set.thick_in, BaseMaterial.Wood).rvalue # Framing
1539
- d = Material.new(nil, constr_set.thick_in, BaseMaterial.Concrete, constr_set.cond_in).rvalue # Concrete
1732
+ c = Material.new(thick_in: constr_set.thick_in, mat_base: BaseMaterial.Wood).rvalue # Framing
1733
+ d = Material.new(thick_in: constr_set.thick_in, mat_base: BaseMaterial.Concrete, k_in: constr_set.cond_in).rvalue # Concrete
1540
1734
  e = non_cavity_r
1541
1735
  rigid_r = 0.5 * (Math.sqrt(a**2 - 4 * a * b * c + 4 * a * b * d + 2 * a * c - 2 * a * d + c**2 - 2 * c * d + d**2) + a - c - d - 2 * e)
1542
- if rigid_r > 0 # Choose this construction set
1736
+ if rigid_r > 0 && rigid_r < Float::INFINITY # Choose this construction set
1543
1737
  return true, constr_set, rigid_r
1544
1738
  end
1545
1739
  end
@@ -1561,11 +1755,11 @@ class Constructions
1561
1755
  # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(C%2BE)+%2B+(1-B)%2F(D%2BE%2B2*x)
1562
1756
  a = assembly_r
1563
1757
  b = constr_set.framing_factor
1564
- c = Material.new(nil, 2 * constr_set.ins_thick_in + constr_set.concrete_thick_in, BaseMaterial.Wood).rvalue # Framing
1565
- d = Material.new(nil, constr_set.concrete_thick_in, BaseMaterial.Concrete).rvalue # Concrete
1758
+ c = Material.new(thick_in: 2 * constr_set.ins_thick_in + constr_set.concrete_thick_in, mat_base: BaseMaterial.Wood).rvalue # Framing
1759
+ d = Material.new(thick_in: constr_set.concrete_thick_in, mat_base: BaseMaterial.Concrete).rvalue # Concrete
1566
1760
  e = non_cavity_r
1567
1761
  icf_r = (a * b * c - a * b * d - a * c - a * e + c * d + c * e + d * e + e**2) / (2 * (a * b - c - e))
1568
- if icf_r > 0 # Choose this construction set
1762
+ if icf_r > 0 && icf_r < Float::INFINITY # Choose this construction set
1569
1763
  return true, constr_set, icf_r
1570
1764
  end
1571
1765
  end
@@ -1585,7 +1779,7 @@ class Constructions
1585
1779
 
1586
1780
  # Calculate effective ins layer R-value
1587
1781
  layer_r = assembly_r - non_cavity_r
1588
- if layer_r > 0 # Choose this construction set
1782
+ if layer_r > 0 && layer_r < Float::INFINITY # Choose this construction set
1589
1783
  return true, constr_set, layer_r
1590
1784
  end
1591
1785
  end
@@ -1713,13 +1907,29 @@ class Construction
1713
1907
  end
1714
1908
  end
1715
1909
 
1910
+ def set_exterior_material_properties(solar_absorptance = 0.75, emittance = 0.9)
1911
+ @layers_materials[1].each do |exterior_material|
1912
+ exterior_material.sAbs = solar_absorptance
1913
+ exterior_material.tAbs = emittance
1914
+ end
1915
+ end
1916
+
1917
+ def set_interior_material_properties(solar_absorptance = 0.6, emittance = 0.9, debug: false)
1918
+ if @layers_materials.size > 3 # Only apply if there is a separate interior material
1919
+ @layers_materials[-2].each do |interior_material|
1920
+ interior_material.sAbs = solar_absorptance
1921
+ interior_material.tAbs = emittance
1922
+ end
1923
+ end
1924
+ end
1925
+
1716
1926
  private
1717
1927
 
1718
1928
  def get_parallel_material(curr_layer_num, name)
1719
1929
  # Returns a Material object with effective properties for the specified
1720
1930
  # parallel path layer of the construction.
1721
1931
 
1722
- mat = Material.new(name)
1932
+ mat = Material.new(name: name)
1723
1933
 
1724
1934
  curr_layer_materials = @layers_materials[curr_layer_num]
1725
1935
 
@@ -1767,6 +1977,12 @@ class Construction
1767
1977
  mat.cp += (curr_layer_materials[path_num].cp * curr_layer_materials[path_num].rho * path_frac) / mat.rho
1768
1978
  end
1769
1979
 
1980
+ # Material solar absorptance
1981
+ mat.sAbs = curr_layer_materials[0].sAbs # All paths have equal solar absorptance
1982
+
1983
+ # Material thermal absorptance
1984
+ mat.tAbs = curr_layer_materials[0].tAbs # All paths have equal thermal absorptance
1985
+
1770
1986
  return mat
1771
1987
  end
1772
1988
 
@@ -1822,8 +2038,8 @@ class Construction
1822
2038
  # Check for valid object types
1823
2039
  @layers_materials.each do |layer_materials|
1824
2040
  layer_materials.each do |mat|
1825
- if (not mat.is_a? SimpleMaterial) && (not mat.is_a? Material)
1826
- fail 'Invalid construction: Materials must be instances of SimpleMaterial or Material classes.'
2041
+ if (not mat.is_a? Material)
2042
+ fail 'Invalid construction: Materials must be instances of Material classes.'
1827
2043
  end
1828
2044
  end
1829
2045
  end
@@ -1835,17 +2051,29 @@ class Construction
1835
2051
  end
1836
2052
  end
1837
2053
 
1838
- # Check if multiple materials in a given layer have differing thicknesses
2054
+ # Check if multiple materials in a given layer have differing thicknesses/absorptances
1839
2055
  @layers_materials.each do |layer_materials|
1840
2056
  next unless layer_materials.size > 1
1841
2057
 
1842
2058
  thick_in = nil
2059
+ solar_abs = nil
2060
+ emitt = nil
1843
2061
  layer_materials.each do |mat|
1844
2062
  if thick_in.nil?
1845
2063
  thick_in = mat.thick_in
1846
2064
  elsif thick_in != mat.thick_in
1847
2065
  fail 'Invalid construction: Materials in a layer have different thicknesses.'
1848
2066
  end
2067
+ if solar_abs.nil?
2068
+ solar_abs = mat.sAbs
2069
+ elsif solar_abs != mat.sAbs
2070
+ fail 'Invalid construction: Materials in a layer have different solar absorptances.'
2071
+ end
2072
+ if emitt.nil?
2073
+ emitt = mat.tAbs
2074
+ elsif emitt != mat.tAbs
2075
+ fail 'Invalid construction: Materials in a layer have different thermal absorptances.'
2076
+ end
1849
2077
  end
1850
2078
  end
1851
2079
 
@@ -1868,20 +2096,7 @@ class Construction
1868
2096
  def self.create_os_material(runner, model, material)
1869
2097
  name = material.name
1870
2098
  tolerance = 0.0001
1871
- if material.is_a? SimpleMaterial
1872
- # Material already exists?
1873
- model.getMasslessOpaqueMaterials.each do |mat|
1874
- next if mat.roughness.downcase.to_s != 'rough'
1875
- next if (mat.thermalResistance - UnitConversions.convert(material.rvalue, 'hr*ft^2*F/Btu', 'm^2*K/W')).abs > tolerance
1876
-
1877
- return mat
1878
- end
1879
- # New material
1880
- mat = OpenStudio::Model::MasslessOpaqueMaterial.new(model)
1881
- mat.setName(name)
1882
- mat.setRoughness('Rough')
1883
- mat.setThermalResistance(UnitConversions.convert(material.rvalue, 'hr*ft^2*F/Btu', 'm^2*K/W'))
1884
- elsif material.is_a? GlazingMaterial
2099
+ if material.is_a? GlazingMaterial
1885
2100
  max_ufactor = UnitConversions.convert(7.0, 'W/(m^2*K)', 'Btu/(hr*ft^2*F)') # Max value EnergyPlus allows
1886
2101
  if material.ufactor > max_ufactor
1887
2102
  runner.registerWarning("Glazing U-factor (#{material.ufactor}) for '#{material.name}' above maximum expected value. U-factor decreased to #{max_ufactor.round(2)}.")
@@ -1890,11 +2105,13 @@ class Construction
1890
2105
 
1891
2106
  # Material already exists?
1892
2107
  model.getSimpleGlazings.each do |mat|
2108
+ next if !mat.name.to_s.start_with?(material.name)
1893
2109
  next if (mat.uFactor - UnitConversions.convert(material.ufactor, 'Btu/(hr*ft^2*F)', 'W/(m^2*K)')).abs > tolerance
1894
2110
  next if (mat.solarHeatGainCoefficient - material.shgc).abs > tolerance
1895
2111
 
1896
2112
  return mat
1897
2113
  end
2114
+
1898
2115
  # New material
1899
2116
  mat = OpenStudio::Model::SimpleGlazing.new(model)
1900
2117
  mat.setName(name)
@@ -1903,17 +2120,18 @@ class Construction
1903
2120
  else
1904
2121
  # Material already exists?
1905
2122
  model.getStandardOpaqueMaterials.each do |mat|
2123
+ next if !mat.name.to_s.start_with?(material.name)
1906
2124
  next if mat.roughness.downcase.to_s != 'rough'
1907
2125
  next if (mat.thickness - UnitConversions.convert(material.thick_in, 'in', 'm')).abs > tolerance
1908
2126
  next if (mat.conductivity - UnitConversions.convert(material.k, 'Btu/(hr*ft*R)', 'W/(m*K)')).abs > tolerance
1909
2127
  next if (mat.density - UnitConversions.convert(material.rho, 'lbm/ft^3', 'kg/m^3')).abs > tolerance
1910
2128
  next if (mat.specificHeat - UnitConversions.convert(material.cp, 'Btu/(lbm*R)', 'J/(kg*K)')).abs > tolerance
1911
- next if (not material.tAbs.nil?) && ((mat.thermalAbsorptance - material.tAbs).abs > tolerance)
1912
- next if (not material.sAbs.nil?) && ((mat.solarAbsorptance - material.sAbs).abs > tolerance)
1913
- next if (not material.vAbs.nil?) && ((mat.visibleAbsorptance - material.vAbs).abs > tolerance)
2129
+ next if (mat.thermalAbsorptance - material.tAbs.to_f).abs > tolerance
2130
+ next if (mat.solarAbsorptance - material.sAbs.to_f).abs > tolerance
1914
2131
 
1915
2132
  return mat
1916
2133
  end
2134
+
1917
2135
  # New material
1918
2136
  mat = OpenStudio::Model::StandardOpaqueMaterial.new(model)
1919
2137
  mat.setName(name)
@@ -1927,9 +2145,7 @@ class Construction
1927
2145
  end
1928
2146
  if not material.sAbs.nil?
1929
2147
  mat.setSolarAbsorptance(material.sAbs)
1930
- end
1931
- if not material.vAbs.nil?
1932
- mat.setVisibleAbsorptance(material.vAbs)
2148
+ mat.setVisibleAbsorptance(material.sAbs)
1933
2149
  end
1934
2150
  end
1935
2151
  return mat
@@ -1937,88 +2153,88 @@ class Construction
1937
2153
  end
1938
2154
 
1939
2155
  class WoodStudConstructionSet
1940
- def initialize(stud, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
2156
+ def initialize(stud, framing_factor, rigid_r, osb_thick_in, mat_int_finish, mat_ext_finish)
1941
2157
  @stud = stud
1942
2158
  @framing_factor = framing_factor
1943
2159
  @rigid_r = rigid_r
1944
2160
  @osb_thick_in = osb_thick_in
1945
- @drywall_thick_in = drywall_thick_in
1946
- @exterior_material = exterior_material
2161
+ @mat_int_finish = mat_int_finish
2162
+ @mat_ext_finish = mat_ext_finish
1947
2163
  end
1948
- attr_accessor(:stud, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
2164
+ attr_accessor(:stud, :framing_factor, :rigid_r, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
1949
2165
  end
1950
2166
 
1951
2167
  class SteelStudConstructionSet
1952
- def initialize(cavity_thick_in, corr_factor, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
2168
+ def initialize(cavity_thick_in, corr_factor, framing_factor, rigid_r, osb_thick_in, mat_int_finish, mat_ext_finish)
1953
2169
  @cavity_thick_in = cavity_thick_in
1954
2170
  @corr_factor = corr_factor
1955
2171
  @framing_factor = framing_factor
1956
2172
  @rigid_r = rigid_r
1957
2173
  @osb_thick_in = osb_thick_in
1958
- @drywall_thick_in = drywall_thick_in
1959
- @exterior_material = exterior_material
2174
+ @mat_int_finish = mat_int_finish
2175
+ @mat_ext_finish = mat_ext_finish
1960
2176
  end
1961
- attr_accessor(:cavity_thick_in, :corr_factor, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
2177
+ attr_accessor(:cavity_thick_in, :corr_factor, :framing_factor, :rigid_r, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
1962
2178
  end
1963
2179
 
1964
2180
  class DoubleStudConstructionSet
1965
- def initialize(stud, framing_factor, framing_spacing, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
2181
+ def initialize(stud, framing_factor, framing_spacing, rigid_r, osb_thick_in, mat_int_finish, mat_ext_finish)
1966
2182
  @stud = stud
1967
2183
  @framing_factor = framing_factor
1968
2184
  @framing_spacing = framing_spacing
1969
2185
  @rigid_r = rigid_r
1970
2186
  @osb_thick_in = osb_thick_in
1971
- @drywall_thick_in = drywall_thick_in
1972
- @exterior_material = exterior_material
2187
+ @mat_int_finish = mat_int_finish
2188
+ @mat_ext_finish = mat_ext_finish
1973
2189
  end
1974
- attr_accessor(:stud, :framing_factor, :framing_spacing, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
2190
+ attr_accessor(:stud, :framing_factor, :framing_spacing, :rigid_r, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
1975
2191
  end
1976
2192
 
1977
2193
  class SIPConstructionSet
1978
- def initialize(thick_in, framing_factor, rigid_r, sheath_thick_in, osb_thick_in, drywall_thick_in, exterior_material)
2194
+ def initialize(thick_in, framing_factor, rigid_r, sheath_thick_in, osb_thick_in, mat_int_finish, mat_ext_finish)
1979
2195
  @thick_in = thick_in
1980
2196
  @framing_factor = framing_factor
1981
2197
  @rigid_r = rigid_r
1982
2198
  @sheath_thick_in = sheath_thick_in
1983
2199
  @osb_thick_in = osb_thick_in
1984
- @drywall_thick_in = drywall_thick_in
1985
- @exterior_material = exterior_material
2200
+ @mat_int_finish = mat_int_finish
2201
+ @mat_ext_finish = mat_ext_finish
1986
2202
  end
1987
- attr_accessor(:thick_in, :framing_factor, :rigid_r, :sheath_thick_in, :osb_thick_in, :drywall_thick_in, :exterior_material)
2203
+ attr_accessor(:thick_in, :framing_factor, :rigid_r, :sheath_thick_in, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
1988
2204
  end
1989
2205
 
1990
2206
  class CMUConstructionSet
1991
- def initialize(thick_in, cond_in, framing_factor, osb_thick_in, drywall_thick_in, exterior_material)
2207
+ def initialize(thick_in, cond_in, framing_factor, osb_thick_in, mat_int_finish, mat_ext_finish)
1992
2208
  @thick_in = thick_in
1993
2209
  @cond_in = cond_in
1994
2210
  @framing_factor = framing_factor
1995
2211
  @osb_thick_in = osb_thick_in
1996
- @drywall_thick_in = drywall_thick_in
1997
- @exterior_material = exterior_material
2212
+ @mat_int_finish = mat_int_finish
2213
+ @mat_ext_finish = mat_ext_finish
1998
2214
  @rigid_r = nil # solved for
1999
2215
  end
2000
- attr_accessor(:thick_in, :cond_in, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
2216
+ attr_accessor(:thick_in, :cond_in, :framing_factor, :rigid_r, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
2001
2217
  end
2002
2218
 
2003
2219
  class ICFConstructionSet
2004
- def initialize(ins_thick_in, concrete_thick_in, framing_factor, rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
2220
+ def initialize(ins_thick_in, concrete_thick_in, framing_factor, rigid_r, osb_thick_in, mat_int_finish, mat_ext_finish)
2005
2221
  @ins_thick_in = ins_thick_in
2006
2222
  @concrete_thick_in = concrete_thick_in
2007
2223
  @framing_factor = framing_factor
2008
2224
  @rigid_r = rigid_r
2009
2225
  @osb_thick_in = osb_thick_in
2010
- @drywall_thick_in = drywall_thick_in
2011
- @exterior_material = exterior_material
2226
+ @mat_int_finish = mat_int_finish
2227
+ @mat_ext_finish = mat_ext_finish
2012
2228
  end
2013
- attr_accessor(:ins_thick_in, :concrete_thick_in, :framing_factor, :rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
2229
+ attr_accessor(:ins_thick_in, :concrete_thick_in, :framing_factor, :rigid_r, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
2014
2230
  end
2015
2231
 
2016
2232
  class GenericConstructionSet
2017
- def initialize(rigid_r, osb_thick_in, drywall_thick_in, exterior_material)
2233
+ def initialize(rigid_r, osb_thick_in, mat_int_finish, mat_ext_finish)
2018
2234
  @rigid_r = rigid_r
2019
2235
  @osb_thick_in = osb_thick_in
2020
- @drywall_thick_in = drywall_thick_in
2021
- @exterior_material = exterior_material
2236
+ @mat_int_finish = mat_int_finish
2237
+ @mat_ext_finish = mat_ext_finish
2022
2238
  end
2023
- attr_accessor(:rigid_r, :osb_thick_in, :drywall_thick_in, :exterior_material)
2239
+ attr_accessor(:rigid_r, :osb_thick_in, :mat_int_finish, :mat_ext_finish)
2024
2240
  end