openstudio-standards 0.8.4 → 0.8.5.rc1

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 (289) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +30 -30
  3. data/data/geometry/ASHRAECourthouse.osm +22 -22
  4. data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
  5. data/data/geometry/DEER_Asm.osm +1 -1
  6. data/data/geometry/DEER_ECC.osm +1 -1
  7. data/data/geometry/DEER_EPr.osm +1 -1
  8. data/data/geometry/DEER_ERC.osm +1 -1
  9. data/data/geometry/DEER_ESe.osm +1 -1
  10. data/data/geometry/DEER_EUn.osm +1 -1
  11. data/data/geometry/DEER_Hsp.osm +1 -1
  12. data/data/geometry/DEER_Htl.osm +1 -1
  13. data/data/geometry/DEER_MBT.osm +1 -1
  14. data/data/geometry/DEER_MFm.osm +1 -1
  15. data/data/geometry/DEER_Nrs.osm +1 -1
  16. data/data/geometry/DEER_OfL.osm +1 -1
  17. data/data/geometry/DEER_OfS.osm +1 -1
  18. data/data/geometry/DEER_RFF.osm +1 -1
  19. data/data/geometry/DEER_RSD.osm +1 -1
  20. data/data/geometry/DEER_Rt3.osm +1 -1
  21. data/data/geometry/DEER_RtS.osm +1 -1
  22. data/data/standards/export_OpenStudio_libraries.rb +2 -3
  23. data/data/standards/test_performance_expected_dd_results.csv +42 -42
  24. data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
  25. data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
  26. data/lib/openstudio-standards/btap/activity.rb +480 -0
  27. data/lib/openstudio-standards/btap/attributes.rb +166 -0
  28. data/lib/openstudio-standards/btap/bridging.rb +561 -1402
  29. data/lib/openstudio-standards/btap/btap.rb +4 -2
  30. data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
  31. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
  32. data/lib/openstudio-standards/btap/{costing/common_paths.rb → common_paths.rb} +14 -11
  33. data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
  34. data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
  35. data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
  36. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
  37. data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
  38. data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting.csv +59 -59
  39. data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_hvac.csv +1019 -1032
  40. data/lib/openstudio-standards/btap/costing/btap_costing.rb +3 -7
  41. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +1 -5
  42. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +5 -4
  43. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +1 -1
  44. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +112 -181
  45. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +4 -4
  46. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +2 -1
  47. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +3 -3
  48. data/lib/openstudio-standards/btap/costing/test_list.txt +15 -17
  49. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +10 -9
  50. data/lib/openstudio-standards/btap/geometry.rb +86 -6
  51. data/lib/openstudio-standards/btap/structure.rb +657 -0
  52. data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
  53. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
  54. data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
  55. data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
  56. data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
  57. data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
  58. data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
  59. data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
  60. data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
  61. data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
  62. data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
  63. data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
  64. data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
  65. data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
  66. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
  67. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
  68. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
  69. data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
  70. data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
  71. data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
  72. data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
  73. data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
  74. data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
  75. data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
  76. data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
  77. data/lib/openstudio-standards/hvac/components/component.rb +39 -0
  78. data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
  79. data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
  80. data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
  81. data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
  82. data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
  83. data/lib/openstudio-standards/hvac/conversions.rb +222 -0
  84. data/lib/openstudio-standards/hvac/curves.rb +192 -0
  85. data/lib/openstudio-standards/hvac/helpers.rb +357 -0
  86. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
  87. data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
  88. data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
  89. data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
  90. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
  91. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
  92. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
  93. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  99. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
  100. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  101. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  102. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
  103. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
  111. data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
  112. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
  113. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
  114. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
  115. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
  116. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
  117. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
  118. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
  119. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
  120. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
  121. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
  122. data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
  123. data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
  124. data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
  125. data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
  126. data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
  127. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
  128. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
  129. data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
  130. data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
  131. data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
  132. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
  133. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
  134. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
  135. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
  136. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
  137. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
  138. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
  139. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
  140. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
  141. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
  142. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
  143. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
  144. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
  145. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
  146. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
  147. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
  148. data/lib/openstudio-standards/standards/Standards.Model.rb +6 -11
  149. data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
  150. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
  151. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
  152. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
  153. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
  154. data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
  155. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
  156. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
  157. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
  158. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
  159. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +37 -102
  160. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
  161. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
  162. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  163. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +37 -37
  164. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
  165. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
  166. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  167. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
  168. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +37 -102
  169. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
  170. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
  171. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  172. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +45 -109
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +45 -109
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
  182. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
  183. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
  184. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +37 -37
  185. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
  186. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +37 -37
  187. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
  188. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  189. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
  194. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
  195. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
  196. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
  197. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
  198. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
  199. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
  200. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +1 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
  207. data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
  208. data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
  209. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +19 -10
  210. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
  211. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
  212. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
  213. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +69 -92
  214. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +2 -1
  215. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
  216. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
  217. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
  218. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +32 -0
  219. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +18 -0
  220. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
  221. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +5 -5
  222. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +2 -0
  223. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +30 -141
  224. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +233 -112
  225. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
  226. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -2
  227. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
  228. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
  229. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
  230. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
  231. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +16 -4
  232. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +65 -42
  233. data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
  234. data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
  235. data/lib/openstudio-standards/version.rb +1 -1
  236. data/lib/openstudio-standards/weather/stat_file.rb +2 -2
  237. data/lib/openstudio-standards.rb +55 -38
  238. metadata +106 -66
  239. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +0 -61
  240. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +0 -1904
  241. data/lib/openstudio-standards/hvac/components/create.rb +0 -169
  242. data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
  243. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
  244. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
  245. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
  246. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
  247. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
  248. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
  249. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
  250. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
  251. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
  252. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
  253. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
  254. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
  255. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
  256. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
  257. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
  258. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
  259. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
  260. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
  261. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
  262. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
  263. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
  264. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
  265. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
  266. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
  267. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
  268. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
  269. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
  270. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
  271. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
  272. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/ConstructionProperties.csv +0 -0
  273. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/Constructions.csv +0 -0
  274. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/construction_sets.csv +0 -0
  275. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/constructions_opaque.csv +0 -0
  276. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/costs_local_factors.csv +0 -0
  277. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/hvac_vent_ahu.csv +0 -0
  278. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/lighting_sets.csv +0 -0
  279. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/locations.csv +0 -0
  280. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_glazing.csv +0 -0
  281. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_lighting.csv +0 -0
  282. /data/lib/openstudio-standards/btap/{costing/common_resources → common_resources}/materials_opaque.csv +0 -0
  283. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
  284. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
  285. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
  286. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
  287. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
  288. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
  289. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
@@ -0,0 +1,657 @@
1
+ # **************************************************************************** /
2
+ # * Copyright (c) 2008-2025, Natural Resources Canada
3
+ # * All rights reserved.
4
+ # *
5
+ # * This library is free software; you can redistribute it and/or
6
+ # * modify it under the terms of the GNU Lesser General Public
7
+ # * License as published by the Free Software Foundation; either
8
+ # * version 2.1 of the License, or (at your option) any later version.
9
+ # *
10
+ # * This library is distributed in the hope that it will be useful,
11
+ # * but WITHOUT ANY WARRANTY; without even the implied warranty of
12
+ # * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13
+ # * Lesser General Public License for more details.
14
+ # *
15
+ # * You should have received a copy of the GNU Lesser General Public
16
+ # * License along with this library; if not, write to the Free Software
17
+ # * Foundation Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18
+ # **************************************************************************** /
19
+
20
+ module BTAP
21
+ module StructureData
22
+ ##
23
+ # @author: Denis Bourgeois
24
+ #
25
+ # Building STRUCTURE parameters, ultimately driving BTAP definitions of e.g.
26
+ # - internal mass
27
+ # - envelope CLADDING/FRAMING/FINISH selection
28
+ # - related thermal bridging calculations (and uprated insulation levels)
29
+ # - costing
30
+ # - embodied carbon tallies
31
+ #
32
+ # As detailed a bit further on, this determination is either via user input:
33
+ # - e.g. "clt" (mass timber) post/beam STRUCTURE, for a school.
34
+ #
35
+ # Or auto-assigned based on the prevalence of model space type assignments:
36
+ # - e.g. 75% of spaces are commercial in nature (see activity.rb),
37
+ # therefore the building STRUCTURE defaults to "steel" post/beam.
38
+ #
39
+ # The overarching idea is that (in most cases) OpenStudio surface
40
+ # construction & material choices (in addition to internal mass definitions),
41
+ # mostly stem from underlying structural design choices (which aren't
42
+ # natively defined in OpenStudio). Structural choices have more to do with
43
+ # fire safety, budget, durability & practicality (low-rise vs high-rise),
44
+ # local workforce, on-site vs prefab, etc.
45
+ #
46
+ # Ensuring consistency between building STRUCTURE, envelope selection,
47
+ # internal mass definitions, etc. is key to harmonizing predicted energy
48
+ # use, peak demand assessments, GHG emissions, vs thermal resilience and
49
+ # embodied energy/GHG tallies.
50
+ #
51
+ # --- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- --- #
52
+ # Although "wood" framed walls constitute the load-bearing components of a
53
+ # "wood" framed building STRUCTURE (e.g. low-rise housing), they can equally
54
+ # be found as non-load-bearing components in a "clt" post-beam STRUCTURE.
55
+ # Light gauge "steel" framed walls are much more common in a non-residential
56
+ # STRUCTURE (e.g. "steel" post/frame, "concrete" post & beam, and even
57
+ # "clt"), though rarely found in low-rise housing. Although one may observe
58
+ # some real-world mixing of STRUCTURE vs FRAMING in a building, it remains
59
+ # largely deterministic: designers select constructions (FRAMING,
60
+ # insulation) while taking building classification and STRUCTURE selection
61
+ # into consideration - the inverse is rarely true.
62
+ #
63
+ # STRUCTURE description
64
+ # __________ ___________________________________________________________
65
+ # "steel" steel, post/frame (default)
66
+ # "metal" prefab panelized steel STRUCTURE (**, ++), typically 1 story
67
+ # "concrete" reinforced concrete, post/beam/slab
68
+ # "cmu" load-bearing concrete masonry unit walls, typically 1-story
69
+ # "wood" conventional load-bearing wood-framed and/or -engineered
70
+ # "clt" prefab, post/beam mass/cross-laminated/timber (**)
71
+ #
72
+ # NOTES:
73
+ #
74
+ # ** Neither "metal" nor "clt" options can be considered as fully
75
+ # supported by BTAP, e.g.:
76
+ # - no range of admissible envelope Uo factors
77
+ # - no associated PSI-factors (thermal bridging)
78
+ # - no costing data
79
+ # - no embodied energy/carbon data
80
+ # They are nonetheless (minimally) maintained here as an
81
+ # "aide-mémoire" for future BTAP upgrades - @todo.
82
+ #
83
+ # ++ ASHRAE 90.1 2022 definitions of:
84
+ #
85
+ # "METAL BUILDING": a complete integrated set of mutually dependent
86
+ # components and assemblies that form a building, which consists of
87
+ # a steel-framed superSTRUCTURE and metal skin.
88
+ #
89
+ # "METAL BUILDING ROOF": a roof that:
90
+ # a. is constructed with a metal, structural, weathering surface;
91
+ # b. has no ventilated cavity; and
92
+ # c. has the insulation entirely below deck (i.e., does not include
93
+ # composite concrete and metal deck construction nor a roof
94
+ # FRAMING system that is separated from the superSTRUCTURE by a
95
+ # wood substrate) and whose STRUCTURE consists of one or more of
96
+ # the following configurations:
97
+ # 1. Metal roofing in direct contact with steel FRAMING members
98
+ # 2. Metal roofing separated from steel FRAMING by insulation
99
+ # 3. Insulated metal roofing panels installed per (a) or (b)
100
+ #
101
+ # "METAL BUILDING WALL": a wall whose STRUCTURE consists of metal
102
+ # spanning members supported by steel structural members (i.e. does
103
+ # not include spandrel glass or metal panels in curtain wall systems).
104
+ #
105
+ # Note that there's a (growing?) need to contrast "metal" buildings against
106
+ # the default "steel" post/beam option. Like a "wood" framed STRUCTURE or a
107
+ # load-bearing "cmu" wall, a "metal" building's envelope structure and skin
108
+ # are indistinguishable, i.e. no mixing/matching of STRUCTURE vs envelope.
109
+ #
110
+ # There are of course several other (smaller scale) structural options,
111
+ # often load-bearing envelopes like adobe/hemp/straw bale construction. Most
112
+ # would agree that these are fairly rare occurrences - rare enough to avoid
113
+ # shortlisting them for commercial building stock assessments. One could
114
+ # state the same when it comes to the current (marginal) use of "clt". Yet
115
+ # as the latter is rapidly becoming a robust low-carbon alternative to
116
+ # "steel" and "concrete" options, its inclusion is justified. Additional
117
+ # options may nonetheless be added in the future.
118
+ @@data = {structure: {}, cladding: {}, finish: {}, category: {}}
119
+
120
+ # Each STRUCTURE inherits a default FRAMING option. Together with the
121
+ # STRUCTURE selection, FRAMING determines inter alia:
122
+ # - above-grade floor assemblies
123
+ # - insulated roof assemblies
124
+ # - cantilevered balconies
125
+ # - interzone walls
126
+ @@data[:structure] = {}
127
+ @@data[:structure][:steel ] = {framing: :steel}
128
+ @@data[:structure][:metal ] = {framing: :metal}
129
+ @@data[:structure][:concrete] = {framing: :steel}
130
+ @@data[:structure][:cmu ] = {framing: :cmu }
131
+ @@data[:structure][:wood ] = {framing: :wood }
132
+ @@data[:structure][:clt ] = {framing: :wood }
133
+
134
+ # An example. STRUCTURE == "wood" + default FRAMING == "wood", e.g. housing:
135
+ # - typical engineered wood joists + FINISH
136
+ # - similar engineered wood rafters + FINISH (if flat or cathedral roof)
137
+ # - anchored engineered wood joist balconies
138
+ #
139
+ # FRAMING may also determine above-grade exterior wall composition (e.g.
140
+ # wool-insulated wood-framed exterior walls, if FRAMING == "wood"). This
141
+ # may instead be determined by CLADDING selection in several cases.
142
+ #
143
+ # Exterior CLADDING and interior FINISH options are both limited to 4
144
+ # generic labels. Defaults for all STRUCTUREs are "light", for both CLADDING
145
+ # (e.g. metal siding on vented hat-channels) and FINISH (e.g. painted
146
+ # drywall). Brick veneer is an example of "medium" CLADDING, while a 4"
147
+ # precast concrete panel is considered "heavy" CLADDING. A "medium" FINISH
148
+ # is akin to a 4" precast panel concrete, while a "heavy" FINISH is a
149
+ # heftier 8" of (poured) reinforced concrete. Option "none" for CLADDING is
150
+ # rare, even in pre-code buildings. An example would be a load-bearing,
151
+ # "cmu" wall with 2 coats of paint in a semi-heated industrial facility. The
152
+ # "none" FINISH option is slightly more common, e.g. exposed ceilings, bare
153
+ # "clt" walls, and again bare "cmu" walls (or with 2 coats of paint).
154
+ @@data[:cladding] = [:none, :light, :medium, :heavy]
155
+ @@data[:finish ] = [:none, :light, :medium, :heavy]
156
+
157
+ # An above-grade building STRUCTURE would normally be auto-assigned based on
158
+ # the prevalence of space type selections in the model (see activity.rb).
159
+ # Note that all below-grade STRUCTUREs remain "concrete", e.g.:
160
+ # - basement slabs and slabs-on-grade
161
+ # - load-bearing basement walls
162
+ # - basement columns, shear walls, etc. (internal mass)
163
+ #
164
+ # Hopefully, users may also assign STRUCTURE, FRAMING, CLADDING & FINISH
165
+ # options per OpenStudio's building-to-space hierarchy, e.g. - @todo:
166
+ #
167
+ # Example A: Composite STRUCTURE:
168
+ # - "concrete" post/beam STRUCTURE for first 4 building stories
169
+ # - "steel" post/frame STRUCTURE for building stories > 4
170
+ #
171
+ # Example B: School gym:
172
+ # - "cmu" gymnasium walls in an otherwise "steel" post/frame school
173
+ #
174
+ # An invalid user-selected STRUCTURE is however caught/logged/corrected:
175
+ # - no other STRUCTURE above "steel", "metal", "cmu" or "wood" STRUCTUREs
176
+ # - a "wood" STRUCTURE may rest upon a "clt" STRUCTURE
177
+ # - any other STRUCTURE may rest upon a "concrete" STRUCTURE
178
+ #
179
+ # With the exception of "metal" buildings, users may optionally interchange
180
+ # some paired STRUCTURE vs FRAMING options (among available :frames above).
181
+ # Unusual in some cases, yet not completely unheard of.
182
+ @@data[:structure][:steel ][:frames] = [:wood ]
183
+ @@data[:structure][:metal ][:frames] = [ ]
184
+ @@data[:structure][:concrete][:frames] = [:wood, :cmu ]
185
+ @@data[:structure][:cmu ][:frames] = [:wood, :steel]
186
+ @@data[:structure][:wood ][:frames] = [:steel ]
187
+ @@data[:structure][:clt ][:frames] = [:clt, :steel ]
188
+
189
+ # --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- #
190
+ # To simplify data management, building TYPES (e.g. those listed in Table
191
+ # A-8.4.3.2.(2)-A of the NECB 2020) are proposed to fall into more general
192
+ # building CATEGORIES (see activity.rb & NECB_building_types.csv):
193
+ #
194
+ # CATEGORY examples
195
+ # _____________ __________________________________________________________
196
+ # "housing" MURB, long-term stay, dormitory
197
+ # "lodging" hotel, motel, highway lodging
198
+ # "public" museum, hospital, school, theatre, terminal
199
+ # "commerce" office, dining, retail, fitness, dealership, theatre
200
+ # "industry" automotive, manufacturing, workshop, storage
201
+ # "recreation" gymnastics, ice arena, indoor soccer/pool
202
+ # "robust" penitentiary, parking garage (i.e. heavyduty, resistant)
203
+ #
204
+ # Each CATEGORY holds "small"-scale and "large"-scale STRUCTURE options by
205
+ # defaults, depending on the characteristics of the building.
206
+ @@data[:category] = {}
207
+ @@data[:category]["housing" ] = {small: :wood , large: :concrete}
208
+ @@data[:category]["lodging" ] = {small: :wood , large: :concrete}
209
+ @@data[:category]["robust" ] = {small: :concrete, large: :concrete}
210
+ @@data[:category]["public" ] = {small: :steel , large: :concrete}
211
+ @@data[:category]["commerce" ] = {small: :steel , large: :steel}
212
+ @@data[:category]["industry" ] = {small: :cmu , large: :metal}
213
+ @@data[:category]["recreation"] = {small: :metal , large: :steel}
214
+
215
+ # What constitutes small- vs large-scale varies between CATEGORY, depending
216
+ # either on the maximum number of stories, or the max floor-to-roof height
217
+ # of the tallest first story space.
218
+ @@data[:category]["housing" ][:stories] = 4
219
+ @@data[:category]["lodging" ][:stories] = 2
220
+ @@data[:category]["public" ][:stories] = 2
221
+ @@data[:category]["industry" ][:height ] = 3.5
222
+ @@data[:category]["recreation"][:height ] = 10.0
223
+
224
+ # For instance, a multi-unit residential building (MURB) would have a
225
+ # typical "wood" framed, load-bearing envelope/STRUCTURE up to (and
226
+ # including) 4 stories above-grade. This default STRUCTURE assignment
227
+ # switches to reinforced "concrete" post + flat slab beyond 4 stories.
228
+ # Building CATEGORIES that hold neither :stories nor :height key:value pairs
229
+ # simply retain the same STRUCTURE option by default, regardless of scale
230
+ # (e.g. "robust", "commerce").
231
+ #
232
+ # Default STRUCTURE assignment per building CATEGORY does not preclude the
233
+ # investigation of e.g. "clt" construction in MURBs, offices or sporting
234
+ # facilities. It simply generates a reasonable reference set of structural/
235
+ # framing options, applicable for large parts of the US and Canada. Users
236
+ # have the option of overriding default assignments (@todo).
237
+
238
+ ##
239
+ # Returns BTAP Structure data.
240
+ #
241
+ # @return [Hash] BTAP Structure data
242
+ def data
243
+ @@data
244
+ end
245
+
246
+ def self.extended(base)
247
+ base.send(:include, self)
248
+ end
249
+ end
250
+
251
+ class BTAP::Structure
252
+ extend StructureData
253
+
254
+ # @return [String] building type CATEGORY (e.g. "public")
255
+ attr_reader :category
256
+
257
+ # @return [Symbol] building STRUCTURE selection (e.g. :steel)
258
+ attr_reader :structure
259
+
260
+ # @return [Symbol] building framing (e.g. :steel)
261
+ attr_reader :framing
262
+
263
+ # @return [Symbol] building cladding (e.g. :medium)
264
+ attr_reader :cladding
265
+
266
+ # @return [Symbol] building finish (e.g. :light)
267
+ attr_reader :finish
268
+
269
+ # @return [Float] estimated dead load, in kg/m2 of floor area
270
+ attr_reader :deadload
271
+
272
+ # @return [Float] estimated non-occupant live load, in kg/m2 of floor area
273
+ attr_reader :liveload
274
+
275
+ # @return [Hash] calculated embodied carbon (CO2-e kg)
276
+ attr_reader :co2
277
+
278
+ # @return [Hash] logged messages
279
+ attr_reader :feedback
280
+
281
+ ##
282
+ # Initialize BTAP STRUCTURE parameters.
283
+ #
284
+ # @param model [OpenStudio::Model::Model] a model
285
+ # @param activity [BTAP::Activity] a BTAP building ACTIVITY object
286
+ # @param massive [Boolean] whether requesting internal mass generation
287
+ def initialize(model = nil, activity = nil, massive = true)
288
+ mth = "BTAP::Structure::#{__callee__}"
289
+ @feedback = {logs: []}
290
+ lgs = @feedback[:logs]
291
+ massive = false unless [true, false].include?(massive)
292
+
293
+ unless model.is_a?(OpenStudio::Model::Model)
294
+ lgs << "Invalid or empty OpenStudio model (#{mth})"
295
+ return
296
+ end
297
+
298
+ unless activity.is_a?(BTAP::Activity)
299
+ lgs << "Invalid or empty BTAP::Activity instance (#{mth})"
300
+ return
301
+ end
302
+
303
+ cat = activity.category
304
+ lload = activity.liveload
305
+
306
+ if cat.respond_to?(:to_s)
307
+ cat = cat.to_s.downcase
308
+
309
+ if cat.empty?
310
+ lgs << "Empty building category (#{mth})"
311
+ return
312
+ else
313
+ unless data[:category].keys.include?(cat)
314
+ lgs << "Unknown building category: #{cat} (#{mth})"
315
+ return
316
+ end
317
+ end
318
+ else
319
+ lgs << "Invalid building category: #{cat.class} (#{mth})"
320
+ return
321
+ end
322
+
323
+ if lload.respond_to?(:to_f)
324
+ lload = lload.to_f
325
+ else
326
+ lgs << "Invalid live load (kg/m2): #{lload.class} (#{mth})"
327
+ return
328
+ end
329
+
330
+ # Cap internal mass density to 1000 kg/m3, and thickness to 6".
331
+ rho = 1000.0
332
+ th = 0.150
333
+ bldg = model.getBuilding
334
+
335
+ @category = cat
336
+ @structure = data[:category][cat][:small]
337
+
338
+ # Switch to :large structure, instead of default :small.
339
+ if data[:category][cat].key?(:stories)
340
+ mx = data[:category][cat][:stories]
341
+ n = bldg.standardsNumberOfAboveGroundStories
342
+ n = n.empty? ? 1 : n.get
343
+
344
+ @structure = data[:category][cat][:large] if n > mx
345
+ elsif data[:category][cat].key?(:height)
346
+ mx = data[:category][cat][:height]
347
+ n = bldg.standardsNumberOfAboveGroundStories
348
+ n = n.empty? ? 1 : n.get
349
+
350
+ if n > 1
351
+ @structure = data[:category][cat][:large]
352
+ else
353
+ h = 0
354
+
355
+ model.getSpaces.each do |space|
356
+ h = [mx, BTAP::Geometry::Spaces.space_height(space)].max
357
+ end
358
+
359
+ @structure = data[:category][cat][:large] if h > mx
360
+ end
361
+ end
362
+
363
+ # Reset :clt and :metal structure selections - not yet available. @todo
364
+ @structure = :steel if @structure == :metal
365
+ @structure = :concrete if @structure == :clt
366
+
367
+ # Set building framing, e.g. light-gauge :steel.
368
+ @framing = data[:structure][@structure][:framing]
369
+
370
+ # Set exterior cladding.
371
+ @cladding = :light
372
+ @cladding = :medium if @structure == :cmu
373
+ @cladding = :medium if @category == "public"
374
+ @cladding = :heavy if @category == "robust"
375
+
376
+ # Set interior finish.
377
+ @finish = :light
378
+ @finish = :none if @framing == :cmu
379
+ @finish = :heavy if @category == "robust"
380
+
381
+ # 'Dead load' refers to the self-weight of structural elements of a
382
+ # building, as well as non-structural fixtures that are permanently
383
+ # attached to the building. They are considered 'dead' as they typically
384
+ # do not move around during the life of the building. If/once a building
385
+ # is resold, its new owners recover dead load as 'real estate assets'.
386
+ # Dead load typically falls under design scopes of architects/engineers.
387
+ # Although there are obvious design constraints to consider (e.g. fire
388
+ # safety, $), designers do get to make design decisions when it comes to
389
+ # dead load, e.g.:
390
+ # - between steel vs concrete post/beam/slab structural options
391
+ # - between light-gauge steel vs CMU wall construction options
392
+ # - between foam vs fibrous insulation options
393
+ #
394
+ # Most dead load is modelled explicitly in OpenStudio, like envelope and
395
+ # interzone sub/surfaces. Rough estimates of embodied carbon (in CO2-e
396
+ # kg/m2) can be reasonably associated to selected construction assemblies
397
+ # (based on m2), such as the embodied carbon of chosen insulation
398
+ # materials or framing options. Other dead load, like lighting and HVAC,
399
+ # are not modelled explicitly. Here, the 'deadload' attribute represents
400
+ # a mass floor area density estimate (kg/m2) of non-modelled structural
401
+ # and non-structural items like fixed furniture, partitions, columns,
402
+ # beams, shear walls and bracing.
403
+
404
+ # First, isolate occupied spaces & floors, as well as exposed surfaces.
405
+ cspaces = model.getSpaces.select { |sp| sp.partofTotalFloorArea }
406
+ floor_m2 = TBD.facets(cspaces, "all", "floor").map(&:grossArea).sum
407
+ ofloor_m2 = TBD.facets(cspaces, "outdoors", "floor").map(&:grossArea).sum
408
+ ifloor_m2 = TBD.facets(cspaces, "surface", "floor").map(&:grossArea).sum
409
+ roof_m2 = TBD.facets(cspaces, "outdoors", "roofceiling").map(&:grossArea).sum
410
+ wall_m2 = TBD.facets(cspaces, "outdoors", "walls").map(&:grossArea).sum
411
+ iwall_m2 = TBD.facets(cspaces, "surface", "wall").map(&:grossArea).sum
412
+
413
+ # In OpenStudio, partitions are usually limited to interzone walls between
414
+ # zones, in order to save on simulation times. Partitions typically absent
415
+ # from a model include walls surrounding lobbies, stairwells, WCs and
416
+ # technical rooms, as well as separations between similar rooms (e.g.
417
+ # multiple, side-by-side enclosed offices, a row of hotel rooms).
418
+ # Comparing BTAP prototype models and samples of building plans for
419
+ # similar facilities suggest matching modelled partition m2 (or total
420
+ # floor m2) as a suitable basis to determine the weight of non-modelled
421
+ # partitions. As this estimate may be more on the high side for many
422
+ # prototype models, fixed appliances (e.g. fixtures, counters, doors and
423
+ # windows) are considered included.
424
+ # partition_m2 = iwall_m2
425
+ # partition_m2 = floor_m2 if partition_m2 > floor_m2
426
+ partition_m2 = floor_m2
427
+
428
+ # For wood-framed partitions, representative material volumes (per m2):
429
+ # - 16% wood-framing: 0.0224 m3/m2 x 540 kg/m3 = 12.1 kg/m2 (35.7%)
430
+ # - 84% insulation : 0.1176 m3/m2 x 19 kg/m3 = 2.2 kg/m2 ( 6.5%)
431
+ # - drywall (2x) : 0.0250 m3/m2 x 785 kg/m3 = 19.6 kg/m2 (57.8%)
432
+ # = 33.9 kg/m2
433
+ #
434
+ # For steel-framed partitions, representative material volumes (per m2):
435
+ # - 1% steel-framing: 1.25 x 2.5 x 1.5 kg/m = 4.7 kg/m2 (17.3%)
436
+ # - 99% insulation : 0.1504 m3/m2 x 19 kg/m3 = 2.9 kg/m2 (10.7%)
437
+ # - drywall (2x) : 0.0250 m3/m2 x 785 kg/m3 = 19.6 kg/m2 (72.0%)
438
+ # = 27.2 kg/m2
439
+ #
440
+ # For CMU partitions, representative material volumes (per m2):
441
+ # - 10" medium weight CMU = 250.0 kg/m2 (approx.)
442
+
443
+ case @framing
444
+ when :cmu then partition_kgm2 = 250.0 * partition_m2 / floor_m2
445
+ when :wood then partition_kgm2 = 33.9 * partition_m2 / floor_m2
446
+ else partition_kgm2 = 27.2 * partition_m2 / floor_m2
447
+ end
448
+
449
+ # Structural dead load - not explicitly modelled - include columns,
450
+ # bracing, connectors, etc. For BTAP purposes, some basic assumptions are
451
+ # required:
452
+ # - 9m x 9m spans
453
+ # - approx. 15 columns / 1000 m2 of floor area
454
+ # - approx. 14" x 14" columns (0.126 m2)
455
+ # - if structure :steel or :metal (HP14x102):
456
+ # - 152 kg/m (x 125% for bracing, etc.) = 190 kg/m
457
+ # - if structure :concrete
458
+ # - concrete: 2240 kg/m3 x 0.126 m2 x 97% = 274 kg/m
459
+ # - rebar: 7850 kg/m3 x 0.126 m2 x 3% = 30 kg/m
460
+ # = 304 kg/m (+11%)
461
+ # - if structure :cmu (mix of load bearing walls + smaller pours)
462
+ # - 1/2 :concrete = 150 kg/m
463
+ # - if structure :clt
464
+ # - wood: 540 kg/m3 x 0.126 m2 x 97% = 66 kg/m
465
+ # - anchors: 7850 kg/m3 x 0.126 m2 x 3% = 30 kg/m
466
+ # = 96 kg/m (+45%)
467
+ # - if structure :wood
468
+ # - 1/2 :clt = 48 kg/m
469
+
470
+ # Fetch approx. total column height (m) in building (including plenums).
471
+ column_m = 0
472
+
473
+ model.getSpaces.each do |space|
474
+ column_m += BTAP::Geometry::Spaces.space_height(space) * 15 / 1000
475
+ end
476
+
477
+ case @structure
478
+ when :steel then column_kgm2 = 190 * column_m / floor_m2
479
+ when :metal then column_kgm2 = 190 * column_m / floor_m2
480
+ when :cmu then column_kgm2 = 150 * column_m / floor_m2
481
+ when :wood then column_kgm2 = 48 * column_m / floor_m2
482
+ when :clt then column_kgm2 = 96 * column_m / floor_m2
483
+ else column_kgm2 = 304 * column_m / floor_m2
484
+ end
485
+
486
+ @deadload = partition_kgm2 + column_kgm2
487
+
488
+ # The 'liveload' attribute represents the mass area density (kg/m2) of
489
+ # dynamic, yet uniform floor live load from non-permanent items like
490
+ # furniture, documents, copiers and computers, i.e. not real estate
491
+ # assets. Architects and engineers deal with (fixed) live load as design
492
+ # constraint - not as potential design option. Non-occupant live load is
493
+ # taken into account when setting internal mass. Yet as a non-real estate
494
+ # item, live load is not considered when tallying embodied carbon.
495
+ #
496
+ # Within BTAP, non-occupant live load estimates are stored in the
497
+ # "NECB_building_types.csv" file, parsed/stored in a BTAP::Activity
498
+ # instance (1x per building activity). These estimates are initially based
499
+ # on NBC Part 4 minimum live load requirements (kPa), as well as data from
500
+ # established structural engineering resources. Minimum live load kPa (or
501
+ # psf) estimates, corresponding to hundreds of kg/m2 of floor area, are
502
+ # strictly for structural dimensioning/safety purposes. They are not (or
503
+ # are very rarely) representative of actual day-to-day loads. Back of the
504
+ # envelope calculations suggest reducing live load code requirements down
505
+ # to ~1/12th of their initial values for internal mass purposes. These
506
+ # code requirements also include occupants, which should be set aside -
507
+ # by subtracting the total building population mass:
508
+ #
509
+ # - NECB building occupant density (occupant/m2) x avg. 80 kg/adult
510
+ #
511
+ # This gives for instance a resulting live load estimate of 23 kg/m2 for
512
+ # housing (low) and a 61 kg/m2 for manufacturing (high). It is obviously
513
+ # challenging to pin down a single-number estimate for several building
514
+ # types, including bigbox retail and warehousing. Grain of salt.
515
+ @liveload = lload
516
+
517
+ # Add internal mass objects, 1x instance per occupied space.
518
+ cspaces.each do |space|
519
+ break unless massive
520
+
521
+ matID = "#{space.nameString} : Mass Material"
522
+ conID = "#{space.nameString} : Mass Construction"
523
+ defID = "#{space.nameString} : Mass Definition"
524
+ mssID = "#{space.nameString} : Mass"
525
+
526
+ # Calculate total mass of internal mass (kg), then thickness.
527
+ kg = space.floorArea * (@liveload + @deadload)
528
+ m2 = kg / rho / th
529
+
530
+ mat = OpenStudio::Model::StandardOpaqueMaterial.new(model)
531
+ mat.setName(matID)
532
+ mat.setRoughness("MediumRough")
533
+ mat.setThickness(th)
534
+ mat.setConductivity(1.0)
535
+ mat.setDensity(rho)
536
+ mat.setSpecificHeat(1000)
537
+ mat.setThermalAbsorptance(0.9)
538
+ mat.setSolarAbsorptance(0.7)
539
+ mat.setVisibleAbsorptance(0.7)
540
+
541
+ con = OpenStudio::Model::Construction.new(model)
542
+ con.setName(conID)
543
+ layers = OpenStudio::Model::MaterialVector.new
544
+ layers << mat
545
+ con.setLayers(layers)
546
+
547
+ df = OpenStudio::Model::InternalMassDefinition.new(model)
548
+ df.setName(defID)
549
+ df.setConstruction(con)
550
+ df.setSurfaceArea(space.floorArea)
551
+ df.setSurfaceArea(m2)
552
+
553
+ mass = OpenStudio::Model::InternalMass.new(df)
554
+ mass.setName(mssID)
555
+ mass.setSpace(space)
556
+ end
557
+
558
+ # Embodied CO2-e kg (A1-A3) of a model is tallied separately as follows:
559
+ @co2 = {}
560
+ @co2[:structure ] = 0
561
+ @co2[:insulation] = 0
562
+ @co2[:cladding ] = 0
563
+
564
+ # The :structure key/value pair includes above grade 'structures' (e.g.
565
+ # slabs, columns) and 'framing' (e.g. wood-framed vs steel-framed). Why
566
+ # grouped together? In many smaller-scale facilities, structure and
567
+ # framing are synonymous, or at least tightly coupled, e.g.:
568
+ # - load-bearing wood-framed walls in small-scale residential
569
+ # - load-bearing CMU walls in small-scale industrial
570
+ # - metal buildings
571
+ #
572
+ # Below-grade structures (rebar + poured concrete) are ignored - no
573
+ # alternative options are considered for the moment, e.g. lower carbon
574
+ # concrete mixes.
575
+ #
576
+ # Upon initialization, only the :structure tally is set. It is assumed
577
+ # that structure (and main framing) do not change with NECB U-factor
578
+ # requirements, e.g.:
579
+ # - NECB 2011 vs 2020
580
+ # - Vancouver vs Calgary
581
+ #
582
+ # Once default construction sets are (later) established (+), followed by
583
+ # TBD uprating assemblies as per NECB 2017 & 2020 requirements (++),
584
+ # embodied carbon tallies can be updated/reset, which would include:
585
+ # - cladding
586
+ # - insulation
587
+ # - secondary framing (proportional to insulation thicknesses)
588
+ #
589
+ # (+) openstudio-standards/standards/necb/NECB2011/building_envelope.rb
590
+ # (++) openstudio-standards/btap/bridging.rb
591
+
592
+ # Start with occupied floors & roofs (exclude slabs on grade).
593
+ m2 = ofloor_m2 + ifloor_m2 + roof_m2
594
+
595
+ case @structure
596
+ when :wood then # engineered I-joists + plywood
597
+ floor_kg = 50.0 * m2
598
+ floor_m3 = floor_kg / 540.0 # kg/m3
599
+ floor_co2kg = floor_m3 * 55.0 / floor_kg # kgCO2-e/kg
600
+ when :concrete then # 200mm flat slab, 3% rebar + accessories
601
+ floor_m3 = 0.200 * m2
602
+ floor_kgm3 = (0.03 * 7850.0) + (0.97 * 2240.0) # kg/m3
603
+ floor_co2kg = (0.03 * 0.854 ) + (0.97 * 0.250) # kgCO2-e/kg
604
+ floor_kg = floor_m3 * floor_kgm3
605
+ else # :steel, includes joists/fasteners
606
+ floor_m3 = 0.125 * m2
607
+ floor_kgm3 = (0.08 * 7850.0) + (0.92 * 2240.0) # kg/m3
608
+ floor_co2kg = (0.08 * 0.854 ) + (0.92 * 0.250) # kgCO2-e/kg
609
+ floor_kg = floor_m3 * floor_kgm3
610
+ end
611
+
612
+ @co2[:structure] += floor_co2kg * floor_kg
613
+
614
+ # Add exposed walls and interior partitions.
615
+ m2 = wall_m2 + iwall_m2 + partition_m2
616
+
617
+ case @framing
618
+ when :wood then # basic 2x6 construction, 16% of framing cavity
619
+ wall_kg = 12.1 * m2
620
+ wall_co2kg = 55.0 / 540.0 # 55 kgCO2-e/m3 / density
621
+ when :cmu then # 250mm medium weight CMU, 200 kgCO2-e/m3
622
+ wall_m3 = 0.250 * m2 # nominal m3
623
+ wall_kg = 250.0 * m2 # volume-weighted concrete/air/grout
624
+ wall_kgm3 = 0.250 / 250.0
625
+ wall_co2kg = 200.0 / wall_kgm3 # 200 kgCO2-e/m3 / density
626
+ else # :steel, 1% lightweight steel-framing
627
+ wall_kg = 4.7 * m2
628
+ wall_co2kg = 2.440
629
+ end
630
+
631
+ @co2[:structure] += wall_co2kg * wall_kg
632
+
633
+ true
634
+ end
635
+
636
+ ##
637
+ # Updates and returns embodied carbon estimates (A1-A3).
638
+ #
639
+ # @param model [OpenStudio::Model::Model] a model
640
+ #
641
+ # @return [Hash] embodied carbon tally (CO2-e kg, A1-A3)
642
+ def tallyCO2(model)
643
+ mth = "BTAP::Structure::#{__callee__}"
644
+ cl = OpenStudio::Model::Model
645
+ lgs = @feedback[:logs]
646
+
647
+ unless model.is_a?(cl)
648
+ lgs << "Invalid OpenStudio model (#{mth})"
649
+ return 0
650
+ end
651
+
652
+ # @todo
653
+
654
+ @co2
655
+ end
656
+ end
657
+ end