urbanopt-cli 0.10.0 → 0.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (712) hide show
  1. checksums.yaml +4 -4
  2. data/.github/release.yml +24 -0
  3. data/.github/workflows/nightly_ci_build.yml +39 -29
  4. data/.gitignore +1 -0
  5. data/CHANGELOG.md +17 -0
  6. data/CMakeLists.txt +7 -7
  7. data/FindOpenStudioSDK.cmake +8 -8
  8. data/LICENSE.md +8 -35
  9. data/README.md +25 -10
  10. data/example_files/Gemfile +9 -9
  11. data/example_files/example_project_combined.json +6 -2
  12. data/example_files/example_project_with_ghe.json +859 -0
  13. data/example_files/mappers/Baseline.rb +39 -415
  14. data/example_files/mappers/ChilledWaterStorage.rb +1 -1
  15. data/example_files/mappers/CreateBar.rb +1 -1
  16. data/example_files/mappers/EvCharging.rb +1 -1
  17. data/example_files/mappers/FlexibleHotWater.rb +1 -1
  18. data/example_files/mappers/Floorspace.rb +1 -1
  19. data/example_files/mappers/HighEfficiency.rb +1 -1
  20. data/example_files/mappers/HighEfficiencyCreateBar.rb +1 -1
  21. data/example_files/mappers/HighEfficiencyFloorspace.rb +1 -1
  22. data/example_files/mappers/PeakHoursMelsShedding.rb +1 -1
  23. data/example_files/mappers/PeakHoursThermostatAdjust.rb +1 -1
  24. data/example_files/mappers/ThermalStorage.rb +1 -1
  25. data/example_files/mappers/base_workflow.osw +11 -4
  26. data/example_files/mappers/residential/template/util.rb +138 -0
  27. data/example_files/mappers/residential/util.rb +276 -0
  28. data/example_files/measures/BuildResidentialModel/measure.rb +118 -230
  29. data/example_files/measures/BuildResidentialModel/measure.xml +344 -233
  30. data/example_files/measures/BuildResidentialModel/resources/geometry.rb +7 -2
  31. data/example_files/measures/BuildResidentialModel/resources/unit_conversions.rb +5 -0
  32. data/example_files/measures/BuildResidentialModel/resources/util.rb +5 -0
  33. data/example_files/measures/BuildResidentialModel/tests/test_build_residential_model.rb +344 -0
  34. data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature1.xml +2112 -0
  35. data/example_files/measures/BuildResidentialModel/tests/xml_building/17/feature2.xml +2112 -0
  36. data/example_files/osm_building/7.osm +0 -2
  37. data/example_files/osm_building/8.osm +0 -2
  38. data/example_files/osm_building/9.osm +0 -2
  39. data/example_files/python_deps/dependencies.json +4 -3
  40. data/example_files/resources/hpxml-measures/.gitattributes +3 -0
  41. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +2 -2
  42. data/example_files/resources/hpxml-measures/.github/workflows/add_to_project.yml +17 -0
  43. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +37 -8
  44. data/example_files/resources/hpxml-measures/.gitignore +1 -0
  45. data/example_files/resources/hpxml-measures/.readthedocs.yml +6 -2
  46. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md +5596 -0
  47. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/README.md.erb +41 -0
  48. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1324 -1035
  49. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +325 -236
  50. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +119 -152
  51. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/{build_residential_hpxml_test.rb → test_build_residential_hpxml.rb} +225 -107
  52. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md +96 -0
  53. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/README.md.erb +41 -0
  54. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +73 -31
  55. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +60 -40
  56. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/README.md +48 -23
  57. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/constants.rb +5 -0
  58. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +6 -12
  59. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/{build_residential_schedule_file_test.rb → test_build_residential_schedule_file.rb} +162 -35
  60. data/example_files/resources/hpxml-measures/Changelog.md +57 -1
  61. data/example_files/resources/hpxml-measures/Gemfile +1 -1
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md +83 -0
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/README.md.erb +41 -0
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +1081 -878
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +258 -204
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +205 -178
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +43 -18
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +37 -112
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +34 -73
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/Xing_okstate_0664D_13659_Table_A-3.csv +4165 -0
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/unavailable_periods.csv +2 -2
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +5 -1
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/generator.rb +13 -7
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +95 -42
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +132 -108
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +1695 -1267
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +668 -589
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +304 -553
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +197 -112
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +1140 -1745
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +412 -325
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +56 -48
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +49 -38
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +5 -0
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -1
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/minitest_helper.rb +5 -0
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +94 -78
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +60 -2
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +6 -1
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/pv.rb +11 -5
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-non-stochastic.csv +1 -1
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic-30-mins.csv +52561 -0
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_2.csv +8761 -0
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_3.csv +8761 -0
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_4.csv +8761 -0
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_5.csv +8761 -0
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/occupancy-stochastic_6.csv +8761 -0
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +129 -137
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +12 -21
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/unit_conversions.rb +5 -0
  101. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/util.rb +7 -2
  102. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +6 -1
  103. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +7 -2
  104. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +179 -144
  105. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +129 -71
  106. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +5 -0
  107. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +23 -6
  108. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +129 -118
  109. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +25 -20
  110. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +2282 -2239
  111. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +395 -204
  112. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +12 -7
  113. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +56 -51
  114. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +369 -230
  115. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +371 -191
  116. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +27 -20
  117. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +55 -5
  118. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +35 -30
  119. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +13 -8
  120. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +107 -93
  121. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +11 -6
  122. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +757 -573
  123. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +77 -72
  124. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +36 -6
  125. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/util.rb +5 -0
  126. data/example_files/resources/hpxml-measures/README.md +2 -0
  127. data/example_files/resources/hpxml-measures/Rakefile +10 -3
  128. data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md +787 -0
  129. data/example_files/resources/hpxml-measures/ReportSimulationOutput/README.md.erb +41 -0
  130. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +730 -418
  131. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +1215 -9
  132. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/{output_report_test.rb → test_report_sim_output.rb} +130 -299
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md +87 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/README.md.erb +41 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +261 -89
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +179 -94
  137. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/Average_retail_price_of_electricity.csv +68 -68
  138. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +3 -2
  139. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +713 -685
  140. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +716 -688
  141. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/simple_rates/README.md +5 -2
  142. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +18 -9
  143. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/test_report_utility_bills.rb +1308 -0
  144. data/example_files/resources/hpxml-measures/docs/requirements.txt +5 -0
  145. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -2
  146. data/example_files/resources/hpxml-measures/docs/source/intro.rst +3 -20
  147. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +1 -1
  148. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +917 -564
  149. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +79 -42
  150. data/example_files/resources/hpxml-measures/tasks.rb +2305 -2055
  151. data/example_files/resources/hpxml-measures/workflow/hpxml_inputs.json +270 -587
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +559 -557
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +522 -520
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +534 -532
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +547 -545
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +546 -544
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +603 -623
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +613 -633
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +699 -721
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +662 -661
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +657 -677
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +470 -467
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +441 -438
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +468 -465
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +469 -466
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +468 -465
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +717 -714
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +647 -645
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +569 -566
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +602 -599
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +630 -627
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +776 -774
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +670 -667
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +632 -629
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +731 -729
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +672 -669
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +667 -644
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +646 -644
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +690 -688
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +701 -699
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +637 -615
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +690 -688
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +557 -554
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +534 -531
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +636 -635
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +616 -613
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +601 -598
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +581 -578
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +624 -622
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +584 -582
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +631 -629
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +922 -921
  193. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +855 -853
  194. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +739 -737
  195. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +798 -796
  196. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +696 -694
  197. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +487 -483
  198. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +443 -440
  199. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +688 -686
  200. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +722 -720
  201. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +619 -617
  202. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +13 -20
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +9 -9
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +11 -12
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +11 -12
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +12 -13
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +11 -12
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +9 -9
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +9 -9
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +4 -4
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +9 -9
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +9 -9
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +9 -9
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +11 -11
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +10 -10
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +9 -9
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +10 -11
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +9 -9
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +8 -8
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +571 -569
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +9 -9
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml → base-bldgtype-mf-unit-adjacent-to-multifamily-buffer-space.xml} +5 -5
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-multiple.xml → base-bldgtype-mf-unit-adjacent-to-multiple.xml} +17 -17
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml → base-bldgtype-mf-unit-adjacent-to-non-freezing-space.xml} +5 -5
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-heated-space.xml → base-bldgtype-mf-unit-adjacent-to-other-heated-space.xml} +5 -5
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml → base-bldgtype-mf-unit-adjacent-to-other-housing-unit.xml} +5 -5
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-infil-compartmentalization-test.xml → base-bldgtype-mf-unit-infil-compartmentalization-test.xml} +461 -461
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-residents-1.xml → base-bldgtype-mf-unit-residents-1.xml} +453 -453
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-chiller-baseboard.xml} +11 -11
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil-ducted.xml} +11 -11
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-chiller-fan-coil.xml} +11 -11
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-chiller-water-loop-heat-pump.xml} +11 -11
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-cooling-tower-water-loop-heat-pump.xml} +11 -11
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-baseboard.xml → base-bldgtype-mf-unit-shared-boiler-only-baseboard.xml} +11 -11
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-ducted.xml} +11 -11
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil-eae.xml} +11 -11
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-mf-unit-shared-boiler-only-fan-coil-fireplace-elec.xml +433 -0
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml → base-bldgtype-mf-unit-shared-boiler-only-fan-coil.xml} +11 -11
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-boiler-only-water-loop-heat-pump.xml} +11 -11
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-baseboard.xml → base-bldgtype-mf-unit-shared-chiller-only-baseboard.xml} +11 -11
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil-ducted.xml} +11 -11
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml → base-bldgtype-mf-unit-shared-chiller-only-fan-coil.xml} +11 -11
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-chiller-only-water-loop-heat-pump.xml} +11 -11
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml → base-bldgtype-mf-unit-shared-cooling-tower-only-water-loop-heat-pump.xml} +11 -11
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-generator.xml → base-bldgtype-mf-unit-shared-generator.xml} +13 -13
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml → base-bldgtype-mf-unit-shared-ground-loop-ground-to-air-heat-pump.xml} +13 -13
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml → base-bldgtype-mf-unit-shared-laundry-room-multiple-water-heaters.xml} +480 -480
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-laundry-room.xml → base-bldgtype-mf-unit-shared-laundry-room.xml} +10 -10
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-multiple.xml → base-bldgtype-mf-unit-shared-mechvent-multiple.xml} +15 -15
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent-preconditioning.xml → base-bldgtype-mf-unit-shared-mechvent-preconditioning.xml} +13 -13
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-mechvent.xml → base-bldgtype-mf-unit-shared-mechvent.xml} +13 -13
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-pv.xml → base-bldgtype-mf-unit-shared-pv.xml} +13 -13
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater-recirc.xml → base-bldgtype-mf-unit-shared-water-heater-recirc.xml} +13 -13
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily-shared-water-heater.xml → base-bldgtype-mf-unit-shared-water-heater.xml} +13 -13
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-multifamily.xml → base-bldgtype-mf-unit.xml} +13 -13
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-2stories.xml → base-bldgtype-sfa-unit-2stories.xml} +610 -610
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-atticroof-cathedral.xml → base-bldgtype-sfa-unit-atticroof-cathedral.xml} +558 -558
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached-infil-compartmentalization-test.xml → base-bldgtype-sfa-unit-infil-compartmentalization-test.xml} +610 -610
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-bldgtype-attached.xml → base-bldgtype-sfa-unit.xml} +610 -610
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +8 -8
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +9 -9
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +9 -9
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +9 -9
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +9 -9
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +9 -9
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +9 -9
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +9 -9
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +9 -9
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +507 -505
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +9 -9
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +8 -8
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +9 -9
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +9 -9
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +9 -9
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +9 -9
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +9 -9
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +9 -9
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +9 -9
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +12 -10
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +14 -14
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +5 -5
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +9 -9
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +9 -9
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +9 -9
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +9 -9
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +9 -9
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +9 -9
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +9 -9
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +9 -9
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +9 -9
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +9 -9
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +9 -9
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +9 -9
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +12 -10
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +9 -9
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +8 -8
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +9 -9
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +9 -9
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +9 -9
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +13 -11
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +9 -9
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +8 -8
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +9 -9
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +9 -9
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +9 -9
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +9 -9
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +12 -10
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +9 -9
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +9 -9
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +9 -9
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +12 -10
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +8 -8
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +9 -9
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +9 -9
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +9 -9
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +9 -9
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +9 -9
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +9 -9
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +9 -9
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +13 -14
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +11 -11
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +9 -9
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +9 -9
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +9 -9
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +9 -9
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +576 -576
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +519 -519
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +4 -5
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +9 -9
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +9 -9
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +9 -9
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ela.xml +548 -548
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +9 -9
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +9 -9
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-cfm.xml +551 -551
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +9 -9
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +9 -9
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +9 -9
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +9 -9
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +9 -9
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +9 -9
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +9 -9
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +10 -11
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +9 -9
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -19
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +555 -553
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +9 -9
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +9 -9
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading-seasons.xml +560 -558
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +9 -9
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +9 -9
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +10 -10
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +10 -11
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-no-skirt.xml +496 -0
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-belly-wing-skirt.xml +496 -0
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -18
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-unavailable.xml → base-foundation-conditioned-basement-slab-insulation-full.xml} +552 -564
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +9 -9
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-wall-insulation.xml +555 -555
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +8 -8
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +5 -5
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +10 -11
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +4 -4
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +4 -4
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +4 -4
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +4 -4
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +9 -9
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace-above-grade.xml +558 -0
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +9 -9
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +15 -15
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +9 -9
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-capacity-17f.xml +552 -552
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +9 -9
  374. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +562 -562
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +557 -557
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +9 -9
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +9 -9
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-hvac-seasons.xml +586 -586
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +9 -9
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +9 -9
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +9 -9
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance-other-temperatures.xml} +89 -13
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml → base-hvac-air-to-air-heat-pump-var-speed-detailed-performance.xml} +107 -13
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +9 -9
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-sizing-controls.xml +567 -565
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +9 -9
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +9 -9
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +9 -9
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +9 -9
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only-pilot.xml +512 -512
  391. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +9 -9
  392. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +9 -9
  393. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +9 -9
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +9 -9
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +536 -536
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +9 -9
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +9 -9
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-central-ac-only-var-speed.xml → base-hvac-central-ac-only-var-speed-detailed-performance.xml} +49 -10
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +9 -9
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +9 -9
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +9 -9
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-lockout-temperatures.xml +559 -559
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +9 -9
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +9 -9
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +9 -9
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +9 -9
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +11 -12
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +558 -558
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-buried.xml +554 -554
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-furnace-gas-room-ac.xml → base-hvac-ducts-defaults.xml} +28 -14
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-effective-rvalue.xml +552 -552
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +9 -9
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +9 -9
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +9 -9
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +9 -9
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +9 -9
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +9 -9
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +9 -9
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +15 -10
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +9 -9
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +9 -9
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +9 -9
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +9 -9
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +9 -9
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +12 -10
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-pilot.xml +541 -541
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +9 -9
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +9 -9
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +9 -9
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +9 -9
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +9 -9
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +9 -9
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +9 -9
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +9 -9
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +9 -9
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +9 -9
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +9 -9
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-air-to-air-heat-pump-1-speed-autosized-backup.xml → base-hvac-install-quality-air-to-air-heat-pump-var-speed-detailed-performance.xml} +650 -556
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +9 -9
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +9 -9
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +9 -9
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +9 -9
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +9 -9
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +9 -9
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +9 -9
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +9 -9
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +9 -9
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml → base-hvac-mini-split-air-conditioner-only-ductless-detailed-performance.xml} +50 -49
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +9 -9
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +9 -9
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml → base-hvac-mini-split-heat-pump-ducted-detailed-performance.xml} +109 -14
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +9 -9
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +9 -9
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-baseboard.xml +524 -524
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted-backup-hardsized.xml → base-hvac-mini-split-heat-pump-ductless-backup-furnace-ducts-defaults.xml} +560 -552
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-furnace.xml +563 -563
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +9 -9
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml → base-hvac-mini-split-heat-pump-ductless-detailed-performance.xml} +108 -60
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-heating-capacity-17f.xml +505 -505
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +9 -9
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +9 -9
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +10 -11
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +9 -9
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-natural-gas.xml +504 -504
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +9 -9
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp-heating-capacity-17f.xml +512 -512
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +9 -9
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +9 -9
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +9 -9
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +12 -10
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +9 -9
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +504 -504
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +517 -517
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +9 -9
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +9 -9
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +9 -9
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +9 -9
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-fixed-heater-gas-only.xml → base-hvac-space-heater-gas-only.xml} +10 -10
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +9 -9
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +9 -9
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +9 -9
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +9 -9
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +9 -9
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +9 -9
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-kwh-per-year.xml +531 -528
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-mixed.xml +536 -536
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none-ceiling-fans.xml +515 -515
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +9 -9
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +9 -9
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +9 -9
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +9 -9
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +10 -11
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +4 -4
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +9 -9
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +10 -11
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +10 -11
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +10 -11
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +9 -9
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +9 -9
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +9 -9
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +9 -9
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +9 -9
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +9 -9
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +576 -576
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +576 -576
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +9 -9
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +9 -9
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +9 -9
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +9 -9
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +9 -9
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +9 -9
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +9 -9
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +9 -9
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +9 -9
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +9 -9
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +21 -19
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +605 -605
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +587 -587
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +9 -9
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +9 -9
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +3 -3
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +9 -9
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +587 -585
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +584 -584
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +9 -9
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +555 -555
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +26 -26
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +26 -26
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +9 -9
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading-bldgtype-multifamily.xml +508 -508
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +9 -9
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +9 -9
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-simple-power-outage-natvent-available.xml → base-misc-unit-multiplier.xml} +553 -564
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +26 -26
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-mf-units.xml +2755 -0
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-multiple-buildings.xml → base-multiple-sfd-buildings.xml} +31 -22
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +9 -9
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +4 -5
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-round-trip-efficiency.xml +597 -597
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +599 -597
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +9 -9
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +615 -613
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +612 -612
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +596 -596
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +9 -9
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0-runperiod-1-month.xml +559 -559
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-0.xml +555 -555
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon.xml +616 -616
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1-misc-loads-large-uncommon2.xml +616 -616
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-1.xml +547 -547
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-residents-5.xml +515 -515
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +14 -12
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-crankcase-heater-40w.xml → base-schedules-detailed-mixed-timesteps-power-outage.xml} +565 -555
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-schedules-detailed-occupancy-stochastic-vacancy-year-round.xml → base-schedules-detailed-mixed-timesteps.xml} +554 -563
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +12 -10
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-power-outage.xml +566 -564
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +12 -10
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +12 -10
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +12 -10
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +12 -10
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +12 -10
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-power-outage.xml +619 -619
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy.xml +618 -618
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +9 -9
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +9 -9
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +9 -9
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +9 -9
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +9 -9
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-temperature-capacitance-multiplier.xml +553 -553
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +12 -10
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +12 -10
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +9 -9
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-30-mins.xml +552 -552
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +9 -9
  575. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +2 -0
  576. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy-subset.osw +2 -0
  577. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +2 -0
  578. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +4 -1
  579. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Long_Residence.xml +385 -385
  580. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Vatilo_Residence.xml +378 -380
  581. data/example_files/resources/hpxml-measures/workflow/tests/ACCA_Examples/Victor_Residence.xml +369 -369
  582. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +7 -7
  583. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +7 -7
  584. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +7 -7
  585. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +7 -7
  586. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +7 -7
  587. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +7 -7
  588. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +7 -7
  589. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +7 -7
  590. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +7 -7
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +7 -7
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +7 -7
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +7 -7
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +7 -7
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +7 -7
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +7 -7
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +7 -7
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +7 -7
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +7 -7
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +7 -7
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +7 -7
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +7 -7
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +7 -7
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +7 -8
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +7 -8
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +6 -6
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +6 -6
  608. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_sizing.csv +363 -0
  609. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1.csv +281 -0
  610. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations1_bills.csv +281 -0
  611. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2.csv +141 -0
  612. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_workflow_simulations2_bills.csv +141 -0
  613. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +12 -6
  614. data/example_files/resources/hpxml-measures/workflow/tests/util.rb +1141 -0
  615. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.ddy +536 -0
  616. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.epw +8768 -0
  617. data/example_files/weather/USA_CO_Denver.Intl.AP.725650_TMY3.stat +554 -0
  618. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.ddy +536 -0
  619. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.epw +8768 -0
  620. data/example_files/weather/USA_FL_MacDill.AFB.747880_TMY3.stat +553 -0
  621. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3-cache.csv +35 -0
  622. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.ddy +536 -0
  623. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.epw +8768 -0
  624. data/example_files/weather/USA_GA_Atlanta-Hartsfield-Jackson.Intl.AP.722190_TMY3.stat +553 -0
  625. data/example_files/weather/USA_NY_Buffalo-Greater.Buffalo.Intl.AP.725280_TMY3-cache.csv +35 -0
  626. data/example_files/xml_building/17/README.md +4 -2
  627. data/example_files/xml_building/17/feature.xml +2112 -0
  628. data/lib/uo_cli/version.rb +1 -1
  629. data/lib/uo_cli.rb +110 -17
  630. data/uo_cli.gemspec +6 -8
  631. metadata +130 -177
  632. data/Jenkinsfile +0 -10
  633. data/example_files/base_workflow_res.osw +0 -276
  634. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +0 -1226
  635. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +0 -551
  636. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +0 -551
  637. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +0 -544
  638. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +0 -550
  639. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -552
  640. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -552
  641. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload-miami-fl.xml +0 -552
  642. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -552
  643. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +0 -552
  644. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +0 -552
  645. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +0 -552
  646. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +0 -569
  647. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +0 -599
  648. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +0 -552
  649. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +0 -506
  650. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +0 -560
  651. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +0 -507
  652. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +0 -536
  653. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +0 -536
  654. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +0 -565
  655. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +0 -553
  656. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +0 -553
  657. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +0 -553
  658. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +0 -497
  659. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +0 -544
  660. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +0 -500
  661. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +0 -536
  662. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +0 -551
  663. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +0 -551
  664. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +0 -536
  665. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +0 -546
  666. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +0 -552
  667. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +0 -554
  668. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +0 -554
  669. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +0 -554
  670. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +0 -543
  671. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +0 -549
  672. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +0 -551
  673. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +0 -551
  674. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-baseboard.xml +0 -519
  675. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +0 -522
  676. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +0 -503
  677. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +0 -496
  678. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +0 -518
  679. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +0 -518
  680. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +0 -518
  681. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +0 -496
  682. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +0 -503
  683. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +0 -518
  684. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +0 -518
  685. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +0 -518
  686. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +0 -500
  687. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +0 -500
  688. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only-pilot-light.xml +0 -506
  689. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +0 -501
  690. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +0 -556
  691. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +0 -548
  692. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple-vacancy-year-round.xml +0 -619
  693. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +0 -475
  694. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +0 -475
  695. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +0 -1313
  696. data/example_files/resources/measure-info.json +0 -26
  697. data/example_files/resources/meta_measure.rb +0 -301
  698. data/example_files/xml_building/17/unit 1.xml +0 -580
  699. data/example_files/xml_building/17/unit 2.xml +0 -553
  700. data/example_files/xml_building/17/unit 3.xml +0 -553
  701. data/example_files/xml_building/17/unit 4.xml +0 -580
  702. /data/example_files/{residential → mappers/residential/template/iecc}/clothes_dryer.tsv +0 -0
  703. /data/example_files/{residential → mappers/residential/template/iecc}/clothes_washer.tsv +0 -0
  704. /data/example_files/{residential → mappers/residential/template/iecc}/cooling_system.tsv +0 -0
  705. /data/example_files/{residential → mappers/residential/template/iecc}/dishwasher.tsv +0 -0
  706. /data/example_files/{residential → mappers/residential/template/iecc}/enclosure.tsv +0 -0
  707. /data/example_files/{residential → mappers/residential/template/iecc}/heat_pump.tsv +0 -0
  708. /data/example_files/{residential → mappers/residential/template/iecc}/heating_system.tsv +0 -0
  709. /data/example_files/{residential → mappers/residential/template/iecc}/mechanical_ventilation.tsv +0 -0
  710. /data/example_files/{residential → mappers/residential/template/iecc}/refrigerator.tsv +0 -0
  711. /data/example_files/{residential → mappers/residential/template/iecc}/water_heater.tsv +0 -0
  712. /data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/{JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json → Detailed Rate.json} +0 -0
@@ -1,3 +1,8 @@
1
+ # *********************************************************************************
2
+ # URBANopt (tm), Copyright (c) Alliance for Sustainable Energy, LLC.
3
+ # See also https://github.com/urbanopt/urbanopt-cli/blob/develop/LICENSE.md
4
+ # *********************************************************************************
5
+
1
6
  # frozen_string_literal: true
2
7
 
3
8
  require_relative '../resources/minitest_helper'
@@ -8,7 +13,7 @@ require_relative '../measure.rb'
8
13
  require_relative '../resources/util.rb'
9
14
  require_relative 'util.rb'
10
15
 
11
- class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
16
+ class HPXMLtoOpenStudioEnclosureTest < Minitest::Test
12
17
  def setup
13
18
  @root_path = File.absolute_path(File.join(File.dirname(__FILE__), '..', '..'))
14
19
  @sample_files_path = File.join(@root_path, 'workflow', 'sample_files')
@@ -28,15 +33,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
28
33
  { assembly_r: 5.0, layer_names: ['asphalt or fiberglass shingles', 'roof rigid ins', 'osb sheathing'] },
29
34
  { assembly_r: 20.0, layer_names: ['asphalt or fiberglass shingles', 'roof rigid ins', 'osb sheathing'] }]
30
35
 
31
- hpxml = _create_hpxml('base.xml')
36
+ hpxml, hpxml_bldg = _create_hpxml('base.xml')
32
37
  roofs_values.each do |roof_values|
33
- hpxml.roofs[0].insulation_assembly_r_value = roof_values[:assembly_r]
34
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
35
- model, hpxml = _test_measure(args_hash)
38
+ hpxml_bldg.roofs[0].insulation_assembly_r_value = roof_values[:assembly_r]
39
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
40
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
36
41
 
37
42
  # Check properties
38
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.roofs[0].id}:" }
39
- _check_surface(hpxml.roofs[0], os_surface, roof_values[:layer_names])
43
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.roofs[0].id}:" }
44
+ _check_surface(hpxml_bldg.roofs[0], os_surface, roof_values[:layer_names])
40
45
  end
41
46
 
42
47
  # Closed cavity, asphalt shingles roof
@@ -44,15 +49,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
44
49
  { assembly_r: 5.0, layer_names: ['asphalt or fiberglass shingles', 'osb sheathing', 'roof stud and cavity', 'gypsum board'] },
45
50
  { assembly_r: 20.0, layer_names: ['asphalt or fiberglass shingles', 'roof rigid ins', 'osb sheathing', 'roof stud and cavity', 'gypsum board'] }]
46
51
 
47
- hpxml = _create_hpxml('base-atticroof-cathedral.xml')
52
+ hpxml, hpxml_bldg = _create_hpxml('base-atticroof-cathedral.xml')
48
53
  roofs_values.each do |roof_values|
49
- hpxml.roofs[0].insulation_assembly_r_value = roof_values[:assembly_r]
50
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
51
- model, hpxml = _test_measure(args_hash)
54
+ hpxml_bldg.roofs[0].insulation_assembly_r_value = roof_values[:assembly_r]
55
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
56
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
52
57
 
53
58
  # Check properties
54
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.roofs[0].id}:" }
55
- _check_surface(hpxml.roofs[0], os_surface, roof_values[:layer_names])
59
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.roofs[0].id}:" }
60
+ _check_surface(hpxml_bldg.roofs[0], os_surface, roof_values[:layer_names])
56
61
  end
57
62
 
58
63
  # Closed cavity, Miscellaneous
@@ -92,16 +97,16 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
92
97
 
93
98
  ]
94
99
 
95
- hpxml = _create_hpxml('base-enclosure-rooftypes.xml')
96
- for i in 0..hpxml.roofs.size - 1
100
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-rooftypes.xml')
101
+ for i in 0..hpxml_bldg.roofs.size - 1
97
102
  roofs_values[i].each do |roof_values|
98
- hpxml.roofs[i].insulation_assembly_r_value = roof_values[:assembly_r]
99
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
100
- model, hpxml = _test_measure(args_hash)
103
+ hpxml_bldg.roofs[i].insulation_assembly_r_value = roof_values[:assembly_r]
104
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
105
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
101
106
 
102
107
  # Check properties
103
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.roofs[i].id}:" }
104
- _check_surface(hpxml.roofs[i], os_surface, roof_values[:layer_names])
108
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.roofs[i].id}:" }
109
+ _check_surface(hpxml_bldg.roofs[i], os_surface, roof_values[:layer_names])
105
110
  end
106
111
  end
107
112
 
@@ -114,15 +119,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
114
119
  { assembly_r: 5.0, layer_names: ['asphalt or fiberglass shingles', 'roof rigid ins', 'osb sheathing', 'radiant barrier'] },
115
120
  { assembly_r: 20.0, layer_names: ['asphalt or fiberglass shingles', 'roof rigid ins', 'osb sheathing', 'radiant barrier'] }]
116
121
 
117
- hpxml = _create_hpxml('base-atticroof-radiant-barrier.xml')
122
+ hpxml, hpxml_bldg = _create_hpxml('base-atticroof-radiant-barrier.xml')
118
123
  roofs_values.each do |roof_values|
119
- hpxml.roofs[0].insulation_assembly_r_value = roof_values[:assembly_r]
120
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
121
- model, hpxml = _test_measure(args_hash)
124
+ hpxml_bldg.roofs[0].insulation_assembly_r_value = roof_values[:assembly_r]
125
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
126
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
122
127
 
123
128
  # Check properties
124
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.roofs[0].id}:" }
125
- _check_surface(hpxml.roofs[0], os_surface, roof_values[:layer_names])
129
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.roofs[0].id}:" }
130
+ _check_surface(hpxml_bldg.roofs[0], os_surface, roof_values[:layer_names])
126
131
  end
127
132
  end
128
133
 
@@ -135,15 +140,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
135
140
  { assembly_r: 5.0, layer_names: ['wood siding', 'rim joist stud and cavity'] },
136
141
  { assembly_r: 20.0, layer_names: ['wood siding', 'rim joist rigid ins', 'osb sheathing', 'rim joist stud and cavity'] }]
137
142
 
138
- hpxml = _create_hpxml('base.xml')
143
+ hpxml, hpxml_bldg = _create_hpxml('base.xml')
139
144
  rimjs_values.each do |rimj_values|
140
- hpxml.rim_joists[0].insulation_assembly_r_value = rimj_values[:assembly_r]
141
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
142
- model, hpxml = _test_measure(args_hash)
145
+ hpxml_bldg.rim_joists[0].insulation_assembly_r_value = rimj_values[:assembly_r]
146
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
147
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
143
148
 
144
149
  # Check properties
145
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.rim_joists[0].id}:" }
146
- _check_surface(hpxml.rim_joists[0], os_surface, rimj_values[:layer_names])
150
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.rim_joists[0].id}:" }
151
+ _check_surface(hpxml_bldg.rim_joists[0], os_surface, rimj_values[:layer_names])
147
152
  end
148
153
 
149
154
  # Miscellaneous
@@ -190,16 +195,16 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
190
195
  { assembly_r: 20.0, layer_names: ['rim joist rigid ins', 'osb sheathing', 'rim joist stud and cavity'] }],
191
196
  ]
192
197
 
193
- hpxml = _create_hpxml('base-enclosure-walltypes.xml')
194
- for i in 0..hpxml.rim_joists.size - 1
198
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-walltypes.xml')
199
+ for i in 0..hpxml_bldg.rim_joists.size - 1
195
200
  rimjs_values[i].each do |rimj_values|
196
- hpxml.rim_joists[i].insulation_assembly_r_value = rimj_values[:assembly_r]
197
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
198
- model, hpxml = _test_measure(args_hash)
201
+ hpxml_bldg.rim_joists[i].insulation_assembly_r_value = rimj_values[:assembly_r]
202
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
203
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
199
204
 
200
205
  # Check properties
201
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.rim_joists[i].id}:" }
202
- _check_surface(hpxml.rim_joists[i], os_surface, rimj_values[:layer_names])
206
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.rim_joists[i].id}:" }
207
+ _check_surface(hpxml_bldg.rim_joists[i], os_surface, rimj_values[:layer_names])
203
208
  end
204
209
  end
205
210
  end
@@ -213,15 +218,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
213
218
  { assembly_r: 5.0, layer_names: ['wood siding', 'osb sheathing', 'wall stud and cavity', 'gypsum board'] },
214
219
  { assembly_r: 20.0, layer_names: ['wood siding', 'wall rigid ins', 'osb sheathing', 'wall stud and cavity', 'gypsum board'] }]
215
220
 
216
- hpxml = _create_hpxml('base.xml')
221
+ hpxml, hpxml_bldg = _create_hpxml('base.xml')
217
222
  walls_values.each do |wall_values|
218
- hpxml.walls[0].insulation_assembly_r_value = wall_values[:assembly_r]
219
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
220
- model, hpxml = _test_measure(args_hash)
223
+ hpxml_bldg.walls[0].insulation_assembly_r_value = wall_values[:assembly_r]
224
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
225
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
221
226
 
222
227
  # Check properties
223
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.walls[0].id}:" }
224
- _check_surface(hpxml.walls[0], os_surface, wall_values[:layer_names])
228
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.walls[0].id}:" }
229
+ _check_surface(hpxml_bldg.walls[0], os_surface, wall_values[:layer_names])
225
230
  end
226
231
 
227
232
  # Miscellaneous
@@ -272,16 +277,16 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
272
277
  { assembly_r: 20.0, layer_names: ['aluminum siding', 'wall rigid ins', 'osb sheathing', 'wall layer', 'wood'] }],
273
278
  ]
274
279
 
275
- hpxml = _create_hpxml('base-enclosure-walltypes.xml')
276
- for i in 0..hpxml.walls.size - 2
280
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-walltypes.xml')
281
+ for i in 0..hpxml_bldg.walls.size - 2
277
282
  walls_values[i].each do |wall_values|
278
- hpxml.walls[i].insulation_assembly_r_value = wall_values[:assembly_r]
279
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
280
- model, hpxml = _test_measure(args_hash)
283
+ hpxml_bldg.walls[i].insulation_assembly_r_value = wall_values[:assembly_r]
284
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
285
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
281
286
 
282
287
  # Check properties
283
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.walls[i].id}:" }
284
- _check_surface(hpxml.walls[i], os_surface, wall_values[:layer_names])
288
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.walls[i].id}:" }
289
+ _check_surface(hpxml_bldg.walls[i], os_surface, wall_values[:layer_names])
285
290
  end
286
291
  end
287
292
  end
@@ -295,15 +300,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
295
300
  { assembly_r: 5.0, layer_names: ['concrete', 'exterior vertical ins'] },
296
301
  { assembly_r: 20.0, layer_names: ['concrete', 'exterior vertical ins'] }]
297
302
 
298
- hpxml = _create_hpxml('base-foundation-unconditioned-basement-assembly-r.xml')
303
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-unconditioned-basement-assembly-r.xml')
299
304
  walls_values.each do |wall_values|
300
- hpxml.foundation_walls[0].insulation_assembly_r_value = wall_values[:assembly_r]
301
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
302
- model, hpxml = _test_measure(args_hash)
305
+ hpxml_bldg.foundation_walls[0].insulation_assembly_r_value = wall_values[:assembly_r]
306
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
307
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
303
308
 
304
309
  # Check properties
305
- os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml.foundation_walls[0].id }
306
- _check_surface(hpxml.foundation_walls[0], os_surface, wall_values[:layer_names])
310
+ os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml_bldg.foundation_walls[0].id }
311
+ _check_surface(hpxml_bldg.foundation_walls[0], os_surface, wall_values[:layer_names])
307
312
  end
308
313
 
309
314
  # Foundation wall w/ different material types
@@ -316,16 +321,16 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
316
321
  { type: HPXML::FoundationWallTypeDoubleBrick, layer_names: ['double brick'] },
317
322
  { type: HPXML::FoundationWallTypeWood, layer_names: ['wood'] }]
318
323
 
319
- hpxml = _create_hpxml('base-foundation-unconditioned-basement-assembly-r.xml')
324
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-unconditioned-basement-assembly-r.xml')
320
325
  walls_values.each do |wall_values|
321
- hpxml.foundation_walls[0].insulation_assembly_r_value = 0.1 # Ensure just a single layer
322
- hpxml.foundation_walls[0].type = wall_values[:type]
323
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
324
- model, hpxml = _test_measure(args_hash)
326
+ hpxml_bldg.foundation_walls[0].insulation_assembly_r_value = 0.1 # Ensure just a single layer
327
+ hpxml_bldg.foundation_walls[0].type = wall_values[:type]
328
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
329
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
325
330
 
326
331
  # Check properties
327
- os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml.foundation_walls[0].id }
328
- _check_surface(hpxml.foundation_walls[0], os_surface, wall_values[:layer_names])
332
+ os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml_bldg.foundation_walls[0].id }
333
+ _check_surface(hpxml_bldg.foundation_walls[0], os_surface, wall_values[:layer_names])
329
334
  end
330
335
 
331
336
  # Foundation wall w/ Insulation Layers
@@ -337,20 +342,20 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
337
342
  { interior_r: 5.0, exterior_r: 5.0, layer_names: ['concrete', 'interior vertical ins', 'exterior vertical ins'] },
338
343
  { interior_r: 20.0, exterior_r: 20.0, layer_names: ['concrete', 'interior vertical ins', 'exterior vertical ins'] }]
339
344
 
340
- hpxml = _create_hpxml('base-foundation-unconditioned-basement-wall-insulation.xml')
345
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-unconditioned-basement-wall-insulation.xml')
341
346
  walls_values.each do |wall_values|
342
- hpxml.foundation_walls[0].insulation_interior_r_value = wall_values[:interior_r]
343
- hpxml.foundation_walls[0].insulation_interior_distance_to_top = 0.0
344
- hpxml.foundation_walls[0].insulation_interior_distance_to_bottom = 8.0
345
- hpxml.foundation_walls[0].insulation_exterior_r_value = wall_values[:exterior_r]
346
- hpxml.foundation_walls[0].insulation_exterior_distance_to_top = 0.0
347
- hpxml.foundation_walls[0].insulation_exterior_distance_to_bottom = 8.0
348
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
349
- model, hpxml = _test_measure(args_hash)
347
+ hpxml_bldg.foundation_walls[0].insulation_interior_r_value = wall_values[:interior_r]
348
+ hpxml_bldg.foundation_walls[0].insulation_interior_distance_to_top = 0.0
349
+ hpxml_bldg.foundation_walls[0].insulation_interior_distance_to_bottom = 8.0
350
+ hpxml_bldg.foundation_walls[0].insulation_exterior_r_value = wall_values[:exterior_r]
351
+ hpxml_bldg.foundation_walls[0].insulation_exterior_distance_to_top = 0.0
352
+ hpxml_bldg.foundation_walls[0].insulation_exterior_distance_to_bottom = 8.0
353
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
354
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
350
355
 
351
356
  # Check properties
352
- os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml.foundation_walls[0].id }
353
- _check_surface(hpxml.foundation_walls[0], os_surface, wall_values[:layer_names])
357
+ os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml_bldg.foundation_walls[0].id }
358
+ _check_surface(hpxml_bldg.foundation_walls[0], os_surface, wall_values[:layer_names])
354
359
  end
355
360
  end
356
361
 
@@ -363,15 +368,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
363
368
  { assembly_r: 5.0, layer_names: ['ceiling stud and cavity', 'gypsum board'] },
364
369
  { assembly_r: 20.0, layer_names: ['ceiling loosefill ins', 'ceiling stud and cavity', 'gypsum board'] }]
365
370
 
366
- hpxml = _create_hpxml('base-foundation-vented-crawlspace.xml')
371
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-vented-crawlspace.xml')
367
372
  ceilings_values.each do |ceiling_values|
368
- hpxml.floors[1].insulation_assembly_r_value = ceiling_values[:assembly_r]
369
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
370
- model, hpxml = _test_measure(args_hash)
373
+ hpxml_bldg.floors[1].insulation_assembly_r_value = ceiling_values[:assembly_r]
374
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
375
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
371
376
 
372
377
  # Check properties
373
- os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml.floors[1].id }
374
- _check_surface(hpxml.floors[1], os_surface, ceiling_values[:layer_names])
378
+ os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml_bldg.floors[1].id }
379
+ _check_surface(hpxml_bldg.floors[1], os_surface, ceiling_values[:layer_names])
375
380
  end
376
381
 
377
382
  # Miscellaneous
@@ -390,16 +395,16 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
390
395
  { assembly_r: 20.0, layer_names: ['ceiling loosefill ins', 'ceiling stud and cavity', 'gypsum board'] }],
391
396
  ]
392
397
 
393
- hpxml = _create_hpxml('base-enclosure-ceilingtypes.xml')
394
- for i in 0..hpxml.floors.size - 1
398
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-ceilingtypes.xml')
399
+ for i in 0..hpxml_bldg.floors.size - 1
395
400
  ceilings_values[i].each do |ceiling_values|
396
- hpxml.floors[i].insulation_assembly_r_value = ceiling_values[:assembly_r]
397
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
398
- model, hpxml = _test_measure(args_hash)
401
+ hpxml_bldg.floors[i].insulation_assembly_r_value = ceiling_values[:assembly_r]
402
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
403
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
399
404
 
400
405
  # Check properties
401
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.floors[i].id}" }
402
- _check_surface(hpxml.floors[i], os_surface, ceiling_values[:layer_names])
406
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.floors[i].id}" }
407
+ _check_surface(hpxml_bldg.floors[i], os_surface, ceiling_values[:layer_names])
403
408
  end
404
409
  end
405
410
  end
@@ -413,15 +418,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
413
418
  { assembly_r: 5.0, layer_names: ['floor stud and cavity', 'osb sheathing', 'floor covering'] },
414
419
  { assembly_r: 20.0, layer_names: ['floor stud and cavity', 'floor rigid ins', 'osb sheathing', 'floor covering'] }]
415
420
 
416
- hpxml = _create_hpxml('base-foundation-vented-crawlspace.xml')
421
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-vented-crawlspace.xml')
417
422
  floors_values.each do |floor_values|
418
- hpxml.floors[0].insulation_assembly_r_value = floor_values[:assembly_r]
419
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
420
- model, hpxml = _test_measure(args_hash)
423
+ hpxml_bldg.floors[0].insulation_assembly_r_value = floor_values[:assembly_r]
424
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
425
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
421
426
 
422
427
  # Check properties
423
- os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml.floors[0].id }
424
- _check_surface(hpxml.floors[0], os_surface, floor_values[:layer_names])
428
+ os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml_bldg.floors[0].id }
429
+ _check_surface(hpxml_bldg.floors[0], os_surface, floor_values[:layer_names])
425
430
  end
426
431
 
427
432
  # Miscellaneous
@@ -440,20 +445,46 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
440
445
  { assembly_r: 20.0, layer_names: ['floor stud and cavity', 'floor rigid ins', 'osb sheathing', 'floor covering'] }],
441
446
  ]
442
447
 
443
- hpxml = _create_hpxml('base-enclosure-floortypes.xml')
444
- for i in 0..hpxml.floors.size - 2
448
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-floortypes.xml')
449
+ for i in 0..hpxml_bldg.floors.size - 2
445
450
  floors_values[i].each do |floor_values|
446
- hpxml.floors[i].insulation_assembly_r_value = floor_values[:assembly_r]
447
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
448
- model, hpxml = _test_measure(args_hash)
451
+ hpxml_bldg.floors[i].insulation_assembly_r_value = floor_values[:assembly_r]
452
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
453
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
449
454
 
450
455
  # Check properties
451
- os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml.floors[i].id}" }
452
- _check_surface(hpxml.floors[i], os_surface, floor_values[:layer_names])
456
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_bldg.floors[i].id}" }
457
+ _check_surface(hpxml_bldg.floors[i], os_surface, floor_values[:layer_names])
453
458
  end
454
459
  end
455
460
  end
456
461
 
462
+ def test_manufactured_home_foundation
463
+ args_hash = {}
464
+ args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
465
+
466
+ hpxml, _hpxml_bldg = _create_hpxml('base-foundation-belly-wing-skirt.xml')
467
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
468
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
469
+ hpxml_floor = hpxml_bldg.floors.find { |x| x.exterior_adjacent_to == HPXML::LocationManufacturedHomeUnderBelly }
470
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_floor.id}" }
471
+ assert_equal('NoWind', os_surface.windExposure)
472
+
473
+ hpxml_bldg.foundations.clear
474
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
475
+ model, _hpxml, hpxml_bldg = _test_measure(args_hash)
476
+ hpxml_floor = hpxml_bldg.floors.find { |x| x.exterior_adjacent_to == HPXML::LocationManufacturedHomeUnderBelly }
477
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_floor.id}" }
478
+ assert_equal('NoWind', os_surface.windExposure)
479
+
480
+ hpxml, _hpxml_bldg = _create_hpxml('base-foundation-belly-wing-no-skirt.xml')
481
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
482
+ model, _hpxml, hpxml_bldg = _test_measure(args_hash)
483
+ hpxml_floor = hpxml_bldg.floors.find { |x| x.exterior_adjacent_to == HPXML::LocationManufacturedHomeUnderBelly }
484
+ os_surface = model.getSurfaces.find { |s| s.name.to_s.start_with? "#{hpxml_floor.id}" }
485
+ assert_equal('WindExposed', os_surface.windExposure)
486
+ end
487
+
457
488
  def test_slabs
458
489
  args_hash = {}
459
490
  args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
@@ -469,35 +500,35 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
469
500
  { perimeter_r: 5.0, under_r: 5.0, under_span: false, layer_names: ['concrete', 'floor covering', 'interior horizontal ins', 'interior vertical ins', 'exterior vertical ins'] },
470
501
  { perimeter_r: 20.0, under_r: 20.0, under_span: false, layer_names: ['concrete', 'floor covering', 'interior horizontal ins', 'interior vertical ins', 'exterior vertical ins'] }]
471
502
 
472
- hpxml = _create_hpxml('base-foundation-slab.xml')
503
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-slab.xml')
473
504
  slabs_values.each do |slab_values|
474
- hpxml.slabs[0].perimeter_insulation_r_value = slab_values[:perimeter_r]
475
- hpxml.slabs[0].perimeter_insulation_depth = 2.0
476
- hpxml.slabs[0].under_slab_insulation_r_value = slab_values[:under_r]
505
+ hpxml_bldg.slabs[0].perimeter_insulation_r_value = slab_values[:perimeter_r]
506
+ hpxml_bldg.slabs[0].perimeter_insulation_depth = 2.0
507
+ hpxml_bldg.slabs[0].under_slab_insulation_r_value = slab_values[:under_r]
477
508
  if slab_values[:under_span]
478
- hpxml.slabs[0].under_slab_insulation_spans_entire_slab = true
479
- hpxml.slabs[0].under_slab_insulation_width = nil
509
+ hpxml_bldg.slabs[0].under_slab_insulation_spans_entire_slab = true
510
+ hpxml_bldg.slabs[0].under_slab_insulation_width = nil
480
511
  else
481
- hpxml.slabs[0].under_slab_insulation_width = 2.0
482
- hpxml.slabs[0].under_slab_insulation_spans_entire_slab = nil
512
+ hpxml_bldg.slabs[0].under_slab_insulation_width = 2.0
513
+ hpxml_bldg.slabs[0].under_slab_insulation_spans_entire_slab = nil
483
514
  end
484
515
 
485
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
486
- model, hpxml = _test_measure(args_hash)
516
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
517
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
487
518
 
488
519
  # Check properties
489
- os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml.slabs[0].id }
490
- _check_surface(hpxml.slabs[0], os_surface, slab_values[:layer_names])
520
+ os_surface = model.getSurfaces.find { |s| s.name.to_s == hpxml_bldg.slabs[0].id }
521
+ _check_surface(hpxml_bldg.slabs[0], os_surface, slab_values[:layer_names])
491
522
  end
492
523
  end
493
524
 
494
525
  def test_windows
495
526
  args_hash = {}
496
527
  args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base.xml'))
497
- model, hpxml = _test_measure(args_hash)
528
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
498
529
 
499
530
  # Check window properties
500
- hpxml.windows.each do |window|
531
+ hpxml_bldg.windows.each do |window|
501
532
  os_window = model.getSubSurfaces.find { |w| w.name.to_s == window.id }
502
533
  os_simple_glazing = os_window.construction.get.to_LayeredConstruction.get.getLayer(0).to_SimpleGlazing.get
503
534
 
@@ -508,16 +539,16 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
508
539
  # Storm windows
509
540
  args_hash = {}
510
541
  args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
511
- hpxml = _create_hpxml('base.xml')
512
- hpxml.windows.each do |window|
542
+ hpxml, hpxml_bldg = _create_hpxml('base.xml')
543
+ hpxml_bldg.windows.each do |window|
513
544
  window.ufactor = 0.6
514
545
  window.storm_type = HPXML::WindowGlassTypeLowE
515
546
  end
516
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
517
- model, hpxml = _test_measure(args_hash)
547
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
548
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
518
549
 
519
550
  # Check window properties
520
- hpxml.windows.each do |window|
551
+ hpxml_bldg.windows.each do |window|
521
552
  os_window = model.getSubSurfaces.find { |w| w.name.to_s == window.id }
522
553
  os_simple_glazing = os_window.construction.get.to_LayeredConstruction.get.getLayer(0).to_SimpleGlazing.get
523
554
 
@@ -530,10 +561,10 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
530
561
  'ZAF_Cape.Town.688160_IWEC.epw'].each do |epw_path| # Test both northern & southern hemisphere
531
562
  args_hash = {}
532
563
  args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
533
- hpxml = _create_hpxml('base-enclosure-windows-shading.xml')
534
- hpxml.climate_and_risk_zones.weather_station_epw_filepath = epw_path
535
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
536
- model, hpxml = _test_measure(args_hash)
564
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-windows-shading.xml')
565
+ hpxml_bldg.climate_and_risk_zones.weather_station_epw_filepath = epw_path
566
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
567
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
537
568
 
538
569
  if epw_path == 'USA_CO_Denver.Intl.AP.725650_TMY3.epw'
539
570
  summer_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('June'), 1, model.yearDescription.get.assumedYear)
@@ -543,34 +574,34 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
543
574
  summer_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('January'), 1, model.yearDescription.get.assumedYear)
544
575
  end
545
576
 
546
- hpxml.windows.each do |window|
577
+ hpxml_bldg.windows.each do |window|
547
578
  sf_summer = window.interior_shading_factor_summer
548
579
  sf_winter = window.interior_shading_factor_winter
549
580
  sf_summer *= window.exterior_shading_factor_summer unless window.exterior_shading_factor_summer.nil?
550
581
  sf_winter *= window.exterior_shading_factor_winter unless window.exterior_shading_factor_winter.nil?
551
582
 
552
583
  # Check shading transmittance for sky beam and sky diffuse
553
- os_shading_surface = model.getShadingSurfaces.find { |ss| ss.name.to_s.start_with? window.id }
584
+ os_subsurface = model.getSubSurfaces.select { |ss| ss.name.to_s.start_with? window.id }[0]
585
+ os_ism = nil
586
+ model.getSurfacePropertyIncidentSolarMultipliers.each do |ism|
587
+ next unless os_subsurface == ism.subSurface
588
+
589
+ os_ism = ism
590
+ end
554
591
  if (sf_summer == 1) && (sf_winter == 1)
555
- assert_nil(os_shading_surface) # No shading
592
+ assert_nil(os_ism) # No shading
556
593
  else
557
- refute_nil(os_shading_surface) # Shading
594
+ refute_nil(os_ism) # Shading
558
595
  if sf_summer == sf_winter
559
- summer_transmittance = os_shading_surface.transmittanceSchedule.get.to_ScheduleConstant.get.value
596
+ summer_transmittance = os_ism.incidentSolarMultiplierSchedule.get.to_ScheduleConstant.get.value
560
597
  winter_transmittance = summer_transmittance
561
598
  else
562
- summer_transmittance = os_shading_surface.transmittanceSchedule.get.to_ScheduleRuleset.get.getDaySchedules(summer_date, summer_date).map { |ds| ds.values.sum }.sum
563
- winter_transmittance = os_shading_surface.transmittanceSchedule.get.to_ScheduleRuleset.get.getDaySchedules(winter_date, winter_date).map { |ds| ds.values.sum }.sum
599
+ summer_transmittance = os_ism.incidentSolarMultiplierSchedule.get.to_ScheduleRuleset.get.getDaySchedules(summer_date, summer_date).map { |ds| ds.values.sum }.sum
600
+ winter_transmittance = os_ism.incidentSolarMultiplierSchedule.get.to_ScheduleRuleset.get.getDaySchedules(winter_date, winter_date).map { |ds| ds.values.sum }.sum
564
601
  end
565
602
  assert_equal(sf_summer, summer_transmittance)
566
603
  assert_equal(sf_winter, winter_transmittance)
567
604
  end
568
-
569
- # Check subsurface view factor to ground
570
- subsurface_view_factor = 0.5
571
- window_actuator = model.getEnergyManagementSystemActuators.find { |w| w.actuatedComponent.get.name.to_s == window.id }
572
- program_values = get_ems_values(model.getEnergyManagementSystemPrograms, 'fixedwindow view factor to ground program')
573
- assert_equal(subsurface_view_factor, program_values["#{window_actuator.name}"][0])
574
605
  end
575
606
  end
576
607
  end
@@ -578,10 +609,10 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
578
609
  def test_skylights
579
610
  args_hash = {}
580
611
  args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-enclosure-skylights.xml'))
581
- model, hpxml = _test_measure(args_hash)
612
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
582
613
 
583
614
  # Check skylight properties
584
- hpxml.skylights.each do |skylight|
615
+ hpxml_bldg.skylights.each do |skylight|
585
616
  os_skylight = model.getSubSurfaces.find { |w| w.name.to_s == skylight.id }
586
617
  os_simple_glazing = os_skylight.construction.get.to_LayeredConstruction.get.getLayer(0).to_SimpleGlazing.get
587
618
 
@@ -594,10 +625,10 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
594
625
  'ZAF_Cape.Town.688160_IWEC.epw'].each do |epw_path| # Test both northern & southern hemisphere
595
626
  args_hash = {}
596
627
  args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
597
- hpxml = _create_hpxml('base-enclosure-skylights-shading.xml')
598
- hpxml.climate_and_risk_zones.weather_station_epw_filepath = epw_path
599
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
600
- model, hpxml = _test_measure(args_hash)
628
+ hpxml, hpxml_bldg = _create_hpxml('base-enclosure-skylights-shading.xml')
629
+ hpxml_bldg.climate_and_risk_zones.weather_station_epw_filepath = epw_path
630
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
631
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
601
632
 
602
633
  if epw_path == 'USA_CO_Denver.Intl.AP.725650_TMY3.epw'
603
634
  summer_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('June'), 1, model.yearDescription.get.assumedYear)
@@ -607,34 +638,34 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
607
638
  summer_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new('January'), 1, model.yearDescription.get.assumedYear)
608
639
  end
609
640
 
610
- hpxml.skylights.each do |skylight|
641
+ hpxml_bldg.skylights.each do |skylight|
611
642
  sf_summer = skylight.interior_shading_factor_summer
612
643
  sf_winter = skylight.interior_shading_factor_winter
613
644
  sf_summer *= skylight.exterior_shading_factor_summer unless skylight.exterior_shading_factor_summer.nil?
614
645
  sf_winter *= skylight.exterior_shading_factor_winter unless skylight.exterior_shading_factor_winter.nil?
615
646
 
616
647
  # Check shading transmittance for sky beam and sky diffuse
617
- os_shading_surface = model.getShadingSurfaces.find { |ss| ss.name.to_s.start_with? skylight.id }
648
+ os_subsurface = model.getSubSurfaces.select { |ss| ss.name.to_s.start_with? skylight.id }[0]
649
+ os_ism = nil
650
+ model.getSurfacePropertyIncidentSolarMultipliers.each do |ism|
651
+ next unless os_subsurface == ism.subSurface
652
+
653
+ os_ism = ism
654
+ end
618
655
  if (sf_summer == 1) && (sf_winter == 1)
619
- assert_nil(os_shading_surface) # No shading
656
+ assert_nil(os_ism) # No shading
620
657
  else
621
- refute_nil(os_shading_surface) # Shading
658
+ refute_nil(os_ism) # Shading
622
659
  if sf_summer == sf_winter
623
- summer_transmittance = os_shading_surface.transmittanceSchedule.get.to_ScheduleConstant.get.value
660
+ summer_transmittance = os_ism.incidentSolarMultiplierSchedule.get.to_ScheduleConstant.get.value
624
661
  winter_transmittance = summer_transmittance
625
662
  else
626
- summer_transmittance = os_shading_surface.transmittanceSchedule.get.to_ScheduleRuleset.get.getDaySchedules(summer_date, summer_date).map { |ds| ds.values.sum }.sum
627
- winter_transmittance = os_shading_surface.transmittanceSchedule.get.to_ScheduleRuleset.get.getDaySchedules(winter_date, winter_date).map { |ds| ds.values.sum }.sum
663
+ summer_transmittance = os_ism.incidentSolarMultiplierSchedule.get.to_ScheduleRuleset.get.getDaySchedules(summer_date, summer_date).map { |ds| ds.values.sum }.sum
664
+ winter_transmittance = os_ism.incidentSolarMultiplierSchedule.get.to_ScheduleRuleset.get.getDaySchedules(winter_date, winter_date).map { |ds| ds.values.sum }.sum
628
665
  end
629
666
  assert_equal(sf_summer, summer_transmittance)
630
667
  assert_equal(sf_winter, winter_transmittance)
631
668
  end
632
-
633
- # Check subsurface view factor to ground
634
- subsurface_view_factor = 0.05 # 6:12 pitch
635
- skylight_actuator = model.getEnergyManagementSystemActuators.find { |w| w.actuatedComponent.get.name.to_s == skylight.id }
636
- program_values = get_ems_values(model.getEnergyManagementSystemPrograms, 'skylight view factor to ground program')
637
- assert_equal(subsurface_view_factor, program_values["#{skylight_actuator.name}"][0])
638
669
  end
639
670
  end
640
671
  end
@@ -648,15 +679,15 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
648
679
  { assembly_r: 5.0, layer_names: ['door material'] },
649
680
  { assembly_r: 20.0, layer_names: ['door material'] }]
650
681
 
651
- hpxml = _create_hpxml('base.xml')
682
+ hpxml, hpxml_bldg = _create_hpxml('base.xml')
652
683
  doors_values.each do |door_values|
653
- hpxml.doors[0].r_value = door_values[:assembly_r]
654
- XMLHelper.write_file(hpxml.to_oga, @tmp_hpxml_path)
655
- model, hpxml = _test_measure(args_hash)
684
+ hpxml_bldg.doors[0].r_value = door_values[:assembly_r]
685
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
686
+ model, hpxml, hpxml_bldg = _test_measure(args_hash)
656
687
 
657
688
  # Check properties
658
- os_surface = model.getSubSurfaces.find { |s| s.name.to_s == hpxml.doors[0].id }
659
- _check_surface(hpxml.doors[0], os_surface, door_values[:layer_names])
689
+ os_surface = model.getSubSurfaces.find { |s| s.name.to_s == hpxml_bldg.doors[0].id }
690
+ _check_surface(hpxml_bldg.doors[0], os_surface, door_values[:layer_names])
660
691
  end
661
692
  end
662
693
 
@@ -667,11 +698,11 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
667
698
  # Thermal masses
668
699
  partition_wall_mass_layer_names = ['gypsum board', 'wall stud and cavity', 'gypsum board']
669
700
 
670
- model, hpxml = _test_measure(args_hash)
701
+ model, _hpxml, hpxml_bldg = _test_measure(args_hash)
671
702
 
672
703
  # Check properties
673
704
  os_surface = model.getInternalMassDefinitions.find { |s| s.name.to_s == 'partition wall mass' }
674
- _check_surface(hpxml.partition_wall_mass, os_surface, partition_wall_mass_layer_names)
705
+ _check_surface(hpxml_bldg.partition_wall_mass, os_surface, partition_wall_mass_layer_names)
675
706
  end
676
707
 
677
708
  def test_furniture_mass
@@ -679,13 +710,147 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
679
710
  args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-enclosure-thermal-mass.xml'))
680
711
 
681
712
  # Thermal masses
682
- furniture_mass_layer_names = ['furniture material living space']
713
+ furniture_mass_layer_names = ['furniture material conditioned space']
683
714
 
684
- model, hpxml = _test_measure(args_hash)
715
+ model, _hpxml, hpxml_bldg = _test_measure(args_hash)
685
716
 
686
717
  # Check properties
687
- os_surface = model.getInternalMassDefinitions.find { |s| s.name.to_s.start_with?('furniture mass living space') }
688
- _check_surface(hpxml.furniture_mass, os_surface, furniture_mass_layer_names)
718
+ os_surface = model.getInternalMassDefinitions.find { |s| s.name.to_s.start_with?('furniture mass conditioned space') }
719
+ _check_surface(hpxml_bldg.furniture_mass, os_surface, furniture_mass_layer_names)
720
+ end
721
+
722
+ def test_foundation_properties
723
+ tests = {
724
+ '../tests/ASHRAE_Standard_140/L322XC.xml' => 1, # 1 basement foundation
725
+ 'base.xml' => 1, # 1 basement foundation
726
+ 'base-foundation-slab.xml' => 1, # 1 slab-on-grade foundation
727
+ 'base-foundation-basement-garage.xml' => 2, # 1 basement foundation + 1 garage slab
728
+ 'base-foundation-unconditioned-basement-above-grade.xml' => 1, # 1 basement foundation
729
+ 'base-foundation-conditioned-crawlspace.xml' => 1, # 1 crawlspace foundation
730
+ 'base-foundation-ambient.xml' => 0, # 0 foundations
731
+ 'base-foundation-walkout-basement.xml' => 2, # 1 basement foundation with 1 effective below-grade depth + additional no-wall exposed perimeter
732
+ 'base-foundation-multiple.xml' => 2, # 1 basement foundation + 1 crawlspace foundation
733
+ 'base-foundation-complex.xml' => 6, # 2 basement foundations, each with 1 effective below-grade depth + additional no-wall exposed perimeter
734
+ 'base-bldgtype-sfa-unit-2stories.xml' => 1, # 1 basement foundation
735
+ 'base-enclosure-2stories-garage.xml' => 2, # 1 basement foundation + 1 garage slab
736
+ }
737
+
738
+ tests.each do |hpxml_name, num_kiva_objects|
739
+ args_hash = {}
740
+ args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, hpxml_name))
741
+ model, _hpxml, hpxml_bldg = _test_measure(args_hash)
742
+
743
+ # Gather HPXML info
744
+ slab_int_adj_tos = {}
745
+ ext_fwall_int_adj_tos = {}
746
+ int_fwall_int_adj_tos = {}
747
+ hpxml_bldg.slabs.each do |slab|
748
+ int_adj_to = slab.interior_adjacent_to
749
+ int_adj_to = HPXML::LocationConditionedSpace if HPXML::conditioned_locations.include?(int_adj_to)
750
+
751
+ slab_int_adj_tos[int_adj_to] = [] if slab_int_adj_tos[int_adj_to].nil?
752
+ slab_int_adj_tos[int_adj_to] << slab
753
+ end
754
+ hpxml_bldg.foundation_walls.each do |fwall|
755
+ int_adj_to = fwall.interior_adjacent_to
756
+ int_adj_to = HPXML::LocationConditionedSpace if HPXML::conditioned_locations.include?(int_adj_to)
757
+
758
+ if fwall.is_exterior
759
+ ext_fwall_int_adj_tos[int_adj_to] = [] if ext_fwall_int_adj_tos[int_adj_to].nil?
760
+ ext_fwall_int_adj_tos[int_adj_to] << fwall
761
+ else
762
+ int_fwall_int_adj_tos[int_adj_to] = [] if int_fwall_int_adj_tos[int_adj_to].nil?
763
+ int_fwall_int_adj_tos[int_adj_to] << fwall
764
+ end
765
+ end
766
+
767
+ # Check number of Kiva:Foundation objects
768
+ # We want the lowest possible number that is sufficient, in order to keep runtime performance fast
769
+ assert_equal(num_kiva_objects, model.getFoundationKivas.size)
770
+
771
+ # Check slab exposed perimeters
772
+ slab_int_adj_tos.each do |int_adj_to, slabs|
773
+ osm_props = []
774
+ model.getSurfacePropertyExposedFoundationPerimeters.each do |osm_prop|
775
+ next unless osm_prop.surface.space.get.name.to_s.start_with? int_adj_to
776
+
777
+ osm_props << osm_prop
778
+ end
779
+
780
+ osm_exposed_perimeter = osm_props.map { |p| p.totalExposedPerimeter.get }.sum
781
+ hpxml_exposed_perimeter = slabs.map { |s| s.exposed_perimeter }.sum
782
+ assert_in_epsilon(hpxml_exposed_perimeter, UnitConversions.convert(osm_exposed_perimeter, 'm', 'ft'), 0.01)
783
+ end
784
+
785
+ # Check each Kiva:Foundation has identical slab exposed perimeter and total exterior foundation wall length
786
+ # This is required by Kiva, otherwise you get simulation errors.
787
+ model.getFoundationKivas.each do |foundation|
788
+ osm_exposed_perimeter = 0.0
789
+ model.getSurfacePropertyExposedFoundationPerimeters.each do |osm_prop|
790
+ next unless osm_prop.surface.outsideBoundaryCondition == 'Foundation' && osm_prop.surface.adjacentFoundation.get == foundation
791
+
792
+ osm_exposed_perimeter += UnitConversions.convert(osm_prop.totalExposedPerimeter.get, 'm', 'ft')
793
+ end
794
+
795
+ osm_fwalls = model.getSurfaces.select { |s| s.outsideBoundaryCondition == 'Foundation' && s.adjacentFoundation.get == foundation && s.surfaceType == 'Wall' }
796
+ if not osm_fwalls.empty?
797
+ osm_fwalls_length = osm_fwalls.map { |s| Geometry.get_surface_length(s) }.sum
798
+ assert_in_epsilon(osm_exposed_perimeter, osm_fwalls_length, 0.01)
799
+ end
800
+ end
801
+
802
+ # Check slab areas
803
+ slab_int_adj_tos.each do |int_adj_to, slabs|
804
+ osm_slabs = model.getSurfaces.select { |s| s.surfaceType == 'Floor' && s.outsideBoundaryCondition == 'Foundation' && s.space.get.name.to_s.start_with?(int_adj_to) }
805
+
806
+ osm_area = osm_slabs.map { |s| s.grossArea }.sum
807
+ hpxml_area = slabs.map { |s| s.area }.sum
808
+ assert_in_epsilon(hpxml_area, UnitConversions.convert(osm_area, 'm^2', 'ft^2'), 0.01)
809
+ end
810
+
811
+ # Check exterior foundation wall exposed areas
812
+ ext_fwall_int_adj_tos.each do |int_adj_to, fwalls|
813
+ osm_fwalls = model.getSurfaces.select { |s| s.surfaceType == 'Wall' && s.outsideBoundaryCondition == 'Foundation' && s.space.get.name.to_s.start_with?(int_adj_to) }
814
+
815
+ osm_area = osm_fwalls.map { |s| s.grossArea }.sum
816
+ hpxml_area = fwalls.map { |fw| fw.net_area * fw.exposed_fraction }.sum
817
+ assert_in_epsilon(hpxml_area, UnitConversions.convert(osm_area, 'm^2', 'ft^2'), 0.01)
818
+ end
819
+
820
+ # Check exterior foundation wall heights & below-grade depths
821
+ ext_fwall_int_adj_tos.each do |int_adj_to, fwalls|
822
+ osm_fwalls = model.getSurfaces.select { |s| s.surfaceType == 'Wall' && s.outsideBoundaryCondition == 'Foundation' && s.space.get.name.to_s.start_with?(int_adj_to) }
823
+
824
+ osm_heights = osm_fwalls.map { |s| Geometry.get_surface_height(s) }.uniq.sort
825
+ hpxml_heights = fwalls.map { |fw| fw.height }.uniq.sort
826
+ assert_equal(hpxml_heights, osm_heights)
827
+
828
+ osm_bgdepths = osm_fwalls.map { |s| -1 * Geometry.get_surface_z_values([s]).min }.uniq.sort
829
+ if hpxml_name == 'base-foundation-walkout-basement.xml'
830
+ # All foundation walls similar: single foundation wall w/ effective below-grade depth
831
+ hpxml_bgdepths = [4.5]
832
+ elsif hpxml_name == 'base-foundation-complex.xml'
833
+ # Pairs of foundation walls similar: pairs of foundation walls w/ effective below-grade depths
834
+ hpxml_bgdepths = [4.33333, 4.5]
835
+ else
836
+ hpxml_bgdepths = fwalls.map { |fw| fw.depth_below_grade }.uniq.sort
837
+ end
838
+ assert_equal(hpxml_bgdepths, osm_bgdepths)
839
+ end
840
+
841
+ # Check interior foundation wall heights & below-grade depths
842
+ int_fwall_int_adj_tos.each do |int_adj_to, fwalls|
843
+ osm_fwalls = model.getSurfaces.select { |s| s.surfaceType == 'Wall' && s.outsideBoundaryCondition != 'Foundation' && Geometry.get_surface_z_values([s]).min < 0 && s.space.get.name.to_s.start_with?(int_adj_to) }
844
+
845
+ osm_heights = osm_fwalls.map { |s| Geometry.get_surface_z_values([s]).max - Geometry.get_surface_z_values([s]).min }.uniq.sort
846
+ hpxml_heights = fwalls.map { |fw| fw.height - fw.depth_below_grade }.uniq.sort
847
+ assert_equal(hpxml_heights, osm_heights)
848
+
849
+ osm_bgdepths = osm_fwalls.map { |s| -1 * Geometry.get_surface_z_values([s]).min }.uniq.sort
850
+ hpxml_bgdepths = fwalls.map { |fw| fw.height - fw.depth_below_grade }.uniq.sort
851
+ assert_equal(hpxml_bgdepths, osm_bgdepths)
852
+ end
853
+ end
689
854
  end
690
855
 
691
856
  def test_kiva_initial_temperatures
@@ -701,7 +866,7 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
701
866
  initial_temps.each do |hpxml_name, expected_temp|
702
867
  args_hash = {}
703
868
  args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, hpxml_name))
704
- model, _hpxml = _test_measure(args_hash)
869
+ model, _hpxml, _hpxml_bldg = _test_measure(args_hash)
705
870
 
706
871
  actual_temp = UnitConversions.convert(model.getFoundationKivas[0].initialIndoorAirTemperature.get, 'C', 'F')
707
872
  assert_in_delta(expected_temp, actual_temp, 0.1)
@@ -709,6 +874,8 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
709
874
  end
710
875
 
711
876
  def test_collapse_surfaces
877
+ # Check that multiple similar surfaces are correctly collapsed
878
+ # to reduce EnergyPlus runtime.
712
879
  def split_surfaces(surfaces, should_collapse_surfaces)
713
880
  surf_class = surfaces[0].class
714
881
  for n in 1..surfaces.size
@@ -755,36 +922,36 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
755
922
  surfaces[-1].exposed_perimeter = 0.05 if surf_class == HPXML::Slab
756
923
  end
757
924
 
758
- def get_num_surfaces_by_type(hpxml)
759
- return { roofs: hpxml.roofs.size,
760
- walls: hpxml.walls.size,
761
- rim_joists: hpxml.rim_joists.size,
762
- foundation_walls: hpxml.foundation_walls.size,
763
- floors: hpxml.floors.size,
764
- slabs: hpxml.slabs.size,
765
- windows: hpxml.windows.size,
766
- skylights: hpxml.skylights.size,
767
- doors: hpxml.doors.size }
925
+ def get_num_surfaces_by_type(hpxml_bldg)
926
+ return { roofs: hpxml_bldg.roofs.size,
927
+ walls: hpxml_bldg.walls.size,
928
+ rim_joists: hpxml_bldg.rim_joists.size,
929
+ foundation_walls: hpxml_bldg.foundation_walls.size,
930
+ floors: hpxml_bldg.floors.size,
931
+ slabs: hpxml_bldg.slabs.size,
932
+ windows: hpxml_bldg.windows.size,
933
+ skylights: hpxml_bldg.skylights.size,
934
+ doors: hpxml_bldg.doors.size }
768
935
  end
769
936
 
770
937
  [true, false].each do |should_collapse_surfaces|
771
- hpxml = _create_hpxml('base-enclosure-skylights.xml')
938
+ _hpxml, hpxml_bldg = _create_hpxml('base-enclosure-skylights.xml')
772
939
 
773
- orig_num_surfaces_by_type = get_num_surfaces_by_type(hpxml)
940
+ orig_num_surfaces_by_type = get_num_surfaces_by_type(hpxml_bldg)
774
941
 
775
- split_surfaces(hpxml.roofs, should_collapse_surfaces)
776
- split_surfaces(hpxml.rim_joists, should_collapse_surfaces)
777
- split_surfaces(hpxml.walls, should_collapse_surfaces)
778
- split_surfaces(hpxml.foundation_walls, should_collapse_surfaces)
779
- split_surfaces(hpxml.floors, should_collapse_surfaces)
780
- split_surfaces(hpxml.slabs, should_collapse_surfaces)
781
- split_surfaces(hpxml.windows, should_collapse_surfaces)
782
- split_surfaces(hpxml.skylights, should_collapse_surfaces)
783
- split_surfaces(hpxml.doors, should_collapse_surfaces)
942
+ split_surfaces(hpxml_bldg.roofs, should_collapse_surfaces)
943
+ split_surfaces(hpxml_bldg.rim_joists, should_collapse_surfaces)
944
+ split_surfaces(hpxml_bldg.walls, should_collapse_surfaces)
945
+ split_surfaces(hpxml_bldg.foundation_walls, should_collapse_surfaces)
946
+ split_surfaces(hpxml_bldg.floors, should_collapse_surfaces)
947
+ split_surfaces(hpxml_bldg.slabs, should_collapse_surfaces)
948
+ split_surfaces(hpxml_bldg.windows, should_collapse_surfaces)
949
+ split_surfaces(hpxml_bldg.skylights, should_collapse_surfaces)
950
+ split_surfaces(hpxml_bldg.doors, should_collapse_surfaces)
784
951
 
785
- split_num_surfaces_by_type = get_num_surfaces_by_type(hpxml)
786
- hpxml.collapse_enclosure_surfaces()
787
- final_num_surfaces_by_type = get_num_surfaces_by_type(hpxml)
952
+ split_num_surfaces_by_type = get_num_surfaces_by_type(hpxml_bldg)
953
+ hpxml_bldg.collapse_enclosure_surfaces()
954
+ final_num_surfaces_by_type = get_num_surfaces_by_type(hpxml_bldg)
788
955
 
789
956
  for surf_type in orig_num_surfaces_by_type.keys
790
957
  if should_collapse_surfaces
@@ -794,25 +961,48 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
794
961
  end
795
962
  end
796
963
  end
964
+
965
+ # Check that Slab/DepthBelowGrade is ignored for below-grade spaces when
966
+ # collapsing surfaces.
967
+ args_hash = {}
968
+ args_hash['hpxml_path'] = File.absolute_path(File.join(@sample_files_path, 'base-foundation-walkout-basement.xml'))
969
+ model, _hpxml, _hpxml_bldg = _test_measure(args_hash)
970
+ num_kiva_fnd_objects = model.getFoundationKivas.size
971
+
972
+ hpxml, hpxml_bldg = _create_hpxml('base-foundation-walkout-basement.xml')
973
+ hpxml_bldg.slabs[0].depth_below_grade = hpxml_bldg.foundation_walls[0].depth_below_grade
974
+ hpxml_bldg.slabs[0].area /= 3.0
975
+ hpxml_bldg.slabs[0].exposed_perimeter /= 3.0
976
+ for i in 1..2
977
+ hpxml_bldg.slabs << hpxml_bldg.slabs[0].dup
978
+ hpxml_bldg.slabs[i].id = "Slab#{i + 1}"
979
+ hpxml_bldg.slabs[i].perimeter_insulation_id = "Slab#{i + 1}PerimeterInsulation"
980
+ hpxml_bldg.slabs[i].under_slab_insulation_id = "Slab#{i + 1}UnderSlabInsulation"
981
+ hpxml_bldg.slabs[i].depth_below_grade = hpxml_bldg.foundation_walls[i].depth_below_grade * i / 3.0
982
+ end
983
+ XMLHelper.write_file(hpxml.to_doc, @tmp_hpxml_path)
984
+ args_hash['hpxml_path'] = File.absolute_path(@tmp_hpxml_path)
985
+ model, _hpxml, _hpxml_bldg = _test_measure(args_hash)
986
+ assert_equal(num_kiva_fnd_objects, model.getFoundationKivas.size)
797
987
  end
798
988
 
799
989
  def test_aspect_ratios
800
990
  # Test single-family attached
801
- hpxml = _create_hpxml('base-bldgtype-attached.xml')
802
- wall_outside = hpxml.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOutside && w.interior_adjacent_to == HPXML::LocationLivingSpace }
803
- wall_other_housing_unit = hpxml.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOtherHousingUnit && w.interior_adjacent_to == HPXML::LocationLivingSpace }
991
+ _hpxml, hpxml_bldg = _create_hpxml('base-bldgtype-sfa-unit.xml')
992
+ wall_outside = hpxml_bldg.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOutside && w.interior_adjacent_to == HPXML::LocationConditionedSpace }
993
+ wall_other_housing_unit = hpxml_bldg.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOtherHousingUnit && w.interior_adjacent_to == HPXML::LocationConditionedSpace }
804
994
 
805
- wall_height = hpxml.building_construction.average_ceiling_height
995
+ wall_height = hpxml_bldg.building_construction.average_ceiling_height
806
996
  left_right_wall_length = wall_other_housing_unit.area / wall_height
807
997
  front_back_wall_length = ((wall_outside.area / wall_height) - left_right_wall_length) / 2.0
808
998
  assert_in_delta(0.6667, front_back_wall_length / left_right_wall_length, 0.01)
809
999
 
810
1000
  # Test multifamily
811
- hpxml = _create_hpxml('base-bldgtype-multifamily.xml')
812
- wall_outside = hpxml.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOutside && w.interior_adjacent_to == HPXML::LocationLivingSpace }
813
- wall_other_housing_unit = hpxml.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOtherHousingUnit && w.interior_adjacent_to == HPXML::LocationLivingSpace }
1001
+ _hpxml, hpxml_bldg = _create_hpxml('base-bldgtype-mf-unit.xml')
1002
+ wall_outside = hpxml_bldg.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOutside && w.interior_adjacent_to == HPXML::LocationConditionedSpace }
1003
+ wall_other_housing_unit = hpxml_bldg.walls.find { |w| w.exterior_adjacent_to == HPXML::LocationOtherHousingUnit && w.interior_adjacent_to == HPXML::LocationConditionedSpace }
814
1004
 
815
- wall_height = hpxml.building_construction.average_ceiling_height
1005
+ wall_height = hpxml_bldg.building_construction.average_ceiling_height
816
1006
  left_right_wall_length = wall_other_housing_unit.area / wall_height
817
1007
  front_back_wall_length = ((wall_outside.area / wall_height) - left_right_wall_length) / 2.0
818
1008
  assert_in_delta(0.6667, front_back_wall_length / left_right_wall_length, 0.01)
@@ -969,10 +1159,11 @@ class HPXMLtoOpenStudioEnclosureTest < MiniTest::Test
969
1159
 
970
1160
  File.delete(File.join(File.dirname(__FILE__), 'in.xml'))
971
1161
 
972
- return model, hpxml
1162
+ return model, hpxml, hpxml.buildings[0]
973
1163
  end
974
1164
 
975
1165
  def _create_hpxml(hpxml_name)
976
- return HPXML.new(hpxml_path: File.join(@sample_files_path, hpxml_name))
1166
+ hpxml = HPXML.new(hpxml_path: File.join(@sample_files_path, hpxml_name))
1167
+ return hpxml, hpxml.buildings[0]
977
1168
  end
978
1169
  end