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
@@ -6,38 +6,52 @@ class NECB2011 < Standard
6
6
 
7
7
  @template = new.class.name
8
8
  register_standard(@template)
9
- attr_reader :tbd
10
9
  attr_reader :template
10
+ attr_reader :tbd
11
+ attr_reader :osut
12
+ attr_reader :activity
13
+ attr_reader :structure
11
14
  attr_accessor :standards_data
12
15
  attr_accessor :space_type_map
13
16
  attr_accessor :space_multiplier_map
14
17
  attr_accessor :fuel_type_set
15
18
 
16
- # This is a helper method to convert arguments that may support 'NECB_Default, and nils to convert to float'
19
+ # This is a helper method to convert arguments to float.
20
+ # If variable undefined set to the default
21
+ # If already a numeric then return it
22
+ # If variable is a string then convert to a float, using the default if 'NECB_Default'
23
+ # If that all fails then return the default.
17
24
  def convert_arg_to_f(variable:, default:)
25
+ return default if variable.nil?
18
26
  return variable if variable.kind_of?(Numeric)
19
- return default if variable.nil? || (variable.to_s == 'NECB_Default')
20
- return unless variable.kind_of?(String)
21
-
22
- variable = variable.strip
23
- return variable.to_f
27
+ if variable.is_a? String
28
+ return default if variable.to_s.downcase == 'necb_default'
29
+ variable = variable.strip
30
+ return variable.to_f
31
+ end
32
+ return default
24
33
  end
25
34
 
26
- # This method converts arguments to bool. Anything other than a bool false or string 'false' is converted
27
- # to a bool true. Bool false and case insesitive string false are turned into bool false.
35
+ # This method converts arguments to bool.
36
+ # If variable undefined set to the default
37
+ # If already a bool then return it
38
+ # If variable is a string then convert to a bool, using the default if 'NECB_Default'
39
+ # If that all fails then return the default.
28
40
  def convert_arg_to_bool(variable:, default:)
29
41
  return default if variable.nil?
42
+ return variable if variable.is_a?(TrueClass) || variable.is_a?(FalseClass)
30
43
  if variable.is_a? String
31
- return true if variable.to_s.downcase == 'true'
44
+ return default if variable.to_s.downcase == 'necb_default'
32
45
  return false if variable.to_s.downcase == 'false'
33
- return default
46
+ return true if variable.to_s.downcase == 'true'
34
47
  end
35
- return variable if variable.is_a?(TrueClass) || variable.is_a?(FalseClass)
36
48
  return default
37
49
  end
38
50
 
39
- # This method checks if a variable is a string. If it is anything but a string it returns the default. If it is a
40
- # string set to "NECB_Default" it return the default. Otherwise it returns the strirng set to it.
51
+ # This method checks if a variable is a string.
52
+ # If variable undefined set to the default
53
+ # If variable is a string then return it, using the default if 'NECB_Default'
54
+ # If that all fails then return the default.
41
55
  def convert_arg_to_string(variable:, default:)
42
56
  return default if variable.nil?
43
57
  if variable.is_a? String
@@ -149,6 +163,10 @@ class NECB2011 < Standard
149
163
  @standards_data = load_standards_database_new
150
164
  corrupt_standards_database
151
165
  @tbd = nil
166
+ @activity = nil
167
+ @structure = nil
168
+ @osut = {gra0: 0, graX: 0, status: 0, logs: []} # "gra": "gross roof area"
169
+
152
170
  # puts "loaded these tables..."
153
171
  # puts @standards_data.keys.size
154
172
  # raise("tables not all loaded in parent #{}") if @standards_data.keys.size < 24
@@ -180,6 +198,22 @@ class NECB2011 < Standard
180
198
  min_distance = 100000000000000.0
181
199
  necb_closest = nil
182
200
  weather_file_path = model.weatherFile.get.path.get.to_s
201
+
202
+ # Check if weather file exists at the specified path
203
+ unless File.exist?(weather_file_path)
204
+ # Try to find the file in the data/weather folder
205
+ weather_file_name = File.basename(weather_file_path)
206
+ data_weather_path = File.absolute_path(File.join(__FILE__, '..', '..', '..', '..', '..', '..', 'data', 'weather', weather_file_name))
207
+
208
+ if File.exist?(data_weather_path)
209
+ weather_file_path = data_weather_path
210
+ # Update the model's weather file path to point to the found file
211
+ OpenstudioStandards::Weather.model_set_building_location(model, weather_file_path: weather_file_path)
212
+ else
213
+ raise "Weather file not found at #{weather_file_path} or #{data_weather_path}"
214
+ end
215
+ end
216
+
183
217
  epw_file = model.weatherFile.get.file.get
184
218
  stat_file_path = weather_file_path.gsub('.epw', '.stat')
185
219
  stat_file = OpenstudioStandards::Weather::StatFile.new(stat_file_path)
@@ -211,6 +245,7 @@ class NECB2011 < Standard
211
245
  # This method is a wrapper to create the 16 archetypes easily. # 55 args
212
246
  def model_create_prototype_model(template:,
213
247
  building_type:,
248
+ construction_opt: '',
214
249
  epw_file:,
215
250
  custom_weather_folder: nil,
216
251
  debug: false,
@@ -250,6 +285,7 @@ class NECB2011 < Standard
250
285
  rotation_degrees: nil,
251
286
  fdwr_set: -1.0,
252
287
  srr_set: -1.0,
288
+ srr_opt: '',
253
289
  nv_type: nil,
254
290
  nv_opening_fraction: nil,
255
291
  nv_temp_out_min: nil,
@@ -272,8 +308,8 @@ class NECB2011 < Standard
272
308
  output_meters: nil,
273
309
  airloop_economizer_type: nil,
274
310
  baseline_system_zones_map_option: nil,
275
- tbd_option: nil,
276
- tbd_interpolate: false,
311
+ tbd_option: 'none',
312
+ tbd_interpolate: true,
277
313
  necb_hdd: true,
278
314
  boiler_fuel: nil,
279
315
  boiler_cap_ratio: nil,
@@ -281,6 +317,7 @@ class NECB2011 < Standard
281
317
  oerd_utility_pricing: nil)
282
318
  model = load_building_type_from_library(building_type: building_type)
283
319
  return model_apply_standard(model: model,
320
+ construction_opt: construction_opt,
284
321
  tbd_option: tbd_option,
285
322
  tbd_interpolate: tbd_interpolate,
286
323
  epw_file: epw_file,
@@ -321,6 +358,7 @@ class NECB2011 < Standard
321
358
  rotation_degrees: rotation_degrees,
322
359
  fdwr_set: fdwr_set,
323
360
  srr_set: srr_set,
361
+ srr_opt: srr_opt,
324
362
  nv_type: nv_type, # Two options: (1) nil/none/false/'NECB_Default', (2) 'add_nv'
325
363
  nv_opening_fraction: nv_opening_fraction, # options: (1) nil/none/false (2) 'NECB_Default' (i.e. 0.1), (3) opening fraction of windows, which can be a float number between 0.0 and 1.0
326
364
  nv_temp_out_min: nv_temp_out_min, # options: (1) nil/none/false(2) 'NECB_Default' (i.e. 13.0 based on inputs from Michel Tardif re a real school in QC), (3) minimum outdoor air temperature (in Celsius) below which natural ventilation is shut down
@@ -364,8 +402,9 @@ class NECB2011 < Standard
364
402
  # Created this method so that additional methods can be addded for bulding the prototype model in later
365
403
  # code versions without modifying the build_protoype_model method or copying it wholesale for a few changes.
366
404
  def model_apply_standard(model:,
367
- tbd_option: nil,
368
- tbd_interpolate: nil,
405
+ construction_opt: '',
406
+ tbd_option: 'none',
407
+ tbd_interpolate: true,
369
408
  epw_file:,
370
409
  custom_weather_folder: nil,
371
410
  btap_weather: true,
@@ -406,6 +445,7 @@ class NECB2011 < Standard
406
445
  skylight_solar_trans: nil,
407
446
  fdwr_set: nil,
408
447
  srr_set: nil,
448
+ srr_opt: '',
409
449
  rotation_degrees: nil,
410
450
  scale_x: nil,
411
451
  scale_y: nil,
@@ -445,6 +485,11 @@ class NECB2011 < Standard
445
485
  clean_and_scale_model(model: model, rotation_degrees: rotation_degrees, scale_x: scale_x, scale_y: scale_y, scale_z: scale_z)
446
486
  fdwr_set = convert_arg_to_f(variable: fdwr_set, default: -1)
447
487
  srr_set = convert_arg_to_f(variable: srr_set, default: -1)
488
+ srr_opt = convert_arg_to_string(variable: srr_opt, default: '')
489
+ construction_opt = convert_arg_to_string(variable: construction_opt, default: '')
490
+ massive = construction_opt == 'structure'
491
+ tbd_option = convert_arg_to_string(variable: tbd_option, default: 'none')
492
+ tbd_interpolate = convert_arg_to_bool(variable: tbd_interpolate, default: true)
448
493
  necb_hdd = convert_arg_to_bool(variable: necb_hdd, default: true)
449
494
  boiler_fuel = convert_arg_to_string(variable: boiler_fuel, default: nil)
450
495
  boiler_cap_ratio = convert_arg_to_string(variable: boiler_cap_ratio, default: nil)
@@ -472,6 +517,8 @@ class NECB2011 < Standard
472
517
 
473
518
  output_meters = check_output_meters(output_meters: output_meters) if oerd_utility_pricing
474
519
 
520
+ assign_building_activity(model: model)
521
+ assign_building_structure(model: model, activity: @activity, massive: massive)
475
522
  apply_loads(model: model,
476
523
  lights_type: lights_type,
477
524
  lights_scale: lights_scale,
@@ -479,6 +526,9 @@ class NECB2011 < Standard
479
526
  electrical_loads_scale: electrical_loads_scale,
480
527
  oa_scale: oa_scale)
481
528
  apply_envelope(model: model,
529
+ construction_opt: construction_opt,
530
+ bldg_category: @activity.category,
531
+ bldg_structure: @structure.structure,
482
532
  ext_wall_cond: ext_wall_cond,
483
533
  ext_floor_cond: ext_floor_cond,
484
534
  ext_roof_cond: ext_roof_cond,
@@ -498,18 +548,21 @@ class NECB2011 < Standard
498
548
  apply_fdwr_srr_daylighting(model: model,
499
549
  fdwr_set: fdwr_set,
500
550
  srr_set: srr_set,
551
+ srr_opt: srr_opt,
501
552
  necb_hdd: necb_hdd)
502
553
  apply_thermal_bridging(model: model,
503
- tbd_option: tbd_option,
504
- tbd_interpolate: tbd_interpolate,
505
- wall_U: ext_wall_cond,
506
- floor_U: ext_floor_cond,
507
- roof_U: ext_roof_cond)
554
+ necb_hdd: necb_hdd,
555
+ structure: @structure,
556
+ option: tbd_option,
557
+ interpolate: tbd_interpolate,
558
+ wallU: ext_wall_cond,
559
+ floorU: ext_floor_cond,
560
+ roofU: ext_roof_cond)
508
561
  apply_auto_zoning(model: model,
509
562
  sizing_run_dir: sizing_run_dir,
510
563
  lights_type: lights_type,
511
564
  lights_scale: lights_scale)
512
- apply_kiva_foundation(model)
565
+ apply_kiva_foundation(model, massive)
513
566
  apply_systems_and_efficiencies(model: model,
514
567
  sizing_run_dir: sizing_run_dir,
515
568
  hvac_system_primary: hvac_system_primary,
@@ -550,7 +603,7 @@ class NECB2011 < Standard
550
603
  def clean_and_scale_model(model:, rotation_degrees: nil, scale_x: nil, scale_y: nil, scale_z: nil)
551
604
  # clean model..
552
605
  BTAP::Resources::Envelope::remove_all_envelope_information(model)
553
- model = remove_all_hvac(model)
606
+ model = OpenstudioStandards::HVAC.remove_all_hvac(model)
554
607
  model.getThermalZones.sort.each { |zone| zone.setUseIdealAirLoads(true) }
555
608
  model.getZoneHVACPackagedTerminalAirConditioners.each(&:remove)
556
609
  model.getCoilCoolingDXSingleSpeeds.each(&:remove)
@@ -709,9 +762,8 @@ class NECB2011 < Standard
709
762
  end
710
763
 
711
764
  # Rename air loop and plant loop nodes to accommodate coming OpenStudio version
712
- rename_air_loop_nodes(model)
713
- rename_plant_loop_nodes(model)
714
-
765
+ OpenstudioStandards::HVAC.rename_air_loop_nodes(model)
766
+ OpenstudioStandards::HVAC.rename_plant_loop_nodes(model)
715
767
  end
716
768
 
717
769
  def apply_loads(model:,
@@ -759,6 +811,9 @@ class NECB2011 < Standard
759
811
  end
760
812
 
761
813
  def apply_envelope(model:,
814
+ construction_opt: '',
815
+ bldg_category: '',
816
+ bldg_structure: '',
762
817
  ext_wall_cond: nil,
763
818
  ext_floor_cond: nil,
764
819
  ext_roof_cond: nil,
@@ -782,29 +837,61 @@ class NECB2011 < Standard
782
837
  ecm.scale_infiltration_loads(model: model, scale: infiltration_scale)
783
838
  model.getInsideSurfaceConvectionAlgorithm.setAlgorithm('TARP')
784
839
  model.getOutsideSurfaceConvectionAlgorithm.setAlgorithm('TARP')
785
- model_add_constructions(model)
786
- apply_standard_construction_properties(model: model,
787
- ext_wall_cond: ext_wall_cond,
788
- ext_floor_cond: ext_floor_cond,
789
- ext_roof_cond: ext_roof_cond,
790
- ground_wall_cond: ground_wall_cond,
791
- ground_floor_cond: ground_floor_cond,
792
- ground_roof_cond: ground_roof_cond,
793
- door_construction_cond: door_construction_cond,
794
- fixed_window_cond: fixed_window_cond,
795
- glass_door_cond: glass_door_cond,
796
- overhead_door_cond: overhead_door_cond,
797
- skylight_cond: skylight_cond,
798
- glass_door_solar_trans: glass_door_solar_trans,
799
- fixed_wind_solar_trans: fixed_wind_solar_trans,
800
- skylight_solar_trans: skylight_solar_trans,
801
- necb_hdd: necb_hdd)
840
+
841
+ construction_opt = '' unless construction_opt.respond_to?(:to_sym)
842
+ bldg_structure = '' unless bldg_structure.respond_to?(:to_sym)
843
+ construction_opt = construction_opt.to_s.downcase
844
+ bldg_structure = bldg_structure.to_s.downcase.to_sym
845
+ bldg_structures = @structure.data[:structure].keys
846
+
847
+ if construction_opt == 'structure' && bldg_structures.include?(bldg_structure)
848
+ argh = {}
849
+ argh[:eWallU ] = ext_wall_cond if ext_wall_cond
850
+ argh[:eFloorU ] = ext_floor_cond if ext_floor_cond
851
+ argh[:eRoofU ] = ext_roof_cond if ext_roof_cond
852
+ argh[:gWallU ] = ground_wall_cond if ground_wall_cond
853
+ argh[:gFloorU ] = ground_floor_cond if ground_floor_cond
854
+ argh[:gRoofU ] = ground_roof_cond if ground_roof_cond
855
+ argh[:doorU ] = door_construction_cond if door_construction_cond
856
+ argh[:fenU ] = fixed_window_cond if fixed_window_cond
857
+ argh[:skyU ] = skylight_solar_trans if skylight_solar_trans
858
+ argh[:doorSHGC] = glass_door_solar_trans if glass_door_solar_trans
859
+ argh[:fenSHGC ] = fixed_wind_solar_trans if fixed_wind_solar_trans
860
+ argh[:skySHGC ] = skylight_solar_trans if skylight_solar_trans
861
+
862
+ assign_contruction_to_adiabatic_surfaces(model)
863
+ ok = add_construction_sets(model, necb_hdd, argh)
864
+
865
+ raise('NECB2011: Failed to assign default construction sets') unless ok
866
+ else
867
+ model_add_constructions(model)
868
+ apply_standard_construction_properties(model: model,
869
+ ext_wall_cond: ext_wall_cond,
870
+ ext_floor_cond: ext_floor_cond,
871
+ ext_roof_cond: ext_roof_cond,
872
+ ground_wall_cond: ground_wall_cond,
873
+ ground_floor_cond: ground_floor_cond,
874
+ ground_roof_cond: ground_roof_cond,
875
+ door_construction_cond: door_construction_cond,
876
+ fixed_window_cond: fixed_window_cond,
877
+ glass_door_cond: glass_door_cond,
878
+ overhead_door_cond: overhead_door_cond,
879
+ skylight_cond: skylight_cond,
880
+ glass_door_solar_trans: glass_door_solar_trans,
881
+ fixed_wind_solar_trans: fixed_wind_solar_trans,
882
+ skylight_solar_trans: skylight_solar_trans,
883
+ necb_hdd: necb_hdd)
884
+ end
885
+
802
886
  model_create_thermal_zones(model, @space_multiplier_map)
803
887
  end
804
888
 
805
- # apply the Kiva foundation model to floors and walls with ground boundary condition
889
+ # Apply Kiva foundation model to floors/walls with ground boundary condition.
806
890
  # created by: Kamel Haddad (kamel.haddad@nrcan-rncan.gc.ca)
807
- def apply_kiva_foundation(model)
891
+ # 'massive' edit: denis@rd2.ca
892
+ #
893
+ # @param massive [Boolean] whether opaque materials are standard (not massless)
894
+ def apply_kiva_foundation(model, massive = false)
808
895
  # define a Kiva model for the whole bldg that's used for the first floor in contact with ground in each zone
809
896
  bldg_kiva_model = OpenStudio::Model::FoundationKiva.new(model)
810
897
  bldg_kiva_model.setName("Bldg Kiva Foundation")
@@ -832,10 +919,21 @@ class NECB2011 < Standard
832
919
  kiva_model.setWallDepthBelowSlab(0.0)
833
920
  zone_kiva_models << kiva_model
834
921
  end
835
- # Kiva model only works with standard materials. Replace constructions massless materials with standard ones.
836
- replace_massless_material_with_std_material(model,gfloor)
837
- gfloor.setOutsideBoundaryCondition('Foundation')
838
- gfloor.setAdjacentFoundation(zone_kiva_models.last)
922
+ # Kiva model only works with standard materials. Replace constructions
923
+ # massless materials with standard ones.
924
+ # Kiva model only works with standard materials. Replace constructions
925
+ # massless materials with standard ones. Skip check if 'massive'.
926
+ if massive
927
+ c = gfloor.construction.get.to_LayeredConstruction.get
928
+ gfloor.setOutsideBoundaryCondition('Foundation')
929
+ gfloor.setAdjacentFoundation(zone_kiva_models.last)
930
+ gfloor.setConstruction(c)
931
+ else
932
+ replace_massless_material_with_std_material(model,gfloor)
933
+ gfloor.setOutsideBoundaryCondition('Foundation')
934
+ gfloor.setAdjacentFoundation(zone_kiva_models.last)
935
+ end
936
+
839
937
  # Set the exposed perimeter for space floors in contact with the ground.
840
938
  floor_exp_per = 0.0
841
939
  if !space_ground_walls.empty?
@@ -848,9 +946,16 @@ class NECB2011 < Standard
848
946
  # contact with the space floor in contact with ground 'gfloor'
849
947
  space_ground_walls.each do |gwall|
850
948
  if surfaces_are_in_contact?(gfloor,gwall)
851
- replace_massless_material_with_std_material(model,gwall)
852
- gwall.setOutsideBoundaryCondition('Foundation')
853
- gwall.setAdjacentFoundation(zone_kiva_models.last)
949
+ if massive
950
+ c = gwall.construction.get.to_LayeredConstruction.get
951
+ gwall.setOutsideBoundaryCondition('Foundation')
952
+ gwall.setAdjacentFoundation(zone_kiva_models.last)
953
+ gwall.setConstruction(c)
954
+ else
955
+ replace_massless_material_with_std_material(model,gwall)
956
+ gwall.setOutsideBoundaryCondition('Foundation')
957
+ gwall.setAdjacentFoundation(zone_kiva_models.last)
958
+ end
854
959
  end
855
960
  end
856
961
  end
@@ -1021,84 +1126,99 @@ class NECB2011 < Standard
1021
1126
  end
1022
1127
 
1023
1128
  # Thermal zones need to be set to determine conditioned spaces when applying fdwr and srr limits.
1024
- # # fdwr_set/srr_set settings:
1025
- # # 0-1: Remove all windows/skylights and add windows/skylights to match this fdwr/srr
1026
- # # -1: Remove all windows/skylights and add windows/skylights to match max fdwr/srr from NECB
1027
- # # -2: Do not apply any fdwr/srr changes, leave windows/skylights alone (also works for fdwr/srr > 1)
1028
- # # -3: Use old method which reduces existing window/skylight size (if necessary) to meet maximum NECB fdwr/srr
1029
- # # limit
1030
- # # <-3.1: Remove all the windows/skylights
1031
- # # > 1: Do nothing
1032
- def apply_fdwr_srr_daylighting(model:, fdwr_set: -1.0, srr_set: -1.0, necb_hdd: true)
1129
+ #
1130
+ # fdwr_set/srr_set settings:
1131
+ # 0-1: Remove all windows/skylights and add windows/skylights to match this fdwr/srr
1132
+ # -1: Remove all windows/skylights and add windows/skylights to match max fdwr/srr from NECB
1133
+ # -2: Do not apply any fdwr/srr changes, leave windows/skylights alone (also works for fdwr/srr > 1)
1134
+ # -3: Use old method which reduces existing window/skylight size (if necessary) to meet maximum NECB fdwr/srr limit
1135
+ # <-3.1: Remove all the windows/skylights
1136
+ # > 1: Do nothing
1137
+ #
1138
+ # By default, :srr_opt is an empty string (" "). If set to "osut", SRR is
1139
+ # instead met using OSut's 'addSkylights' (:srr_set numeric values may apply).
1140
+ def apply_fdwr_srr_daylighting(model:, fdwr_set: -1.0, srr_set: -1.0, necb_hdd: true, srr_opt: '')
1033
1141
  fdwr_set = -1.0 if (fdwr_set == 'NECB_default') || fdwr_set.nil?
1034
1142
  srr_set = -1.0 if (srr_set == 'NECB_default') || srr_set.nil?
1035
1143
  fdwr_set = fdwr_set.to_f
1036
1144
  srr_set = srr_set.to_f
1037
1145
  apply_standard_window_to_wall_ratio(model: model, fdwr_set: fdwr_set, necb_hdd: necb_hdd)
1038
- apply_standard_skylight_to_roof_ratio(model: model, srr_set: srr_set)
1146
+ apply_standard_skylight_to_roof_ratio(model: model, srr_set: srr_set, srr_opt: srr_opt)
1039
1147
  # model_add_daylighting_controls(model) # to be removed after refactor.
1040
1148
  end
1041
1149
 
1042
- ##
1043
- # Optionally uprates, then derates, envelope surfaces due to MAJOR thermal
1044
- # bridges (e.g. roof parapets, corners, fenestration perimeters). See
1045
- # lib/openstudio-standards/btap/bridging.rb, which relies on the Thermal
1046
- # Bridging & Derating (TBD) gem.
1150
+ # Initiates a BTAP building ACTIVITY.
1047
1151
  #
1048
- # @param model [OpenStudio::Model::Model] an OpenStudio model
1049
- # @param tbd_option [String] BTAP/TBD option
1152
+ # @param model [OpenStudio::Model::Model] a model
1050
1153
  #
1051
- # @return [Boolean] true if successful, e.g. no errors, compliant if uprated
1154
+ # @return [BTAP::Activity] a BTAP building ACTIVITY (see logs if failed)
1155
+ def assign_building_activity(model: nil)
1156
+ @activity = BTAP::Activity.new(model)
1157
+ end
1158
+
1159
+ # Initiates a BTAP building STRUCTURE.
1160
+ #
1161
+ # @param model [OpenStudio::Model::Model] a model
1162
+ # @param activity [BTAP::Activity] a BTAP building ACTIVITY object
1163
+ # @param massive [Boolean] whether requesting internal mass generation
1164
+ #
1165
+ # @return [BTAP::Structure] a BTAP building STRUCTURE (see logs if failed)
1166
+ def assign_building_structure(model: nil, activity: nil, massive: true)
1167
+ @structure = BTAP::Structure.new(model, activity, massive)
1168
+ end
1052
1169
 
1053
1170
  ##
1054
- # (Optionally) uprates, then derates, envelope surface constructions due to
1171
+ # (Optionally) uprates - then derates - envelope surface constructions due to
1055
1172
  # MAJOR thermal bridges (e.g. roof parapets, corners, fenestration
1056
1173
  # perimeters). See lib/openstudio-standards/btap/bridging.rb, which relies on
1057
1174
  # the Thermal Bridging & Derating (TBD) gem.
1058
1175
  #
1059
1176
  # @param model [OpenStudio::Model::Model] an OpenStudio model
1060
- # @param tbd_option [String] BTAP/TBD option
1061
- # @param tbd_interpolate [Boolean] true if TBD interpolates between costed Uo
1062
- # @param wall_U [Double] wall conductance in W/m2.K (nil by default)
1063
- # @param floor_U [Double] floor conductance in W/m2.K (nil by default)
1064
- # @param roof_U [Double] roof conductance in W/m2.K (nil by default)
1177
+ # @param necb_hdd [Boolean] whether to rely on BTAP to set HDD (vs stat file)
1178
+ # @param structure [BTAP::Structure] BTAP Structure object
1179
+ # @param option [#to_sym] BTAP/TBD option e.g. "uprate"
1180
+ # @param interpolate [Boolean] true if TBD interpolates among Uo (uprating)
1181
+ # @param wallU [Numeric] optional wall Ut in W/m2.K if uprating
1182
+ # @param floorU [Numeric] optional floor Ut in W/m2.K if uprating
1183
+ # @param roofU [Numeric] optional roof Ut in W/m2.K if uprating
1065
1184
  #
1066
1185
  # @return [Boolean] true if successful, e.g. no errors, compliant if uprated
1067
1186
  def apply_thermal_bridging(model: nil,
1068
- tbd_option: 'none',
1069
- tbd_interpolate: false,
1070
- wall_U: nil,
1071
- floor_U: nil,
1072
- roof_U: nil)
1073
- return false unless model.is_a?(OpenStudio::Model::Model)
1074
- return false unless tbd_option.respond_to?(:to_s)
1075
-
1076
- tbd_option = tbd_option.to_s
1077
- # 4x options:
1078
- # - 'none' (TBD is ignored)
1079
- # - derate using 'bad' PSI factors (BTAP-costed)
1080
- # - derate using 'good' PSI factors (BTAP-costed)
1081
- # - 'uprate' (then derate), i.e. iterative process (BTAP-costed)
1082
- ok = tbd_option == 'bad' || tbd_option == 'good' || tbd_option == 'uprate'
1083
- return true if tbd_option == 'none'
1084
- return false unless ok
1085
-
1086
- argh = {} # BTAP/TBD arguments
1087
- ok = tbd_interpolate == true || tbd_interpolate == false
1088
- argh[:interpolate] = tbd_interpolate if ok
1089
- argh[:interpolate] = false unless ok
1090
-
1091
- argh[:walls ] = { uo: wall_U }
1092
- argh[:floors] = { uo: floor_U }
1093
- argh[:roofs ] = { uo: roof_U }
1094
-
1095
- if tbd_option == 'uprate'
1096
- argh[:walls ][:ut] = wall_U
1097
- argh[:floors ][:ut] = floor_U
1098
- argh[:roofs ][:ut] = roof_U
1099
- elsif tbd_option == 'good'
1187
+ necb_hdd: true,
1188
+ structure: nil,
1189
+ option: 'none',
1190
+ interpolate: false,
1191
+ wallU: nil,
1192
+ floorU: nil,
1193
+ roofU: nil)
1194
+ necb_hdd = true unless [true, false].include?(necb_hdd)
1195
+ return true unless option.respond_to?(:to_sym)
1196
+ return true if option.to_s.downcase == 'none'
1197
+
1198
+ hdd = get_necb_hdd18(model: model, necb_hdd: necb_hdd)
1199
+ wallU = wallU ? wallU : max_u_necb("wall", "outdoors", hdd)
1200
+ floorU = floorU ? floorU : max_u_necb("floor", "outdoors", hdd)
1201
+ roofU = roofU ? roofU : max_u_necb("roofceiling", "outdoors", hdd)
1202
+
1203
+ argh = {}
1204
+ argh[:structure] = structure
1205
+ argh[:walls ] = { uo: wallU }
1206
+ argh[:floors ] = { uo: floorU }
1207
+ argh[:roofs ] = { uo: roofU }
1208
+
1209
+ case option.downcase
1210
+ when 'uprate'
1211
+ argh[:walls ][:ut] = wallU
1212
+ argh[:floors ][:ut] = floorU
1213
+ argh[:roofs ][:ut] = roofU
1214
+ when 'good'
1100
1215
  argh[:quality] = :good
1101
- end # default == :bad
1216
+ else
1217
+ argh[:quality] = :bad
1218
+ end
1219
+
1220
+ argh[:interpolate] = interpolate
1221
+ argh[:interpolate] = false unless [true, false].include?(interpolate)
1102
1222
 
1103
1223
  @tbd = BTAP::Bridging.new(model, argh)
1104
1224
 
@@ -2010,7 +2130,8 @@ class NECB2011 < Standard
2010
2130
  space_type_apply_internal_loads(space_type: space_type, lights_type: lights_type, lights_scale: lights_scale)
2011
2131
 
2012
2132
  # Schedules
2013
- space_type_apply_internal_load_schedules(space_type, true, true, true, true, true, true)
2133
+ space_type_apply_internal_load_schedules(space_type)
2134
+ space_type_apply_thermostat_schedules(space_type)
2014
2135
  end
2015
2136
 
2016
2137
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished applying space types (loads)')
@@ -15,7 +15,8 @@
15
15
  "start_date": "9/9/1919",
16
16
  "end_date": "2999-09-09T00:00:00+00:00",
17
17
  "minimum_heating_seasonal_performance_factor": null,
18
- "minimum_coefficient_of_performance_heating": 3.1,
18
+ "minimum_coefficient_of_performance_heating": null,
19
+ "minimum_seasonal_energy_efficiency_ratio": 14,
19
20
  "minimum_energy_efficiency_ratio": null,
20
21
  "pthp_cop_coefficient_1": null,
21
22
  "pthp_cop_coefficient_2": null,
@@ -35,7 +36,8 @@
35
36
  "start_date": "9/9/1919",
36
37
  "end_date": "2999-09-09T00:00:00+00:00",
37
38
  "minimum_heating_seasonal_performance_factor": null,
38
- "minimum_coefficient_of_performance_heating": 3.1,
39
+ "minimum_coefficient_of_performance_heating": null,
40
+ "minimum_seasonal_energy_efficiency_ratio": 15,
39
41
  "minimum_energy_efficiency_ratio": null,
40
42
  "pthp_cop_coefficient_1": null,
41
43
  "pthp_cop_coefficient_2": null,
@@ -56,6 +58,7 @@
56
58
  "end_date": "2999-09-09T00:00:00+00:00",
57
59
  "minimum_heating_seasonal_performance_factor": null,
58
60
  "minimum_coefficient_of_performance_heating": 3.3,
61
+ "minimum_seasonal_energy_efficiency_ratio": null,
59
62
  "minimum_energy_efficiency_ratio": null,
60
63
  "pthp_cop_coefficient_1": null,
61
64
  "pthp_cop_coefficient_2": null,
@@ -76,6 +79,7 @@
76
79
  "end_date": "2999-09-09T00:00:00+00:00",
77
80
  "minimum_heating_seasonal_performance_factor": null,
78
81
  "minimum_coefficient_of_performance_heating": 3.3,
82
+ "minimum_seasonal_energy_efficiency_ratio": null,
79
83
  "minimum_energy_efficiency_ratio": null,
80
84
  "pthp_cop_coefficient_1": null,
81
85
  "pthp_cop_coefficient_2": null,
@@ -96,6 +100,7 @@
96
100
  "end_date": "2999-09-09T00:00:00+00:00",
97
101
  "minimum_heating_seasonal_performance_factor": null,
98
102
  "minimum_coefficient_of_performance_heating": 3.2,
103
+ "minimum_seasonal_energy_efficiency_ratio": null,
99
104
  "minimum_energy_efficiency_ratio": null,
100
105
  "pthp_cop_coefficient_1": null,
101
106
  "pthp_cop_coefficient_2": null,
@@ -116,6 +121,7 @@
116
121
  "end_date": "2999-09-09T00:00:00+00:00",
117
122
  "minimum_heating_seasonal_performance_factor": null,
118
123
  "minimum_coefficient_of_performance_heating": 3.2,
124
+ "minimum_seasonal_energy_efficiency_ratio": null,
119
125
  "minimum_energy_efficiency_ratio": null,
120
126
  "pthp_cop_coefficient_1": null,
121
127
  "pthp_cop_coefficient_2": null,
@@ -136,6 +142,7 @@
136
142
  "end_date": "2999-09-09T00:00:00+00:00",
137
143
  "minimum_heating_seasonal_performance_factor": null,
138
144
  "minimum_coefficient_of_performance_heating": 3.2,
145
+ "minimum_seasonal_energy_efficiency_ratio": null,
139
146
  "minimum_energy_efficiency_ratio": null,
140
147
  "pthp_cop_coefficient_1": null,
141
148
  "pthp_cop_coefficient_2": null,
@@ -156,6 +163,7 @@
156
163
  "end_date": "2999-09-09T00:00:00+00:00",
157
164
  "minimum_heating_seasonal_performance_factor": null,
158
165
  "minimum_coefficient_of_performance_heating": 3.2,
166
+ "minimum_seasonal_energy_efficiency_ratio": null,
159
167
  "minimum_energy_efficiency_ratio": null,
160
168
  "pthp_cop_coefficient_1": null,
161
169
  "pthp_cop_coefficient_2": null,
@@ -13,7 +13,7 @@ class NECB2015
13
13
  compressor_type = search_criteria['compressor_type']
14
14
 
15
15
  # Get the chiller capacity
16
- capacity_w = chiller_electric_eir_find_capacity(chiller_electric_eir)
16
+ capacity_w = OpenstudioStandards::HVAC.chiller_electric_get_capacity(chiller_electric_eir)
17
17
 
18
18
  # All chillers must be modulating down to 25% of their capacity
19
19
  chiller_electric_eir.setChillerFlowMode('LeavingSetpointModulated')
@@ -95,7 +95,7 @@ class NECB2015
95
95
  cop = nil
96
96
  if chlr_props['minimum_full_load_efficiency']
97
97
  kw_per_ton = chlr_props['minimum_full_load_efficiency']
98
- cop = kw_per_ton_to_cop(kw_per_ton)
98
+ cop = OpenstudioStandards::HVAC.kw_per_ton_to_cop(kw_per_ton)
99
99
  chiller_electric_eir.setReferenceCOP(cop)
100
100
  else
101
101
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.ChillerElectricEIR', "For #{chiller_electric_eir.name}, cannot find minimum full load efficiency, will not be set.")