urbanopt-cli 0.8.3 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (649) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +14 -0
  4. data/CMakeLists.txt +7 -7
  5. data/Gemfile +3 -1
  6. data/README.md +9 -0
  7. data/example_files/Gemfile +23 -16
  8. data/example_files/Gemfile.lock +177 -0
  9. data/example_files/base_workflow_res.osw +57 -14
  10. data/example_files/class_project_coincident.json +1322 -0
  11. data/example_files/class_project_diverse.json +1322 -0
  12. data/example_files/disco/config.json +42 -0
  13. data/example_files/disco/cost_database.xlsx +0 -0
  14. data/example_files/disco/technical_catalog.json +12126 -0
  15. data/example_files/mappers/Baseline.rb +10 -7
  16. data/example_files/mappers/ChilledWaterStorage.rb +98 -0
  17. data/example_files/mappers/ClassProject.rb +110 -0
  18. data/example_files/mappers/CreateBar.rb +1 -0
  19. data/example_files/mappers/HighEfficiency.rb +13 -11
  20. data/example_files/mappers/PeakHoursMelsShedding.rb +72 -0
  21. data/example_files/mappers/PeakHoursThermostatAdjust.rb +78 -0
  22. data/example_files/mappers/ThermalStorage.rb +1 -0
  23. data/example_files/mappers/base_workflow.osw +55 -14
  24. data/example_files/mappers/class_project_workflow.osw +328 -0
  25. data/example_files/mappers/createbar_workflow.osw +16 -16
  26. data/example_files/measures/BuildResidentialModel/measure.rb +7 -1
  27. data/example_files/measures/BuildResidentialModel/measure.xml +1313 -706
  28. data/example_files/opendss/electrical_database.json +1446 -1446
  29. data/example_files/python_deps/dependencies.json +5 -0
  30. data/example_files/python_deps/install_python.ps1 +96 -0
  31. data/example_files/python_deps/install_python.sh +120 -0
  32. data/example_files/residential/clothes_dryer.tsv +11 -11
  33. data/example_files/residential/clothes_washer.tsv +3 -3
  34. data/example_files/residential/dishwasher.tsv +3 -3
  35. data/example_files/resources/hpxml-measures/.github/pull_request_template.md +0 -1
  36. data/example_files/resources/hpxml-measures/.github/workflows/config.yml +8 -21
  37. data/example_files/resources/hpxml-measures/.gitignore +2 -0
  38. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.rb +1272 -1094
  39. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/measure.xml +978 -659
  40. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/resources/geometry.rb +52 -74
  41. data/example_files/resources/hpxml-measures/BuildResidentialHPXML/tests/build_residential_hpxml_test.rb +77 -140
  42. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.rb +30 -27
  43. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/measure.xml +32 -13
  44. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/resources/schedules.rb +55 -51
  45. data/example_files/resources/hpxml-measures/BuildResidentialScheduleFile/tests/build_residential_schedule_file_test.rb +89 -16
  46. data/example_files/resources/hpxml-measures/Changelog.md +65 -0
  47. data/example_files/resources/hpxml-measures/Gemfile +2 -4
  48. data/example_files/resources/hpxml-measures/Gemfile.lock +2 -13
  49. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.rb +276 -300
  50. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/measure.xml +221 -215
  51. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/airflow.rb +215 -170
  52. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/battery.rb +108 -16
  53. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constants.rb +24 -44
  54. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/constructions.rb +564 -197
  55. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/cambium/README.md +8 -8
  56. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/energyplus.rb +1 -0
  57. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/geometry.rb +7 -55
  58. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hotwater_appliances.rb +24 -19
  59. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml.rb +541 -211
  60. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_defaults.rb +300 -172
  61. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXML.xsd +0 -2
  62. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLBaseElements.xsd +230 -141
  63. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schema/HPXMLDataTypes.xsd +145 -137
  64. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/EPvalidator.xml +191 -97
  65. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/iso-schematron.xsd +391 -0
  66. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac.rb +194 -198
  67. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hvac_sizing.rb +140 -145
  68. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/lighting.rb +11 -11
  69. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/location.rb +33 -1
  70. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/materials.rb +4 -4
  71. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/meta_measure.rb +17 -9
  72. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/misc_loads.rb +14 -12
  73. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/output.rb +39 -17
  74. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/psychrometrics.rb +1 -1
  75. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedule_files/battery.csv +8761 -0
  76. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/schedules.rb +114 -57
  77. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/simcontrols.rb +1 -0
  78. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/utility_bills.rb +148 -0
  79. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/version.rb +2 -2
  80. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/waterheater.rb +85 -127
  81. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/weather.rb +26 -32
  82. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlhelper.rb +2 -14
  83. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/xmlvalidator.rb +67 -0
  84. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_airflow.rb +117 -56
  85. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_battery.rb +141 -14
  86. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_defaults.rb +453 -344
  87. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_enclosure.rb +124 -20
  88. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_generator.rb +1 -1
  89. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hotwater_appliance.rb +28 -32
  90. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac.rb +172 -79
  91. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_hvac_sizing.rb +54 -8
  92. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_lighting.rb +3 -3
  93. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_location.rb +4 -4
  94. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_miscloads.rb +7 -7
  95. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_pv.rb +1 -1
  96. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_schedules.rb +6 -9
  97. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_simcontrols.rb +8 -8
  98. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_validation.rb +213 -95
  99. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_water_heater.rb +1 -10
  100. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/tests/test_weather.rb +76 -0
  101. data/example_files/resources/hpxml-measures/README.md +2 -3
  102. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.rb +585 -287
  103. data/example_files/resources/hpxml-measures/ReportSimulationOutput/measure.xml +304 -352
  104. data/example_files/resources/hpxml-measures/ReportSimulationOutput/tests/output_report_test.rb +404 -279
  105. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.rb +222 -501
  106. data/example_files/resources/hpxml-measures/ReportUtilityBills/measure.xml +137 -200
  107. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Annual Charge.json +649 -0
  108. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate Min Monthly Charge.json +649 -0
  109. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Flat Rate.json +647 -0
  110. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Annual Charge.json +8776 -0
  111. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate Min Monthly Charge.json +8776 -0
  112. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Real-Time Pricing Rate.json +8774 -0
  113. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Annual Charge.json +659 -0
  114. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate Min Monthly Charge.json +659 -0
  115. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Rate.json +657 -0
  116. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Annual Charge.json +670 -0
  117. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate Min Monthly Charge.json +670 -0
  118. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Tiered Time-of-Use Rate.json +668 -0
  119. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Annual Charge.json +655 -0
  120. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate Min Monthly Charge.json +655 -0
  121. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/Sample Time-of-Use Rate.json +653 -0
  122. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/detailed_rates/openei_rates.zip +0 -0
  123. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/Average_retail_price_of_electricity.csv +0 -0
  124. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/HouseholdConsumption.csv +0 -0
  125. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/NG_PRI_SUM_A_EPG0_PRS_DMCF_A.csv +0 -0
  126. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPD2F_PRS_DPGAL_W.csv +0 -0
  127. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/PET_PRI_WFR_A_EPLLPA_PRS_DPGAL_W.csv +0 -0
  128. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/{Data/UtilityRates → simple_rates}/README.md +0 -0
  129. data/example_files/resources/hpxml-measures/ReportUtilityBills/resources/util.rb +506 -25
  130. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Contains Demand Charges.json +1312 -0
  131. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Fixed Charge Units.json +657 -0
  132. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Invalid Min Charge Units.json +659 -0
  133. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/JacksonElectricMemberCorp-ResidentialSeniorCitizenLowIncomeAssistance.json +681 -0
  134. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/Missing Required Fields.json +54 -0
  135. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/data.csv +8761 -0
  136. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/utility_bills_test.rb +1006 -235
  137. data/example_files/resources/hpxml-measures/docs/source/conf.py +1 -1
  138. data/example_files/resources/hpxml-measures/docs/source/intro.rst +0 -1
  139. data/example_files/resources/hpxml-measures/docs/source/usage_instructions.rst +2 -2
  140. data/example_files/resources/hpxml-measures/docs/source/workflow_inputs.rst +461 -261
  141. data/example_files/resources/hpxml-measures/docs/source/workflow_outputs.rst +146 -152
  142. data/example_files/resources/hpxml-measures/tasks.rb +616 -802
  143. data/example_files/resources/hpxml-measures/workflow/real_homes/house001.xml +19 -11
  144. data/example_files/resources/hpxml-measures/workflow/real_homes/house002.xml +20 -12
  145. data/example_files/resources/hpxml-measures/workflow/real_homes/house003.xml +12 -7
  146. data/example_files/resources/hpxml-measures/workflow/real_homes/house004.xml +12 -7
  147. data/example_files/resources/hpxml-measures/workflow/real_homes/house005.xml +19 -11
  148. data/example_files/resources/hpxml-measures/workflow/real_homes/house006.xml +12 -7
  149. data/example_files/resources/hpxml-measures/workflow/real_homes/house007.xml +20 -12
  150. data/example_files/resources/hpxml-measures/workflow/real_homes/house008.xml +28 -16
  151. data/example_files/resources/hpxml-measures/workflow/real_homes/house009.xml +28 -17
  152. data/example_files/resources/hpxml-measures/workflow/real_homes/house010.xml +28 -16
  153. data/example_files/resources/hpxml-measures/workflow/real_homes/house011.xml +20 -12
  154. data/example_files/resources/hpxml-measures/workflow/real_homes/house012.xml +20 -12
  155. data/example_files/resources/hpxml-measures/workflow/real_homes/house013.xml +20 -12
  156. data/example_files/resources/hpxml-measures/workflow/real_homes/house014.xml +20 -12
  157. data/example_files/resources/hpxml-measures/workflow/real_homes/house015.xml +20 -12
  158. data/example_files/resources/hpxml-measures/workflow/real_homes/house016.xml +22 -12
  159. data/example_files/resources/hpxml-measures/workflow/real_homes/house017.xml +19 -11
  160. data/example_files/resources/hpxml-measures/workflow/real_homes/house018.xml +20 -12
  161. data/example_files/resources/hpxml-measures/workflow/real_homes/house019.xml +13 -7
  162. data/example_files/resources/hpxml-measures/workflow/real_homes/house020.xml +12 -7
  163. data/example_files/resources/hpxml-measures/workflow/real_homes/house021.xml +31 -16
  164. data/example_files/resources/hpxml-measures/workflow/real_homes/house022.xml +22 -12
  165. data/example_files/resources/hpxml-measures/workflow/real_homes/house023.xml +21 -12
  166. data/example_files/resources/hpxml-measures/workflow/real_homes/house024.xml +37 -22
  167. data/example_files/resources/hpxml-measures/workflow/real_homes/house025.xml +24 -12
  168. data/example_files/resources/hpxml-measures/workflow/real_homes/house026.xml +33 -21
  169. data/example_files/resources/hpxml-measures/workflow/real_homes/house027.xml +28 -16
  170. data/example_files/resources/hpxml-measures/workflow/real_homes/house028.xml +28 -16
  171. data/example_files/resources/hpxml-measures/workflow/real_homes/house029.xml +30 -17
  172. data/example_files/resources/hpxml-measures/workflow/real_homes/house030.xml +10 -7
  173. data/example_files/resources/hpxml-measures/workflow/real_homes/house031.xml +22 -11
  174. data/example_files/resources/hpxml-measures/workflow/real_homes/house032.xml +12 -7
  175. data/example_files/resources/hpxml-measures/workflow/real_homes/house033.xml +18 -12
  176. data/example_files/resources/hpxml-measures/workflow/real_homes/house034.xml +25 -16
  177. data/example_files/resources/hpxml-measures/workflow/real_homes/house035.xml +22 -12
  178. data/example_files/resources/hpxml-measures/workflow/real_homes/house036.xml +20 -12
  179. data/example_files/resources/hpxml-measures/workflow/real_homes/house037.xml +26 -17
  180. data/example_files/resources/hpxml-measures/workflow/real_homes/house038.xml +19 -11
  181. data/example_files/resources/hpxml-measures/workflow/real_homes/house039.xml +25 -16
  182. data/example_files/resources/hpxml-measures/workflow/real_homes/house040.xml +20 -12
  183. data/example_files/resources/hpxml-measures/workflow/real_homes/house041.xml +35 -21
  184. data/example_files/resources/hpxml-measures/workflow/real_homes/house042.xml +28 -17
  185. data/example_files/resources/hpxml-measures/workflow/real_homes/house043.xml +20 -12
  186. data/example_files/resources/hpxml-measures/workflow/real_homes/house044.xml +35 -21
  187. data/example_files/resources/hpxml-measures/workflow/real_homes/house045.xml +20 -12
  188. data/example_files/resources/hpxml-measures/workflow/real_homes/house046.xml +20 -13
  189. data/example_files/resources/hpxml-measures/workflow/real_homes/house047.xml +12 -9
  190. data/example_files/resources/hpxml-measures/workflow/real_homes/house048.xml +25 -14
  191. data/example_files/resources/hpxml-measures/workflow/real_homes/house049.xml +10 -7
  192. data/example_files/resources/hpxml-measures/workflow/real_homes/house050.xml +20 -11
  193. data/example_files/resources/hpxml-measures/workflow/run_simulation.rb +91 -88
  194. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-coal.xml +18 -7
  195. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-portable.xml +546 -535
  196. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-ief-whole-home.xml +546 -535
  197. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier-multiple.xml +555 -544
  198. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-dehumidifier.xml +18 -7
  199. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-gas.xml +18 -7
  200. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-modified.xml +18 -7
  201. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-none.xml +18 -7
  202. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil-location-miami-fl.xml +580 -569
  203. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-oil.xml +18 -7
  204. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane-location-portland-or.xml +580 -569
  205. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-propane.xml +18 -7
  206. data/example_files/resources/hpxml-measures/workflow/sample_files/base-appliances-wood.xml +18 -7
  207. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-cathedral.xml +7 -0
  208. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-conditioned.xml +17 -6
  209. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-flat.xml +7 -0
  210. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-radiant-barrier.xml +18 -7
  211. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-unvented-insulated-roof.xml +18 -7
  212. data/example_files/resources/hpxml-measures/workflow/sample_files/base-atticroof-vented.xml +18 -7
  213. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery-scheduled.xml +600 -0
  214. data/example_files/resources/hpxml-measures/workflow/sample_files/base-battery.xml +598 -587
  215. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multifamily-buffer-space.xml +494 -485
  216. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-multiple.xml +606 -593
  217. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-non-freezing-space.xml +494 -485
  218. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-heated-space.xml +494 -485
  219. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-adjacent-to-other-housing-unit.xml +494 -485
  220. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-calctype-operational.xml +480 -471
  221. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-baseboard.xml +464 -457
  222. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil-ducted.xml +496 -487
  223. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-fan-coil.xml +466 -459
  224. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-chiller-water-loop-heat-pump.xml +518 -509
  225. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-cooling-tower-water-loop-heat-pump.xml +513 -504
  226. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-baseboard.xml +445 -438
  227. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-ducted.xml +476 -467
  228. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil-eae.xml +443 -436
  229. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-fan-coil.xml +446 -439
  230. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-boiler-only-water-loop-heat-pump.xml +494 -485
  231. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-baseboard.xml +445 -438
  232. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil-ducted.xml +476 -467
  233. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-fan-coil.xml +446 -439
  234. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-chiller-only-water-loop-heat-pump.xml +494 -485
  235. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-cooling-tower-only-water-loop-heat-pump.xml +489 -480
  236. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-generator.xml +499 -490
  237. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-ground-loop-ground-to-air-heat-pump.xml +491 -482
  238. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room-multiple-water-heaters.xml +510 -0
  239. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-laundry-room.xml +495 -486
  240. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-multiple.xml +709 -695
  241. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent-preconditioning.xml +528 -519
  242. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-mechvent.xml +512 -503
  243. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-pv.xml +504 -495
  244. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater-recirc.xml +497 -488
  245. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily-shared-water-heater.xml +490 -481
  246. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-multifamily.xml +487 -478
  247. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-2stories.xml +639 -628
  248. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached-atticroof-cathedral.xml +587 -580
  249. data/example_files/resources/hpxml-measures/workflow/sample_files/base-bldgtype-single-family-attached.xml +639 -628
  250. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-defaults.xml +539 -528
  251. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon.xml +644 -633
  252. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational-misc-loads-large-uncommon2.xml +644 -633
  253. data/example_files/resources/hpxml-measures/workflow/sample_files/base-calctype-operational.xml +575 -564
  254. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless-outside.xml +16 -7
  255. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-combi-tankless.xml +16 -7
  256. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-2-speed.xml +18 -7
  257. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-gshp.xml +585 -574
  258. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-hpwh.xml +18 -7
  259. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-tankless.xml +18 -7
  260. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater-var-speed.xml +18 -7
  261. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-desuperheater.xml +18 -7
  262. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-dwhr.xml +18 -7
  263. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-detailed-setpoints.xml +536 -0
  264. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-dse.xml +16 -7
  265. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-outside.xml +16 -7
  266. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-standbyloss.xml +20 -8
  267. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect-with-solar-fraction.xml +16 -7
  268. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-indirect.xml +16 -7
  269. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-electric.xml +18 -7
  270. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-gas.xml +18 -7
  271. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-hpwh.xml +18 -7
  272. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-jacket-indirect.xml +16 -7
  273. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-low-flow-fixtures.xml +18 -7
  274. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-multiple.xml +16 -7
  275. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-none.xml +18 -7
  276. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-demand.xml +19 -8
  277. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-manual.xml +19 -8
  278. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-nocontrol.xml +19 -8
  279. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-temperature.xml +19 -8
  280. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-recirc-timer.xml +19 -8
  281. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-evacuated-tube.xml +18 -7
  282. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-flat-plate.xml +18 -7
  283. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-direct-ics.xml +18 -7
  284. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-fraction.xml +18 -7
  285. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-indirect-flat-plate.xml +18 -7
  286. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-solar-thermosyphon-flat-plate.xml +18 -7
  287. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-coal.xml +18 -7
  288. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-detailed-setpoints.xml +582 -571
  289. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-elec-uef.xml +583 -572
  290. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-outside.xml +18 -7
  291. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef-fhr.xml +584 -573
  292. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas-uef.xml +584 -573
  293. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-gas.xml +18 -7
  294. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-detailed-schedules.xml +583 -572
  295. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-operating-mode-heat-pump-only.xml +585 -574
  296. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-outside.xml +18 -7
  297. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-uef.xml +582 -571
  298. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar-fraction.xml +18 -7
  299. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump-with-solar.xml +18 -7
  300. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-heat-pump.xml +18 -7
  301. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified-detailed-occupancy-stochastic.xml +586 -575
  302. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-model-type-stratified.xml +585 -574
  303. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-oil.xml +18 -7
  304. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tank-wood.xml +18 -7
  305. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-detailed-setpoints.xml +580 -569
  306. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-outside.xml +18 -7
  307. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric-uef.xml +580 -569
  308. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-electric.xml +18 -7
  309. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-uef.xml +580 -569
  310. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar-fraction.xml +18 -7
  311. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas-with-solar.xml +18 -7
  312. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-gas.xml +18 -7
  313. data/example_files/resources/hpxml-measures/workflow/sample_files/base-dhw-tankless-propane.xml +18 -7
  314. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories-garage.xml +28 -11
  315. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-2stories.xml +20 -7
  316. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-1.xml +18 -7
  317. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-2.xml +18 -7
  318. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-4.xml +18 -7
  319. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-beds-5.xml +18 -7
  320. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-ceilingtypes.xml +607 -0
  321. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-floortypes.xml +550 -0
  322. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-garage.xml +27 -12
  323. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-ach-house-pressure.xml +18 -7
  324. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm-house-pressure.xml +18 -7
  325. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-cfm50.xml +18 -7
  326. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-flue.xml +18 -7
  327. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-infil-natural-ach.xml +18 -7
  328. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-orientations.xml +589 -578
  329. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-overhangs.xml +18 -7
  330. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-rooftypes.xml +18 -7
  331. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-physical-properties.xml +619 -608
  332. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-shading.xml +620 -609
  333. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights-storms.xml +618 -607
  334. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-skylights.xml +18 -7
  335. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-level.xml +537 -526
  336. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces.xml +90 -43
  337. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-split-surfaces2.xml +2507 -2460
  338. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-thermal-mass.xml +595 -584
  339. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-walltypes.xml +19 -8
  340. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-natural-ventilation-availability.xml +584 -0
  341. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-none.xml +18 -7
  342. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-physical-properties.xml +594 -583
  343. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-shading.xml +597 -586
  344. data/example_files/resources/hpxml-measures/workflow/sample_files/base-enclosure-windows-storms.xml +598 -587
  345. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-ambient.xml +27 -12
  346. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-basement-garage.xml +671 -656
  347. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-complex.xml +18 -7
  348. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-basement-slab-insulation.xml +18 -7
  349. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-foundation-conditioned-basement-wall-interior-insulation.xml → base-foundation-conditioned-basement-wall-insulation.xml} +585 -574
  350. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-conditioned-crawlspace.xml +582 -571
  351. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-multiple.xml +35 -16
  352. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-slab.xml +18 -7
  353. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-above-grade.xml +27 -12
  354. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-assembly-r.xml +27 -12
  355. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement-wall-insulation.xml +27 -12
  356. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unconditioned-basement.xml +27 -12
  357. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-unvented-crawlspace.xml +27 -12
  358. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-vented-crawlspace.xml +27 -12
  359. data/example_files/resources/hpxml-measures/workflow/sample_files/base-foundation-walkout-basement.xml +18 -7
  360. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-backup-lockout-temperature.xml +586 -575
  361. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  362. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-heating-only.xml +580 -569
  363. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed-seer2-hspf2.xml +583 -0
  364. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-1-speed.xml +18 -7
  365. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-2-speed.xml +18 -7
  366. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler-switchover-temperature.xml +600 -589
  367. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-boiler.xml +599 -588
  368. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed-backup-furnace.xml +629 -616
  369. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-air-to-air-heat-pump-var-speed.xml +18 -7
  370. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-cooling-only.xml +573 -562
  371. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-heating-only.xml +579 -568
  372. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-acca.xml +581 -570
  373. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-hers.xml +581 -570
  374. 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 +582 -0
  375. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-1-speed-sizing-methodology-maxload.xml +581 -570
  376. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-acca.xml +581 -570
  377. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-hers.xml +581 -570
  378. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-2-speed-sizing-methodology-maxload.xml +581 -570
  379. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-boiler.xml +598 -587
  380. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-backup-furnace.xml +628 -615
  381. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-acca.xml +581 -570
  382. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-hers.xml +581 -570
  383. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-air-to-air-heat-pump-var-speed-sizing-methodology-maxload.xml +581 -570
  384. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-elec-only.xml +535 -526
  385. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-central-ac-1-speed.xml +589 -578
  386. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-boiler-gas-only.xml +536 -527
  387. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-1-speed.xml +18 -7
  388. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-2-speed.xml +565 -554
  389. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-only-var-speed.xml +565 -554
  390. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  391. 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 +582 -571
  392. 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 +582 -571
  393. 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 +582 -571
  394. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  395. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-elec-resistance-only.xml +526 -517
  396. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-evap-cooler-furnace-gas.xml +573 -562
  397. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-floor-furnace-propane-only.xml +529 -520
  398. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-elec-only.xml +565 -554
  399. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-2-speed.xml +580 -569
  400. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-central-ac-var-speed.xml +580 -569
  401. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-only.xml +565 -554
  402. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-furnace-gas-room-ac.xml +578 -567
  403. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-cooling-only.xml +575 -564
  404. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-heating-only.xml +581 -570
  405. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-acca.xml +583 -572
  406. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-hers.xml +583 -572
  407. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ground-to-air-heat-pump-sizing-methodology-maxload.xml +583 -572
  408. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-air-conditioner-only-ducted.xml +18 -7
  409. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  410. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  411. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-acca.xml +580 -569
  412. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-hers.xml +580 -569
  413. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ducted-sizing-methodology-maxload.xml +580 -569
  414. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-mini-split-heat-pump-ductless-backup-stove.xml +551 -542
  415. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac-with-heating.xml +532 -530
  416. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-ptac.xml +525 -516
  417. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-acca.xml +541 -532
  418. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-hers.xml +541 -532
  419. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-pthp-sizing-methodology-maxload.xml +541 -532
  420. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-only.xml +525 -516
  421. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-heating.xml +533 -0
  422. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-acca.xml +542 -0
  423. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-hers.xml +542 -0
  424. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-room-ac-with-reverse-cycle-sizing-methodology-maxload.xml +542 -0
  425. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-stove-oil-only.xml +529 -520
  426. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize-wall-furnace-elec-only.xml +529 -520
  427. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-autosize.xml +580 -569
  428. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-coal-only.xml +16 -7
  429. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-elec-only.xml +16 -7
  430. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-central-ac-1-speed.xml +18 -7
  431. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-gas-only.xml +16 -7
  432. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-oil-only.xml +16 -7
  433. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-propane-only.xml +16 -7
  434. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-boiler-wood-only.xml +16 -7
  435. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed-seer2.xml +567 -0
  436. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-1-speed.xml +18 -7
  437. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-2-speed.xml +18 -7
  438. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-only-var-speed.xml +18 -7
  439. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-central-ac-plus-air-to-air-heat-pump-heating.xml +18 -7
  440. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dse.xml +16 -7
  441. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed-electric.xml +18 -7
  442. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-1-speed.xml +18 -7
  443. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-2-speed.xml +18 -7
  444. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-air-to-air-heat-pump-var-speed.xml +18 -7
  445. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-dual-fuel-mini-split-heat-pump-ducted.xml +18 -7
  446. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-fractions.xml +611 -598
  447. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-area-multipliers.xml +589 -0
  448. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-cfm50.xml +582 -571
  449. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ducts-leakage-percent.xml +18 -7
  450. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-elec-resistance-only.xml +16 -7
  451. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-furnace-gas.xml +18 -7
  452. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only-ducted.xml +17 -7
  453. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-evap-cooler-only.xml +16 -7
  454. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fireplace-wood-only.xml +530 -521
  455. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-fixed-heater-gas-only.xml +530 -521
  456. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-floor-furnace-propane-only.xml +530 -521
  457. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-coal-only.xml +566 -555
  458. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-central-ac-1-speed.xml +18 -7
  459. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-elec-only.xml +18 -7
  460. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-2-speed.xml +18 -7
  461. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-central-ac-var-speed.xml +18 -7
  462. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only-detailed-setpoints.xml +566 -555
  463. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-only.xml +566 -555
  464. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-gas-room-ac.xml +18 -7
  465. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-oil-only.xml +18 -7
  466. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-propane-only.xml +18 -7
  467. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-wood-only.xml +18 -7
  468. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-furnace-x3-dse.xml +16 -7
  469. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-cooling-only.xml +574 -563
  470. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump-heating-only.xml +581 -570
  471. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ground-to-air-heat-pump.xml +583 -572
  472. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-1-speed.xml +587 -576
  473. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-2-speed.xml +587 -576
  474. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-air-to-air-heat-pump-var-speed.xml +587 -576
  475. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-1-speed.xml +591 -580
  476. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-2-speed.xml +591 -580
  477. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-central-ac-var-speed.xml +591 -580
  478. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-furnace-gas-only.xml +570 -559
  479. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-ground-to-air-heat-pump.xml +586 -575
  480. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-air-conditioner-only-ducted.xml +570 -559
  481. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-install-quality-mini-split-heat-pump-ducted.xml +586 -575
  482. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ducted.xml +18 -7
  483. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-air-conditioner-only-ductless.xml +16 -7
  484. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-cooling-only.xml +18 -7
  485. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted-heating-only.xml +18 -7
  486. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ducted.xml +18 -7
  487. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless-backup-stove.xml +552 -543
  488. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-mini-split-heat-pump-ductless.xml +16 -7
  489. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-multiple.xml +963 -938
  490. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-none.xml +33 -69
  491. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-portable-heater-gas-only.xml +530 -521
  492. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac-with-heating-electricity.xml +535 -0
  493. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-hvac-ptac-with-heating.xml → base-hvac-ptac-with-heating-natural-gas.xml} +23 -21
  494. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-ptac.xml +526 -517
  495. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-pthp.xml +541 -532
  496. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-33percent.xml +16 -7
  497. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-ceer.xml +526 -517
  498. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only-detailed-setpoints.xml +526 -517
  499. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-only.xml +16 -7
  500. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-heating.xml +535 -0
  501. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-room-ac-with-reverse-cycle.xml +542 -0
  502. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-seasons.xml +594 -583
  503. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-schedules.xml +586 -575
  504. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints-daily-setbacks.xml +18 -7
  505. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-setpoints.xml +18 -7
  506. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-oil-only.xml +530 -521
  507. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-stove-wood-pellets-only.xml +530 -521
  508. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized-allow-increased-fixed-capacities.xml +18 -7
  509. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-undersized.xml +18 -7
  510. data/example_files/resources/hpxml-measures/workflow/sample_files/base-hvac-wall-furnace-elec-only.xml +530 -521
  511. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-ceiling-fans.xml +18 -7
  512. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-holiday.xml +18 -7
  513. data/example_files/resources/hpxml-measures/workflow/sample_files/base-lighting-none.xml +18 -7
  514. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-AMY-2012.xml +18 -7
  515. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-baltimore-md.xml +27 -12
  516. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-capetown-zaf.xml +591 -576
  517. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-dallas-tx.xml +18 -7
  518. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-duluth-mn.xml +27 -12
  519. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-helena-mt.xml +582 -571
  520. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-honolulu-hi.xml +537 -526
  521. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-miami-fl.xml +18 -7
  522. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-phoenix-az.xml +537 -526
  523. data/example_files/resources/hpxml-measures/workflow/sample_files/base-location-portland-or.xml +601 -586
  524. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-balanced.xml +18 -7
  525. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-bath-kitchen-fans.xml +18 -7
  526. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-airflow-fraction-zero.xml +601 -587
  527. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-dse.xml +19 -7
  528. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-evap-cooler-only-ducted.xml +20 -7
  529. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-exhaust.xml +607 -0
  530. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis-supplemental-fan-supply.xml +607 -0
  531. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-cfis.xml +21 -7
  532. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv-atre-asre.xml +18 -7
  533. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-erv.xml +18 -7
  534. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust-rated-flow-rate.xml +18 -7
  535. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-exhaust.xml +18 -7
  536. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv-asre.xml +18 -7
  537. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-hrv.xml +18 -7
  538. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-multiple.xml +37 -19
  539. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-supply.xml +18 -7
  540. data/example_files/resources/hpxml-measures/workflow/sample_files/base-mechvent-whole-house-fan.xml +18 -7
  541. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-additional-properties.xml +590 -579
  542. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-none.xml +578 -0
  543. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-detailed-only.xml +632 -0
  544. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv-mixed.xml +614 -0
  545. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills-pv.xml +677 -0
  546. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-bills.xml +593 -0
  547. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-defaults.xml +27 -9
  548. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-emissions.xml +676 -665
  549. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery-scheduled.xml +616 -0
  550. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators-battery.xml +615 -0
  551. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-generators.xml +598 -587
  552. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-ground-conductivity.xml +586 -0
  553. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon.xml +18 -7
  554. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-large-uncommon2.xml +18 -7
  555. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-loads-none.xml +18 -7
  556. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-neighbor-shading.xml +18 -7
  557. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-shielding-of-home.xml +583 -572
  558. data/example_files/resources/hpxml-measures/workflow/sample_files/base-misc-usage-multiplier.xml +18 -7
  559. data/example_files/resources/hpxml-measures/workflow/sample_files/base-multiple-buildings.xml +1700 -1677
  560. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-ah.xml +622 -611
  561. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-garage.xml +697 -682
  562. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-pv-battery-lifetime-model.xml → base-pv-battery-round-trip-efficiency.xml} +20 -11
  563. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery-scheduled.xml +624 -0
  564. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-battery.xml +622 -611
  565. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery-scheduled.xml +640 -0
  566. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators-battery.xml +639 -0
  567. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv-generators.xml +623 -0
  568. data/example_files/resources/hpxml-measures/workflow/sample_files/base-pv.xml +606 -595
  569. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-all-10-mins.xml +582 -571
  570. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-smooth.xml +583 -572
  571. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-10-mins.xml +584 -0
  572. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic-vacancy.xml +583 -572
  573. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-occupancy-stochastic.xml +583 -572
  574. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-schedules.xml +581 -570
  575. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints-daily-setbacks.xml +581 -570
  576. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-detailed-setpoints.xml +581 -570
  577. data/example_files/resources/hpxml-measures/workflow/sample_files/base-schedules-simple.xml +636 -625
  578. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-calendar-year-custom.xml +18 -7
  579. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-custom.xml +27 -14
  580. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-daylight-saving-disabled.xml +21 -10
  581. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-runperiod-1-month.xml +21 -10
  582. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-operating-modes.xml → base-simcontrol-temperature-capacitance-multiplier.xml} +25 -13
  583. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-10-mins.xml +584 -0
  584. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins-occupancy-stochastic-60-mins.xml +584 -0
  585. data/example_files/resources/hpxml-measures/workflow/sample_files/base-simcontrol-timestep-10-mins.xml +18 -7
  586. data/example_files/resources/hpxml-measures/workflow/sample_files/{base-dhw-tank-heat-pump-detailed-setpoints.xml → base-simcontrol-timestep-30-mins.xml} +25 -14
  587. data/example_files/resources/hpxml-measures/workflow/sample_files/base.xml +18 -7
  588. data/example_files/resources/hpxml-measures/workflow/template-build-and-run-hpxml-with-stochastic-occupancy.osw +18 -13
  589. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml-with-stochastic-occupancy.osw +12 -7
  590. data/example_files/resources/hpxml-measures/workflow/template-run-hpxml.osw +8 -24
  591. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AC.xml +366 -358
  592. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L100AL.xml +369 -361
  593. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AC.xml +369 -361
  594. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L110AL.xml +369 -361
  595. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AC.xml +369 -361
  596. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L120AL.xml +369 -361
  597. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AC.xml +369 -361
  598. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L130AL.xml +369 -361
  599. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AC.xml +311 -303
  600. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L140AL.xml +311 -303
  601. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AC.xml +327 -319
  602. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L150AL.xml +327 -319
  603. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AC.xml +332 -324
  604. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L155AL.xml +332 -324
  605. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AC.xml +341 -333
  606. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L160AL.xml +341 -333
  607. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AC.xml +369 -361
  608. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L170AL.xml +369 -361
  609. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AC.xml +369 -361
  610. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L200AL.xml +369 -361
  611. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AC.xml +369 -361
  612. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L202AL.xml +369 -361
  613. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L302XC.xml +383 -379
  614. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L304XC.xml +383 -379
  615. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L322XC.xml +538 -534
  616. data/example_files/resources/hpxml-measures/workflow/tests/ASHRAE_Standard_140/L324XC.xml +550 -546
  617. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results.csv +444 -410
  618. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_ashrae_140.csv +8 -8
  619. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_bills.csv +444 -410
  620. data/example_files/resources/hpxml-measures/workflow/tests/compare.py +18 -4
  621. data/example_files/resources/hpxml-measures/workflow/tests/hpxml_translator_test.rb +133 -288
  622. data/example_files/scripts/convert_urbanopt_to_disco.py +130 -0
  623. data/example_files/scripts/default_control_changes.csv +8 -0
  624. data/example_files/scripts/default_voltage_regulators.csv +3 -0
  625. data/example_files/scripts/read_data.py +331 -0
  626. data/example_files/visualization/input_visualization_feature.html +172 -81
  627. data/example_files/visualization/input_visualization_scenario.html +178 -82
  628. data/example_files/xml_building/17/README.md +2 -2
  629. data/example_files/xml_building/17/unit 1.xml +40 -41
  630. data/example_files/xml_building/17/unit 2.xml +35 -36
  631. data/example_files/xml_building/17/unit 3.xml +35 -36
  632. data/example_files/xml_building/17/unit 4.xml +41 -42
  633. data/lib/uo_cli/version.rb +1 -1
  634. data/lib/uo_cli.rb +596 -96
  635. data/uo_cli.gemspec +6 -5
  636. metadata +121 -36
  637. data/example_files/residential/exhaust.tsv +0 -3
  638. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  642. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  646. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/workflow/tests/base_results/results_hvac_sizing.csv +0 -410
@@ -3,7 +3,7 @@
3
3
  class Constructions
4
4
  # Container class for walls, floors/ceilings, roofs, etc.
5
5
 
6
- def self.apply_wood_stud_wall(runner, model, surfaces, constr_name,
6
+ def self.apply_wood_stud_wall(model, surfaces, constr_name,
7
7
  cavity_r, install_grade, cavity_depth_in, cavity_filled,
8
8
  framing_factor, mat_int_finish, osb_thick_in,
9
9
  rigid_r, mat_ext_finish, inside_film, outside_film,
@@ -62,10 +62,10 @@ class Constructions
62
62
  constr.set_interior_material_properties()
63
63
 
64
64
  # Create and assign construction to surfaces
65
- constr.create_and_assign_constructions(runner, surfaces, model)
65
+ constr.create_and_assign_constructions(surfaces, model)
66
66
  end
67
67
 
68
- def self.apply_double_stud_wall(runner, model, surfaces, constr_name,
68
+ def self.apply_double_stud_wall(model, surfaces, constr_name,
69
69
  cavity_r, install_grade, stud_depth_in, gap_depth_in,
70
70
  framing_factor, framing_spacing, is_staggered,
71
71
  mat_int_finish, osb_thick_in, rigid_r,
@@ -135,10 +135,10 @@ class Constructions
135
135
  constr.set_interior_material_properties()
136
136
 
137
137
  # Create and assign construction to surfaces
138
- constr.create_and_assign_constructions(runner, surfaces, model)
138
+ constr.create_and_assign_constructions(surfaces, model)
139
139
  end
140
140
 
141
- def self.apply_cmu_wall(runner, model, surfaces, constr_name,
141
+ def self.apply_cmu_wall(model, surfaces, constr_name,
142
142
  thick_in, conductivity, density, framing_factor,
143
143
  furring_r, furring_cavity_depth, furring_spacing,
144
144
  mat_int_finish, osb_thick_in, rigid_r,
@@ -206,10 +206,10 @@ class Constructions
206
206
  constr.set_interior_material_properties()
207
207
 
208
208
  # Create and assign construction to surfaces
209
- constr.create_and_assign_constructions(runner, surfaces, model)
209
+ constr.create_and_assign_constructions(surfaces, model)
210
210
  end
211
211
 
212
- def self.apply_icf_wall(runner, model, surfaces, constr_name,
212
+ def self.apply_icf_wall(model, surfaces, constr_name,
213
213
  icf_r, ins_thick_in, concrete_thick_in, framing_factor,
214
214
  mat_int_finish, osb_thick_in, rigid_r,
215
215
  mat_ext_finish, inside_film, outside_film,
@@ -259,10 +259,10 @@ class Constructions
259
259
  constr.set_interior_material_properties()
260
260
 
261
261
  # Create and assign construction to surfaces
262
- constr.create_and_assign_constructions(runner, surfaces, model)
262
+ constr.create_and_assign_constructions(surfaces, model)
263
263
  end
264
264
 
265
- def self.apply_sip_wall(runner, model, surfaces, constr_name, sip_r,
265
+ def self.apply_sip_wall(model, surfaces, constr_name, sip_r,
266
266
  sip_thick_in, framing_factor, sheathing_thick_in,
267
267
  mat_int_finish, osb_thick_in, rigid_r,
268
268
  mat_ext_finish, inside_film, outside_film,
@@ -319,10 +319,10 @@ class Constructions
319
319
  constr.set_interior_material_properties()
320
320
 
321
321
  # Create and assign construction to surfaces
322
- constr.create_and_assign_constructions(runner, surfaces, model)
322
+ constr.create_and_assign_constructions(surfaces, model)
323
323
  end
324
324
 
325
- def self.apply_steel_stud_wall(runner, model, surfaces, constr_name,
325
+ def self.apply_steel_stud_wall(model, surfaces, constr_name,
326
326
  cavity_r, install_grade, cavity_depth,
327
327
  cavity_filled, framing_factor, correction_factor,
328
328
  mat_int_finish, osb_thick_in, rigid_r,
@@ -382,10 +382,10 @@ class Constructions
382
382
  constr.set_interior_material_properties()
383
383
 
384
384
  # Create and assign construction to surfaces
385
- constr.create_and_assign_constructions(runner, surfaces, model)
385
+ constr.create_and_assign_constructions(surfaces, model)
386
386
  end
387
387
 
388
- def self.apply_generic_layered_wall(runner, model, surfaces, constr_name,
388
+ def self.apply_generic_layered_wall(model, surfaces, constr_name,
389
389
  thick_ins, conds, denss, specheats,
390
390
  mat_int_finish, osb_thick_in, rigid_r,
391
391
  mat_ext_finish, inside_film, outside_film,
@@ -452,10 +452,10 @@ class Constructions
452
452
  constr.set_interior_material_properties()
453
453
 
454
454
  # Create and assign construction to surfaces
455
- constr.create_and_assign_constructions(runner, surfaces, model)
455
+ constr.create_and_assign_constructions(surfaces, model)
456
456
  end
457
457
 
458
- def self.apply_rim_joist(runner, model, surfaces, constr_name,
458
+ def self.apply_rim_joist(model, surfaces, constr_name,
459
459
  cavity_r, install_grade, framing_factor,
460
460
  mat_int_finish, osb_thick_in,
461
461
  rigid_r, mat_ext_finish, inside_film,
@@ -512,10 +512,10 @@ class Constructions
512
512
  constr.set_interior_material_properties()
513
513
 
514
514
  # Create and assign construction to surfaces
515
- constr.create_and_assign_constructions(runner, surfaces, model)
515
+ constr.create_and_assign_constructions(surfaces, model)
516
516
  end
517
517
 
518
- def self.apply_open_cavity_roof(runner, model, surfaces, constr_name,
518
+ def self.apply_open_cavity_roof(model, surfaces, constr_name,
519
519
  cavity_r, install_grade, cavity_ins_thick_in,
520
520
  framing_factor, framing_thick_in,
521
521
  osb_thick_in, rigid_r,
@@ -585,10 +585,10 @@ class Constructions
585
585
  constr.set_interior_material_properties() unless has_radiant_barrier
586
586
 
587
587
  # Create and assign construction to roof surfaces
588
- constr.create_and_assign_constructions(runner, surfaces, model)
588
+ constr.create_and_assign_constructions(surfaces, model)
589
589
  end
590
590
 
591
- def self.apply_closed_cavity_roof(runner, model, surfaces, constr_name,
591
+ def self.apply_closed_cavity_roof(model, surfaces, constr_name,
592
592
  cavity_r, install_grade, cavity_depth,
593
593
  filled_cavity, framing_factor, mat_int_finish,
594
594
  osb_thick_in, rigid_r, mat_roofing, has_radiant_barrier,
@@ -655,116 +655,329 @@ class Constructions
655
655
  constr.set_interior_material_properties() unless has_radiant_barrier
656
656
 
657
657
  # Create and assign construction to surfaces
658
- constr.create_and_assign_constructions(runner, surfaces, model)
658
+ constr.create_and_assign_constructions(surfaces, model)
659
659
  end
660
660
 
661
- def self.apply_ceiling(runner, model, surfaces, constr_name,
662
- cavity_r, install_grade, addtl_r,
663
- framing_factor, joist_height_in,
664
- mat_int_finish, inside_film, outside_film)
661
+ def self.apply_wood_frame_floor_ceiling(model, surfaces, constr_name, is_ceiling,
662
+ cavity_r, install_grade,
663
+ framing_factor, joist_height_in,
664
+ plywood_thick_in, rigid_r, mat_int_finish_or_covering,
665
+ inside_film, outside_film)
665
666
 
666
667
  # Interior finish below, open cavity above (e.g., attic floor)
668
+ # Open cavity below, floor covering above (e.g., crawlspace ceiling)
667
669
 
668
670
  return if surfaces.empty?
669
671
 
670
- # Define materials
671
- mat_addtl_ins = nil
672
- if cavity_r == 0
673
- mat_cavity = Material.AirCavityOpen(joist_height_in)
674
- else
675
- if addtl_r > 0
676
- # If there is additional insulation beyond the rafter height,
677
- # these inputs are used for defining an additional layer
678
- addtl_thick_in = addtl_r / 3.0 # Assume roughly R-3 per inch of loose-fill above cavity
679
- mat_addtl_ins = Material.new(name: 'ceiling loosefill ins', thick_in: addtl_thick_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: addtl_thick_in / addtl_r)
672
+ if is_ceiling
673
+ # Define materials
674
+ mat_addtl_ins = nil
675
+ if cavity_r == 0
676
+ mat_cavity = Material.AirCavityOpen(joist_height_in)
677
+ else
678
+ if rigid_r > 0
679
+ # If there is additional insulation beyond the rafter height,
680
+ # these inputs are used for defining an additional layer
681
+ addtl_thick_in = rigid_r / 3.0 # Assume roughly R-3 per inch of loose-fill above cavity
682
+ mat_addtl_ins = Material.new(name: 'ceiling loosefill ins', thick_in: addtl_thick_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: addtl_thick_in / rigid_r)
683
+ end
684
+ mat_cavity = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: joist_height_in / cavity_r)
685
+ end
686
+ mat_framing = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.Wood)
687
+ mat_gap = Material.AirCavityOpen(joist_height_in)
688
+
689
+ # Set paths
690
+ gapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
691
+ path_fracs = [framing_factor, 1 - framing_factor - gapFactor, gapFactor]
692
+
693
+ # Define construction
694
+ constr = Construction.new(constr_name, path_fracs)
695
+ constr.add_layer(outside_film)
696
+ if not mat_addtl_ins.nil?
697
+ constr.add_layer(mat_addtl_ins)
698
+ end
699
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'ceiling stud and cavity')
700
+ if not mat_int_finish_or_covering.nil?
701
+ constr.add_layer(mat_int_finish_or_covering)
702
+ end
703
+ constr.add_layer(inside_film)
704
+ else # floors
705
+ # Define materials
706
+ mat_2x = Material.Stud2x(joist_height_in)
707
+ if cavity_r == 0
708
+ mat_cavity = Material.AirCavityOpen(mat_2x.thick_in)
709
+ else
710
+ mat_cavity = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: mat_2x.thick_in / cavity_r)
711
+ end
712
+ mat_framing = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.Wood)
713
+ mat_gap = Material.AirCavityOpen(joist_height_in)
714
+ mat_rigid = nil
715
+ if rigid_r > 0
716
+ rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
717
+ mat_rigid = Material.new(name: 'floor rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
718
+ end
719
+
720
+ # Set paths
721
+ gapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
722
+ path_fracs = [framing_factor, 1 - framing_factor - gapFactor, gapFactor]
723
+
724
+ # Define construction
725
+ constr = Construction.new(constr_name, path_fracs)
726
+ constr.add_layer(outside_film)
727
+ constr.add_layer([mat_framing, mat_cavity, mat_gap], 'floor stud and cavity')
728
+ if not mat_rigid.nil?
729
+ constr.add_layer(mat_rigid)
730
+ end
731
+ if plywood_thick_in > 0
732
+ constr.add_layer(Material.OSBSheathing(plywood_thick_in))
680
733
  end
681
- mat_cavity = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: joist_height_in / cavity_r)
734
+ if not mat_int_finish_or_covering.nil?
735
+ constr.add_layer(mat_int_finish_or_covering)
736
+ end
737
+ constr.add_layer(inside_film)
738
+ end
739
+
740
+ constr.set_interior_material_properties()
741
+
742
+ # Create and assign construction to surfaces
743
+ constr.create_and_assign_constructions(surfaces, model)
744
+ end
745
+
746
+ def self.apply_steel_frame_floor_ceiling(model, surfaces, constr_name, is_ceiling,
747
+ cavity_r, install_grade,
748
+ framing_factor, correction_factor, joist_height_in,
749
+ plywood_thick_in, rigid_r, mat_int_finish_or_covering,
750
+ inside_film, outside_film)
751
+
752
+ # Interior finish below, open cavity above (e.g., attic floor)
753
+ # Open cavity below, floor covering above (e.g., crawlspace ceiling)
754
+
755
+ return if surfaces.empty?
756
+
757
+ if is_ceiling
758
+ # Define materials
759
+ mat_addtl_ins = nil
760
+ eR = cavity_r * correction_factor # The effective R-value of the cavity insulation with steel stud framing
761
+ if eR == 0
762
+ mat_cavity = Material.AirCavityOpen(joist_height_in)
763
+ else
764
+ if rigid_r > 0
765
+ # If there is additional insulation beyond the rafter height,
766
+ # these inputs are used for defining an additional layer
767
+ addtl_thick_in = rigid_r / 3.0 # Assume roughly R-3 per inch of loose-fill above cavity
768
+ mat_addtl_ins = Material.new(name: 'ceiling loosefill ins', thick_in: addtl_thick_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: addtl_thick_in / rigid_r)
769
+ end
770
+ mat_cavity = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.InsulationGenericLoosefill, k_in: joist_height_in / eR)
771
+ end
772
+ mat_gap = Material.AirCavityOpen(joist_height_in)
773
+
774
+ # Set paths
775
+ gapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
776
+ path_fracs = [1 - gapFactor, gapFactor]
777
+
778
+ # Define construction
779
+ constr = Construction.new(constr_name, path_fracs)
780
+ constr.add_layer(outside_film)
781
+ if not mat_addtl_ins.nil?
782
+ constr.add_layer(mat_addtl_ins)
783
+ end
784
+ constr.add_layer([mat_cavity, mat_gap], 'ceiling stud and cavity')
785
+ if not mat_int_finish_or_covering.nil?
786
+ constr.add_layer(mat_int_finish_or_covering)
787
+ end
788
+ constr.add_layer(inside_film)
789
+ else # floors
790
+ # Define materials
791
+ mat_2x = Material.Stud2x(joist_height_in)
792
+ eR = cavity_r * correction_factor # The effective R-value of the cavity insulation with steel stud framing
793
+ if eR == 0
794
+ mat_cavity = Material.AirCavityOpen(mat_2x.thick_in)
795
+ else
796
+ mat_cavity = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: mat_2x.thick_in / eR)
797
+ end
798
+ mat_gap = Material.AirCavityOpen(joist_height_in)
799
+ mat_rigid = nil
800
+ if rigid_r > 0
801
+ rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
802
+ mat_rigid = Material.new(name: 'floor rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
803
+ end
804
+
805
+ # Set paths
806
+ gapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
807
+ path_fracs = [1 - gapFactor, gapFactor]
808
+
809
+ # Define construction
810
+ constr = Construction.new(constr_name, path_fracs)
811
+ constr.add_layer(outside_film)
812
+ constr.add_layer([mat_cavity, mat_gap], 'floor stud and cavity')
813
+ if not mat_rigid.nil?
814
+ constr.add_layer(mat_rigid)
815
+ end
816
+ if plywood_thick_in > 0
817
+ constr.add_layer(Material.OSBSheathing(plywood_thick_in))
818
+ end
819
+ if not mat_int_finish_or_covering.nil?
820
+ constr.add_layer(mat_int_finish_or_covering)
821
+ end
822
+ constr.add_layer(inside_film)
823
+ end
824
+
825
+ constr.set_interior_material_properties()
826
+
827
+ # Create and assign construction to surfaces
828
+ constr.create_and_assign_constructions(surfaces, model)
829
+ end
830
+
831
+ def self.apply_sip_floor_ceiling(model, surfaces, constr_name, is_ceiling,
832
+ sip_r, sip_thick_in, framing_factor,
833
+ mat_int_finish, osb_thick_in, rigid_r,
834
+ mat_ext_finish, inside_film, outside_film,
835
+ solar_absorptance = nil, emittance = nil)
836
+
837
+ return if surfaces.empty?
838
+
839
+ if is_ceiling
840
+ constr_type = HPXML::FloorOrCeilingCeiling
841
+ else
842
+ constr_type = HPXML::FloorOrCeilingFloor
843
+ end
844
+
845
+ # Define materials
846
+ spline_thick_in = 0.5
847
+ ins_thick_in = sip_thick_in - (2.0 * spline_thick_in) # in
848
+ mat_framing_inner_outer = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.Wood)
849
+ mat_framing_middle = Material.new(thick_in: ins_thick_in, mat_base: BaseMaterial.Wood)
850
+ mat_spline = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.Wood)
851
+ mat_ins_inner_outer = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: sip_thick_in / sip_r)
852
+ mat_ins_middle = Material.new(thick_in: ins_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: sip_thick_in / sip_r)
853
+ mat_osb = nil
854
+ if osb_thick_in > 0
855
+ mat_osb = Material.OSBSheathing(osb_thick_in)
856
+ end
857
+ mat_rigid = nil
858
+ if rigid_r > 0
859
+ rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
860
+ mat_rigid = Material.new(name: "#{constr_type} rigid ins", thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
682
861
  end
683
- mat_framing = Material.new(thick_in: joist_height_in, mat_base: BaseMaterial.Wood)
684
- mat_gap = Material.AirCavityOpen(joist_height_in)
685
862
 
686
863
  # Set paths
687
- gapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
688
- path_fracs = [framing_factor, 1 - framing_factor - gapFactor, gapFactor]
864
+ spline_frac = 4.0 / 48.0 # One 4" spline for every 48" wide panel
865
+ cavity_frac = 1.0 - (spline_frac + framing_factor)
866
+ path_fracs = [framing_factor, spline_frac, cavity_frac]
689
867
 
690
868
  # Define construction
691
869
  constr = Construction.new(constr_name, path_fracs)
692
870
  constr.add_layer(outside_film)
693
- if not mat_addtl_ins.nil?
694
- constr.add_layer(mat_addtl_ins)
871
+ if not mat_ext_finish.nil?
872
+ constr.add_layer(mat_ext_finish)
873
+ end
874
+ constr.add_layer([mat_framing_inner_outer, mat_spline, mat_ins_inner_outer], "#{constr_type} spline layer")
875
+ constr.add_layer([mat_framing_middle, mat_ins_middle, mat_ins_middle], "#{constr_type} ins layer")
876
+ constr.add_layer([mat_framing_inner_outer, mat_spline, mat_ins_inner_outer], "#{constr_type} spline layer")
877
+ if not mat_rigid.nil?
878
+ constr.add_layer(mat_rigid)
879
+ end
880
+ if not mat_osb.nil?
881
+ constr.add_layer(mat_osb)
695
882
  end
696
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'ceiling stud and cavity')
697
883
  if not mat_int_finish.nil?
698
884
  constr.add_layer(mat_int_finish)
699
885
  end
700
886
  constr.add_layer(inside_film)
701
887
 
702
- constr.set_interior_material_properties(debug: true)
888
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
889
+ constr.set_interior_material_properties()
703
890
 
704
- # Create and assign construction to ceiling surfaces
705
- constr.create_and_assign_constructions(runner, surfaces, model)
891
+ # Create and assign construction to surfaces
892
+ constr.create_and_assign_constructions(surfaces, model)
706
893
  end
707
894
 
708
- def self.apply_floor(runner, model, surfaces, constr_name,
709
- cavity_r, install_grade,
710
- framing_factor, joist_height_in,
711
- plywood_thick_in, rigid_r, mat_floor_covering,
712
- inside_film, outside_film)
713
-
714
- # Open cavity below, floor covering above (e.g., crawlspace ceiling)
895
+ def self.apply_generic_layered_floor_ceiling(model, surfaces, constr_name, is_ceiling,
896
+ thick_ins, conds, denss, specheats,
897
+ mat_int_finish, osb_thick_in, rigid_r,
898
+ mat_ext_finish, inside_film, outside_film,
899
+ solar_absorptance = nil, emittance = nil)
715
900
 
716
901
  return if surfaces.empty?
717
902
 
718
- # Define materials
719
- mat_2x = Material.Stud2x(joist_height_in)
720
- if cavity_r == 0
721
- mat_cavity = Material.AirCavityOpen(mat_2x.thick_in)
903
+ if is_ceiling
904
+ constr_type = HPXML::FloorOrCeilingCeiling
722
905
  else
723
- mat_cavity = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.InsulationGenericDensepack, k_in: mat_2x.thick_in / cavity_r)
906
+ constr_type = HPXML::FloorOrCeilingFloor
907
+ end
908
+
909
+ # Validate inputs
910
+ for idx in 0..4
911
+ if (thick_ins[idx].nil? != conds[idx].nil?) || (thick_ins[idx].nil? != denss[idx].nil?) || (thick_ins[idx].nil? != specheats[idx].nil?)
912
+ fail "Layer #{idx + 1} does not have all four properties (thickness, conductivity, density, specific heat) entered."
913
+ end
914
+ end
915
+
916
+ # Define materials
917
+ mats = []
918
+ mats << Material.new(name: "#{constr_type} layer 1", thick_in: thick_ins[0], k_in: conds[0], rho: denss[0], cp: specheats[0])
919
+ if not thick_ins[1].nil?
920
+ mats << Material.new(name: "#{constr_type} layer 2", thick_in: thick_ins[1], k_in: conds[1], rho: denss[1], cp: specheats[1])
921
+ end
922
+ if not thick_ins[2].nil?
923
+ mats << Material.new(name: "#{constr_type} layer 3", thick_in: thick_ins[2], k_in: conds[2], rho: denss[2], cp: specheats[2])
924
+ end
925
+ if not thick_ins[3].nil?
926
+ mats << Material.new(name: "#{constr_type} layer 4", thick_in: thick_ins[3], k_in: conds[3], rho: denss[3], cp: specheats[3])
927
+ end
928
+ if not thick_ins[4].nil?
929
+ mats << Material.new(name: "#{constr_type} layer 5", thick_in: thick_ins[4], k_in: conds[4], rho: denss[4], cp: specheats[4])
930
+ end
931
+ mat_osb = nil
932
+ if osb_thick_in > 0
933
+ mat_osb = Material.OSBSheathing(osb_thick_in)
724
934
  end
725
- mat_framing = Material.new(thick_in: mat_2x.thick_in, mat_base: BaseMaterial.Wood)
726
- mat_gap = Material.AirCavityOpen(joist_height_in)
727
935
  mat_rigid = nil
728
936
  if rigid_r > 0
729
937
  rigid_thick_in = rigid_r * BaseMaterial.InsulationRigid.k_in
730
- mat_rigid = Material.new(name: 'floor rigid ins', thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
938
+ mat_rigid = Material.new(name: "#{constr_type} rigid ins", thick_in: rigid_thick_in, mat_base: BaseMaterial.InsulationRigid, k_in: rigid_thick_in / rigid_r)
731
939
  end
732
940
 
733
941
  # Set paths
734
- gapFactor = get_gap_factor(install_grade, framing_factor, cavity_r)
735
- path_fracs = [framing_factor, 1 - framing_factor - gapFactor, gapFactor]
942
+ path_fracs = [1]
736
943
 
737
944
  # Define construction
738
945
  constr = Construction.new(constr_name, path_fracs)
739
946
  constr.add_layer(outside_film)
740
- constr.add_layer([mat_framing, mat_cavity, mat_gap], 'floor stud and cavity')
947
+ if not mat_ext_finish.nil?
948
+ constr.add_layer(mat_ext_finish)
949
+ end
950
+ mats.each do |mat|
951
+ constr.add_layer(mat)
952
+ end
741
953
  if not mat_rigid.nil?
742
954
  constr.add_layer(mat_rigid)
743
955
  end
744
- if plywood_thick_in > 0
745
- constr.add_layer(Material.OSBSheathing(plywood_thick_in))
956
+ if not mat_osb.nil?
957
+ constr.add_layer(mat_osb)
746
958
  end
747
- if not mat_floor_covering.nil?
748
- constr.add_layer(mat_floor_covering)
959
+ if not mat_int_finish.nil?
960
+ constr.add_layer(mat_int_finish)
749
961
  end
750
962
  constr.add_layer(inside_film)
751
963
 
964
+ constr.set_exterior_material_properties(solar_absorptance, emittance)
752
965
  constr.set_interior_material_properties()
753
966
 
754
967
  # Create and assign construction to surfaces
755
- constr.create_and_assign_constructions(runner, surfaces, model)
968
+ constr.create_and_assign_constructions(surfaces, model)
756
969
  end
757
970
 
758
- def self.apply_foundation_wall(runner, model, surfaces, constr_name,
971
+ def self.apply_foundation_wall(model, surfaces, constr_name,
759
972
  ext_rigid_ins_offset, int_rigid_ins_offset, ext_rigid_ins_height,
760
973
  int_rigid_ins_height, ext_rigid_r, int_rigid_r, mat_int_finish,
761
- mat_wall, height_above_grade)
974
+ mat_wall, height_above_grade, soil_k_in)
762
975
 
763
976
  # Create Kiva foundation
764
977
  foundation = apply_kiva_walled_foundation(model, ext_rigid_r, int_rigid_r, ext_rigid_ins_offset,
765
978
  int_rigid_ins_offset, ext_rigid_ins_height,
766
979
  int_rigid_ins_height, height_above_grade,
767
- mat_wall.thick_in, mat_int_finish)
980
+ mat_wall.thick_in, mat_int_finish, soil_k_in)
768
981
 
769
982
  # Define construction
770
983
  constr = Construction.new(constr_name, [1])
@@ -774,7 +987,7 @@ class Constructions
774
987
  end
775
988
 
776
989
  # Create and assign construction to surfaces
777
- constr.create_and_assign_constructions(runner, surfaces, model)
990
+ constr.create_and_assign_constructions(surfaces, model)
778
991
 
779
992
  # Assign surfaces to Kiva foundation
780
993
  surfaces.each do |surface|
@@ -782,11 +995,11 @@ class Constructions
782
995
  end
783
996
  end
784
997
 
785
- def self.apply_foundation_slab(runner, model, surface, constr_name,
998
+ def self.apply_foundation_slab(model, surface, constr_name,
786
999
  under_r, under_width, gap_r,
787
1000
  perimeter_r, perimeter_depth,
788
1001
  whole_r, concrete_thick_in, exposed_perimeter,
789
- mat_carpet, foundation)
1002
+ mat_carpet, soil_k_in, foundation)
790
1003
 
791
1004
  return if surface.nil?
792
1005
 
@@ -795,7 +1008,7 @@ class Constructions
795
1008
  thick = UnitConversions.convert(concrete_thick_in, 'in', 'ft')
796
1009
  foundation = create_kiva_slab_foundation(model, under_r, under_width,
797
1010
  gap_r, thick, perimeter_r, perimeter_depth,
798
- concrete_thick_in)
1011
+ concrete_thick_in, soil_k_in)
799
1012
  else
800
1013
  # Kiva foundation (for crawlspace/basement) exists
801
1014
  if (under_r > 0) && (under_width > 0)
@@ -813,7 +1026,7 @@ class Constructions
813
1026
  mat_concrete = Material.Concrete(concrete_thick_in)
814
1027
  else
815
1028
  # Use 0.5 - 1.0 inches of soil, per Neal Kruis recommendation
816
- mat_soil = Material.Soil(0.5)
1029
+ mat_soil = Material.Soil(0.5, soil_k_in)
817
1030
  end
818
1031
  mat_rigid = nil
819
1032
  if whole_r > 0
@@ -837,14 +1050,14 @@ class Constructions
837
1050
  end
838
1051
 
839
1052
  # Create and assign construction to surfaces
840
- constr.create_and_assign_constructions(runner, [surface], model)
1053
+ constr.create_and_assign_constructions([surface], model)
841
1054
 
842
1055
  # Assign surface to Kiva foundation
843
1056
  surface.setAdjacentFoundation(foundation)
844
1057
  surface.createSurfacePropertyExposedFoundationPerimeter('TotalExposedPerimeter', UnitConversions.convert(exposed_perimeter, 'ft', 'm'))
845
1058
  end
846
1059
 
847
- def self.apply_door(runner, model, subsurfaces, constr_name, ufactor, inside_film, outside_film)
1060
+ def self.apply_door(model, subsurfaces, constr_name, ufactor, inside_film, outside_film)
848
1061
  return if subsurfaces.empty?
849
1062
 
850
1063
  # Define materials
@@ -860,52 +1073,33 @@ class Constructions
860
1073
  constr.add_layer(fin_door_mat)
861
1074
 
862
1075
  # Create and assign construction to subsurfaces
863
- constr.create_and_assign_constructions(runner, subsurfaces, model)
1076
+ constr.create_and_assign_constructions(subsurfaces, model)
864
1077
  end
865
1078
 
866
- def self.apply_window(runner, model, subsurface, constr_name, ufactor, shgc)
867
- apply_window_skylight(runner, model, 'Window', subsurface, constr_name, ufactor, shgc)
1079
+ def self.apply_window(model, subsurface, constr_name, ufactor, shgc)
1080
+ apply_window_skylight(model, 'Window', subsurface, constr_name, ufactor, shgc)
868
1081
  end
869
1082
 
870
- def self.apply_skylight(runner, model, subsurface, constr_name, ufactor, shgc)
871
- apply_window_skylight(runner, model, 'Skylight', subsurface, constr_name, ufactor, shgc)
1083
+ def self.apply_skylight(model, subsurface, constr_name, ufactor, shgc)
1084
+ apply_window_skylight(model, 'Skylight', subsurface, constr_name, ufactor, shgc)
872
1085
  end
873
1086
 
874
- def self.apply_partition_walls(runner, model, constr_name, mat_int_finish, partition_wall_area,
875
- basement_frac_of_cfa, living_space)
876
-
877
- imdefs = []
878
-
879
- # Determine additional partition wall mass required
880
- addtl_surface_area_base = partition_wall_area * basement_frac_of_cfa
881
- addtl_surface_area_lv = partition_wall_area * (1.0 - basement_frac_of_cfa)
1087
+ def self.apply_partition_walls(model, constr_name, mat_int_finish, partition_wall_area, spaces)
1088
+ return if partition_wall_area <= 0
882
1089
 
883
- if addtl_surface_area_lv > 0
884
- # Add remaining partition walls within spaces (those without geometric representation)
885
- # as internal mass object.
886
- obj_name = 'partition wall mass above grade'
887
- imdef = create_os_int_mass_and_def(model, obj_name, living_space, addtl_surface_area_lv)
888
- imdefs << imdef
889
- end
890
-
891
- if addtl_surface_area_base > 0
892
- # Add remaining partition walls within spaces (those without geometric representation)
893
- # as internal mass object.
894
- obj_name = 'partition wall mass below grade'
895
- imdef = create_os_int_mass_and_def(model, obj_name, living_space, addtl_surface_area_base)
896
- imdefs << imdef
897
- end
1090
+ # Add remaining partition walls within spaces (those without geometric representation)
1091
+ # as internal mass object.
1092
+ obj_name = 'partition wall mass'
1093
+ imdef = create_os_int_mass_and_def(model, obj_name, spaces[HPXML::LocationLivingSpace], partition_wall_area)
898
1094
 
899
- apply_wood_stud_wall(runner, model, imdefs, constr_name,
1095
+ apply_wood_stud_wall(model, [imdef], constr_name,
900
1096
  0, 1, 3.5, false, 0.16,
901
1097
  mat_int_finish, 0, 0, mat_int_finish,
902
1098
  Material.AirFilmVertical,
903
1099
  Material.AirFilmVertical)
904
1100
  end
905
1101
 
906
- def self.apply_furniture(runner, model, furniture_mass, cfa, ubfa, gfa,
907
- basement_frac_of_cfa, living_space)
908
-
1102
+ def self.apply_furniture(model, furniture_mass, spaces)
909
1103
  if furniture_mass.type == HPXML::FurnitureMassTypeLightWeight
910
1104
  mass_lb_per_sqft = 8.0
911
1105
  mat = BaseMaterial.FurnitureLightWeight
@@ -915,29 +1109,28 @@ class Constructions
915
1109
  end
916
1110
 
917
1111
  # Add user-specified furniture mass
918
- model.getSpaces.each do |space|
1112
+ spaces.each do |location, space|
1113
+ floor_area = UnitConversions.convert(space.floorArea, 'm^2', 'ft^2')
1114
+ next if floor_area <= 0
1115
+
919
1116
  furnAreaFraction = nil # Fraction of conditioned floor area
920
1117
  furnConductivity = mat.k_in
921
1118
  furnSolarAbsorptance = 0.6
922
1119
  furnSpecHeat = mat.cp
923
1120
  furnDensity = mat.rho
924
- if space == living_space
1121
+ if location == HPXML::LocationLivingSpace
925
1122
  furnAreaFraction = furniture_mass.area_fraction
926
1123
  furnMass = mass_lb_per_sqft
927
- floor_area = cfa
928
- elsif Geometry.is_unconditioned_basement(space)
1124
+ elsif location == HPXML::LocationBasementUnconditioned
929
1125
  furnAreaFraction = 0.4
930
1126
  furnMass = mass_lb_per_sqft
931
- floor_area = ubfa
932
- elsif Geometry.is_garage(space)
1127
+ elsif location == HPXML::LocationGarage
933
1128
  furnAreaFraction = 0.1
934
1129
  furnMass = 2.0
935
- floor_area = gfa
936
1130
  end
937
1131
 
938
1132
  next if furnAreaFraction.nil?
939
1133
  next if furnAreaFraction <= 0
940
- next if space.floorArea <= 0
941
1134
 
942
1135
  mat_obj_name_space = "#{Constants.ObjectNameFurniture} material #{space.name}"
943
1136
  constr_obj_name_space = "#{Constants.ObjectNameFurniture} construction #{space.name}"
@@ -955,30 +1148,11 @@ class Constructions
955
1148
  constr = Construction.new(constr_obj_name_space, path_fracs)
956
1149
  constr.add_layer(mat_fm)
957
1150
 
958
- imdefs = []
959
- if space == living_space
960
- # if living space, judge if includes conditioned basement, create furniture independently
961
- living_surface_area = furnAreaFraction * floor_area * (1 - basement_frac_of_cfa)
962
- base_surface_area = furnAreaFraction * floor_area * basement_frac_of_cfa
963
- # living furniture mass
964
- if living_surface_area > 0
965
- living_obj_name = mass_obj_name_space + ' above grade'
966
- imdef = create_os_int_mass_and_def(model, living_obj_name, space, living_surface_area)
967
- imdefs << imdef
968
- end
969
- # basement furniture mass
970
- if base_surface_area > 0
971
- base_obj_name = mass_obj_name_space + ' below grade'
972
- imdef = create_os_int_mass_and_def(model, base_obj_name, space, base_surface_area)
973
- imdefs << imdef
974
- end
975
- else
976
- surface_area = furnAreaFraction * floor_area
977
- imdef = create_os_int_mass_and_def(model, mass_obj_name_space, space, surface_area)
978
- imdefs << imdef
979
- end
1151
+ surface_area = furnAreaFraction * floor_area
1152
+ imdef = create_os_int_mass_and_def(model, mass_obj_name_space, space, surface_area)
1153
+
980
1154
  # Create and assign construction to surfaces
981
- constr.create_and_assign_constructions(runner, imdefs, model)
1155
+ constr.create_and_assign_constructions([imdef], model)
982
1156
  end
983
1157
  end
984
1158
 
@@ -1010,7 +1184,7 @@ class Constructions
1010
1184
 
1011
1185
  color_map[key[0]] = value
1012
1186
  end
1013
- color = color_map.min_by { |k, v| (v - solar_absorptance).abs }[0]
1187
+ color = color_map.min_by { |_k, v| (v - solar_absorptance).abs }[0]
1014
1188
  return color
1015
1189
  end
1016
1190
 
@@ -1021,7 +1195,7 @@ class Constructions
1021
1195
 
1022
1196
  def self.get_default_wall_color(solar_absorptance)
1023
1197
  map = get_wall_color_and_solar_absorptance_map
1024
- color = map.min_by { |k, v| (v - solar_absorptance).abs }[0]
1198
+ color = map.min_by { |_k, v| (v - solar_absorptance).abs }[0]
1025
1199
  return color
1026
1200
  end
1027
1201
 
@@ -1214,7 +1388,7 @@ class Constructions
1214
1388
 
1215
1389
  def self.create_kiva_slab_foundation(model, int_horiz_r, int_horiz_width, int_vert_r,
1216
1390
  int_vert_depth, ext_vert_r, ext_vert_depth,
1217
- concrete_thick_in)
1391
+ concrete_thick_in, soil_k_in)
1218
1392
 
1219
1393
  # Create the Foundation:Kiva object for slab foundations
1220
1394
  foundation = OpenStudio::Model::FoundationKiva.new(model)
@@ -1244,14 +1418,15 @@ class Constructions
1244
1418
  foundation.setWallHeightAboveGrade(UnitConversions.convert(concrete_thick_in, 'in', 'm'))
1245
1419
  foundation.setWallDepthBelowSlab(UnitConversions.convert(8.0, 'in', 'm'))
1246
1420
 
1247
- apply_kiva_settings(model)
1421
+ apply_kiva_settings(model, soil_k_in)
1248
1422
 
1249
1423
  return foundation
1250
1424
  end
1251
1425
 
1252
1426
  def self.apply_kiva_walled_foundation(model, ext_vert_r, int_vert_r,
1253
1427
  ext_vert_offset, int_vert_offset, ext_vert_depth, int_vert_depth,
1254
- wall_height_above_grade, wall_material_thick_in, wall_mat_int_finish)
1428
+ wall_height_above_grade, wall_material_thick_in, wall_mat_int_finish,
1429
+ soil_k_in)
1255
1430
 
1256
1431
  # Create the Foundation:Kiva object for crawl/basement foundations
1257
1432
  foundation = OpenStudio::Model::FoundationKiva.new(model)
@@ -1278,14 +1453,14 @@ class Constructions
1278
1453
  foundation.setWallHeightAboveGrade(UnitConversions.convert(wall_height_above_grade, 'ft', 'm'))
1279
1454
  foundation.setWallDepthBelowSlab(UnitConversions.convert(8.0, 'in', 'm'))
1280
1455
 
1281
- apply_kiva_settings(model)
1456
+ apply_kiva_settings(model, soil_k_in)
1282
1457
 
1283
1458
  return foundation
1284
1459
  end
1285
1460
 
1286
- def self.apply_kiva_settings(model)
1461
+ def self.apply_kiva_settings(model, soil_k_in)
1287
1462
  # Set the Foundation:Kiva:Settings object
1288
- soil_mat = BaseMaterial.Soil
1463
+ soil_mat = BaseMaterial.Soil(soil_k_in)
1289
1464
  settings = model.getFoundationKivaSettings
1290
1465
  settings.setSoilConductivity(UnitConversions.convert(soil_mat.k_in, 'Btu*in/(hr*ft^2*R)', 'W/(m*K)'))
1291
1466
  settings.setSoilDensity(UnitConversions.convert(soil_mat.rho, 'lbm/ft^3', 'kg/m^3'))
@@ -1298,7 +1473,113 @@ class Constructions
1298
1473
  settings.setDeepGroundDepth(40)
1299
1474
  settings.setMinimumCellDimension(0.2)
1300
1475
  settings.setMaximumCellGrowthCoefficient(3.0)
1301
- settings.setSimulationTimestep('Hourly')
1476
+ # Using 'Timestep' instead of 'Hourly' below because it makes timeseries
1477
+ # results smoother with only a small increase in runtime (generally
1478
+ # less than 10%).
1479
+ settings.setSimulationTimestep('Timestep')
1480
+ end
1481
+
1482
+ def self.apply_kiva_initial_temp(foundation, slab, weather, conditioned_zone,
1483
+ sim_begin_month, sim_begin_day, sim_year, schedules_file,
1484
+ foundation_walls_insulated, foundation_ceiling_insulated)
1485
+ # Set Kiva foundation initial temperature
1486
+
1487
+ outdoor_temp = weather.data.MonthlyAvgDrybulbs[sim_begin_month - 1]
1488
+
1489
+ # Approximate indoor temperature
1490
+ if conditioned_zone.thermostatSetpointDualSetpoint.is_initialized
1491
+ # Building has HVAC system
1492
+ setpoint_sch = conditioned_zone.thermostatSetpointDualSetpoint.get
1493
+ sim_begin_date = OpenStudio::Date.new(OpenStudio::MonthOfYear.new(sim_begin_month), sim_begin_day, sim_year)
1494
+ sim_begin_hour = (Schedule.get_day_num_from_month_day(sim_year, sim_begin_month, sim_begin_day) - 1) * 24
1495
+
1496
+ # Get heating/cooling setpoints for the simulation start
1497
+ htg_setpoint_sch = setpoint_sch.heatingSetpointTemperatureSchedule.get
1498
+ if htg_setpoint_sch.to_ScheduleRuleset.is_initialized
1499
+ htg_day_sch = htg_setpoint_sch.to_ScheduleRuleset.get.getDaySchedules(sim_begin_date, sim_begin_date)[0]
1500
+ heat_setpoint = UnitConversions.convert(htg_day_sch.values[0], 'C', 'F')
1501
+ else
1502
+ heat_setpoint = schedules_file.schedules[SchedulesFile::ColumnHeatingSetpoint][sim_begin_hour]
1503
+ end
1504
+ clg_setpoint_sch = setpoint_sch.coolingSetpointTemperatureSchedule.get
1505
+ if clg_setpoint_sch.to_ScheduleRuleset.is_initialized
1506
+ clg_day_sch = clg_setpoint_sch.to_ScheduleRuleset.get.getDaySchedules(sim_begin_date, sim_begin_date)[0]
1507
+ cool_setpoint = UnitConversions.convert(clg_day_sch.values[0], 'C', 'F')
1508
+ else
1509
+ cool_setpoint = schedules_file.schedules[SchedulesFile::ColumnCoolingSetpoint][sim_begin_hour]
1510
+ end
1511
+
1512
+ # Methodology adapted from https://github.com/NREL/EnergyPlus/blob/b18a2733c3131db808feac44bc278a14b05d8e1f/src/EnergyPlus/HeatBalanceKivaManager.cc#L303-L313
1513
+ heat_balance_temp = UnitConversions.convert(10.0, 'C', 'F')
1514
+ cool_balance_temp = UnitConversions.convert(15.0, 'C', 'F')
1515
+ if outdoor_temp < heat_balance_temp
1516
+ indoor_temp = heat_setpoint
1517
+ elsif outdoor_temp > cool_balance_temp
1518
+ indoor_temp = cool_setpoint
1519
+ elsif cool_balance_temp == heat_balance_temp
1520
+ indoor_temp = heat_balance_temp
1521
+ else
1522
+ weight = (cool_balance_temp - outdoor_temp) / (cool_balance_temp - heat_balance_temp)
1523
+ indoor_temp = heat_setpoint * weight + cool_setpoint * (1.0 - weight)
1524
+ end
1525
+ else
1526
+ # Building does not have HVAC system
1527
+ indoor_temp = outdoor_temp
1528
+ end
1529
+
1530
+ # Determine initial temperature
1531
+ # For unconditioned spaces, this overrides EnergyPlus's built-in assumption of 22C (71.6F);
1532
+ # see https://github.com/NREL/EnergyPlus/blob/b18a2733c3131db808feac44bc278a14b05d8e1f/src/EnergyPlus/HeatBalanceKivaManager.cc#L257-L259
1533
+ # For conditioned spaces, this avoids an E+ 22.2 bug; see https://github.com/NREL/EnergyPlus/issues/9692
1534
+ if HPXML::conditioned_locations.include? slab.interior_adjacent_to
1535
+ initial_temp = indoor_temp
1536
+ else
1537
+ # Space temperature assumptions from ASHRAE 152 - Duct Efficiency Calculations.xls, Zone temperatures
1538
+ ground_temp = weather.data.GroundMonthlyTemps[sim_begin_month - 1]
1539
+ if slab.interior_adjacent_to == HPXML::LocationBasementUnconditioned
1540
+ if foundation_ceiling_insulated
1541
+ # Insulated ceiling: 75% ground, 25% outdoor, 0% indoor
1542
+ ground_weight, outdoor_weight, indoor_weight = 0.75, 0.25, 0.0
1543
+ elsif foundation_walls_insulated
1544
+ # Insulated walls: 50% ground, 0% outdoor, 50% indoor (case not in ASHRAE 152)
1545
+ ground_weight, outdoor_weight, indoor_weight = 0.5, 0.0, 0.5
1546
+ else
1547
+ # Uninsulated: 50% ground, 20% outdoor, 30% indoor
1548
+ ground_weight, outdoor_weight, indoor_weight = 0.5, 0.2, 0.3
1549
+ end
1550
+ initial_temp = outdoor_temp * outdoor_weight + ground_temp * ground_weight + indoor_weight * indoor_temp
1551
+ elsif slab.interior_adjacent_to == HPXML::LocationCrawlspaceVented
1552
+ if foundation_ceiling_insulated
1553
+ # Insulated ceiling: 90% outdoor, 10% indoor
1554
+ outdoor_weight, indoor_weight = 0.9, 0.1
1555
+ elsif foundation_walls_insulated
1556
+ # Insulated walls: 25% outdoor, 75% indoor (case not in ASHRAE 152)
1557
+ outdoor_weight, indoor_weight = 0.25, 0.75
1558
+ else
1559
+ # Uninsulated: 50% outdoor, 50% indoor
1560
+ outdoor_weight, indoor_weight = 0.5, 0.5
1561
+ end
1562
+ initial_temp = outdoor_temp * outdoor_weight + indoor_weight * indoor_temp
1563
+ elsif slab.interior_adjacent_to == HPXML::LocationCrawlspaceUnvented
1564
+ if foundation_ceiling_insulated
1565
+ # Insulated ceiling: 85% outdoor, 15% indoor
1566
+ outdoor_weight, indoor_weight = 0.85, 0.15
1567
+ elsif foundation_walls_insulated
1568
+ # Insulated walls: 25% outdoor, 75% indoor
1569
+ outdoor_weight, indoor_weight = 0.25, 0.75
1570
+ else
1571
+ # Uninsulated: 40% outdoor, 60% indoor
1572
+ outdoor_weight, indoor_weight = 0.4, 0.6
1573
+ end
1574
+ initial_temp = outdoor_temp * outdoor_weight + indoor_weight * indoor_temp
1575
+ elsif slab.interior_adjacent_to == HPXML::LocationGarage
1576
+ initial_temp = outdoor_temp + 11.0
1577
+ else
1578
+ fail "Unhandled space: #{slab.interior_adjacent_to}"
1579
+ end
1580
+ end
1581
+
1582
+ foundation.setInitialIndoorAirTemperature(UnitConversions.convert(initial_temp, 'F', 'C'))
1302
1583
  end
1303
1584
 
1304
1585
  def self.create_insulation_material(model, name, rvalue)
@@ -1313,20 +1594,7 @@ class Constructions
1313
1594
  return mat
1314
1595
  end
1315
1596
 
1316
- def self.create_footing_material(model, name)
1317
- footing_mat = Material.Concrete(8.0)
1318
- mat = OpenStudio::Model::StandardOpaqueMaterial.new(model)
1319
- mat.setName(name)
1320
- mat.setRoughness('Rough')
1321
- mat.setThickness(UnitConversions.convert(footing_mat.thick_in, 'in', 'm'))
1322
- mat.setConductivity(UnitConversions.convert(footing_mat.k_in, 'Btu*in/(hr*ft^2*R)', 'W/(m*K)'))
1323
- mat.setDensity(UnitConversions.convert(footing_mat.rho, 'lbm/ft^3', 'kg/m^3'))
1324
- mat.setSpecificHeat(UnitConversions.convert(footing_mat.cp, 'Btu/(lbm*R)', 'J/(kg*K)'))
1325
- mat.setThermalAbsorptance(footing_mat.tAbs)
1326
- return mat
1327
- end
1328
-
1329
- def self.apply_window_skylight(runner, model, type, subsurface, constr_name, ufactor, shgc)
1597
+ def self.apply_window_skylight(model, type, subsurface, constr_name, ufactor, shgc)
1330
1598
  # Define materials
1331
1599
  if type == 'Skylight'
1332
1600
  # As of 2004, NFRC skylights are rated at a 20-degree slope (instead of vertical), but
@@ -1346,7 +1614,7 @@ class Constructions
1346
1614
  constr.add_layer(glaz_mat)
1347
1615
 
1348
1616
  # Create and assign construction to subsurfaces
1349
- constr.create_and_assign_constructions(runner, [subsurface], model)
1617
+ constr.create_and_assign_constructions([subsurface], model)
1350
1618
  end
1351
1619
 
1352
1620
  def self.apply_window_skylight_shading(model, window_or_skylight, index, shading_vertices, parent_surface, sub_surface, shading_group,
@@ -1440,7 +1708,6 @@ class Constructions
1440
1708
  mat_int_finish, inside_film, outside_film, mat_ext_finish,
1441
1709
  solar_absorptance, emittance)
1442
1710
 
1443
- film_r = inside_film.rvalue + outside_film.rvalue
1444
1711
  if mat_ext_finish.nil?
1445
1712
  fallback_mat_ext_finish = nil
1446
1713
  else
@@ -1463,9 +1730,9 @@ class Constructions
1463
1730
  WoodStudConstructionSet.new(Material.Stud2x4, 0.23, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x4, 16" o.c.
1464
1731
  WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1465
1732
  ]
1466
- match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1733
+ match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1467
1734
 
1468
- apply_wood_stud_wall(runner, model, surfaces, "#{wall_id} construction",
1735
+ apply_wood_stud_wall(model, surfaces, "#{wall_id} construction",
1469
1736
  cavity_r, install_grade, constr_set.stud.thick_in,
1470
1737
  cavity_filled, constr_set.framing_factor,
1471
1738
  constr_set.mat_int_finish, constr_set.osb_thick_in,
@@ -1484,9 +1751,9 @@ class Constructions
1484
1751
  SteelStudConstructionSet.new(3.5, corr_factor, 0.23, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x4, 16" o.c.
1485
1752
  SteelStudConstructionSet.new(3.5, 1.0, 0.01, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1486
1753
  ]
1487
- match, constr_set, cavity_r = pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1754
+ match, constr_set, cavity_r = pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1488
1755
 
1489
- apply_steel_stud_wall(runner, model, surfaces, "#{wall_id} construction",
1756
+ apply_steel_stud_wall(model, surfaces, "#{wall_id} construction",
1490
1757
  cavity_r, install_grade, constr_set.cavity_thick_in,
1491
1758
  cavity_filled, constr_set.framing_factor,
1492
1759
  constr_set.corr_factor, constr_set.mat_int_finish,
@@ -1501,9 +1768,9 @@ class Constructions
1501
1768
  DoubleStudConstructionSet.new(Material.Stud2x4, 0.23, 24.0, 0.0, 0.5, mat_int_finish, mat_ext_finish), # 2x4, 24" o.c.
1502
1769
  DoubleStudConstructionSet.new(Material.Stud2x4, 0.01, 16.0, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1503
1770
  ]
1504
- match, constr_set, cavity_r = pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1771
+ match, constr_set, cavity_r = pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1505
1772
 
1506
- apply_double_stud_wall(runner, model, surfaces, "#{wall_id} construction",
1773
+ apply_double_stud_wall(model, surfaces, "#{wall_id} construction",
1507
1774
  cavity_r, install_grade, constr_set.stud.thick_in,
1508
1775
  constr_set.stud.thick_in, constr_set.framing_factor,
1509
1776
  constr_set.framing_spacing, is_staggered,
@@ -1521,9 +1788,9 @@ class Constructions
1521
1788
  CMUConstructionSet.new(8.0, 1.4, 0.08, 0.5, mat_int_finish, mat_ext_finish), # 8" perlite-filled CMU
1522
1789
  CMUConstructionSet.new(6.0, 5.29, 0.01, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback (6" hollow CMU)
1523
1790
  ]
1524
- match, constr_set, rigid_r = pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1791
+ match, constr_set, rigid_r = pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1525
1792
 
1526
- apply_cmu_wall(runner, model, surfaces, "#{wall_id} construction",
1793
+ apply_cmu_wall(model, surfaces, "#{wall_id} construction",
1527
1794
  constr_set.thick_in, constr_set.cond_in, density,
1528
1795
  constr_set.framing_factor, furring_r,
1529
1796
  furring_cavity_depth_in, furring_spacing,
@@ -1538,9 +1805,9 @@ class Constructions
1538
1805
  SIPConstructionSet.new(5.0, 0.16, 0.0, sheathing_thick_in, 0.5, mat_int_finish, mat_ext_finish), # 5" SIP core
1539
1806
  SIPConstructionSet.new(1.0, 0.01, 0.0, sheathing_thick_in, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1540
1807
  ]
1541
- match, constr_set, cavity_r = pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1808
+ match, constr_set, cavity_r = pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1542
1809
 
1543
- apply_sip_wall(runner, model, surfaces, "#{wall_id} construction",
1810
+ apply_sip_wall(model, surfaces, "#{wall_id} construction",
1544
1811
  cavity_r, constr_set.thick_in, constr_set.framing_factor,
1545
1812
  constr_set.sheath_thick_in, constr_set.mat_int_finish,
1546
1813
  constr_set.osb_thick_in, constr_set.rigid_r,
@@ -1551,9 +1818,9 @@ class Constructions
1551
1818
  ICFConstructionSet.new(2.0, 4.0, 0.08, 0.0, 0.5, mat_int_finish, mat_ext_finish), # ICF w/4" concrete and 2" rigid ins layers
1552
1819
  ICFConstructionSet.new(1.0, 1.0, 0.01, 0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1553
1820
  ]
1554
- match, constr_set, icf_r = pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1821
+ match, constr_set, icf_r = pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1555
1822
 
1556
- apply_icf_wall(runner, model, surfaces, "#{wall_id} construction",
1823
+ apply_icf_wall(model, surfaces, "#{wall_id} construction",
1557
1824
  icf_r, constr_set.ins_thick_in,
1558
1825
  constr_set.concrete_thick_in, constr_set.framing_factor,
1559
1826
  constr_set.mat_int_finish, constr_set.osb_thick_in,
@@ -1566,7 +1833,7 @@ class Constructions
1566
1833
  GenericConstructionSet.new(0.0, 0.5, mat_int_finish, mat_ext_finish), # Standard
1567
1834
  GenericConstructionSet.new(0.0, 0.0, fallback_mat_int_finish, fallback_mat_ext_finish), # Fallback
1568
1835
  ]
1569
- match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, wall_id)
1836
+ match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1570
1837
 
1571
1838
  if wall_type == HPXML::WallTypeConcrete
1572
1839
  thick_in = 6.0
@@ -1576,7 +1843,7 @@ class Constructions
1576
1843
  base_mat = BaseMaterial.Brick
1577
1844
  elsif wall_type == HPXML::WallTypeAdobe
1578
1845
  thick_in = 10.0
1579
- base_mat = BaseMaterial.Soil
1846
+ base_mat = BaseMaterial.Soil(12.0)
1580
1847
  elsif wall_type == HPXML::WallTypeStrawBale
1581
1848
  thick_in = 23.0
1582
1849
  base_mat = BaseMaterial.StrawBale
@@ -1596,7 +1863,7 @@ class Constructions
1596
1863
  denss = [base_mat.rho]
1597
1864
  specheats = [base_mat.cp]
1598
1865
 
1599
- apply_generic_layered_wall(runner, model, surfaces, "#{wall_id} construction",
1866
+ apply_generic_layered_wall(model, surfaces, "#{wall_id} construction",
1600
1867
  thick_ins, conds, denss, specheats,
1601
1868
  constr_set.mat_int_finish, constr_set.osb_thick_in,
1602
1869
  constr_set.rigid_r, constr_set.mat_ext_finish,
@@ -1609,7 +1876,109 @@ class Constructions
1609
1876
  check_surface_assembly_rvalue(runner, surfaces, inside_film, outside_film, assembly_r, match)
1610
1877
  end
1611
1878
 
1612
- def self.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
1879
+ def self.apply_floor_ceiling_construction(runner, model, surface, floor_id, floor_type, is_ceiling, assembly_r,
1880
+ mat_int_finish_or_covering, inside_film, outside_film)
1881
+
1882
+ if mat_int_finish_or_covering.nil?
1883
+ fallback_mat_int_finish_or_covering = nil
1884
+ else
1885
+ if is_ceiling
1886
+ fallback_mat_int_finish_or_covering = Material.InteriorFinishMaterial(mat_int_finish_or_covering.name, 0.1) # Try thin material
1887
+ else
1888
+ fallback_mat_int_finish_or_covering = Material.CoveringBare(0.8, 0.01) # Try thin material
1889
+ end
1890
+ end
1891
+ osb_thick_in = (is_ceiling ? 0.0 : 0.75)
1892
+
1893
+ if floor_type == HPXML::FloorTypeWoodFrame
1894
+ install_grade = 1
1895
+ constr_sets = [
1896
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 50.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R50
1897
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 40.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R40
1898
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 30.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R30
1899
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 20.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R20
1900
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 10.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R10
1901
+ WoodStudConstructionSet.new(Material.Stud2x6, 0.10, 0.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c.
1902
+ WoodStudConstructionSet.new(Material.Stud2x4, 0.13, 0.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x4, 16" o.c.
1903
+ WoodStudConstructionSet.new(Material.Stud2x4, 0.01, 0.0, 0.0, fallback_mat_int_finish_or_covering, nil), # Fallback
1904
+ ]
1905
+ match, constr_set, cavity_r = pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1906
+ constr_int_finish_or_covering = constr_set.mat_int_finish
1907
+
1908
+ apply_wood_frame_floor_ceiling(model, surface, "#{floor_id} construction", is_ceiling,
1909
+ cavity_r, install_grade,
1910
+ constr_set.framing_factor, constr_set.stud.thick_in,
1911
+ constr_set.osb_thick_in, constr_set.rigid_r, constr_int_finish_or_covering,
1912
+ inside_film, outside_film)
1913
+
1914
+ elsif floor_type == HPXML::FloorTypeSteelFrame
1915
+ install_grade = 1
1916
+ corr_factor = 0.45
1917
+ osb_thick_in = (is_ceiling ? 0.0 : 0.75)
1918
+ constr_sets = [
1919
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.10, 50.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R50
1920
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.10, 40.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R40
1921
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.10, 30.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R30
1922
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.10, 20.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R20
1923
+ SteelStudConstructionSet.new(5.5, corr_factor, 0.10, 10.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x6, 24" o.c. + R10
1924
+ SteelStudConstructionSet.new(3.5, corr_factor, 0.13, 0.0, osb_thick_in, mat_int_finish_or_covering, nil), # 2x4, 16" o.c.
1925
+ SteelStudConstructionSet.new(3.5, 1.0, 0.01, 0.0, 0.0, fallback_mat_int_finish_or_covering, nil), # Fallback
1926
+ ]
1927
+ match, constr_set, cavity_r = pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1928
+ constr_int_finish_or_covering = constr_set.mat_int_finish
1929
+
1930
+ apply_steel_frame_floor_ceiling(model, surface, "#{floor_id} construction", is_ceiling,
1931
+ cavity_r, install_grade,
1932
+ constr_set.framing_factor, constr_set.corr_factor, constr_set.cavity_thick_in,
1933
+ constr_set.osb_thick_in, constr_set.rigid_r, constr_int_finish_or_covering,
1934
+ inside_film, outside_film)
1935
+
1936
+ elsif floor_type == HPXML::FloorTypeSIP
1937
+ constr_sets = [
1938
+ SIPConstructionSet.new(16.0, 0.16, 0.0, 0.0, osb_thick_in, mat_int_finish_or_covering, nil), # 16" SIP core
1939
+ SIPConstructionSet.new(12.0, 0.16, 0.0, 0.0, osb_thick_in, mat_int_finish_or_covering, nil), # 12" SIP core
1940
+ SIPConstructionSet.new(8.0, 0.16, 0.0, 0.0, osb_thick_in, mat_int_finish_or_covering, nil), # 8" SIP core
1941
+ SIPConstructionSet.new(1.0, 0.01, 0.0, 0.0, 0.0, fallback_mat_int_finish_or_covering, nil), # Fallback
1942
+ ]
1943
+ match, constr_set, cavity_r = pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1944
+
1945
+ apply_sip_floor_ceiling(model, surface, "#{floor_id} construction", is_ceiling,
1946
+ cavity_r, constr_set.thick_in, constr_set.framing_factor,
1947
+ constr_set.mat_int_finish, constr_set.osb_thick_in, constr_set.rigid_r,
1948
+ constr_set.mat_ext_finish, inside_film, outside_film)
1949
+ elsif floor_type == HPXML::FloorTypeConcrete
1950
+ constr_sets = [
1951
+ GenericConstructionSet.new(20.0, osb_thick_in, mat_int_finish_or_covering, nil), # w/R-20 rigid
1952
+ GenericConstructionSet.new(10.0, osb_thick_in, mat_int_finish_or_covering, nil), # w/R-10 rigid
1953
+ GenericConstructionSet.new(0.0, osb_thick_in, mat_int_finish_or_covering, nil), # Standard
1954
+ GenericConstructionSet.new(0.0, 0.0, fallback_mat_int_finish_or_covering, nil), # Fallback
1955
+ ]
1956
+ match, constr_set, layer_r = pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1957
+
1958
+ thick_in = 6.0
1959
+ base_mat = BaseMaterial.Concrete
1960
+ thick_ins = [thick_in]
1961
+ if layer_r == 0
1962
+ conds = [99]
1963
+ else
1964
+ conds = [thick_in / layer_r]
1965
+ end
1966
+ denss = [base_mat.rho]
1967
+ specheats = [base_mat.cp]
1968
+
1969
+ apply_generic_layered_floor_ceiling(model, surface, "#{floor_id} construction", is_ceiling,
1970
+ thick_ins, conds, denss, specheats,
1971
+ constr_set.mat_int_finish, constr_set.osb_thick_in,
1972
+ constr_set.rigid_r, constr_set.mat_ext_finish,
1973
+ inside_film, outside_film)
1974
+ else
1975
+ fail "Unexpected floor type '#{floor_type}'."
1976
+ end
1977
+
1978
+ check_surface_assembly_rvalue(runner, surface, inside_film, outside_film, assembly_r, match)
1979
+ end
1980
+
1981
+ def self.pick_wood_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1613
1982
  # Picks a construction set from supplied constr_sets for which a positive R-value
1614
1983
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1615
1984
 
@@ -1631,7 +2000,7 @@ class Constructions
1631
2000
  return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
1632
2001
  end
1633
2002
 
1634
- def self.pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
2003
+ def self.pick_steel_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1635
2004
  # Picks a construction set from supplied constr_sets for which a positive R-value
1636
2005
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1637
2006
 
@@ -1652,7 +2021,7 @@ class Constructions
1652
2021
  return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
1653
2022
  end
1654
2023
 
1655
- def self.pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
2024
+ def self.pick_double_stud_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1656
2025
  # Picks a construction set from supplied constr_sets for which a positive R-value
1657
2026
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1658
2027
 
@@ -1667,7 +2036,6 @@ class Constructions
1667
2036
  # Solved in Wolfram Alpha: https://www.wolframalpha.com/input/?i=1%2FA+%3D+B%2F(2*C%2Bx%2BD)+%2B+E%2F(3*C%2BD)+%2B+(1-B-E)%2F(3*x%2BD)
1668
2037
  stud_frac = 1.5 / constr_set.framing_spacing
1669
2038
  misc_framing_factor = constr_set.framing_factor - stud_frac
1670
- cavity_frac = 1.0 - (2 * stud_frac + misc_framing_factor)
1671
2039
  a = assembly_r
1672
2040
  b = stud_frac
1673
2041
  c = constr_set.stud.rvalue
@@ -1683,7 +2051,7 @@ class Constructions
1683
2051
  return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
1684
2052
  end
1685
2053
 
1686
- def self.pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
2054
+ def self.pick_sip_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1687
2055
  # Picks a construction set from supplied constr_sets for which a positive R-value
1688
2056
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1689
2057
 
@@ -1701,7 +2069,6 @@ class Constructions
1701
2069
  framing_r = Material.new(thick_in: constr_set.thick_in, mat_base: BaseMaterial.Wood).rvalue
1702
2070
  spline_r = Material.new(thick_in: spline_thick_in, mat_base: BaseMaterial.Wood).rvalue
1703
2071
  spline_frac = 4.0 / 48.0 # One 4" spline for every 48" wide panel
1704
- cavity_frac = 1.0 - (spline_frac + constr_set.framing_factor)
1705
2072
  a = assembly_r
1706
2073
  b = constr_set.framing_factor
1707
2074
  c = framing_r
@@ -1719,7 +2086,7 @@ class Constructions
1719
2086
  return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
1720
2087
  end
1721
2088
 
1722
- def self.pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
2089
+ def self.pick_cmu_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1723
2090
  # Picks a construction set from supplied constr_sets for which a positive R-value
1724
2091
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1725
2092
 
@@ -1746,7 +2113,7 @@ class Constructions
1746
2113
  return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
1747
2114
  end
1748
2115
 
1749
- def self.pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
2116
+ def self.pick_icf_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1750
2117
  # Picks a construction set from supplied constr_sets for which a positive R-value
1751
2118
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1752
2119
 
@@ -1772,7 +2139,7 @@ class Constructions
1772
2139
  return false, constr_sets[-1], 0.0 # Pick fallback construction with minimum R-value
1773
2140
  end
1774
2141
 
1775
- def self.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film, surface_name)
2142
+ def self.pick_generic_construction_set(assembly_r, constr_sets, inside_film, outside_film)
1776
2143
  # Picks a construction set from supplied constr_sets for which a positive R-value
1777
2144
  # can be calculated for the unknown insulation to achieve the assembly R-value.
1778
2145
 
@@ -1910,11 +2277,11 @@ class Construction
1910
2277
 
1911
2278
  # Creates constructions as needed and assigns to surfaces.
1912
2279
  # Leave name as nil if the materials (e.g., exterior finish) apply to multiple constructions.
1913
- def create_and_assign_constructions(runner, surfaces, model)
2280
+ def create_and_assign_constructions(surfaces, model)
1914
2281
  validate
1915
2282
 
1916
2283
  # Create list of OpenStudio materials
1917
- materials = construct_materials(runner, model)
2284
+ materials = construct_materials(model)
1918
2285
 
1919
2286
  # Create OpenStudio construction and assign to surface
1920
2287
  constr = OpenStudio::Model::Construction.new(model)
@@ -1944,7 +2311,7 @@ class Construction
1944
2311
  end
1945
2312
  end
1946
2313
 
1947
- def set_interior_material_properties(solar_absorptance = 0.6, emittance = 0.9, debug: false)
2314
+ def set_interior_material_properties(solar_absorptance = 0.6, emittance = 0.9)
1948
2315
  if @layers_materials.size > 3 # Only apply if there is a separate interior material
1949
2316
  @layers_materials[-2].each do |interior_material|
1950
2317
  interior_material.sAbs = solar_absorptance
@@ -2016,17 +2383,17 @@ class Construction
2016
2383
  return mat
2017
2384
  end
2018
2385
 
2019
- def construct_materials(runner, model)
2386
+ def construct_materials(model)
2020
2387
  # Create materials
2021
2388
  materials = []
2022
2389
  @layers_materials.each_with_index do |layer_materials, layer_num|
2023
2390
  if layer_materials.size == 1
2024
2391
  next if layer_materials[0].name == Constants.AirFilm # Do not include air films in construction
2025
2392
 
2026
- mat = Construction.create_os_material(runner, model, layer_materials[0])
2393
+ mat = Construction.create_os_material(model, layer_materials[0])
2027
2394
  else
2028
2395
  parallel_path_mat = get_parallel_material(layer_num, @layers_names[layer_num])
2029
- mat = Construction.create_os_material(runner, model, parallel_path_mat)
2396
+ mat = Construction.create_os_material(model, parallel_path_mat)
2030
2397
  end
2031
2398
  materials << mat
2032
2399
  end
@@ -2123,7 +2490,7 @@ class Construction
2123
2490
  end
2124
2491
 
2125
2492
  # Creates (or returns an existing) OpenStudio Material from our own Material object
2126
- def self.create_os_material(runner, model, material)
2493
+ def self.create_os_material(model, material)
2127
2494
  name = material.name
2128
2495
  tolerance = 0.0001
2129
2496
  if material.is_a? GlazingMaterial