urbanopt-cli 0.10.0 → 0.11.0

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