urbanopt-cli 0.8.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (650) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +5 -6
  3. data/CHANGELOG.md +21 -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 +601 -101
  635. data/scripts/setup-env.bat +6 -7
  636. data/uo_cli.gemspec +6 -5
  637. metadata +121 -36
  638. data/example_files/residential/exhaust.tsv +0 -3
  639. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/hvac_equipment_efficiency.csv +0 -493
  640. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/data/water_heater_efficiency.csv +0 -157
  641. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/hpxml_schematron/HPXMLvalidator.xml +0 -620
  642. data/example_files/resources/hpxml-measures/HPXMLtoOpenStudio/resources/validator.rb +0 -107
  643. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.rb +0 -450
  644. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/measure.xml +0 -85
  645. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/resources/constants.rb +0 -72
  646. data/example_files/resources/hpxml-measures/ReportHPXMLOutput/tests/hpxml_output_report_test.rb +0 -290
  647. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_10kW.csv +0 -8761
  648. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_1kW.csv +0 -8761
  649. data/example_files/resources/hpxml-measures/ReportUtilityBills/tests/PV_None.csv +0 -8761
  650. 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