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,363 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:Fan
5
+ # Methods to create, modify, and get information about fans
6
+
7
+ # creates an on off fan
8
+ #
9
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
10
+ # @param fan_name [String] fan name
11
+ # @param fan_efficiency [Double] fan efficiency
12
+ # @param pressure_rise [Double] fan pressure rise in Pa
13
+ # @param motor_efficiency [Double] fan motor efficiency
14
+ # @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
15
+ # @param end_use_subcategory [String] end use subcategory name
16
+ # @return [OpenStudio::Model::FanOnOff] on off fan object
17
+ def self.create_fan_on_off(model,
18
+ fan_name: nil,
19
+ fan_efficiency: nil,
20
+ pressure_rise: nil,
21
+ motor_efficiency: nil,
22
+ motor_in_airstream_fraction: nil,
23
+ end_use_subcategory: nil)
24
+ fan = OpenStudio::Model::FanOnOff.new(model)
25
+ fan.setName(fan_name) unless fan_name.nil?
26
+ fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
27
+ fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
28
+ fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
29
+ fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
30
+ fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
31
+
32
+ return fan
33
+ end
34
+
35
+ # creates a constant volume fan
36
+ #
37
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
38
+ # @param fan_name [String] fan name
39
+ # @param fan_efficiency [Double] fan efficiency
40
+ # @param pressure_rise [Double] fan pressure rise in Pa
41
+ # @param motor_efficiency [Double] fan motor efficiency
42
+ # @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
43
+ # @param end_use_subcategory [String] end use subcategory name
44
+ # @return [OpenStudio::Model::FanConstantVolume] constant volume fan object
45
+ def self.create_fan_constant_volume(model,
46
+ fan_name: nil,
47
+ fan_efficiency: nil,
48
+ pressure_rise: nil,
49
+ motor_efficiency: nil,
50
+ motor_in_airstream_fraction: nil,
51
+ end_use_subcategory: nil)
52
+ fan = OpenStudio::Model::FanConstantVolume.new(model)
53
+ fan.setName(fan_name) unless fan_name.nil?
54
+ fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
55
+ fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
56
+ fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
57
+ fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
58
+ fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
59
+
60
+ return fan
61
+ end
62
+
63
+ # creates a variable volume fan
64
+ #
65
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
66
+ # @param fan_name [String] fan name
67
+ # @param fan_efficiency [Double] fan efficiency
68
+ # @param pressure_rise [Double] fan pressure rise in Pa
69
+ # @param motor_efficiency [Double] fan motor efficiency
70
+ # @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
71
+ # @param end_use_subcategory [String] end use subcategory name
72
+ # @param fan_curve [String] fan curve for variable volume fans. See fan_variable_volume_set_control_type() for options.
73
+ # @param fan_power_minimum_flow_rate_input_method [String] options are Fraction, FixedFlowRate
74
+ # @param fan_power_minimum_flow_rate_fraction [Double] minimum flow rate fraction. overrides data in fan curve.
75
+ # @param fan_power_coefficient_1 [Double] fan power coefficient 1. overrides data in fan curve.
76
+ # @param fan_power_coefficient_2 [Double] fan power coefficient 2. overrides data in fan curve.
77
+ # @param fan_power_coefficient_3 [Double] fan power coefficient 3. overrides data in fan curve.
78
+ # @param fan_power_coefficient_4 [Double] fan power coefficient 4. overrides data in fan curve.
79
+ # @param fan_power_coefficient_5 [Double] fan power coefficient 5. overrides data in fan curve.
80
+ # @return [OpenStudio::Model::FanVariableVolume] variable volume fan object
81
+ def self.create_fan_variable_volume(model,
82
+ fan_name: nil,
83
+ fan_efficiency: nil,
84
+ pressure_rise: nil,
85
+ motor_efficiency: nil,
86
+ motor_in_airstream_fraction: nil,
87
+ end_use_subcategory: nil,
88
+ fan_curve: nil,
89
+ fan_power_minimum_flow_rate_input_method: nil,
90
+ fan_power_minimum_flow_rate_fraction: nil,
91
+ fan_power_coefficient_1: nil,
92
+ fan_power_coefficient_2: nil,
93
+ fan_power_coefficient_3: nil,
94
+ fan_power_coefficient_4: nil,
95
+ fan_power_coefficient_5: nil)
96
+ fan = OpenStudio::Model::FanVariableVolume.new(model)
97
+ fan.setName(fan_name) unless fan_name.nil?
98
+ fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
99
+ fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
100
+ fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
101
+ fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
102
+ fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
103
+ OpenstudioStandards::HVAC.fan_variable_volume_set_control_type(fan, control_type: fan_curve) unless fan_curve.nil?
104
+ fan.setFanPowerMinimumFlowRateInputMethod(fan_power_minimum_flow_rate_input_method) unless fan_power_minimum_flow_rate_input_method.nil?
105
+ fan.setFanPowerMinimumFlowFraction(fan_power_minimum_flow_rate_fraction) unless fan_power_minimum_flow_rate_fraction.nil?
106
+ fan.setFanPowerCoefficient1(fan_power_coefficient_1) unless fan_power_coefficient_1.nil?
107
+ fan.setFanPowerCoefficient2(fan_power_coefficient_2) unless fan_power_coefficient_2.nil?
108
+ fan.setFanPowerCoefficient3(fan_power_coefficient_3) unless fan_power_coefficient_3.nil?
109
+ fan.setFanPowerCoefficient4(fan_power_coefficient_4) unless fan_power_coefficient_4.nil?
110
+ fan.setFanPowerCoefficient5(fan_power_coefficient_5) unless fan_power_coefficient_5.nil?
111
+
112
+ return fan
113
+ end
114
+
115
+ # creates a zone exhaust fan
116
+ #
117
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
118
+ # @param fan_name [String] fan name
119
+ # @param fan_efficiency [Double] fan efficiency
120
+ # @param pressure_rise [Double] fan pressure rise in Pa
121
+ # @param end_use_subcategory [String] end use subcategory name
122
+ # @param system_availability_manager_coupling_mode [String] coupling mode, options are Coupled, Decoupled
123
+ # @return [OpenStudio::Model::FanZoneExhaust] the exhaust fan
124
+ def self.create_fan_zone_exhaust(model,
125
+ fan_name: nil,
126
+ fan_efficiency: nil,
127
+ pressure_rise: nil,
128
+ system_availability_manager_coupling_mode: nil,
129
+ end_use_subcategory: nil)
130
+ fan = OpenStudio::Model::FanZoneExhaust.new(model)
131
+ fan.setName(fan_name) unless fan_name.nil?
132
+ fan.setFanEfficiency(fan_efficiency) unless fan_efficiency.nil?
133
+ fan.setPressureRise(pressure_rise) unless pressure_rise.nil?
134
+ fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
135
+ fan.setSystemAvailabilityManagerCouplingMode(system_availability_manager_coupling_mode) unless system_availability_manager_coupling_mode.nil?
136
+
137
+ return fan
138
+ end
139
+
140
+ # creates a fan system model
141
+ #
142
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
143
+ # @param fan_name [String] fan name
144
+ # @param pressure_rise [Double] fan pressure rise in Pa
145
+ # @param motor_efficiency [Double] fan motor efficiency
146
+ # @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
147
+ # @param end_use_subcategory [String] end use subcategory name
148
+ # @param design_power_sizing_method [String] design power sizing method, options are PowerPerFlow or PowerPerFlowPerPressure
149
+ # @param power_per_flow_rate [Double] power per flow rate in W/(m^3/s)
150
+ # @param power_per_flow_rate_per_pressure [Double] power per flow rate per pressure in W/(m^3/s)/Pa
151
+ # @param speed_control_method [String] speed control method, options are Discrete or Continuous
152
+ # @param speeds [Array<[Integer, Integer]>] array of pairs of air flow rate fraction and electric power fraction for discrete speed fans
153
+ # @return [OpenStudio::Model::FanSystemModel] fan system model object
154
+ def self.create_fan_system_model(model,
155
+ fan_name: nil,
156
+ pressure_rise: nil,
157
+ motor_efficiency: nil,
158
+ motor_in_airstream_fraction: nil,
159
+ end_use_subcategory: nil,
160
+ design_power_sizing_method: 'PowerPerFlowPerPressure',
161
+ power_per_flow_rate: nil,
162
+ power_per_flow_rate_per_pressure: 1.66667,
163
+ speed_control_method: 'Continuous',
164
+ speeds: nil)
165
+ fan = OpenStudio::Model::FanSystemModel.new(model)
166
+ fan.setName(fan_name) unless fan_name.nil?
167
+ fan.setDesignPressureRise(pressure_rise) unless pressure_rise.nil?
168
+ fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
169
+ fan.setMotorInAirStreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
170
+ fan.setEndUseSubcategory(end_use_subcategory) unless end_use_subcategory.nil?
171
+ fan.setDesignPowerSizingMethod(design_power_sizing_method) unless design_power_sizing_method.nil?
172
+ fan.setElectricPowerPerUnitFlowRate(power_per_flow_rate) unless power_per_flow_rate.nil?
173
+ fan.setElectricPowerPerUnitFlowRatePerUnitPressure(power_per_flow_rate_per_pressure) unless power_per_flow_rate_per_pressure.nil?
174
+ fan.setSpeedControlMethod(speed_control_method) unless speed_control_method.nil?
175
+ if !speeds.nil? && (speed_control_method == 'Discrete')
176
+ speeds.each { |pair| fan.addSpeed(pair[0], pair[1]) }
177
+ end
178
+
179
+ return fan
180
+ end
181
+
182
+ # create a fan with properties for a typical fan type
183
+ #
184
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
185
+ # @param typical_fan [String] the kind of typical fan to create
186
+ # @param fan_name [String] fan name
187
+ # @param fan_efficiency [Double] fan efficiency
188
+ # @param pressure_rise [Double] fan pressure rise in Pa
189
+ # @param motor_efficiency [Double] fan motor efficiency
190
+ # @param motor_in_airstream_fraction [Double] fraction of motor heat in airstream
191
+ # @param end_use_subcategory [String] end use subcategory name
192
+ # @param fan_curve [String] fan curve for variable volume fans. See fan_variable_volume_set_control_type() for options.
193
+ # @param system_availability_manager_coupling_mode [String] coupling mode, options are Coupled, Decoupled
194
+ # @return [OpenStudio::Model::StraightComponent] fan object
195
+ def self.create_typical_fan(model, typical_fan,
196
+ fan_name: nil,
197
+ fan_efficiency: nil,
198
+ pressure_rise: nil,
199
+ motor_efficiency: nil,
200
+ motor_in_airstream_fraction: nil,
201
+ end_use_subcategory: nil,
202
+ fan_power_minimum_flow_rate_input_method: nil,
203
+ fan_power_minimum_flow_rate_fraction: nil,
204
+ fan_curve: nil,
205
+ system_availability_manager_coupling_mode: nil)
206
+ fan_json = JSON.parse(File.read("#{__dir__}/data/fans.json"), symbolize_names: true)
207
+ fan_data = fan_json[:fans].select { |hash| hash[:name] == typical_fan }
208
+
209
+ if fan_data.empty?
210
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC.fan', "Could not find fan data for typical fan '#{typical_fan}'.")
211
+ return nil
212
+ end
213
+ fan_data = fan_data[0]
214
+
215
+ # use argument values if provided, otherwise use values from the fan data
216
+ fan_efficiency ||= fan_data[:fan_efficiency]
217
+ pressure_rise_inh2o ||= fan_data[:pressure_rise]
218
+ pressure_rise_pa = pressure_rise_inh2o ? OpenStudio.convert(pressure_rise_inh2o, 'inH_{2}O', 'Pa').get : nil # convert pressure rise to Pa
219
+ motor_efficiency ||= fan_data[:motor_efficiency]
220
+ motor_in_airstream_fraction ||= fan_data[:motor_in_airstream_fraction]
221
+
222
+ case fan_data[:type]
223
+ when 'OnOff'
224
+ fan = OpenstudioStandards::HVAC.create_fan_on_off(model,
225
+ fan_name: fan_name,
226
+ fan_efficiency: fan_efficiency,
227
+ pressure_rise: pressure_rise_pa,
228
+ motor_efficiency: motor_efficiency,
229
+ motor_in_airstream_fraction: motor_in_airstream_fraction,
230
+ end_use_subcategory: end_use_subcategory)
231
+ when 'ConstantVolume'
232
+ fan = OpenstudioStandards::HVAC.create_fan_constant_volume(model,
233
+ fan_name: fan_name,
234
+ fan_efficiency: fan_efficiency,
235
+ pressure_rise: pressure_rise_pa,
236
+ motor_efficiency: motor_efficiency,
237
+ motor_in_airstream_fraction: motor_in_airstream_fraction,
238
+ end_use_subcategory: end_use_subcategory)
239
+ when 'VariableVolume'
240
+ fan_curve ||= fan_data[:fan_curve]
241
+ fan = OpenstudioStandards::HVAC.create_fan_variable_volume(model,
242
+ fan_name: fan_name,
243
+ fan_efficiency: fan_efficiency,
244
+ pressure_rise: pressure_rise_pa,
245
+ motor_efficiency: motor_efficiency,
246
+ motor_in_airstream_fraction: motor_in_airstream_fraction,
247
+ end_use_subcategory: end_use_subcategory,
248
+ fan_curve: fan_curve,
249
+ fan_power_minimum_flow_rate_input_method: fan_power_minimum_flow_rate_input_method,
250
+ fan_power_minimum_flow_rate_fraction: fan_power_minimum_flow_rate_fraction)
251
+ when 'ZoneExhaust'
252
+ fan = OpenstudioStandards::HVAC.create_fan_zone_exhaust(model,
253
+ fan_name: fan_name,
254
+ fan_efficiency: fan_efficiency,
255
+ pressure_rise: pressure_rise,
256
+ end_use_subcategory: end_use_subcategory,
257
+ system_availability_manager_coupling_mode: system_availability_manager_coupling_mode)
258
+ end
259
+
260
+ return fan
261
+ end
262
+
263
+ # Modify the fan curve coefficients to reflect a specific type of control.
264
+ #
265
+ # @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
266
+ # @param control_type [String] valid choices are:
267
+ # Single Zone VAV
268
+ # Multi Zone VAV with Fixed Static Pressure Setpoint
269
+ # Multi Zone VAV with Static Pressure Setpoint Reset
270
+ # Multi Zone VAV with Discharge Dampers
271
+ # Multi Zone VAV with Airfoil or Backward Incline riding the curve
272
+ # Multi Zone VAV with Airfoil or Backward Incline with Inlet Vanes
273
+ # Multi Zone VAV with Forward Curved fans riding the curve
274
+ # Multi Zone VAV with Forward Curved with Inlet Vanes
275
+ # Multi Zone VAV with Vane-axial with Variable Pitch Blades
276
+ # @return [Boolean] returns true if successful, false if not
277
+ def self.fan_variable_volume_set_control_type(fan_variable_volume, control_type: 'Multi Zone VAV with Static Pressure Setpoint Reset')
278
+ case control_type
279
+ when 'Single Zone VAV'
280
+ # Baseline for System Type 11 from ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
281
+ coeff_a = 0.027827882
282
+ coeff_b = 0.026583195
283
+ coeff_c = -0.0870687
284
+ coeff_d = 1.03091975
285
+ min_pct_pwr = 0.1
286
+ when 'Multi Zone VAV with Fixed Static Pressure Setpoint'
287
+ # Appendix G baseline from ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
288
+ coeff_a = 0.0013
289
+ coeff_b = 0.1470
290
+ coeff_c = 0.9506
291
+ coeff_d = -0.0998
292
+ min_pct_pwr = 0.2
293
+ when 'Multi Zone VAV with Static Pressure Setpoint Reset'
294
+ # OpenStudio default, baseline for System Types 5-8 from ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
295
+ coeff_a = 0.040759894
296
+ coeff_b = 0.08804497
297
+ coeff_c = -0.07292612
298
+ coeff_d = 0.943739823
299
+ min_pct_pwr = 0.1
300
+ when 'Multi Zone VAV with Discharge Dampers'
301
+ coeff_a = 0.18984763
302
+ coeff_b = 0.31447014
303
+ coeff_c = 0.49568211
304
+ coeff_d = 0.0
305
+ min_pct_pwr = 0.25
306
+ when 'Multi Zone VAV with Airfoil or Backward Incline riding the curve'
307
+ # From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
308
+ coeff_a = 0.1631
309
+ coeff_b = 1.5901
310
+ coeff_c = -0.8817
311
+ coeff_d = 0.1281
312
+ min_pct_pwr = 0.7
313
+ when 'Multi Zone VAV with Airfoil or Backward Incline with Inlet Vanes'
314
+ # From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
315
+ coeff_a = 0.9977
316
+ coeff_b = -0.659
317
+ coeff_c = 0.9547
318
+ coeff_d = -0.2936
319
+ min_pct_pwr = 0.5
320
+ when 'Multi Zone VAV with Forward Curved fans riding the curve'
321
+ # From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
322
+ coeff_a = 0.1224
323
+ coeff_b = 0.612
324
+ coeff_c = 0.5983
325
+ coeff_d = -0.3334
326
+ min_pct_pwr = 0.3
327
+ when 'Multi Zone VAV with Forward Curved with Inlet Vanes'
328
+ # From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
329
+ coeff_a = 0.3038
330
+ coeff_b = -0.7608
331
+ coeff_c = 2.2729
332
+ coeff_d = -0.8169
333
+ min_pct_pwr = 0.3
334
+ when 'Multi Zone VAV with Vane-axial with Variable Pitch Blades'
335
+ # From ANSI/ASHRAE/IES Standard 90.1-2016 - Energy Standard for Buildings Except Low-Rise Residential Performance Rating Method
336
+ coeff_a = 0.1639
337
+ coeff_b = -0.4016
338
+ coeff_c = 1.9909
339
+ coeff_d = -0.7541
340
+ min_pct_pwr = 0.2
341
+ else
342
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC.fan', "Fan control type '#{control_type}' not recognized, fan power coefficients will not be changed.")
343
+ return false
344
+ end
345
+
346
+ # Set the coefficients
347
+ fan_variable_volume.setFanPowerCoefficient1(coeff_a) unless coeff_a.nil?
348
+ fan_variable_volume.setFanPowerCoefficient2(coeff_b) unless coeff_b.nil?
349
+ fan_variable_volume.setFanPowerCoefficient3(coeff_c) unless coeff_c.nil?
350
+ fan_variable_volume.setFanPowerCoefficient4(coeff_d) unless coeff_d.nil?
351
+
352
+ # Set the fan minimum power
353
+ unless min_pct_pwr.nil?
354
+ fan_variable_volume.setFanPowerMinimumFlowRateInputMethod('Fraction')
355
+ fan_variable_volume.setFanPowerMinimumFlowFraction(min_pct_pwr)
356
+ end
357
+
358
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.HVAC.fan', "For #{fan_variable_volume.name}: Set fan curve coefficients to reflect control type of '#{control_type}'.")
359
+
360
+ return true
361
+ end
362
+ end
363
+ end
@@ -0,0 +1,203 @@
1
+ module OpenstudioStandards
2
+ # The HVAC module provides methods create, modify, and get information about HVAC systems in the model
3
+ module HVAC
4
+ # @!group Component:HX
5
+ # Methods to create, modify, and get information about heat exchangers
6
+
7
+ # creates HeatExchangerAirToAirSensibleAndLatent object with user-input effectiveness values
8
+ #
9
+ # @param model [<OpenStudio::Model::Model>] OpenStudio model
10
+ # @param name [String]
11
+ # @param type [String] Heat Exchanger Type. One of 'Plate', 'Rotary'
12
+ # @param economizer_lockout [Boolean] whether heat exchanger is locked out during economizing
13
+ # @param supply_air_outlet_temperature_control [Boolean]
14
+ # @param frost_control_type [String] heat exchanger frost control type. One of 'None', 'ExhaustAirRecirculation', 'ExhaustOnly', 'MinimumExhaustTemperature'
15
+ # @param nominal_electric_power [Float] Nominal electric power
16
+ # @param sensible_heating_100_eff [Float]
17
+ # @param sensible_heating_75_eff [Float]
18
+ # @param latent_heating_100_eff [Float]
19
+ # @param latent_heating_75_eff [Float]
20
+ # @param sensible_cooling_100_eff [Float]
21
+ # @param sensible_cooling_75_eff [Float]
22
+ # @param latent_cooling_100_eff [Float]
23
+ # @param latent_cooling_75_eff [Float]
24
+ # @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HeatExchangerAirToAirSensibleAndLatent object
25
+ def self.create_heat_exchanger_air_to_air_sensible_and_latent(model,
26
+ name: nil,
27
+ type: nil,
28
+ economizer_lockout: nil,
29
+ supply_air_outlet_temperature_control: nil,
30
+ frost_control_type: nil,
31
+ nominal_electric_power: nil,
32
+ sensible_heating_100_eff: nil,
33
+ sensible_heating_75_eff: nil,
34
+ latent_heating_100_eff: nil,
35
+ latent_heating_75_eff: nil,
36
+ sensible_cooling_100_eff: nil,
37
+ sensible_cooling_75_eff: nil,
38
+ latent_cooling_100_eff: nil,
39
+ latent_cooling_75_eff: nil)
40
+ heat_exchanger = OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.new(model)
41
+ heat_exchanger.setName(name) unless name.nil?
42
+
43
+ unless type.nil?
44
+ if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues.include?(type)
45
+ heat_exchanger.setHeatExchangerType(type)
46
+ else
47
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC', "Entered heat exchanger type #{type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.heatExchangerTypeValues}")
48
+ end
49
+ end
50
+
51
+ unless frost_control_type.nil?
52
+ if OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues.include?(frost_control_type)
53
+ heat_exchanger.setFrostControlType(frost_control_type)
54
+ else
55
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC', "Entered heat exchanger frost control type #{frost_control_type} not a valid type value. Enter one of #{OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent.frostControlTypeValues}")
56
+ end
57
+ end
58
+
59
+ heat_exchanger.setEconomizerLockout(economizer_lockout) unless economizer_lockout.nil?
60
+ heat_exchanger.setSupplyAirOutletTemperatureControl(supply_air_outlet_temperature_control) unless supply_air_outlet_temperature_control.nil?
61
+ heat_exchanger.setNominalElectricPower(nominal_electric_power) unless nominal_electric_power.nil?
62
+
63
+ if model.version < OpenStudio::VersionString.new('3.8.0')
64
+ heat_exchanger.setSensibleEffectivenessat100HeatingAirFlow(sensible_heating_100_eff) unless sensible_heating_100_eff.nil?
65
+ heat_exchanger.setSensibleEffectivenessat75HeatingAirFlow(sensible_heating_75_eff) unless sensible_heating_75_eff.nil?
66
+ heat_exchanger.setLatentEffectivenessat100HeatingAirFlow(latent_heating_100_eff) unless latent_heating_100_eff.nil?
67
+ heat_exchanger.setLatentEffectivenessat75HeatingAirFlow(latent_heating_75_eff) unless latent_heating_75_eff.nil?
68
+ heat_exchanger.setSensibleEffectivenessat100CoolingAirFlow(sensible_cooling_100_eff) unless sensible_cooling_100_eff.nil?
69
+ heat_exchanger.setSensibleEffectivenessat75CoolingAirFlow(sensible_cooling_75_eff) unless sensible_cooling_75_eff.nil?
70
+ heat_exchanger.setLatentEffectivenessat100CoolingAirFlow(latent_cooling_100_eff) unless latent_cooling_100_eff.nil?
71
+ heat_exchanger.setLatentEffectivenessat75CoolingAirFlow(latent_cooling_75_eff) unless latent_cooling_75_eff.nil?
72
+ else
73
+ effectiveness_inputs = Hash.new { |hash, key| hash[key] = {} }
74
+ effectiveness_inputs['Sensible Heating'][0.75] = sensible_heating_75_eff.to_f unless sensible_heating_75_eff.nil?
75
+ effectiveness_inputs['Sensible Heating'][1.0] = sensible_heating_100_eff.to_f unless sensible_heating_100_eff.nil?
76
+ effectiveness_inputs['Latent Heating'][0.75] = latent_heating_75_eff.to_f unless latent_heating_75_eff.nil?
77
+ effectiveness_inputs['Latent Heating'][1.0] = latent_heating_100_eff.to_f unless latent_heating_100_eff.nil?
78
+ effectiveness_inputs['Sensible Cooling'][0.75] = sensible_cooling_75_eff.to_f unless sensible_cooling_75_eff.nil?
79
+ effectiveness_inputs['Sensible Cooling'][1.0] = sensible_cooling_100_eff.to_f unless sensible_cooling_100_eff.nil?
80
+ effectiveness_inputs['Latent Cooling'][0.75] = latent_cooling_75_eff.to_f unless latent_cooling_75_eff.nil?
81
+ effectiveness_inputs['Latent Cooling'][1.0] = latent_cooling_100_eff.to_f unless latent_cooling_100_eff.nil?
82
+
83
+ if effectiveness_inputs.values.all?(&:empty?)
84
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.HVAC', 'Creating heat exchanger with historical effectiveness curves')
85
+ defaults = true
86
+ else
87
+ defaults = false
88
+ end
89
+
90
+ OpenstudioStandards::HVAC.heat_exchanger_air_to_air_set_effectiveness_values(heat_exchanger, defaults: defaults, values: effectiveness_inputs)
91
+ end
92
+
93
+ return heat_exchanger
94
+ end
95
+
96
+ # creates LookupTable objects to define effectiveness of HeatExchangerAirToAirSensibleAndLatent objects
97
+ #
98
+ # @param heat_exchanger [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio heat exchanger object to update
99
+ # @param type [String] type of curve to create. one of 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
100
+ # @param values_hash [Hash(Float=>Float)] user_input flow decimal fraction => effectiveness decimal fraction pairs, e.g. (0.75 => 0.81, 1.0 => 0.76)
101
+ # @return [<OpenStudio::Model::TableLookup>] lookup table object
102
+ def self.create_heat_exchanger_effectiveness_table(heat_exchanger, type, values_hash)
103
+ # validate inputs
104
+ types = ['Sensible Heating', 'Latent Heating', 'Sensible Cooling', 'Latent Cooling']
105
+ unless types.include? type
106
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC', "#{__method__} requires effectiveness type as one of #{types}")
107
+ return false
108
+ end
109
+
110
+ def self.validate_effectiveness_hash(values_hash)
111
+ values_hash.all? do |key, value|
112
+ key.is_a?(Float) && value.is_a?(Float) && key.between?(0.0, 1.0) && value.between?(0.0, 1.0)
113
+ end
114
+ end
115
+
116
+ if !validate_effectiveness_hash(values_hash)
117
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC', "#{__method__} require values_hash to have keys and values between 0.0 and 1.0: #{values_hash}")
118
+ return false
119
+ end
120
+
121
+ # look for existing curve
122
+ type_a = type.split
123
+ method_name = "#{type_a[0].downcase}Effectivenessof#{type_a[1]}AirFlowCurve"
124
+
125
+ # use existing independent variable object if found and matches inputs
126
+ iv = nil
127
+ table = OpenStudio::Model::OptionalTableLookup.new
128
+ if heat_exchanger.send(method_name).is_initialized
129
+ table = heat_exchanger.send(method_name).get.to_TableLookup
130
+ curve = table.get
131
+ iv_existing = curve.independentVariables.first
132
+ if values_hash.keys.sort == iv_existing.values.sort
133
+ iv = iv_existing
134
+ end
135
+ end
136
+
137
+ # otherwise create new independent variable
138
+ if iv.nil?
139
+ iv = OpenStudio::Model::TableIndependentVariable.new(heat_exchanger.model)
140
+ iv.setName("#{heat_exchanger.name.get}_#{type.gsub(' ', '')}_IndependentVariable")
141
+ iv.setInterpolationMethod('Linear')
142
+ iv.setExtrapolationMethod('Linear')
143
+ iv.setMinimumValue(0.0)
144
+ iv.setMaximumValue(10.0)
145
+ iv.setUnitType('Dimensionless')
146
+ values_hash.keys.sort.each { |k| iv.addValue(k) }
147
+ end
148
+
149
+ # create new lookup table
150
+ t = OpenStudio::Model::TableLookup.new(heat_exchanger.model)
151
+ t.setName("#{heat_exchanger.name.get}_#{type.gsub(/ible|ent|ing|\s/, '')}Eff")
152
+ t.addIndependentVariable(iv)
153
+ t.setNormalizationMethod('DivisorOnly')
154
+ t.setMinimumOutput(0.0)
155
+ t.setMaximumOutput(10.0)
156
+ t.setOutputUnitType('Dimensionless')
157
+ values = values_hash.sort.map { |a| a[1] }
158
+ # protect against setting normalization divisor to zero for zero effectiveness
159
+ values[-1].zero? ? t.setNormalizationDivisor(1) : t.setNormalizationDivisor(values[-1])
160
+ values.each { |v| t.addOutputValue(v) }
161
+
162
+ # remove curve if found
163
+ table.get.remove if table.is_initialized
164
+
165
+ return t
166
+ end
167
+
168
+ # Applies historical default or user-input effectiveness values to a HeatExchanger:AirToAir:SensibleAndLatent object
169
+ #
170
+ # @param heat_exchanger [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] OpenStudio HeatExchangerAirToAirSensibleAndLatent object to update
171
+ # @param defaults [Boolean] flag to apply historical default curves
172
+ # @param values [Hash{String=>Hash{Float=>Float}}] user-input effectiveness values, where keys are one of
173
+ # 'Sensible Heating', 'Latent Heating, 'Sensible Cooling', 'Latent Cooling'
174
+ # and value is a hash of (flow decimal fraction => effectivess decimal fraction), e.g. (0.75 => 0.81, 1.0 => 0.76)
175
+ # @return [<OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent>] modified OpenStudio HeatExchangerAirToAirSensibleAndLatent object
176
+ def self.heat_exchanger_air_to_air_set_effectiveness_values(heat_exchanger, defaults: false, values: nil)
177
+ if defaults
178
+ heat_exchanger.assignHistoricalEffectivenessCurves
179
+ if values.nil?
180
+ return heat_exchanger
181
+ end
182
+ elsif values.nil?
183
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.HVAC', "#{__method__} called with defaults=false and no values provided. #{heat_exchanger.name.get} will not be modified")
184
+ return heat_exchanger
185
+ end
186
+
187
+ values.each do |type, values_hash|
188
+ # ensure values_hash has one value at 100% flow
189
+ unless values_hash.key?(1.0)
190
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.HVAC', "Effectiveness Values for #{type} do not include 100% flow effectivenss. Cannot set effectiveness curves")
191
+ return false
192
+ end
193
+
194
+ lookup_table = OpenstudioStandards::HVAC.create_heat_exchanger_effectiveness_table(heat_exchanger, type, values_hash)
195
+ type_a = type.split
196
+ heat_exchanger.send("set#{type_a[0]}Effectivenessat100#{type_a[1]}AirFlow", values_hash[1.0])
197
+ heat_exchanger.send("set#{type_a[0]}Effectivenessof#{type_a[1]}AirFlowCurve", lookup_table)
198
+ end
199
+
200
+ return heat_exchanger
201
+ end
202
+ end
203
+ end