openstudio-standards 0.2.14 → 0.2.15.pre.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 (642) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.json +0 -19
  3. data/data/geometry/ASHRAEMidriseApartment.json +47 -47
  4. data/data/geometry/ASHRAESecondarySchool.osm +2 -2
  5. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  6. data/data/standards/export_OpenStudio_libraries.rb +1 -1
  7. data/data/standards/manage_OpenStudio_Standards.rb +43 -87
  8. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +9 -0
  9. data/data/standards/openstudio_standards_duplicates_log.csv +142 -27
  10. data/data/standards/test_performance_expected_dd_results.csv +2016 -2016
  11. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.ddy +2316 -0
  12. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.epw +8768 -0
  13. data/data/weather/CAN_NU_Iqaluit.AP.719090_CWEC2016.stat +697 -0
  14. data/lib/openstudio-standards/btap/WeatherData1.json +54 -0
  15. data/lib/openstudio-standards/btap/WeatherData1.xlsx +0 -0
  16. data/lib/openstudio-standards/btap/btap_result.rb +12 -10
  17. data/lib/openstudio-standards/btap/envelope.rb +2 -2
  18. data/lib/openstudio-standards/btap/geometry.rb +96 -49
  19. data/lib/openstudio-standards/{utilities → btap/utilities}/Add_template_field_to_json.rb +0 -0
  20. data/lib/openstudio-standards/{utilities → btap/utilities}/convert_surfaces_to_adiabatic_necb_8426.rb +0 -0
  21. data/lib/openstudio-standards/{utilities → btap/utilities}/generate_space_types.rb +0 -0
  22. data/lib/openstudio-standards/{utilities → btap/utilities}/necb_to_epw_map.rb +0 -0
  23. data/lib/openstudio-standards/{utilities → btap/utilities}/os_sim_extract.rb +0 -0
  24. data/lib/openstudio-standards/{utilities → btap/utilities}/rename_surfaces.rb +0 -0
  25. data/lib/openstudio-standards/{utilities → btap/utilities}/round_surf_coords.rb +0 -0
  26. data/lib/openstudio-standards/{utilities → btap/utilities}/sched_create.rb +0 -0
  27. data/lib/openstudio-standards/{utilities → btap/utilities}/set_mult_to_adiabatic.rb +0 -0
  28. data/lib/openstudio-standards/btap/utilities/space_type.rb +78 -0
  29. data/lib/openstudio-standards/{utilities → btap/utilities}/weatherData1_xlsx_to_json.rb +0 -0
  30. data/lib/openstudio-standards/hvac_sizing/Siz.AirConditionerVariableRefrigerantFlow.rb +1 -1
  31. data/lib/openstudio-standards/hvac_sizing/Siz.HVACComponent.rb +1 -1
  32. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +20 -6
  33. data/lib/openstudio-standards/hvac_sizing/Siz.Model.rb +6 -6
  34. data/lib/openstudio-standards/hvac_sizing/Siz.WaterHeaterMixed.rb +2 -2
  35. data/lib/openstudio-standards/hvac_sizing/Siz.ZoneHVACTerminalUnitVariableRefrigerantFlow.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  37. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +6 -7
  38. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirTerminalSingleDuctVAVReheat.rb +2 -1
  39. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanConstantVolume.rb +5 -4
  40. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanOnOff.rb +5 -5
  41. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +5 -4
  42. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +6 -7
  43. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +2 -1
  44. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanConstantVolume.rb +5 -4
  45. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanOnOff.rb +5 -5
  46. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +5 -4
  47. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.elevators.rb +6 -4
  48. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +10 -9
  49. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +9 -11
  50. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +2 -1
  51. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanConstantVolume.rb +5 -4
  52. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanOnOff.rb +5 -5
  53. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +5 -4
  54. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.elevators.rb +11 -7
  55. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +17 -16
  56. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +9 -11
  57. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.hvac_systems.rb +4 -2
  58. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +2 -1
  59. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +5 -4
  60. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +5 -5
  61. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +5 -4
  62. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +11 -7
  63. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +23 -22
  64. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +9 -10
  65. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +4 -2
  66. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +2 -1
  67. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +5 -4
  68. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +5 -5
  69. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +5 -4
  70. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +11 -7
  71. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +23 -22
  72. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +89 -0
  73. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +9 -10
  74. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +76 -0
  75. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +22 -2
  76. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +2 -1
  77. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.elevators.rb +11 -11
  78. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +5 -4
  79. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +2 -1
  80. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.CoilHeatingGas.rb +5 -4
  81. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.elevators.rb +11 -11
  82. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +5 -4
  83. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +2 -1
  84. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanConstantVolume.rb +5 -4
  85. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanOnOff.rb +5 -5
  86. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +5 -4
  87. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  88. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.elevators.rb +11 -7
  89. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +10 -10
  90. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.hvac_systems.rb +4 -2
  91. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +2 -1
  92. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanConstantVolume.rb +5 -4
  93. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanOnOff.rb +5 -5
  94. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +5 -4
  95. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +2 -0
  96. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.elevators.rb +11 -7
  97. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +10 -10
  98. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.hvac_systems.rb +4 -2
  99. data/lib/openstudio-standards/prototypes/cbes/cbes.Model.elevators.rb +3 -6
  100. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +5 -4
  101. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanConstantVolume.rb +5 -3
  102. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanOnOff.rb +5 -4
  103. data/lib/openstudio-standards/prototypes/cbes/cbes_t24_2008/cbes_t24_2008.FanVariableVolume.rb +5 -3
  104. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +65 -30
  105. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +54 -23
  106. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +135 -147
  107. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +42 -7
  108. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +85 -12
  109. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +42 -30
  110. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +39 -8
  111. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +39 -8
  112. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +60 -12
  113. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +33 -265
  114. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +41 -3
  115. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +69 -297
  116. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +68 -25
  117. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +88 -59
  118. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +88 -9
  119. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +48 -10
  120. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +130 -145
  121. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +29 -101
  122. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +24 -7
  123. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +48 -589
  124. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +38 -7
  125. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +38 -8
  126. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +40 -7
  127. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +85 -171
  128. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +87 -44
  129. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +46 -5
  130. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +105 -17
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +97 -15
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +26 -167
  133. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3828 -1131
  134. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +3 -0
  135. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +2 -1
  136. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -0
  137. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -0
  138. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +4 -1
  139. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +3 -0
  140. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +4 -1
  141. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +3 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +9 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +3 -0
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +9 -4
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +4 -1
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +3 -0
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +2 -2
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +4 -1
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +23 -2
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +29 -4
  151. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +29 -5
  152. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +43 -4
  153. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +22 -0
  154. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +46 -3
  155. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +27 -22
  156. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +15 -8
  157. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +22 -4
  158. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +429 -59
  159. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +18 -11
  160. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +11 -2
  161. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +1 -0
  162. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +8 -10
  163. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +37 -28
  164. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +24 -6
  165. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +251 -65
  166. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +1 -1
  167. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +46 -31
  168. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +62 -10
  169. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +76 -33
  170. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  171. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +445 -275
  172. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +3 -3
  173. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +26 -21
  174. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +5 -2
  175. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +7 -9
  176. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +8 -2
  177. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +10 -6
  178. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +5 -1
  179. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -1
  180. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +45 -4
  181. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +18 -8
  182. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +9 -7
  183. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +8 -4
  184. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +86 -3
  185. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +5 -2
  186. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +6 -2
  187. data/lib/openstudio-standards/standards/Standards.Construction.rb +66 -35
  188. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +7 -7
  189. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +2 -2
  190. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +2 -1
  191. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +2 -1
  192. data/lib/openstudio-standards/standards/Standards.Fan.rb +53 -35
  193. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +22 -16
  194. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +2 -2
  195. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +4 -4
  196. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +77 -19
  197. data/lib/openstudio-standards/standards/Standards.Model.rb +387 -245
  198. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +13 -15
  199. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +94 -48
  200. data/lib/openstudio-standards/standards/Standards.Pump.rb +28 -20
  201. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +3 -4
  202. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +2 -1
  203. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +2 -0
  204. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +34 -24
  205. data/lib/openstudio-standards/standards/Standards.Space.rb +179 -116
  206. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +23 -12
  207. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +55 -25
  208. data/lib/openstudio-standards/standards/Standards.Surface.rb +57 -32
  209. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +157 -107
  210. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +9 -6
  211. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +52 -1
  212. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +2 -2
  213. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.rb +4 -0
  214. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +28 -18
  215. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.FanVariableVolume.rb +1 -1
  216. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -2
  217. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.rb +4 -0
  218. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/comstock_ashrae_90_1_2004.rb +4 -0
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +696 -2938
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ext_ltg.json +1 -1
  221. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +123 -123
  222. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.furnaces.json +26 -0
  223. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +11 -11
  224. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -8
  225. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +395 -384
  226. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +69 -0
  227. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +20 -13
  228. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +1 -1
  229. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Model.rb +1 -1
  230. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.rb +4 -0
  231. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/comstock_ashrae_90_1_2007.rb +4 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +696 -2938
  233. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ext_ltg.json +1 -1
  234. 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 +122 -122
  235. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.furnaces.json +26 -0
  236. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +11 -11
  237. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -8
  238. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +413 -401
  239. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +69 -0
  240. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +42 -53
  241. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +3 -2
  242. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.CoolingTower.rb +5 -8
  243. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.FanVariableVolume.rb +1 -1
  244. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +6 -4
  245. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.rb +4 -0
  246. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/comstock_ashrae_90_1_2010.rb +4 -0
  247. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +696 -2938
  248. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ext_ltg.json +1 -1
  249. 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 +129 -129
  250. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +210 -42
  251. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.furnaces.json +26 -0
  252. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +11 -11
  253. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -8
  254. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +460 -320
  255. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +69 -0
  256. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +45 -51
  257. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +3 -2
  258. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTower.rb +5 -8
  259. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.CoolingTowerVariableSpeed.rb +2 -3
  260. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.FanVariableVolume.rb +2 -2
  261. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +8 -5
  262. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ThermalZone.rb +2 -1
  263. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  264. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.ZoneHVACComponent.rb +1 -0
  265. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.rb +4 -0
  266. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/comstock_ashrae_90_1_2013.rb +4 -0
  267. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +696 -2938
  268. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ext_ltg.json +1 -1
  269. 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 +121 -121
  270. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +420 -84
  271. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.furnaces.json +26 -0
  272. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +12 -12
  273. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -8
  274. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +475 -335
  275. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +69 -0
  276. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +40 -50
  277. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +3 -2
  278. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +5 -8
  279. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +2 -3
  280. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +2 -2
  281. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +8 -5
  282. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +2 -1
  283. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +1 -0
  284. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +4 -0
  285. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/comstock_ashrae_90_1_2016.rb +4 -0
  286. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +696 -2938
  287. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ext_ltg.json +1 -1
  288. 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 +152 -128
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +488 -84
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.furnaces.json +26 -0
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +47 -47
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +69 -0
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +342 -56
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +3 -2
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +5 -8
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +2 -3
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +2 -2
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +25 -5
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +2 -1
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +30 -0
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +4 -0
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/comstock_ashrae_90_1_2019.rb +4 -0
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +696 -2938
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ext_ltg.json +1 -1
  305. 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 +151 -127
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +1 -1
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2307 -101
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.furnaces.json +26 -0
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +1 -1
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +47 -47
  311. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +69 -0
  312. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +25 -0
  313. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +286 -224
  314. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/comstock_doe_ref_1980_2004.rb +4 -0
  315. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +696 -2938
  316. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ext_ltg.json +1 -1
  317. 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 +126 -126
  318. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.furnaces.json +26 -0
  319. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +11 -11
  320. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.refrigeration_system.json +0 -8
  321. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +405 -393
  322. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirLoopHVAC.rb +15 -11
  323. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +1 -1
  324. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.PlantLoop.rb +3 -0
  325. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.rb +4 -0
  326. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/comstock_doe_ref_pre_1980.rb +4 -0
  327. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +696 -2938
  328. 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 +121 -121
  329. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.furnaces.json +37 -0
  330. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +11 -11
  331. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.refrigeration_system.json +0 -8
  332. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +403 -391
  333. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirLoopHVAC.rb +15 -11
  334. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +1 -1
  335. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.PlantLoop.rb +3 -0
  336. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.rb +4 -0
  337. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.furnaces.json +15 -0
  338. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +64 -42
  339. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +3 -2
  340. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTower.rb +5 -8
  341. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.CoolingTowerVariableSpeed.rb +2 -3
  342. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.FanVariableVolume.rb +2 -2
  343. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +1 -1
  344. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
  345. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +4 -1
  346. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +5 -3
  347. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +3 -0
  348. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.rb +4 -0
  349. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.furnaces.json +15 -0
  350. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +61 -36
  351. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +3 -2
  352. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTower.rb +5 -8
  353. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.CoolingTowerVariableSpeed.rb +2 -3
  354. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.FanVariableVolume.rb +2 -2
  355. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +1 -1
  356. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
  357. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +4 -1
  358. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +6 -4
  359. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +3 -0
  360. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.rb +4 -0
  361. data/lib/openstudio-standards/standards/cbes/cbes.AirLoopHVAC.rb +20 -14
  362. data/lib/openstudio-standards/standards/cbes/cbes.PlantLoop.rb +3 -0
  363. data/lib/openstudio-standards/standards/cbes/cbes.rb +4 -0
  364. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/cbes_pre_1978.rb +4 -0
  365. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/cbes_t24_1978.rb +4 -0
  366. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/cbes_t24_1992.rb +4 -0
  367. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/cbes_t24_2001.rb +4 -0
  368. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.rb +4 -0
  369. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.rb +4 -0
  370. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +10 -5
  371. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +1 -1
  372. data/lib/openstudio-standards/standards/deer/deer.rb +4 -0
  373. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/comstock_deer_1985.rb +4 -0
  374. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +2 -2
  375. data/lib/openstudio-standards/standards/deer/deer_1985/deer_1985.rb +4 -0
  376. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/comstock_deer_1996.rb +4 -0
  377. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +2 -2
  378. data/lib/openstudio-standards/standards/deer/deer_1996/deer_1996.rb +4 -0
  379. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/comstock_deer_2003.rb +4 -0
  380. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +2 -2
  381. data/lib/openstudio-standards/standards/deer/deer_2003/deer_2003.rb +4 -0
  382. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/comstock_deer_2007.rb +4 -0
  383. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +2 -2
  384. data/lib/openstudio-standards/standards/deer/deer_2007/deer_2007.rb +4 -0
  385. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/comstock_deer_2011.rb +4 -0
  386. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +2 -2
  387. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +4 -0
  388. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/comstock_deer_2014.rb +4 -0
  389. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +2 -2
  390. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +5 -3
  391. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +4 -0
  392. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/comstock_deer_2015.rb +4 -0
  393. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +2 -2
  394. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +5 -3
  395. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.rb +4 -0
  396. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/comstock_deer_2017.rb +4 -0
  397. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +2 -2
  398. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +5 -3
  399. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.rb +4 -0
  400. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/comstock_deer_2020.rb +4 -0
  401. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +9 -5
  402. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +3 -0
  403. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +5 -3
  404. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.rb +4 -0
  405. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/comstock_deer_2025.rb +4 -0
  406. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +9 -5
  407. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +3 -0
  408. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +5 -3
  409. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.rb +4 -0
  410. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/comstock_deer_2030.rb +4 -0
  411. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +9 -5
  412. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +3 -0
  413. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +5 -3
  414. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.rb +4 -0
  415. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/comstock_deer_2035.rb +4 -0
  416. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +9 -5
  417. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +3 -0
  418. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +5 -3
  419. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.rb +4 -0
  420. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/comstock_deer_2040.rb +4 -0
  421. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +9 -5
  422. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +3 -0
  423. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +5 -3
  424. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.rb +4 -0
  425. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/comstock_deer_2045.rb +4 -0
  426. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +9 -5
  427. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +3 -0
  428. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +5 -3
  429. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.rb +4 -0
  430. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/comstock_deer_2050.rb +4 -0
  431. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +9 -5
  432. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +3 -0
  433. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +5 -3
  434. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.rb +4 -0
  435. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/comstock_deer_2055.rb +4 -0
  436. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +9 -5
  437. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +3 -0
  438. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +5 -3
  439. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.rb +4 -0
  440. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/comstock_deer_2060.rb +4 -0
  441. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +9 -5
  442. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +3 -0
  443. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +5 -3
  444. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.rb +4 -0
  445. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/comstock_deer_2065.rb +4 -0
  446. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +9 -5
  447. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +3 -0
  448. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +5 -3
  449. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.rb +4 -0
  450. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/comstock_deer_2070.rb +4 -0
  451. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +9 -5
  452. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +3 -0
  453. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +5 -3
  454. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.rb +4 -0
  455. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/comstock_deer_2075.rb +4 -0
  456. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +9 -5
  457. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +3 -0
  458. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +5 -3
  459. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.rb +4 -0
  460. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/comstock_deer_pre_1975.rb +4 -0
  461. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +2 -2
  462. data/lib/openstudio-standards/standards/deer/deer_pre_1975/deer_pre_1975.rb +4 -0
  463. data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +4 -0
  464. data/lib/openstudio-standards/standards/necb/BTAP1980TO2010/btap_1980to2010.rb +6 -28
  465. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +25 -110
  466. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +45 -60
  467. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +19 -23
  468. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +84 -83
  469. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +52 -47
  470. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +43 -40
  471. data/lib/openstudio-standards/standards/necb/ECMS/data/boiler_set.json +18 -0
  472. data/lib/openstudio-standards/standards/necb/ECMS/data/chiller_set.json +211 -0
  473. data/lib/openstudio-standards/standards/necb/ECMS/data/curves.json +1195 -20
  474. data/lib/openstudio-standards/standards/necb/ECMS/data/furnace_set.json +18 -0
  475. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +244 -182
  476. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +232 -185
  477. data/lib/openstudio-standards/standards/necb/ECMS/data/shw_set.json +20 -2
  478. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +18 -25
  479. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +12 -13
  480. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +1647 -466
  481. data/lib/openstudio-standards/standards/necb/ECMS/loads.rb +93 -0
  482. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +40 -47
  483. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +26 -25
  484. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +303 -305
  485. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +45 -45
  486. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +90 -120
  487. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/Hospital.osm +1176 -1115
  488. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +8279 -28923
  489. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +1173 -1173
  490. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_multi_speed.rb +15 -13
  491. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +32 -29
  492. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +25 -26
  493. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +14 -14
  494. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +24 -29
  495. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +85 -84
  496. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +41 -42
  497. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +209 -197
  498. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +87 -82
  499. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +510 -406
  500. data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +3 -3
  501. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +686 -683
  502. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +129 -82
  503. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +1608 -1608
  504. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +25 -18
  505. data/lib/openstudio-standards/standards/necb/NECB2015/lighting.rb +73 -67
  506. data/lib/openstudio-standards/standards/necb/NECB2015/necb_2015.rb +18 -22
  507. data/lib/openstudio-standards/standards/necb/NECB2015/qaqc/necb_2015_qaqc.rb +59 -63
  508. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +1608 -1608
  509. data/lib/openstudio-standards/standards/necb/NECB2017/hvac_systems.rb +1 -4
  510. data/lib/openstudio-standards/standards/necb/NECB2017/necb_2017.rb +10 -14
  511. data/lib/openstudio-standards/standards/necb/NECB2020/building_envelope.rb +779 -0
  512. data/lib/openstudio-standards/standards/necb/NECB2020/data/boilers.json +122 -0
  513. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +335 -0
  514. data/lib/openstudio-standards/standards/necb/NECB2020/data/constants.json +13 -0
  515. data/lib/openstudio-standards/standards/necb/NECB2020/data/furnaces.json +41 -0
  516. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +452 -0
  517. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +164 -0
  518. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_rejection.json +228 -0
  519. data/lib/openstudio-standards/standards/necb/NECB2020/data/led_lighting_data.json +2883 -0
  520. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +25851 -0
  521. data/lib/openstudio-standards/standards/necb/NECB2020/data/surface_thermal_transmittance.json +60 -0
  522. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +585 -0
  523. data/lib/openstudio-standards/standards/necb/NECB2020/necb_2020.rb +175 -0
  524. data/lib/openstudio-standards/standards/necb/common/bc_step_code_indicators.md +10 -0
  525. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +1963 -0
  526. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +410 -0
  527. data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +42 -0
  528. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +28705 -0
  529. data/lib/openstudio-standards/standards/necb/common/phius.md +23 -0
  530. data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +1158 -386
  531. data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +4 -0
  532. data/lib/openstudio-standards/standards/standard.rb +2 -1
  533. data/lib/openstudio-standards/utilities/define_thermal_zone_and_mulitpliers.rb +1 -1
  534. data/lib/openstudio-standards/utilities/logging.rb +6 -0
  535. data/lib/openstudio-standards/utilities/simulation.rb +30 -14
  536. data/lib/openstudio-standards/utilities/{speacetype_map_converter.rb → spacetype_map_converter.rb} +0 -0
  537. data/lib/openstudio-standards/utilities/sqlfile.rb +112 -71
  538. data/lib/openstudio-standards/version.rb +2 -2
  539. data/lib/openstudio-standards/weather/Weather.Model.rb +209 -9
  540. data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
  541. data/lib/openstudio-standards.rb +9 -0
  542. metadata +106 -205
  543. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  544. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +0 -49
  545. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +0 -293
  546. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +0 -25426
  547. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +0 -1600
  548. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +0 -564
  549. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +0 -349
  550. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +0 -164
  551. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +0 -10663
  552. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +0 -508
  553. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +0 -156
  554. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +0 -44
  555. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +0 -184
  556. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +0 -3094
  557. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +0 -829
  558. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +0 -562
  559. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +0 -52
  560. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +0 -220
  561. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +0 -156
  562. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +0 -1316
  563. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +0 -21446
  564. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +0 -554
  565. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +0 -68
  566. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +0 -28
  567. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +0 -12
  568. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +0 -49
  569. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +0 -293
  570. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +0 -12487
  571. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +0 -1600
  572. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +0 -564
  573. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +0 -349
  574. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +0 -164
  575. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +0 -10663
  576. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +0 -466
  577. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +0 -137
  578. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +0 -44
  579. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +0 -184
  580. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +0 -3094
  581. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +0 -829
  582. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +0 -562
  583. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +0 -52
  584. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +0 -220
  585. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +0 -156
  586. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +0 -1316
  587. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +0 -21380
  588. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +0 -554
  589. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +0 -68
  590. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +0 -28
  591. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +0 -12
  592. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +0 -49
  593. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +0 -395
  594. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +0 -12487
  595. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +0 -1600
  596. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +0 -592
  597. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +0 -349
  598. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +0 -550
  599. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +0 -164
  600. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +0 -10663
  601. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +0 -466
  602. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +0 -137
  603. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +0 -44
  604. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +0 -238
  605. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +0 -3094
  606. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +0 -829
  607. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +0 -562
  608. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +0 -52
  609. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +0 -220
  610. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +0 -156
  611. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +0 -1316
  612. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +0 -21548
  613. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +0 -554
  614. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +0 -68
  615. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +0 -28
  616. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +0 -12
  617. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +0 -64
  618. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +0 -871
  619. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +0 -12487
  620. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +0 -1600
  621. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +0 -592
  622. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +0 -349
  623. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +0 -1096
  624. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +0 -164
  625. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +0 -10663
  626. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +0 -886
  627. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +0 -194
  628. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +0 -44
  629. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +0 -247
  630. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +0 -3094
  631. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +0 -829
  632. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +0 -562
  633. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +0 -52
  634. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +0 -220
  635. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +0 -156
  636. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +0 -1316
  637. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +0 -22079
  638. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +0 -994
  639. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +0 -68
  640. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +0 -28
  641. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +0 -12
  642. data/lib/openstudio-standards/utilities/convert_costing_constructions.rb +0 -105
@@ -1,12 +1,12 @@
1
1
  class ECMS
2
-
3
2
  # =============================================================================================================================
4
3
  # Remove existing zone equipment
5
4
  def remove_all_zone_eqpt(sys_objs)
6
5
  sys_objs.each do |isys|
7
6
  isys.thermalZones.each do |izone|
8
- if(izone.equipment.empty?) then next end
9
- izone.equipment.each {|icomp| icomp.remove}
7
+ if izone.equipment.empty? then next end
8
+
9
+ izone.equipment.each(&:remove)
10
10
  end
11
11
  end
12
12
  end
@@ -17,7 +17,7 @@ class ECMS
17
17
  model.getPlantLoops.each do |iloop|
18
18
  hw_loop = false
19
19
  iloop.supplyComponents.each do |icomp|
20
- if(icomp.to_BoilerHotWater.is_initialized)
20
+ if icomp.to_BoilerHotWater.is_initialized
21
21
  hw_loop = true
22
22
  break
23
23
  end
@@ -32,7 +32,7 @@ class ECMS
32
32
  model.getPlantLoops.each do |iloop|
33
33
  chw_loop = false
34
34
  iloop.supplyComponents.each do |icomp|
35
- if(icomp.to_ChillerElectricEIR.is_initialized)
35
+ if icomp.to_ChillerElectricEIR.is_initialized
36
36
  chw_loop = true
37
37
  break
38
38
  end
@@ -47,7 +47,7 @@ class ECMS
47
47
  model.getPlantLoops.each do |iloop|
48
48
  cw_loop = false
49
49
  iloop.supplyComponents.each do |icomp|
50
- if(icomp.to_CoolingTowerSingleSpeed.is_initialized)
50
+ if icomp.to_CoolingTowerSingleSpeed.is_initialized
51
51
  cw_loop = true
52
52
  end
53
53
  end
@@ -59,9 +59,7 @@ class ECMS
59
59
  # Remove air loops
60
60
  def remove_air_loops(model)
61
61
  # remove air loops
62
- model.getAirLoopHVACs.each do |iloop|
63
- iloop.remove
64
- end
62
+ model.getAirLoopHVACs.each(&:remove)
65
63
  end
66
64
 
67
65
  # =============================================================================================================================
@@ -72,13 +70,13 @@ class ECMS
72
70
  systems.each do |system|
73
71
  zones = system.thermalZones
74
72
  map_systems_to_zones[system.name.to_s] = zones
75
- if system.sizingSystem.typeofLoadtoSizeOn.to_s == "VentilationRequirement"
73
+ if system.sizingSystem.typeofLoadtoSizeOn.to_s == 'VentilationRequirement'
76
74
  system_doas_flags[system.name.to_s] = true
77
75
  else
78
76
  system_doas_flags[system.name.to_s] = false
79
77
  end
80
78
  end
81
- return map_systems_to_zones,system_doas_flags
79
+ return map_systems_to_zones, system_doas_flags
82
80
  end
83
81
 
84
82
  # =============================================================================================================================
@@ -88,7 +86,7 @@ class ECMS
88
86
  model.getThermalZones.each do |zone|
89
87
  zone.equipment.each do |eqpt|
90
88
  if eqpt.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
91
- zone_clg_eqpt_type[zone.name.to_s] = "ZoneHVACPackagedTerminalAirConditioner"
89
+ zone_clg_eqpt_type[zone.name.to_s] = 'ZoneHVACPackagedTerminalAirConditioner'
92
90
  break
93
91
  end
94
92
  end
@@ -112,7 +110,7 @@ class ECMS
112
110
  if zone.thermostat.is_initialized
113
111
  if zone.thermostat.get.to_ThermostatSetpointDualSetpoint.is_initialized
114
112
  if zone.thermostat.get.to_ThermostatSetpointDualSetpoint.get.heatingSetpointTemperatureSchedule.is_initialized ||
115
- zone.thermostat.get.to_ThermostatSetpointDualSetpoint.get.coolingSetpointTemperatureSchedule.is_initialized
113
+ zone.thermostat.get.to_ThermostatSetpointDualSetpoint.get.coolingSetpointTemperatureSchedule.is_initialized
116
114
  storey_cond = true
117
115
  end
118
116
  end
@@ -120,7 +118,7 @@ class ECMS
120
118
  end
121
119
  # Find average height of z-coordinates of ceiling/roof of floor
122
120
  space.surfaces.each do |surf|
123
- if (surf.surfaceType.to_s.upcase == "ROOFCEILING")
121
+ if surf.surfaceType.to_s.upcase == 'ROOFCEILING'
124
122
  sum += (surf.centroid.z.to_f + space.zOrigin.to_f) * surf.grossArea.to_f
125
123
  total_area += surf.grossArea.to_f
126
124
  end
@@ -136,14 +134,17 @@ class ECMS
136
134
  # =============================================================================================================================
137
135
  # Return x,y,z coordinates of exterior wall with largest area on the lowest floor
138
136
  def get_lowest_floor_ext_wall_centroid_coords(storeys_clg_zcoords)
139
- ext_wall,ext_wall_x,ext_wall_y,ext_wall_z = nil,nil,nil,nil
137
+ ext_wall = nil
138
+ ext_wall_x = nil
139
+ ext_wall_y = nil
140
+ ext_wall_z = nil
140
141
  storeys_clg_zcoords.keys.each do |storey|
141
142
  max_area = 0.0
142
- sorted_spaces = storey.spaces.sort_by {|space| space.name.to_s}
143
+ sorted_spaces = storey.spaces.sort_by { |space| space.name.to_s }
143
144
  sorted_spaces.each do |space|
144
- ext_walls = space.surfaces.select {|surf| (surf.surfaceType.to_s.upcase == "WALL") && (surf.outsideBoundaryCondition.to_s.upcase == "OUTDOORS")}
145
- ext_walls = ext_walls.sort_by {|wall| wall.grossArea.to_f}
146
- if not ext_walls.empty?
145
+ ext_walls = space.surfaces.select { |surf| (surf.surfaceType.to_s.upcase == 'WALL') && (surf.outsideBoundaryCondition.to_s.upcase == 'OUTDOORS') }
146
+ ext_walls = ext_walls.sort_by { |wall| wall.grossArea.to_f }
147
+ if !ext_walls.empty?
147
148
  if ext_walls.last.grossArea.to_f > max_area
148
149
  max_area = ext_walls.last.grossArea.to_f
149
150
  ext_wall_x = ext_walls.last.centroid.x.to_f + space.xOrigin.to_f
@@ -153,20 +154,22 @@ class ECMS
153
154
  end
154
155
  end
155
156
  end
156
- break unless not ext_wall
157
+ break unless !ext_wall
157
158
  end
158
- if not ext_wall
159
- OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_lowest_floor_ext_wall_centroid_coords','Did not find an exteior wall in the building!')
159
+ if !ext_wall
160
+ OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_lowest_floor_ext_wall_centroid_coords', 'Did not find an exteior wall in the building!')
160
161
  end
161
162
 
162
- return ext_wall_x,ext_wall_y,ext_wall_z
163
+ return ext_wall_x, ext_wall_y, ext_wall_z
163
164
  end
164
165
 
165
166
  # =============================================================================================================================
166
167
  # Return x,y,z coordinates of space centroid
167
168
  def get_space_centroid_coords(space)
168
169
  total_area = 0.0
169
- sum_x,sum_y,sum_z = 0.0,0.0,0.0
170
+ sum_x = 0.0
171
+ sum_y = 0.0
172
+ sum_z = 0.0
170
173
  space.surfaces.each do |surf|
171
174
  total_area += surf.grossArea.to_f
172
175
  sum_x += (surf.centroid.x.to_f + space.xOrigin.to_f) * surf.grossArea.to_f
@@ -177,16 +180,21 @@ class ECMS
177
180
  space_centroid_y = sum_y / total_area
178
181
  space_centroid_z = sum_z / total_area
179
182
 
180
- return space_centroid_x,space_centroid_y,space_centroid_z
183
+ return space_centroid_x, space_centroid_y, space_centroid_z
181
184
  end
182
185
 
183
186
  # =============================================================================================================================
184
187
  # Return x,y,z coordinates of the centroid of the roof of the storey
185
188
  def get_roof_centroid_coords(storey)
186
- sum_x,sum_y,sum_z,total_area = 0.0,0.0,0.0,0.0
187
- cent_x,cent_y,cent_z = nil,nil,nil
189
+ sum_x = 0.0
190
+ sum_y = 0.0
191
+ sum_z = 0.0
192
+ total_area = 0.0
193
+ cent_x = nil
194
+ cent_y = nil
195
+ cent_z = nil
188
196
  storey.spaces.each do |space|
189
- roof_surfaces = space.surfaces.select {|surf| (surf.surfaceType.to_s.upcase == "ROOFCEILING") && (surf.outsideBoundaryCondition.to_s.upcase == "OUTDOORS")}
197
+ roof_surfaces = space.surfaces.select { |surf| (surf.surfaceType.to_s.upcase == 'ROOFCEILING') && (surf.outsideBoundaryCondition.to_s.upcase == 'OUTDOORS') }
190
198
  roof_surfaces.each do |surf|
191
199
  sum_x += (surf.centroid.x.to_f + space.xOrigin.to_f) * surf.grossArea.to_f
192
200
  sum_y += (surf.centroid.y.to_f + space.yOrigin.to_f) * surf.grossArea.to_f
@@ -199,10 +207,10 @@ class ECMS
199
207
  cent_y = sum_y / total_area
200
208
  cent_z = sum_z / total_area
201
209
  else
202
- OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_roof_centroid_coords','Did not find a roof on the top floor!')
210
+ OpenStudio.logFree(OpenStudio::Info, 'openstudiostandards.get_roof_centroid_coords', 'Did not find a roof on the top floor!')
203
211
  end
204
212
 
205
- return cent_x,cent_y,cent_z
213
+ return cent_x, cent_y, cent_z
206
214
  end
207
215
 
208
216
  # =============================================================================================================================
@@ -210,14 +218,14 @@ class ECMS
210
218
  def get_max_vrf_pipe_lengths(model)
211
219
  # Get and sort floors average ceilings z-coordinates hash
212
220
  storeys_clg_zcoords = get_storey_avg_clg_zcoords(model)
213
- storeys_clg_zcoords = storeys_clg_zcoords.sort_by {|key,value| value[1]}.to_h # sort storeys hash based on ceiling/roof z-coordinate
221
+ storeys_clg_zcoords = storeys_clg_zcoords.sort_by { |key, value| value[1] }.to_h # sort storeys hash based on ceiling/roof z-coordinate
214
222
  if storeys_clg_zcoords.values.last[0]
215
223
  # If the top floor is conditioned, then assume the top floor is not an attic floor and place the VRF outdoor unit at the roof centroid
216
- location_cent_x,location_cent_y,location_cent_z = get_roof_centroid_coords(storeys_clg_zcoords.keys.last)
224
+ location_cent_x, location_cent_y, location_cent_z = get_roof_centroid_coords(storeys_clg_zcoords.keys.last)
217
225
  else
218
226
  # If the top floor is not conditioned, then assume it's an attic floor. In this case place the VRF outdoor unit next to the centroid
219
227
  # of the exterior wall with the largest area on the lowest floor.
220
- location_cent_x,location_cent_y,location_cent_z = get_lowest_floor_ext_wall_centroid_coords(storeys_clg_zcoords)
228
+ location_cent_x, location_cent_y, location_cent_z = get_lowest_floor_ext_wall_centroid_coords(storeys_clg_zcoords)
221
229
  end
222
230
  # Initialize distances
223
231
  max_equiv_distance = 0.0
@@ -225,42 +233,46 @@ class ECMS
225
233
  min_vert_distance = 0.0
226
234
  storeys_clg_zcoords.keys.each do |storey|
227
235
  next unless storeys_clg_zcoords[storey][0]
236
+
228
237
  storey.spaces.each do |space|
229
238
  # Is there a VRF terminal unit in the space/zone?
230
239
  vrf_term_units = []
231
240
  if space.thermalZone.is_initialized
232
- vrf_term_units = space.thermalZone.get.equipment.select {|eqpt| eqpt.to_ZoneHVACTerminalUnitVariableRefrigerantFlow.is_initialized}
241
+ vrf_term_units = space.thermalZone.get.equipment.select { |eqpt| eqpt.to_ZoneHVACTerminalUnitVariableRefrigerantFlow.is_initialized }
233
242
  end
234
- next unless not vrf_term_units.empty?
235
- space_centroid_x,space_centroid_y,space_centroid_z = get_space_centroid_coords(space)
243
+ next if vrf_term_units.empty?
244
+
245
+ space_centroid_x, space_centroid_y, space_centroid_z = get_space_centroid_coords(space)
236
246
  # Update max horizontal and vertical distances if needed
237
247
  equiv_distance = (location_cent_x.to_f - space_centroid_x.to_f).abs +
238
- (location_cent_y.to_f - space_centroid_y.to_f).abs +
239
- (location_cent_z.to_f - space_centroid_z.to_f).abs
248
+ (location_cent_y.to_f - space_centroid_y.to_f).abs +
249
+ (location_cent_z.to_f - space_centroid_z.to_f).abs
240
250
  if equiv_distance > max_equiv_distance then max_equiv_distance = equiv_distance end
241
- pos_vert_distance = [space_centroid_z.to_f-location_cent_z.to_f,0.0].max
251
+ pos_vert_distance = [space_centroid_z.to_f - location_cent_z.to_f, 0.0].max
242
252
  if pos_vert_distance > max_vert_distance then max_vert_distance = pos_vert_distance end
243
- neg_vert_distance = [space_centroid_z.to_f-location_cent_z.to_f,0.0].min
253
+ neg_vert_distance = [space_centroid_z.to_f - location_cent_z.to_f, 0.0].min
244
254
  if neg_vert_distance < min_vert_distance then min_vert_distance = neg_vert_distance end
245
255
  end
246
256
  end
247
257
  max_net_vert_distance = max_vert_distance + min_vert_distance
248
- max_net_vert_distance = [max_net_vert_distance,0.000001].max
258
+ max_net_vert_distance = [max_net_vert_distance, 0.000001].max
249
259
 
250
- return max_equiv_distance,max_net_vert_distance
260
+ return max_equiv_distance, max_net_vert_distance
251
261
  end
252
262
 
253
263
  # =============================================================================================================================
254
264
  # Add an outdoor VRF unit
255
- def add_outdoor_vrf_unit(model:,ecm_name: nil,condenser_type: "AirCooled")
265
+ def add_outdoor_vrf_unit(model:,
266
+ ecm_name: nil,
267
+ condenser_type: 'AirCooled')
256
268
  outdoor_vrf_unit = OpenStudio::Model::AirConditionerVariableRefrigerantFlow.new(model)
257
- outdoor_vrf_unit.setName("VRF Outdoor Unit")
269
+ outdoor_vrf_unit.setName('VRF Outdoor Unit')
258
270
  outdoor_vrf_unit.setHeatPumpWasteHeatRecovery(true)
259
271
  outdoor_vrf_unit.setRatedHeatingCOP(4.0)
260
272
  outdoor_vrf_unit.setRatedCoolingCOP(4.0)
261
273
  outdoor_vrf_unit.setMinimumOutdoorTemperatureinHeatingMode(-25.0)
262
- outdoor_vrf_unit.setHeatingPerformanceCurveOutdoorTemperatureType("WetBulbTemperature")
263
- outdoor_vrf_unit.setMasterThermostatPriorityControlType("ThermostatOffsetPriority")
274
+ outdoor_vrf_unit.setHeatingPerformanceCurveOutdoorTemperatureType('WetBulbTemperature')
275
+ outdoor_vrf_unit.setMasterThermostatPriorityControlType('ThermostatOffsetPriority')
264
276
  outdoor_vrf_unit.setDefrostControl('OnDemand')
265
277
  outdoor_vrf_unit.setDefrostStrategy('ReverseCycle')
266
278
  outdoor_vrf_unit.autosizeResistiveDefrostHeaterCapacity
@@ -278,11 +290,12 @@ class ECMS
278
290
  outdoor_vrf_unit.setHeatRecoveryCoolingEnergyTimeConstant(0.0)
279
291
  outdoor_vrf_unit.setMinimumHeatPumpPartLoadRatio(0.5)
280
292
  outdoor_vrf_unit.setCondenserType(condenser_type)
281
- outdoor_vrf_unit.setCrankcaseHeaterPowerperCompressor(0.001)
293
+ outdoor_vrf_unit.setCrankcaseHeaterPowerperCompressor(1.0e-6)
282
294
  heat_defrost_eir_ft = nil
283
295
  if ecm_name
284
- search_criteria = coil_dx_find_search_criteria(outdoor_vrf_unit)
285
- props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_#{ecm_name.downcase}"]['table'], search_criteria, 1.0, Date.today)
296
+ search_criteria = {}
297
+ search_criteria['name'] = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit'
298
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
286
299
  heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
287
300
  end
288
301
  if heat_defrost_eir_ft
@@ -295,229 +308,690 @@ class ECMS
295
308
  end
296
309
 
297
310
  # =============================================================================================================================
298
- # Add indoor VRF units and update horizontal and vertical pipe runs for outdoor VRF unit
299
- def add_indoor_vrf_units(model:,system_zones_map:,outdoor_vrf_unit:)
300
- always_on = model.alwaysOnDiscreteSchedule
301
- always_off = model.alwaysOffDiscreteSchedule
302
- system_zones_map.sort.each do |sname,zones|
303
- zones.sort.each do |izone|
304
- zone_vrf_fan = OpenStudio::Model::FanOnOff.new(model, always_on)
305
- zone_vrf_fan.setName("#{izone.name} VRF Fan")
306
- zone_vrf_clg_coil = OpenStudio::Model::CoilCoolingDXVariableRefrigerantFlow.new(model)
307
- zone_vrf_clg_coil.setName("#{izone.name} VRF Clg Coil")
308
- zone_vrf_htg_coil = OpenStudio::Model::CoilHeatingDXVariableRefrigerantFlow.new(model)
309
- zone_vrf_htg_coil.setName("#{izone.name} VRF Htg Coil")
310
- zone_vrf_unit = OpenStudio::Model::ZoneHVACTerminalUnitVariableRefrigerantFlow.new(model,zone_vrf_clg_coil,zone_vrf_htg_coil,zone_vrf_fan)
311
- zone_vrf_unit.setName("#{izone.name} VRF Indoor Unit")
312
- zone_vrf_unit.setOutdoorAirFlowRateDuringCoolingOperation(0.000001)
313
- zone_vrf_unit.setOutdoorAirFlowRateDuringHeatingOperation(0.000001)
314
- zone_vrf_unit.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(0.000001)
315
- zone_vrf_unit.setZoneTerminalUnitOffParasiticElectricEnergyUse(0.000001)
316
- zone_vrf_unit.setZoneTerminalUnitOnParasiticElectricEnergyUse(0.000001)
317
- zone_vrf_unit.setSupplyAirFanOperatingModeSchedule(always_off)
318
- zone_vrf_unit.setRatedTotalHeatingCapacitySizingRatio(1.3)
319
- zone_vrf_unit.addToThermalZone(izone)
320
- outdoor_vrf_unit.addTerminal(zone_vrf_unit)
321
- # VRF terminal unit does not have a backup coil, use a unit heater as backup coil
322
- zone_unitheater_fan = OpenStudio::Model::FanConstantVolume.new(model, always_on) # OS does not support an OnOff fan for unit heaters
323
- zone_unitheater_fan.setName("#{izone.name} Unit Heater Fan")
324
- zone_unitheater_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
325
- zone_unitheater_htg_coil.setName("#{izone.name} Unit Heater Htg Coil")
326
- zone_unit_heater = OpenStudio::Model::ZoneHVACUnitHeater.new(model,always_on,zone_unitheater_fan,zone_unitheater_htg_coil)
327
- zone_unit_heater.setName("#{izone.name} Unit Heater")
328
- zone_unit_heater.setFanControlType("OnOff")
329
- zone_unit_heater.addToThermalZone(izone)
311
+ # Method to determine whether zone can have terminal vrf equipment. Zones with no vrf terminal equipment are characterized by
312
+ # transient occupancy such is the case for corridors, stairwells, storage, etc ...
313
+ def zone_with_no_vrf_eqpt?(zone)
314
+ space_types_to_skip = {}
315
+ space_types_to_skip['NECB2011'] = ['Atrium - H < 13m',
316
+ 'Atrium - H > 13m',
317
+ 'Audience - auditorium',
318
+ 'Corr. < 2.4m wide',
319
+ 'Corr. >= 2.4m wide',
320
+ 'Electrical/Mechanical',
321
+ 'Hospital corr. < 2.4m',
322
+ 'Hospital corr. >= 2.4m',
323
+ 'Mfg - corr. < 2.4m',
324
+ 'Mfg - corr. >= 2.4m',
325
+ 'Lobby - elevator',
326
+ 'Lobby - hotel',
327
+ 'Lobby - motion picture',
328
+ 'Lobby - other',
329
+ 'Lobby - performance arts',
330
+ 'Locker room',
331
+ 'Parking garage space',
332
+ 'Stairway',
333
+ 'Storage area',
334
+ 'Storage area - occsens',
335
+ 'Storage area - refrigerated',
336
+ 'Storage area - refrigerated - occsens',
337
+ 'Washroom',
338
+ 'Warehouse - fine',
339
+ 'Warehouse - fine - refrigerated',
340
+ 'Warehouse - med/blk',
341
+ 'Warehouse - med/blk - refrigerated',
342
+ 'Warehouse - med/blk2',
343
+ 'Warehouse - med/blk2 - refrigerated',
344
+ 'Hotel/Motel - lobby']
345
+
346
+ space_types_to_skip['NECB2015'] = ['Atrium (height < 6m)',
347
+ 'Atrium (6 =< height <= 12m)',
348
+ 'Atrium (height > 12m)',
349
+ 'Computer/Server room-sch-A',
350
+ 'Copy/Print room',
351
+ 'Corridor/Transition area - hospital',
352
+ 'Corridor/Transition area - manufacturing facility',
353
+ 'Corridor/Transition area - space designed to ANSI/IES RP-28',
354
+ 'Corridor/Transition area other',
355
+ 'Electrical/Mechanical room',
356
+ 'Emergency vehicle garage',
357
+ 'Lobby - elevator',
358
+ 'Lobby - hotel',
359
+ 'Lobby - motion picture theatre',
360
+ 'Lobby - performing arts theatre',
361
+ 'Lobby - space designed to ANSI/IES RP-28',
362
+ 'Lobby - other',
363
+ 'Locker room',
364
+ 'Storage garage interior',
365
+ 'Storage room < 5 m2',
366
+ 'Storage room <= 5 m2 <= 100 m2',
367
+ 'Storage room > 100 m2',
368
+ 'Washroom - space designed to ANSI/IES RP-28',
369
+ 'Washroom - other',
370
+ 'Warehouse storage area medium to bulky palletized items',
371
+ 'Warehouse storage area small hand-carried items(4)']
372
+
373
+ space_types_to_skip['NECB2017'] = ['Atrium (height < 6m)',
374
+ 'Atrium (6 =< height <= 12m)',
375
+ 'Atrium (height > 12m)',
376
+ 'Computer/Server room',
377
+ 'Copy/Print room',
378
+ 'Corridor/Transition area - hospital',
379
+ 'Corridor/Transition area - manufacturing facility',
380
+ 'Corridor/Transition area - space designed to ANSI/IES RP-28',
381
+ 'Corridor/Transition area other',
382
+ 'Electrical/Mechanical room',
383
+ 'Emergency vehicle garage',
384
+ 'Lobby - elevator',
385
+ 'Lobby - hotel',
386
+ 'Lobby - motion picture theatre',
387
+ 'Lobby - performing arts theatre',
388
+ 'Lobby - space designed to ANSI/IES RP-28',
389
+ 'Lobby - other',
390
+ 'Locker room',
391
+ 'Stairway/Stairwell',
392
+ 'Storage garage interior',
393
+ 'Storage room < 5 m2',
394
+ 'Storage room <= 5 m2 <= 100 m2',
395
+ 'Storage room > 100 m2',
396
+ 'Washroom - space designed to ANSI/IES RP-28',
397
+ 'Washroom - other',
398
+ 'Warehouse storage area medium to bulky palletized items',
399
+ 'Warehouse storage area small hand-carried items(4)']
400
+
401
+ zone_does_not_have_vrf_eqpt = false
402
+ zone.spaces.each do |space|
403
+ space_types_to_skip.each do |std, spfs|
404
+ spfs.each do |spf|
405
+ if space.spaceType.get.name.to_s.downcase.include? spf.downcase
406
+ zone_does_not_have_vrf_eqpt = true
407
+ break
408
+ end
409
+ end
410
+ break if zone_does_not_have_vrf_eqpt
330
411
  end
412
+ break if zone_does_not_have_vrf_eqpt
331
413
  end
332
- # Now we can find and apply maximum horizontal and vertical distances between outdoor vrf unit and zones with vrf terminal units
333
- max_hor_pipe_length,max_vert_pipe_length = get_max_vrf_pipe_lengths(model)
334
- #raise("test1:#{max_hor_pipe_length},#{max_vert_pipe_length}")
335
- outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinCoolingMode(max_hor_pipe_length)
336
- outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinHeatingMode(max_hor_pipe_length)
337
- outdoor_vrf_unit.setVerticalHeightusedforPipingCorrectionFactor(max_vert_pipe_length)
338
414
  end
339
415
 
340
416
  # =============================================================================================================================
341
- # Add a dedicated outside air loop with cold-climate heat pump with electric backup
342
- # Add cold-climate zonal terminal VRF units
343
- def add_ecm_hs08_vrfzonal(model:,system_zones_map:,system_doas_flags:,zone_clg_eqpt_type:, standard:)
344
- # Update system doas flags
345
- system_doas_flags.keys.each {|sname| system_doas_flags[sname] = true}
346
- # Add doas with cold-climate air-source heat pump and electric backup
347
- add_ecm_hs09_ccashpsys(model: model,system_zones_map: system_zones_map,system_doas_flags: system_doas_flags,standard: standard,baseboard_flag: false)
417
+ # Add equipment for ECM 'hs08_ccashp_vrf':
418
+ # -Constant-volume DOAS with air-source heat pump for heating and cooling and electric backup
419
+ # -Zonal terminal VRF units connected to an outdoor VRF condenser unit
420
+ # -Zonal electric backup
421
+ def add_ecm_hs08_ccashp_vrf(
422
+ model:,
423
+ system_zones_map:,
424
+ system_doas_flags:,
425
+ air_sys_eqpt_type: 'ccashp'
426
+ )
348
427
  # Add outdoor VRF unit
349
- outdoor_vrf_unit = add_outdoor_vrf_unit(model: model,ecm_name: "hs08_vrfzonal")
350
- # Add indoor VRF terminal units
351
- add_indoor_vrf_units(model: model,system_zones_map: system_zones_map,outdoor_vrf_unit: outdoor_vrf_unit)
428
+ outdoor_vrf_unit = add_outdoor_vrf_unit(model: model, ecm_name: 'hs08_ccashp_vrf')
429
+ # Update system doas flags
430
+ system_doas_flags.keys.each { |sname| system_doas_flags[sname] = true }
431
+ # use system zones map and generate new air system and zonal equipment
432
+ system_zones_map.sort.each do |sys_name, zones|
433
+ sys_info = air_sys_comps_assumptions(sys_name: sys_name,
434
+ zones: zones,
435
+ system_doas_flags: system_doas_flags)
436
+ airloop, return_fan = add_air_system(model: model,
437
+ zones: zones,
438
+ sys_abbr: sys_info['sys_abbr'],
439
+ sys_vent_type: sys_info['sys_vent_type'],
440
+ sys_heat_rec_type: sys_info['sys_heat_rec_type'],
441
+ sys_htg_eqpt_type: air_sys_eqpt_type,
442
+ sys_supp_htg_eqpt_type: 'coil_electric',
443
+ sys_clg_eqpt_type: air_sys_eqpt_type,
444
+ sys_supp_fan_type: sys_info['sys_supp_fan_type'],
445
+ sys_ret_fan_type: sys_info['sys_ret_fan_type'],
446
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
447
+ # get and assign defrost curve
448
+ dx_htg_coil = nil
449
+ airloop.supplyComponents.sort.each do |comp|
450
+ if comp.to_CoilHeatingDXSingleSpeed.is_initialized
451
+ dx_htg_coil = comp.to_CoilHeatingDXSingleSpeed.get
452
+ elsif comp.to_CoilHeatingDXVariableSpeed.is_initialized
453
+ dx_htg_coil = comp.to_CoilHeatingDXVariableSpeed.get
454
+ end
455
+ end
456
+ search_criteria = {}
457
+ if air_sys_eqpt_type == 'ccashp'
458
+ search_criteria['name'] = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
459
+ elsif air_sys_eqpt_type == 'ashp'
460
+ search_criteria['name'] = 'NECB2015_ASHP'
461
+ end
462
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
463
+ heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
464
+ if heat_defrost_eir_ft
465
+ dx_htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
466
+ else
467
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDX', "For #{dx_htg_coil.name}, cannot find heat_defrost_eir_ft curve, will not be set.")
468
+ end
469
+ # add zone equipment and diffuser
470
+ # add terminal VRF units
471
+ add_zone_eqpt(model: model,
472
+ airloop: airloop,
473
+ zones: zones,
474
+ outdoor_unit: outdoor_vrf_unit,
475
+ zone_diffuser_type: sys_info['zone_diffuser_type'],
476
+ zone_htg_eqpt_type: 'vrf',
477
+ zone_supp_htg_eqpt_type: 'none',
478
+ zone_clg_eqpt_type: 'vrf',
479
+ zone_fan_type: 'On_Off')
480
+ # add electric unit heaters fpr backup
481
+ add_zone_eqpt(model: model,
482
+ airloop: airloop,
483
+ zones: zones,
484
+ outdoor_unit: nil,
485
+ zone_diffuser_type: nil,
486
+ zone_htg_eqpt_type: 'baseboard_electric',
487
+ zone_supp_htg_eqpt_type: 'none',
488
+ zone_clg_eqpt_type: 'none',
489
+ zone_fan_type: 'none') # OS doesn't support onoff fans for unit heaters
490
+ # Now we can find and apply maximum horizontal and vertical distances between outdoor vrf unit and zones with vrf terminal units
491
+ max_hor_pipe_length, max_vert_pipe_length = get_max_vrf_pipe_lengths(model)
492
+ outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinCoolingMode(max_hor_pipe_length)
493
+ outdoor_vrf_unit.setEquivalentPipingLengthusedforPipingCorrectionFactorinHeatingMode(max_hor_pipe_length)
494
+ outdoor_vrf_unit.setVerticalHeightusedforPipingCorrectionFactor(max_vert_pipe_length)
495
+ end
352
496
  end
353
497
 
354
498
  # =============================================================================================================================
355
- # Apply efficiencies and performance curves for ECM 'hs08_vrfzonal'
356
- def apply_efficiency_ecm_hs08_vrfzonal(model:,ecm_name:)
357
- # Use same performance data as ECM "hs09_ccashpsys" for air system
358
- apply_efficiency_ecm_hs09_ccashpsys(model: model,ecm_name: "hs09_ccashpsys")
499
+ # Apply efficiencies and performance curves for ECM 'hs08_ccashp_vrf'
500
+ def apply_efficiency_ecm_hs08_ccashp_vrf(model, air_sys_eqpt_type: 'ccashp')
501
+ # Use same performance data as ECM 'hs09_ccashpsys' for air system
502
+ if air_sys_eqpt_type == 'ccashp'
503
+ apply_efficiency_ecm_hs09_ccashp_baseboard(model)
504
+ elsif air_sys_eqpt_type == 'ashp'
505
+ apply_efficiency_ecm_hs12_ashp_baseboard(model)
506
+ end
359
507
  # Apply efficiency and curves for VRF units
508
+ eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit'
360
509
  model.getAirConditionerVariableRefrigerantFlows.sort.each do |vrf_unit|
361
- airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(vrf_unit,ecm_name)
362
- airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(vrf_unit,ecm_name)
510
+ airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(vrf_unit, eqpt_name)
511
+ airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(vrf_unit, eqpt_name)
363
512
  end
364
513
  # Set fan size of VRF terminal units
365
- fan_power_per_flow_rate = 150.0 # based on Mitsubishi data: 100 low and 200 high (W-s/m3)
514
+ fan_power_per_flow_rate = 150.0 # based on Mitsubishi data: 100 low and 200 high (W-s/m3)
366
515
  model.getZoneHVACTerminalUnitVariableRefrigerantFlows.each do |iunit|
367
516
  fan = iunit.supplyAirFan.to_FanOnOff.get
368
- fan_pr_rise = fan_power_per_flow_rate*(fan.fanEfficiency*fan.motorEfficiency)
517
+ fan_pr_rise = fan_power_per_flow_rate * (fan.fanEfficiency * fan.motorEfficiency)
369
518
  fan.setPressureRise(fan_pr_rise)
370
519
  end
371
520
  # Set fan size of unit heaters
372
521
  model.getZoneHVACUnitHeaters.each do |iunit|
373
522
  fan = iunit.supplyAirFan.to_FanConstantVolume.get
374
- fan_pr_rise = fan_power_per_flow_rate*(fan.fanEfficiency*fan.motorEfficiency)
523
+ fan_pr_rise = fan_power_per_flow_rate * (fan.fanEfficiency * fan.motorEfficiency)
375
524
  fan.setPressureRise(fan_pr_rise)
376
525
  end
377
526
  end
378
527
 
379
528
  # =============================================================================================================================
380
- # Add air loops with cold-climate heat pump with electric backup coil.
381
- # Add zone electric baseboards
382
- def add_ecm_hs09_ccashpsys(model:,system_zones_map:,system_doas_flags:,zone_clg_eqpt_type: nil,standard:,baseboard_flag: true)
529
+ # create air loop
530
+ def create_airloop(model, sys_vent_type)
531
+ airloop = OpenStudio::Model::AirLoopHVAC.new(model)
532
+ airloop.sizingSystem.setPreheatDesignTemperature(7.0)
533
+ airloop.sizingSystem.setPreheatDesignHumidityRatio(0.008)
534
+ airloop.sizingSystem.setPrecoolDesignTemperature(13.0)
535
+ airloop.sizingSystem.setPrecoolDesignHumidityRatio(0.008)
536
+ airloop.sizingSystem.setSizingOption('NonCoincident')
537
+ airloop.sizingSystem.setCoolingDesignAirFlowMethod('DesignDay')
538
+ airloop.sizingSystem.setCoolingDesignAirFlowRate(0.0)
539
+ airloop.sizingSystem.setHeatingDesignAirFlowMethod('DesignDay')
540
+ airloop.sizingSystem.setHeatingDesignAirFlowRate(0.0)
541
+ airloop.sizingSystem.setSystemOutdoorAirMethod('ZoneSum')
542
+ airloop.sizingSystem.setCentralCoolingDesignSupplyAirHumidityRatio(0.0085)
543
+ airloop.sizingSystem.setCentralHeatingDesignSupplyAirHumidityRatio(0.0080)
544
+ airloop.sizingSystem.setMinimumSystemAirFlowRatio(1.0)
545
+ case sys_vent_type.downcase
546
+ when 'doas'
547
+ airloop.sizingSystem.setAllOutdoorAirinCooling(true)
548
+ airloop.sizingSystem.setAllOutdoorAirinHeating(true)
549
+ airloop.sizingSystem.setTypeofLoadtoSizeOn('VentilationRequirement')
550
+ airloop.sizingSystem.setCentralCoolingDesignSupplyAirTemperature(19.9)
551
+ airloop.sizingSystem.setCentralHeatingDesignSupplyAirTemperature(20.0)
552
+ when 'mixed'
553
+ airloop.sizingSystem.setAllOutdoorAirinCooling(false)
554
+ airloop.sizingSystem.setAllOutdoorAirinHeating(false)
555
+ airloop.sizingSystem.setTypeofLoadtoSizeOn('Sensible')
556
+ airloop.sizingSystem.setCentralCoolingDesignSupplyAirTemperature(13.0)
557
+ airloop.sizingSystem.setCentralHeatingDesignSupplyAirTemperature(43.0)
558
+ end
559
+
560
+ return airloop
561
+ end
562
+
563
+ # =============================================================================================================================
564
+ # create air system setpoint manager
565
+ def create_air_sys_spm(model, setpoint_mgr_type, zones)
566
+ spm = nil
567
+ case setpoint_mgr_type.downcase
568
+ when 'scheduled'
569
+ sat = 20.0
570
+ sat_sch = OpenStudio::Model::ScheduleRuleset.new(model)
571
+ sat_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), sat)
572
+ spm = OpenStudio::Model::SetpointManagerScheduled.new(model, sat_sch)
573
+ when 'single_zone_reheat'
574
+ spm = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
575
+ spm.setControlZone(zones[0])
576
+ spm.setMinimumSupplyAirTemperature(13.0)
577
+ spm.setMaximumSupplyAirTemperature(43.0)
578
+ when 'warmest'
579
+ spm = OpenStudio::Model::SetpointManagerWarmest.new(model)
580
+ spm.setMinimumSetpointTemperature(13.0)
581
+ spm.setMaximumSetpointTemperature(43.0)
582
+ end
583
+
584
+ return spm
585
+ end
586
+
587
+ # =============================================================================================================================
588
+ # create air system fan
589
+ def create_air_sys_fan(model, fan_type)
590
+ fan = nil
591
+ case fan_type.downcase
592
+ when 'constant_volume'
593
+ fan = OpenStudio::Model::FanConstantVolume.new(model)
594
+ fan.setName('FanConstantVolume')
595
+ when 'variable_volume'
596
+ fan = OpenStudio::Model::FanVariableVolume.new(model)
597
+ fan.setName('FanVariableVolume')
598
+ when 'on_off'
599
+ fan = OpenStudio::Model::FanOnOff.new(model)
600
+ fan.setName('FanOnOff')
601
+ end
602
+
603
+ return fan
604
+ end
605
+
606
+ # =============================================================================================================================
607
+ # create air system cooling equipment
608
+ def create_air_sys_clg_eqpt(model, clg_eqpt_type)
609
+ clg_eqpt = nil
610
+ case clg_eqpt_type.downcase
611
+ when 'ashp'
612
+ clg_eqpt = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
613
+ clg_eqpt.setName('CoilCoolingDxSingleSpeed_ASHP')
614
+ clg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
615
+ when 'ccashp'
616
+ clg_eqpt = OpenStudio::Model::CoilCoolingDXVariableSpeed.new(model)
617
+ clg_eqpt.setName('CoilCoolingDXVariableSpeed_CCASHP')
618
+ clg_eqpt_speed1 = OpenStudio::Model::CoilCoolingDXVariableSpeedSpeedData.new(model)
619
+ clg_eqpt.addSpeed(clg_eqpt_speed1)
620
+ clg_eqpt.setNominalSpeedLevel(1)
621
+ clg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
622
+ when 'vrf'
623
+ clg_eqpt = OpenStudio::Model::CoilCoolingDXVariableRefrigerantFlow.new(model)
624
+ clg_eqpt.setName('CoilCoolingDXVariableRefrigerantFlow')
625
+ end
626
+
627
+ return clg_eqpt
628
+ end
629
+
630
+ # =============================================================================================================================
631
+ # create air system heating equipment
632
+ def create_air_sys_htg_eqpt(model, htg_eqpt_type)
633
+ always_on = model.alwaysOnDiscreteSchedule
634
+ htg_eqpt = nil
635
+ case htg_eqpt_type.downcase
636
+ when 'coil_electric'
637
+ htg_eqpt = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
638
+ htg_eqpt.setName('CoilHeatingElectric')
639
+ when 'ashp'
640
+ htg_eqpt = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
641
+ htg_eqpt.setName('CoilHeatingDXSingleSpeed_ASHP')
642
+ htg_eqpt.setDefrostStrategy('ReverseCycle')
643
+ htg_eqpt.setDefrostControl('OnDemand')
644
+ htg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
645
+ when 'ccashp'
646
+ htg_eqpt = OpenStudio::Model::CoilHeatingDXVariableSpeed.new(model)
647
+ htg_eqpt.setName('CoilHeatingDXVariableSpeed_CCASHP')
648
+ htg_eqpt_speed1 = OpenStudio::Model::CoilHeatingDXVariableSpeedSpeedData.new(model)
649
+ htg_eqpt.addSpeed(htg_eqpt_speed1)
650
+ htg_eqpt.setNominalSpeedLevel(1)
651
+ htg_eqpt.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0)
652
+ htg_eqpt.setDefrostStrategy('ReverseCycle')
653
+ htg_eqpt.setDefrostControl('OnDemand')
654
+ htg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
655
+ end
656
+
657
+ return htg_eqpt
658
+ end
659
+
660
+ # =============================================================================================================================
661
+ # add air system with all its components
662
+ def add_air_system(
663
+ model:,
664
+ zones:,
665
+ sys_abbr:,
666
+ sys_vent_type:,
667
+ sys_heat_rec_type:,
668
+ sys_htg_eqpt_type:,
669
+ sys_supp_htg_eqpt_type:,
670
+ sys_clg_eqpt_type:,
671
+ sys_supp_fan_type:,
672
+ sys_ret_fan_type:,
673
+ sys_setpoint_mgr_type:
674
+ )
675
+
676
+ # create all the needed components and the air loop
677
+ airloop = create_airloop(model, sys_vent_type)
678
+ setpoint_mgr = create_air_sys_spm(model, sys_setpoint_mgr_type, zones)
679
+ supply_fan = create_air_sys_fan(model, sys_supp_fan_type)
680
+ supply_fan.setName('Supply Fan') if supply_fan
681
+ return_fan = create_air_sys_fan(model, sys_ret_fan_type)
682
+ return_fan.setName('Return Fan') if return_fan
683
+ htg_eqpt = create_air_sys_htg_eqpt(model, sys_htg_eqpt_type)
684
+ supp_htg_eqpt = create_air_sys_htg_eqpt(model, sys_supp_htg_eqpt_type)
685
+ clg_eqpt = create_air_sys_clg_eqpt(model, sys_clg_eqpt_type)
686
+ # add components to the air loop
687
+ clg_eqpt.addToNode(airloop.supplyOutletNode) if clg_eqpt
688
+ htg_eqpt.addToNode(airloop.supplyOutletNode) if htg_eqpt
689
+ supp_htg_eqpt.addToNode(airloop.supplyOutletNode) if supp_htg_eqpt
690
+ supply_fan.addToNode(airloop.supplyOutletNode) if supply_fan
691
+ setpoint_mgr.addToNode(airloop.supplyOutletNode) if setpoint_mgr
692
+
693
+ # OA controller
694
+ oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
695
+ oa_controller.autosizeMinimumOutdoorAirFlowRate
696
+ oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
697
+ oa_system.addToNode(airloop.supplyInletNode)
698
+
699
+ # Set airloop name
700
+ sys_name_pars = {}
701
+ sys_name_pars['sys_hr'] = 'none'
702
+ sys_name_pars['sys_clg'] = sys_clg_eqpt_type
703
+ sys_name_pars['sys_htg'] = sys_htg_eqpt_type
704
+ sys_name_pars['sys_sf'] = 'cv' if sys_supp_fan_type == 'constant_volume'
705
+ sys_name_pars['sys_sf'] = 'vv' if sys_supp_fan_type == 'variable_volume'
706
+ sys_name_pars['zone_htg'] = 'none'
707
+ sys_name_pars['zone_clg'] = 'none'
708
+ sys_name_pars['sys_rf'] = 'none'
709
+ sys_name_pars['sys_rf'] = 'cv' if sys_ret_fan_type == 'constant_volume'
710
+ sys_name_pars['sys_rf'] = 'vv' if sys_ret_fan_type == 'variable_volume'
711
+ assign_base_sys_name(airloop, sys_abbr: sys_abbr, sys_oa: sys_vent_type, sys_name_pars: sys_name_pars)
712
+ return airloop, return_fan
713
+ end
714
+
715
+ # =============================================================================================================================
716
+ # create zone diffuser
717
+ def create_zone_diffuser(model, zone_diffuser_type, zone)
718
+ always_on = model.alwaysOnDiscreteSchedule
719
+ diffuser = nil
720
+ case zone_diffuser_type.downcase
721
+ when 'single_duct_uncontrolled'
722
+ diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
723
+ when 'single_duct_vav_reheat'
724
+ reheat_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
725
+ diffuser = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, always_on, reheat_coil)
726
+ # diffuser.setFixedMinimumAirFlowRate(0.002 * zone.floorArea )
727
+ diffuser.setMaximumReheatAirTemperature(43.0)
728
+ diffuser.setDamperHeatingAction('Normal')
729
+ end
730
+
731
+ return diffuser
732
+ end
733
+
734
+ # =============================================================================================================================
735
+ # create zonal heating equipment
736
+ def create_zone_htg_eqpt(model, zone_htg_eqpt_type)
383
737
  always_on = model.alwaysOnDiscreteSchedule
384
738
  always_off = model.alwaysOffDiscreteSchedule
385
- systems = []
386
- system_zones_map.sort.each do |sys_name,zones|
387
- system_data = {}
388
- system_data[:PreheatDesignTemperature] = 7.0
389
- system_data[:PreheatDesignHumidityRatio] = 0.008
390
- system_data[:PrecoolDesignTemperature] = 13.0
391
- system_data[:PrecoolDesignHumidityRatio] = 0.008
392
- system_data[:SizingOption] = 'NonCoincident'
393
- system_data[:CoolingDesignAirFlowMethod] = 'DesignDay'
394
- system_data[:CoolingDesignAirFlowRate] = 0.0
395
- system_data[:HeatingDesignAirFlowMethod] = 'DesignDay'
396
- system_data[:HeatingDesignAirFlowRate] = 0.0
397
- system_data[:SystemOutdoorAirMethod] = 'ZoneSum'
398
- system_data[:CentralCoolingDesignSupplyAirHumidityRatio] = 0.0085
399
- system_data[:CentralHeatingDesignSupplyAirHumidityRatio] = 0.0080
400
- system_data[:MinimumSystemAirFlowRatio] = 1.0
401
- system_data[:system_supply_air_temperature] = 20.0
402
- system_data[:ZoneCoolingDesignSupplyAirTemperature] = 13.0
403
- system_data[:ZoneHeatingDesignSupplyAirTemperature] = 43.0
404
- system_data[:ZoneCoolingSizingFactor] = 1.1
405
- system_data[:ZoneHeatingSizingFactor] = 1.3
406
- if system_doas_flags[sys_name.to_s]
407
- system_data[:name] = sys_name.to_s
408
- system_data[:AllOutdoorAirinCooling] = true
409
- system_data[:AllOutdoorAirinHeating] = true
410
- system_data[:TypeofLoadtoSizeOn] = 'VentilationRequirement'
411
- system_data[:CentralCoolingDesignSupplyAirTemperature] = 19.9
412
- system_data[:CentralHeatingDesignSupplyAirTemperature] = 20.0
413
- sat_sch = OpenStudio::Model::ScheduleRuleset.new(model)
414
- sat_sch.setName('Makeup-Air Unit Supply Air Temp')
415
- sat_sch.defaultDaySchedule.setName('Makeup Air Unit Supply Air Temp Default')
416
- sat_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), system_data[:system_supply_air_temperature])
417
- setpoint_mgr = OpenStudio::Model::SetpointManagerScheduled.new(model, sat_sch)
418
- else
419
- system_data[:name] = sys_name.to_s
420
- system_data[:AllOutdoorAirinCooling] = false
421
- system_data[:AllOutdoorAirinHeating] = false
422
- system_data[:TypeofLoadtoSizeOn] = 'Sensible'
423
- system_data[:CentralCoolingDesignSupplyAirTemperature] = 13.0
424
- system_data[:CentralHeatingDesignSupplyAirTemperature] = 43.0
425
- if zones.size == 1
426
- setpoint_mgr = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
427
- setpoint_mgr.setControlZone(zones[0])
428
- setpoint_mgr.setMinimumSupplyAirTemperature(13.0)
429
- setpoint_mgr.setMaximumSupplyAirTemperature(43.0)
430
- else
431
- setpoint_mgr = OpenStudio::Model::SetpointManagerWarmest.new(model)
432
- setpoint_mgr.setMinimumSetpointTemperature(13.0)
433
- setpoint_mgr.setMaximumSetpointTemperature(43.0)
434
- end
739
+ htg_eqpt = nil
740
+ case zone_htg_eqpt_type.downcase
741
+ when 'baseboard_electric'
742
+ htg_eqpt = OpenStudio::Model::ZoneHVACBaseboardConvectiveElectric.new(model)
743
+ htg_eqpt.setName('Zone HVAC Baseboard Convective Electric')
744
+ when 'coil_electric', 'ptac_electric_off', 'unitheater_electric'
745
+ htg_eqpt = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
746
+ htg_eqpt.setName('CoilHeatingElectric')
747
+ htg_eqpt.setAvailabilitySchedule(always_off) if zone_htg_eqpt_type == 'ptac_electric_off'
748
+ when 'pthp'
749
+ htg_eqpt = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
750
+ htg_eqpt.setName('CoilHeatingDXSingleSpeed_PTHP')
751
+ htg_eqpt.setDefrostStrategy('ReverseCycle')
752
+ htg_eqpt.setDefrostControl('OnDemand')
753
+ htg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
754
+ when 'vrf'
755
+ htg_eqpt = OpenStudio::Model::CoilHeatingDXVariableRefrigerantFlow.new(model)
756
+ htg_eqpt.setName('CoilHeatingDXVariableRefrigerantFlow')
757
+ end
758
+
759
+ return htg_eqpt
760
+ end
761
+
762
+ # =============================================================================================================================
763
+ # create zonal cooling equipment
764
+ def create_zone_clg_eqpt(model, zone_clg_eqpt_type)
765
+ always_on = model.alwaysOnDiscreteSchedule
766
+ clg_eqpt = nil
767
+ case zone_clg_eqpt_type.downcase
768
+ when 'ptac_electric_off', 'pthp'
769
+ clg_eqpt = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
770
+ clg_eqpt.setName('CoilCoolingDXSingleSpeed_PTHP') if zone_clg_eqpt_type.downcase == 'pthp'
771
+ clg_eqpt.setName('CoilCoolingDXSingleSpeed_PTAC') if zone_clg_eqpt_type.downcase == 'ptac_electric_off'
772
+ clg_eqpt.setCrankcaseHeaterCapacity(1.0e-6)
773
+ when 'vrf'
774
+ clg_eqpt = OpenStudio::Model::CoilCoolingDXVariableRefrigerantFlow.new(model)
775
+ clg_eqpt.setName('CoilCoolingDXVariableRefrigerantFlow')
776
+ end
777
+
778
+ return clg_eqpt
779
+ end
780
+
781
+ # =============================================================================================================================
782
+ # create zpne container eqpt
783
+ def create_zone_container_eqpt(
784
+ model:,
785
+ zone_cont_eqpt_type:,
786
+ zone_htg_eqpt:,
787
+ zone_supp_htg_eqpt:,
788
+ zone_clg_eqpt:,
789
+ zone_fan:,
790
+ zone_vent_off: true
791
+ )
792
+
793
+ always_on = model.alwaysOnDiscreteSchedule
794
+ always_off = model.alwaysOffDiscreteSchedule
795
+ zone_eqpt = nil
796
+ case zone_cont_eqpt_type.downcase
797
+ when 'ptac_electric_off'
798
+ zone_eqpt = OpenStudio::Model::ZoneHVACPackagedTerminalAirConditioner.new(model, always_on, zone_fan, zone_htg_eqpt, zone_clg_eqpt)
799
+ zone_eqpt.setName('ZoneHVACPackagedTerminalAirConditioner')
800
+ if zone_vent_off
801
+ zone_eqpt.setOutdoorAirFlowRateDuringCoolingOperation(1.0e-6)
802
+ zone_eqpt.setOutdoorAirFlowRateDuringHeatingOperation(1.0e-6)
803
+ zone_eqpt.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(1.0e-6)
435
804
  end
436
- airloop = standard.common_air_loop(model: model, system_data: system_data)
437
- # Fan
438
- if system_doas_flags[sys_name.to_s] || zones.size == 1
439
- sys_supply_fan = OpenStudio::Model::FanConstantVolume.new(model)
440
- else
441
- sys_supply_fan = OpenStudio::Model::FanVariableVolume.new(model)
442
- sys_return_fan = OpenStudio::Model::FanVariableVolume.new(model)
443
- sys_return_fan.setName("System Return Fan")
805
+ when 'pthp'
806
+ zone_eqpt = OpenStudio::Model::ZoneHVACPackagedTerminalHeatPump.new(model, always_on, zone_fan, zone_htg_eqpt, zone_clg_eqpt, zone_supp_htg_eqpt)
807
+ zone_eqpt.setName('ZoneHVACPackagedTerminalHeatPump')
808
+ if zone_vent_off
809
+ zone_eqpt.setOutdoorAirFlowRateDuringCoolingOperation(1.0e-6)
810
+ zone_eqpt.setOutdoorAirFlowRateDuringHeatingOperation(1.0e-6)
811
+ zone_eqpt.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(1.0e-6)
812
+ zone_eqpt.setSupplyAirFanOperatingModeSchedule(always_off)
444
813
  end
445
- sys_supply_fan.setName("System Supply Fan")
446
- # Cooling coil
447
- sys_clg_coil = OpenStudio::Model::CoilCoolingDXVariableSpeed.new(model)
448
- sys_clg_coil.setName("CoilCoolingDXVariableSpeed_CCASHP")
449
- sys_clg_coil_speeddata1 = OpenStudio::Model::CoilCoolingDXVariableSpeedSpeedData.new(model)
450
- sys_clg_coil.addSpeed(sys_clg_coil_speeddata1)
451
- sys_clg_coil.setNominalSpeedLevel(1)
452
- # Electric supplemental heating coil
453
- sys_elec_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
454
- sys_elec_htg_coil.setName("CoilHeatingElectric")
455
- # DX heating coil
456
- sys_dx_htg_coil = OpenStudio::Model::CoilHeatingDXVariableSpeed.new(model)
457
- sys_dx_htg_coil.setName("CoilHeatingDXVariableSpeed_CCASHP")
458
- sys_dx_htg_coil_speed1 = OpenStudio::Model::CoilHeatingDXVariableSpeedSpeedData.new(model)
459
- sys_dx_htg_coil.addSpeed(sys_dx_htg_coil_speed1)
460
- sys_dx_htg_coil.setNominalSpeedLevel(1)
461
- sys_dx_htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(-25.0)
462
- sys_dx_htg_coil.setDefrostStrategy("ReverseCycle")
463
- #sys_dx_htg_coil.setDefrostStrategy("Resistive")
464
- #sys_dx_htg_coil.setResistiveDefrostHeaterCapacity(0.001)
465
- sys_dx_htg_coil.setDefrostControl("OnDemand")
466
- sys_dx_htg_coil.setCrankcaseHeaterCapacity(0.001)
467
- search_criteria = coil_dx_find_search_criteria(sys_dx_htg_coil)
468
- props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_hs09_ccashpsys"]['table'], search_criteria, 1.0, Date.today)
469
- heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
470
- # This defrost curve has to be assigned here before sizing
471
- if heat_defrost_eir_ft
472
- sys_dx_htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
473
- else
474
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{sys_dx_htg_coil.name}, cannot find heat_defrost_eir_ft curve, will not be set.")
814
+ when 'unitheater_electric'
815
+ zone_eqpt = OpenStudio::Model::ZoneHVACUnitHeater.new(model, always_on, zone_fan, zone_htg_eqpt)
816
+ zone_eqpt.setName('ZoneHVACUnitHeater')
817
+ zone_eqpt.setFanControlType('OnOff')
818
+ when 'vrf'
819
+ zone_eqpt = OpenStudio::Model::ZoneHVACTerminalUnitVariableRefrigerantFlow.new(model, zone_clg_eqpt, zone_htg_eqpt, zone_fan)
820
+ zone_eqpt.setName('ZoneHVACTerminalUnitVariableRefrigerantFlow')
821
+ zone_eqpt.setSupplyAirFanOperatingModeSchedule(always_off)
822
+ if zone_vent_off
823
+ zone_eqpt.setOutdoorAirFlowRateDuringCoolingOperation(1.0e-6)
824
+ zone_eqpt.setOutdoorAirFlowRateDuringHeatingOperation(1.0e-6)
825
+ zone_eqpt.setOutdoorAirFlowRateWhenNoCoolingorHeatingisNeeded(1.0e-6)
826
+ zone_eqpt.setZoneTerminalUnitOffParasiticElectricEnergyUse(1.0e-6)
827
+ zone_eqpt.setZoneTerminalUnitOnParasiticElectricEnergyUse(1.0e-6)
475
828
  end
476
- sys_clg_coil.addToNode(airloop.supplyOutletNode)
477
- sys_dx_htg_coil.addToNode(airloop.supplyOutletNode)
478
- sys_elec_htg_coil.addToNode(airloop.supplyOutletNode)
479
- sys_supply_fan.addToNode(airloop.supplyOutletNode)
480
- setpoint_mgr.addToNode(airloop.supplyOutletNode)
481
- # OA controller
482
- oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
483
- oa_controller.autosizeMinimumOutdoorAirFlowRate
484
- oa_system = OpenStudio::Model::AirLoopHVACOutdoorAirSystem.new(model, oa_controller)
485
- oa_system.addToNode(airloop.supplyInletNode)
486
- zones.each do |zone|
829
+ end
830
+
831
+ return zone_eqpt
832
+ end
833
+
834
+ # =============================================================================================================================
835
+ # add zonal heating and cooling equipment
836
+ def add_zone_eqpt(model:,
837
+ airloop:,
838
+ zones:,
839
+ outdoor_unit:,
840
+ zone_diffuser_type:,
841
+ zone_htg_eqpt_type:,
842
+ zone_supp_htg_eqpt_type:,
843
+ zone_clg_eqpt_type:,
844
+ zone_fan_type:)
845
+
846
+ always_on = model.alwaysOnDiscreteSchedule
847
+ zones.sort.each do |zone|
848
+ # during the first call to this method for a zone, the diffuser type has to be specified if there is an air loop serving the zone
849
+ if zone_diffuser_type
487
850
  zone.sizingZone.setZoneCoolingDesignSupplyAirTemperature(13.0)
488
851
  zone.sizingZone.setZoneHeatingDesignSupplyAirTemperature(43.0)
489
852
  zone.sizingZone.setZoneCoolingSizingFactor(1.1)
490
853
  zone.sizingZone.setZoneHeatingSizingFactor(1.3)
491
- if zone_clg_eqpt_type
492
- case zone_clg_eqpt_type[zone.name.to_s]
493
- when "ZoneHVACPackagedTerminalAirConditioner"
494
- standard.add_ptac_dx_cooling(model,zone,true)
495
- end
496
- end
497
- if system_doas_flags[sys_name.to_s] || zones.size == 1
498
- diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
499
- else
500
- reheat_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
501
- diffuser = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, always_on, reheat_coil)
502
- sys_return_fan.addToNode(airloop.returnAirNode.get)
503
- diffuser.setFixedMinimumAirFlowRate(0.002 * zone.floorArea )
504
- diffuser.setMaximumReheatAirTemperature(43.0)
505
- diffuser.setDamperHeatingAction('Normal')
506
- end
854
+ diffuser = create_zone_diffuser(model, zone_diffuser_type, zone)
507
855
  airloop.removeBranchForZone(zone)
508
856
  airloop.addBranchForZone(zone, diffuser.to_StraightComponent)
509
- if baseboard_flag then standard.add_zone_baseboards(baseboard_type: 'Electric', hw_loop: nil, model: model, zone: zone) end
510
857
  end
511
- update_sys_name(airloop,
512
- sys_abbr: nil,
513
- sys_oa: nil,
514
- sys_hr: nil,
515
- sys_htg: "ccashp",
516
- sys_clg: "ccashp",
517
- sys_sf: nil,
518
- zone_htg: "b-e",
519
- zone_clg: "none",
520
- sys_rf: nil)
858
+ clg_eqpt = create_zone_clg_eqpt(model, zone_clg_eqpt_type)
859
+ htg_eqpt = create_zone_htg_eqpt(model, zone_htg_eqpt_type)
860
+ supp_htg_eqpt = create_zone_htg_eqpt(model, zone_supp_htg_eqpt_type)
861
+ fan = create_air_sys_fan(model, zone_fan_type)
862
+ # for container zonal equipment call method "create_zone_container_equipment"
863
+ this_is_container_comp = false
864
+ if (zone_htg_eqpt_type == 'pthp') || (zone_htg_eqpt_type == 'vrf') ||
865
+ (zone_htg_eqpt_type.include? 'unitheater') || (zone_htg_eqpt_type.include? 'ptac')
866
+ this_is_container_comp = true
867
+ zone_cont_eqpt = create_zone_container_eqpt(model: model,
868
+ zone_cont_eqpt_type: zone_htg_eqpt_type,
869
+ zone_htg_eqpt: htg_eqpt,
870
+ zone_supp_htg_eqpt: supp_htg_eqpt,
871
+ zone_clg_eqpt: clg_eqpt,
872
+ zone_fan: fan)
873
+ end
874
+ if zone_cont_eqpt
875
+ zone_cont_eqpt.addToThermalZone(zone)
876
+ outdoor_unit.addTerminal(zone_cont_eqpt) if outdoor_unit
877
+ elsif htg_eqpt && !this_is_container_comp
878
+ htg_eqpt.addToThermalZone(zone)
879
+ end
880
+ end
881
+ sys_name_zone_htg_eqpt_type = zone_htg_eqpt_type
882
+ sys_name_zone_htg_eqpt_type = 'b-e' if zone_htg_eqpt_type == 'baseboard_electric' || zone_htg_eqpt_type == 'ptac_electric_off'
883
+ sys_name_zone_clg_eqpt_type = zone_clg_eqpt_type
884
+ sys_name_zone_clg_eqpt_type = 'ptac' if zone_clg_eqpt_type == 'ptac_electric_off'
885
+ update_sys_name(airloop, zone_htg: sys_name_zone_htg_eqpt_type, zone_clg: sys_name_zone_clg_eqpt_type) if zone_diffuser_type
886
+ end
887
+
888
+ # =============================================================================================================================
889
+ # Set assumptions for type of components for air system based on the number of zones served by the system and whether it's
890
+ # a mixed or doas.
891
+ def air_sys_comps_assumptions(sys_name:,
892
+ zones:,
893
+ system_doas_flags:)
894
+
895
+ sys_info = {}
896
+ sys_info['sys_abbr'] = sys_name.split('|')[0]
897
+ sys_info['sys_vent_type'] = 'mixed'
898
+ sys_info['sys_vent_type'] = 'doas' if system_doas_flags[sys_name.to_s]
899
+ sys_info['sys_heat_rec_type'] = 'none'
900
+ sys_info['sys_htg_eqpt_type'] = 'coil_electric'
901
+ sys_info['sys_supp_htg_eqpt_type'] = 'none'
902
+ sys_info['sys_clg_eqpt_type'] = 'coil_dx'
903
+ if zones.size == 1
904
+ sys_info['sys_setpoint_mgr_type'] = 'single_zone_reheat'
905
+ sys_info['sys_setpoint_mgr_type'] = 'scheduled' if system_doas_flags[sys_name.to_s]
906
+ sys_info['sys_supp_fan_type'] = 'constant_volume'
907
+ sys_info['sys_ret_fan_type'] = 'none'
908
+ sys_info['zone_diffuser_type'] = 'single_duct_uncontrolled'
909
+ elsif zones.size > 1
910
+ if system_doas_flags[sys_name.to_s]
911
+ sys_info['sys_setpoint_mgr_type'] = 'scheduled'
912
+ sys_info['sys_supp_fan_type'] = 'constant_volume'
913
+ sys_info['sys_ret_fan_type'] = 'none'
914
+ sys_info['zone_diffuser_type'] = 'single_duct_uncontrolled'
915
+ else
916
+ sys_info['sys_setpoint_mgr_type'] = 'warmest'
917
+ sys_info['sys_supp_fan_type'] = 'variable_volume'
918
+ sys_info['sys_ret_fan_type'] = 'variable_volume'
919
+ sys_info['zone_diffuser_type'] = 'single_duct_vav_reheat'
920
+ end
921
+ end
922
+
923
+ return sys_info
924
+ end
925
+
926
+ # =============================================================================================================================
927
+ # Add equipment for ecm "hs09_ccashp_baseboard":
928
+ # -Constant-volume reheat system for single zone systems
929
+ # -VAV system with reheat for non DOAS multi-zone systems
930
+ # -Cold-climate air-source heat pump for heating and cooling with electric backup
931
+ # -Electric baseboards
932
+ def add_ecm_hs09_ccashp_baseboard(model:,
933
+ system_zones_map:, # hash of ailoop names as keys and array of zones as values
934
+ system_doas_flags:) # hash of system names as keys and flag for DOAS as values
935
+
936
+ systems = []
937
+ system_zones_map.sort.each do |sys_name, zones|
938
+ sys_info = air_sys_comps_assumptions(sys_name: sys_name,
939
+ zones: zones,
940
+ system_doas_flags: system_doas_flags)
941
+ # add air loop and its equipment
942
+ airloop, return_fan = add_air_system(
943
+ model: model,
944
+ zones: zones,
945
+ sys_abbr: sys_info['sys_abbr'],
946
+ sys_vent_type: sys_info['sys_vent_type'],
947
+ sys_heat_rec_type: sys_info['sys_heat_rec_type'],
948
+ sys_htg_eqpt_type: 'ccashp',
949
+ sys_supp_htg_eqpt_type: 'coil_electric',
950
+ sys_clg_eqpt_type: 'ccashp',
951
+ sys_supp_fan_type: sys_info['sys_supp_fan_type'],
952
+ sys_ret_fan_type: sys_info['sys_ret_fan_type'],
953
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
954
+ )
955
+ htg_dx_coils = model.getCoilHeatingDXVariableSpeeds
956
+ search_criteria = {}
957
+ search_criteria['name'] = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU',
958
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
959
+ heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
960
+ # This defrost curve has to be assigned here before sizing
961
+ if heat_defrost_eir_ft
962
+ htg_dx_coils.sort.each { |dxcoil| dxcoil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft) }
963
+ else
964
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{htg_dx_coils[0].name}, cannot find heat_defrost_eir_ft curve, will not be set.")
965
+ end
966
+ # add zone equipment and diffuser
967
+ zone_htg_eqpt_type = 'baseboard_electric'
968
+ zone_htg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
969
+ zone_clg_eqpt_type = 'none'
970
+ zone_clg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
971
+ zone_fan_type = 'none'
972
+ zone_fan_type = 'constant_volume' if sys_info['sys_vent_type'] == 'doas'
973
+ add_zone_eqpt(model: model,
974
+ airloop: airloop,
975
+ zones: zones,
976
+ outdoor_unit: nil,
977
+ zone_diffuser_type: sys_info['zone_diffuser_type'],
978
+ zone_htg_eqpt_type: zone_htg_eqpt_type,
979
+ zone_supp_htg_eqpt_type: 'none',
980
+ zone_clg_eqpt_type: zone_clg_eqpt_type,
981
+ zone_fan_type: zone_fan_type)
982
+ # for doas use baseboard electric as backup for PTAC units
983
+ if sys_info['sys_vent_type'] == 'doas'
984
+ add_zone_eqpt(model: model,
985
+ airloop: airloop,
986
+ zones: zones,
987
+ outdoor_unit: nil,
988
+ zone_diffuser_type: nil,
989
+ zone_htg_eqpt_type: 'baseboard_electric',
990
+ zone_supp_htg_eqpt_type: 'none',
991
+ zone_clg_eqpt_type: 'none',
992
+ zone_fan_type: 'none')
993
+ end
994
+ return_fan.addToNode(airloop.returnAirNode.get) if return_fan
521
995
  systems << airloop
522
996
  end
523
997
 
@@ -525,22 +999,22 @@ class ECMS
525
999
  end
526
1000
 
527
1001
  # =============================================================================================================================
528
- # Apply efficiencies and performance curves for ECM 'hs09_ccashpsys'
529
- def apply_efficiency_ecm_hs09_ccashpsys(model:,ecm_name:)
1002
+ # Apply efficiencies and performance curves for ECM "hs09_ccashp_baseboard"
1003
+ def apply_efficiency_ecm_hs09_ccashp_baseboard(model)
530
1004
  # fraction of electric backup heating coil capacity assigned to dx heating coil
531
1005
  fr_backup_coil_cap_as_dx_coil_cap = 0.5
532
- model.getAirLoopHVACs.each do |isys|
1006
+ model.getAirLoopHVACs.sort.each do |isys|
533
1007
  clg_dx_coil = nil
534
1008
  htg_dx_coil = nil
535
1009
  backup_coil = nil
536
1010
  fans = []
537
1011
  # Find the components on the air loop
538
- isys.supplyComponents.each do |icomp|
1012
+ isys.supplyComponents.sort.each do |icomp|
539
1013
  if icomp.to_CoilCoolingDXVariableSpeed.is_initialized
540
1014
  clg_dx_coil = icomp.to_CoilCoolingDXVariableSpeed.get
541
1015
  elsif icomp.to_CoilHeatingDXVariableSpeed.is_initialized
542
1016
  htg_dx_coil = icomp.to_CoilHeatingDXVariableSpeed.get
543
- elsif icomp.to_CoilHeatingElectric.is_initialized
1017
+ elsif icomp.to_CoilHeatingElectric.is_initialized
544
1018
  backup_coil = icomp.to_CoilHeatingElectric.get
545
1019
  elsif icomp.to_FanConstantVolume.is_initialized
546
1020
  fans << icomp.to_FanConstantVolume.get
@@ -549,32 +1023,474 @@ class ECMS
549
1023
  end
550
1024
  end
551
1025
  if clg_dx_coil && htg_dx_coil && backup_coil
552
- clg_dx_coil_cap = clg_dx_coil.autosizedGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.to_f
553
- htg_dx_coil_cap = htg_dx_coil.autosizedRatedHeatingCapacityAtSelectedNominalSpeedLevel.to_f
554
- backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
555
- fan_power = 0.0
556
- fans.each do |ifan|
557
- fan_power += ifan.pressureRise.to_f*ifan.autosizedMaximumFlowRate.to_f/ifan.fanEfficiency.to_f
1026
+ clg_dx_coil_init_name = get_hvac_comp_init_name(clg_dx_coil, false)
1027
+ clg_dx_coil.setName(clg_dx_coil_init_name)
1028
+ if clg_dx_coil.autosizedGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.is_initialized
1029
+ max_pd = 0.0
1030
+ supply_fan = nil
1031
+ fans.each do |fan|
1032
+ if fan.pressureRise.to_f > max_pd
1033
+ max_pd = fan.pressureRise.to_f
1034
+ supply_fan = fan # assume supply fan has higher pressure drop
1035
+ end
1036
+ end
1037
+ fan_power = supply_fan.autosizedMaximumFlowRate.to_f * max_pd / supply_fan.fanTotalEfficiency.to_f
1038
+ clg_dx_coil_cap = clg_dx_coil.autosizedGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.to_f *
1039
+ supply_fan.autosizedMaximumFlowRate.to_f / clg_dx_coil.autosizedRatedAirFlowRateAtSelectedNominalSpeedLevel.to_f +
1040
+ fan_power / clg_dx_coil.speeds.last.referenceUnitGrossRatedSensibleHeatRatio.to_f
1041
+ else
1042
+ clg_dx_coil_cap = clg_dx_coil.grossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel.to_f
558
1043
  end
1044
+ htg_dx_coil_init_name = get_hvac_comp_init_name(htg_dx_coil, false)
1045
+ htg_dx_coil.setName(htg_dx_coil_init_name)
1046
+ backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
559
1047
  # Set the DX capacities to the maximum of the fraction of the backup coil capacity or the cooling capacity needed
560
- dx_cap = fr_backup_coil_cap_as_dx_coil_cap*backup_coil_cap
561
- if dx_cap < (clg_dx_coil_cap+fan_power) then dx_cap = clg_dx_coil_cap+fan_power end
1048
+ dx_cap = fr_backup_coil_cap_as_dx_coil_cap * backup_coil_cap
1049
+ if dx_cap < clg_dx_coil_cap then dx_cap = clg_dx_coil_cap end
562
1050
  clg_dx_coil.setGrossRatedTotalCoolingCapacityAtSelectedNominalSpeedLevel(dx_cap)
563
1051
  htg_dx_coil.setRatedHeatingCapacityAtSelectedNominalSpeedLevel(dx_cap)
1052
+ # Assign performance curves and COPs
1053
+ eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
1054
+ coil_cooling_dx_variable_speed_apply_efficiency_and_curves(clg_dx_coil, eqpt_name)
1055
+ coil_heating_dx_variable_speed_apply_efficiency_and_curves(htg_dx_coil, eqpt_name)
564
1056
  end
565
1057
  end
566
- # Assign performance curves and COPs
567
- model.getCoilCoolingDXVariableSpeeds.sort.each {|coil| coil_cooling_dx_variable_speed_apply_efficiency_and_curves(coil,ecm_name)}
568
- model.getCoilHeatingDXVariableSpeeds.sort.each {|coil| coil_heating_dx_variable_speed_apply_efficiency_and_curves(coil,ecm_name)}
569
1058
  end
570
1059
 
571
1060
  # =============================================================================================================================
572
- # Applies the standard efficiency ratings and typical performance curves "CoilCoolingDXVariableSpeed" object.
573
- def coil_cooling_dx_variable_speed_apply_efficiency_and_curves(coil_cooling_dx_variable_speed,ecm_name)
1061
+ # Add equipment for ECM "hs11_ashp_pthp"
1062
+ # -Constant volume DOAS with air-source heat pump for heating and cooling and electric backup
1063
+ # -Packaged-Terminal air-source heat pumps with electric backup
1064
+ def add_ecm_hs11_ashp_pthp(model:,
1065
+ system_zones_map:,
1066
+ system_doas_flags:)
1067
+
1068
+ # Update system doas flags
1069
+ system_doas_flags.keys.each { |sname| system_doas_flags[sname] = true }
1070
+ # use system zones map and generate new air system and zonal equipment
1071
+ systems = []
1072
+ system_zones_map.sort.each do |sys_name, zones|
1073
+ sys_info = air_sys_comps_assumptions(sys_name: sys_name,
1074
+ zones: zones,
1075
+ system_doas_flags: system_doas_flags)
1076
+ airloop, return_fan = add_air_system(model: model,
1077
+ zones: zones,
1078
+ sys_abbr: sys_info['sys_abbr'],
1079
+ sys_vent_type: sys_info['sys_vent_type'],
1080
+ sys_heat_rec_type: sys_info['sys_heat_rec_type'],
1081
+ sys_htg_eqpt_type: 'ashp',
1082
+ sys_supp_htg_eqpt_type: 'coil_electric',
1083
+ sys_clg_eqpt_type: 'ashp',
1084
+ sys_supp_fan_type: sys_info['sys_supp_fan_type'],
1085
+ sys_ret_fan_type: sys_info['sys_ret_fan_type'],
1086
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
1087
+ # Get and assign defrost performance curve
1088
+ search_criteria = {}
1089
+ search_criteria['name'] = 'HS11_PTHP'
1090
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
1091
+ heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
1092
+ if !heat_defrost_eir_ft
1093
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXConstantSpeed', 'Cannot find heat_defrost_eir_ft curve, will not be set.')
1094
+ end
1095
+ airloop.supplyComponents.each do |comp|
1096
+ if comp.to_CoilHeatingDXSingleSpeed.is_initialized
1097
+ htg_coil = comp.to_CoilHeatingDXSingleSpeed.get
1098
+ htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
1099
+ end
1100
+ end
1101
+ # add zone equipment and diffuser
1102
+ zone_htg_eqpt_type = 'pthp'
1103
+ zone_clg_eqpt_type = 'pthp'
1104
+ zone_supp_htg_eqpt_type = 'coil_electric'
1105
+ zone_fan_type = 'on_off'
1106
+ add_zone_eqpt(model: model,
1107
+ airloop: airloop,
1108
+ zones: zones,
1109
+ outdoor_unit: nil,
1110
+ zone_diffuser_type: sys_info['zone_diffuser_type'],
1111
+ zone_htg_eqpt_type: zone_htg_eqpt_type,
1112
+ zone_supp_htg_eqpt_type: zone_supp_htg_eqpt_type,
1113
+ zone_clg_eqpt_type: zone_clg_eqpt_type,
1114
+ zone_fan_type: zone_fan_type)
1115
+ zones.each do |zone|
1116
+ zone.equipment.each do |comp|
1117
+ if comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
1118
+ if comp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.is_initialized
1119
+ htg_coil = comp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.get
1120
+ htg_coil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft)
1121
+ end
1122
+ end
1123
+ end
1124
+ end
1125
+ return_fan.addToNode(airloop.returnAirNode.get) if return_fan
1126
+ systems << airloop
1127
+ end
1128
+
1129
+ return systems
1130
+ end
1131
+
1132
+ # =============================================================================================================================
1133
+ # Apply efficiencies and performance curves for ECM "hs11_ashp_pthp"
1134
+ def apply_efficiency_ecm_hs11_ashp_pthp(model)
1135
+ fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric backup heating coil capacity assigned to dx heating coil
1136
+ apply_efficiency_ecm_hs12_ashp_baseboard(model)
1137
+ pthp_eqpt_name = 'HS11_PTHP'
1138
+ model.getAirLoopHVACs.sort.each do |isys|
1139
+ isys.thermalZones.each do |zone|
1140
+ clg_dx_coil = nil
1141
+ htg_dx_coil = nil
1142
+ backup_coil = nil
1143
+ fan = nil
1144
+ zone.equipment.sort.each do |icomp|
1145
+ if icomp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
1146
+ if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil.to_CoilCoolingDXSingleSpeed.is_initialized
1147
+ clg_dx_coil = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil.to_CoilCoolingDXSingleSpeed.get
1148
+ end
1149
+ if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.is_initialized
1150
+ htg_dx_coil = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.heatingCoil.to_CoilHeatingDXSingleSpeed.get
1151
+ end
1152
+ if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplementalHeatingCoil.to_CoilHeatingElectric.is_initialized
1153
+ backup_coil = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplementalHeatingCoil.to_CoilHeatingElectric.get
1154
+ end
1155
+ if icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplyAirFan.to_FanOnOff.is_initialized
1156
+ fan = icomp.to_ZoneHVACPackagedTerminalHeatPump.get.supplyAirFan.to_FanOnOff.get
1157
+ end
1158
+ end
1159
+ if clg_dx_coil && htg_dx_coil && backup_coil && fan
1160
+ clg_dx_coil_init_name = get_hvac_comp_init_name(clg_dx_coil, false)
1161
+ clg_dx_coil.setName(clg_dx_coil_init_name)
1162
+ if clg_dx_coil.autosizedRatedTotalCoolingCapacity.is_initialized
1163
+ clg_dx_coil_cap = clg_dx_coil.autosizedRatedTotalCoolingCapacity.to_f
1164
+ else
1165
+ clg_dx_coil_cap = clg_dx_coil.ratedTotalCoolingCapacity.to_f
1166
+ end
1167
+ htg_dx_coil_init_name = get_hvac_comp_init_name(htg_dx_coil, true)
1168
+ htg_dx_coil.setName(htg_dx_coil_init_name)
1169
+ backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
1170
+ # Set the DX capacities to the maximum of the fraction of the backup coil capacity or the cooling capacity needed
1171
+ dx_cap = fr_backup_coil_cap_as_dx_coil_cap * backup_coil_cap
1172
+ if dx_cap < clg_dx_coil_cap then dx_cap = clg_dx_coil_cap end
1173
+ # clg_dx_coil.setRatedTotalCoolingCapacity(dx_cap)
1174
+ # htg_dx_coil.setRatedTotalHeatingCapacity(dx_cap)
1175
+ # assign performance curves and COPs
1176
+ coil_cooling_dx_single_speed_apply_efficiency_and_curves(clg_dx_coil, pthp_eqpt_name)
1177
+ coil_heating_dx_single_speed_apply_efficiency_and_curves(htg_dx_coil, pthp_eqpt_name)
1178
+ # Set fan power
1179
+ fan_power_per_flow_rate = 150.0 # based on Mitsubishi data: 100 low and 200 high (W-s/m3)
1180
+ fan_pr_rise = fan_power_per_flow_rate * (fan.fanEfficiency * fan.motorEfficiency)
1181
+ fan.setPressureRise(fan_pr_rise)
1182
+ end
1183
+ end
1184
+ end
1185
+ end
1186
+ end
1187
+
1188
+ # =============================================================================================================================
1189
+ # Add equipment for ecm "hs12_ashp_baseboard":
1190
+ # -Constant-volume reheat system for single zone systems
1191
+ # -VAV system with reheat for non DOAS multi-zone systems
1192
+ # -Air-source heat pump for heating and cooling with electric backup
1193
+ # -Electric baseboards
1194
+ def add_ecm_hs12_ashp_baseboard(model:,
1195
+ system_zones_map:,
1196
+ system_doas_flags:)
1197
+
1198
+ systems = []
1199
+ system_zones_map.sort.each do |sys_name, zones|
1200
+ sys_info = air_sys_comps_assumptions(sys_name: sys_name,
1201
+ zones: zones,
1202
+ system_doas_flags: system_doas_flags)
1203
+ # add air loop and its equipment
1204
+ airloop, return_fan = add_air_system(model: model,
1205
+ zones: zones,
1206
+ sys_abbr: sys_info['sys_abbr'],
1207
+ sys_vent_type: sys_info['sys_vent_type'],
1208
+ sys_heat_rec_type: sys_info['sys_heat_rec_type'],
1209
+ sys_htg_eqpt_type: 'ashp',
1210
+ sys_supp_htg_eqpt_type: 'coil_electric',
1211
+ sys_clg_eqpt_type: 'ashp',
1212
+ sys_supp_fan_type: sys_info['sys_supp_fan_type'],
1213
+ sys_ret_fan_type: sys_info['sys_ret_fan_type'],
1214
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
1215
+ # get and assign defrost curve
1216
+ htg_dx_coils = model.getCoilHeatingDXSingleSpeeds
1217
+ search_criteria = {}
1218
+ search_criteria['name'] = 'NECB2015_ASHP'
1219
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, 1.0)
1220
+ heat_defrost_eir_ft = model_add_curve(model, props['heat_defrost_eir_ft'])
1221
+ if heat_defrost_eir_ft
1222
+ htg_dx_coils.sort.each { |dxcoil| dxcoil.setDefrostEnergyInputRatioFunctionofTemperatureCurve(heat_defrost_eir_ft) }
1223
+ else
1224
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{htg_dx_coils[0].name}, cannot find heat_defrost_eir_ft curve, will not be set.")
1225
+ end
1226
+ # add zone equipment and diffuser
1227
+ zone_htg_eqpt_type = 'baseboard_electric'
1228
+ zone_htg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
1229
+ zone_clg_eqpt_type = 'none'
1230
+ zone_clg_eqpt_type = 'ptac_electric_off' if sys_info['sys_vent_type'] == 'doas'
1231
+ zone_fan_type = 'none'
1232
+ zone_fan_type = 'constant_volume' if sys_info['sys_vent_type'] == 'doas'
1233
+ add_zone_eqpt(model: model,
1234
+ airloop: airloop,
1235
+ zones: zones,
1236
+ outdoor_unit: nil,
1237
+ zone_diffuser_type: sys_info['zone_diffuser_type'],
1238
+ zone_htg_eqpt_type: zone_htg_eqpt_type,
1239
+ zone_supp_htg_eqpt_type: 'none',
1240
+ zone_clg_eqpt_type: zone_clg_eqpt_type,
1241
+ zone_fan_type: zone_fan_type)
1242
+ # for doas use baseboard electric as backup for PTAC units
1243
+ if sys_info['sys_vent_type'] == 'doas'
1244
+ add_zone_eqpt(model: model,
1245
+ airloop: airloop,
1246
+ zones: zones,
1247
+ outdoor_unit: nil,
1248
+ zone_diffuser_type: nil,
1249
+ zone_htg_eqpt_type: 'baseboard_electric',
1250
+ zone_supp_htg_eqpt_type: 'none',
1251
+ zone_clg_eqpt_type: 'none',
1252
+ zone_fan_type: 'none')
1253
+ end
1254
+ return_fan.addToNode(airloop.returnAirNode.get) if return_fan
1255
+ systems << airloop
1256
+ end
1257
+
1258
+ return systems
1259
+ end
1260
+
1261
+ # =============================================================================================================================
1262
+ # Name of HVAC component might have been updated by standards methods for setting efficiency. Here original name of the component
1263
+ # is restored.
1264
+ def get_hvac_comp_init_name(obj, htg_flag)
1265
+ return obj.name.to_s if obj.name.to_s.split.size <= 2
1266
+
1267
+ init_name = obj.name.to_s.split[0]
1268
+ range = obj.name.to_s.split.size - 3
1269
+ range = obj.name.to_s.split.size - 5 if htg_flag
1270
+ for i in 1..range
1271
+ init_name += " #{obj.name.to_s.split[i]}"
1272
+ end
1273
+ return init_name
1274
+ end
1275
+
1276
+ # =============================================================================================================================
1277
+ # Apply efficiencies and performance curves for ECM "hs12_ashp_baseboard"
1278
+ def apply_efficiency_ecm_hs12_ashp_baseboard(model)
1279
+ fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric backup heating coil capacity assigned to dx heating coil
1280
+ ashp_eqpt_name = 'NECB2015_ASHP'
1281
+ model.getAirLoopHVACs.sort.each do |isys|
1282
+ clg_dx_coil = nil
1283
+ htg_dx_coil = nil
1284
+ backup_coil = nil
1285
+ # Find the coils on the air loop
1286
+ isys.supplyComponents.sort.each do |icomp|
1287
+ if icomp.to_CoilCoolingDXSingleSpeed.is_initialized
1288
+ clg_dx_coil = icomp.to_CoilCoolingDXSingleSpeed.get
1289
+ elsif icomp.to_CoilHeatingDXSingleSpeed.is_initialized
1290
+ htg_dx_coil = icomp.to_CoilHeatingDXSingleSpeed.get
1291
+ elsif icomp.to_CoilHeatingElectric.is_initialized
1292
+ backup_coil = icomp.to_CoilHeatingElectric.get
1293
+ end
1294
+ end
1295
+ if clg_dx_coil && htg_dx_coil && backup_coil
1296
+ # update names of dx coils
1297
+ clg_dx_coil_init_name = get_hvac_comp_init_name(clg_dx_coil, false)
1298
+ clg_dx_coil.setName(clg_dx_coil_init_name)
1299
+ if clg_dx_coil.autosizedRatedTotalCoolingCapacity.is_initialized
1300
+ clg_dx_coil_cap = clg_dx_coil.autosizedRatedTotalCoolingCapacity.to_f
1301
+ else
1302
+ clg_dx_coil_cap = clg_dx_coil.ratedTotalCoolingCapacity.to_f
1303
+ end
1304
+ htg_dx_coil_init_name = get_hvac_comp_init_name(htg_dx_coil, true)
1305
+ htg_dx_coil.setName(htg_dx_coil_init_name)
1306
+ backup_coil_cap = backup_coil.autosizedNominalCapacity.to_f
1307
+ # set the DX capacities to the maximum of the fraction of the backup coil capacity or the cooling capacity needed
1308
+ dx_cap = fr_backup_coil_cap_as_dx_coil_cap * backup_coil_cap
1309
+ if dx_cap < clg_dx_coil_cap then dx_cap = clg_dx_coil_cap end
1310
+ clg_dx_coil.setRatedTotalCoolingCapacity(dx_cap)
1311
+ htg_dx_coil.setRatedTotalHeatingCapacity(dx_cap)
1312
+ # assign performance curves and COPs
1313
+ coil_cooling_dx_single_speed_apply_efficiency_and_curves(clg_dx_coil, ashp_eqpt_name)
1314
+ coil_heating_dx_single_speed_apply_efficiency_and_curves(htg_dx_coil, ashp_eqpt_name)
1315
+ end
1316
+ end
1317
+ end
1318
+
1319
+ # =============================================================================================================================
1320
+ # Add equipment for ecm "hs13_ashp_vrf":
1321
+ # -Constant-volume dedicated-outside air system
1322
+ # -Air-source heat pump for heating and cooling with electric backup
1323
+ # -Zonal VRF terminal units for heating and cooling with electric baseboards
1324
+ def add_ecm_hs13_ashp_vrf(model:,
1325
+ system_zones_map:,
1326
+ system_doas_flags:)
1327
+ # call method for ECM hs08 with ASHP in the air system
1328
+ add_ecm_hs08_ccashp_vrf(model: model,
1329
+ system_zones_map: system_zones_map,
1330
+ system_doas_flags: system_doas_flags,
1331
+ air_sys_eqpt_type: 'ashp')
1332
+ end
1333
+
1334
+ # =============================================================================================================================
1335
+ # Apply efficiencies and performance curves for ECM "hs12_ashp_vrf"
1336
+ def apply_efficiency_ecm_hs13_ashp_vrf(model)
1337
+ # call method for ECM hs08 with ASHP in air system
1338
+ apply_efficiency_ecm_hs08_ccashp_vrf(model, air_sys_eqpt_type: 'ashp')
1339
+ end
1340
+
1341
+ # =============================================================================================================================
1342
+ # Applies the standard efficiency ratings and typical performance curves "CoilCoolingDXSingleSpeed" object.
1343
+ def coil_cooling_dx_single_speed_apply_efficiency_and_curves(coil_cooling_dx_single_speed, eqpt_name)
1344
+ successfully_set_all_properties = true
1345
+
1346
+ search_criteria = {}
1347
+ search_criteria['name'] = eqpt_name
1348
+
1349
+ # Get the capacity
1350
+ capacity_w = coil_cooling_dx_single_speed_find_capacity(coil_cooling_dx_single_speed)
1351
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1352
+
1353
+ # Lookup efficiencies
1354
+ ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
1355
+
1356
+ # Check to make sure properties were found
1357
+ if ac_props.nil?
1358
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency.")
1359
+ successfully_set_all_properties = false
1360
+ end
1361
+
1362
+ # Make the COOL-CAP-FT curve
1363
+ cool_cap_ft = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_cap_ft'])
1364
+
1365
+ if cool_cap_ft
1366
+ coil_cooling_dx_single_speed.setTotalCoolingCapacityFunctionOfTemperatureCurve(cool_cap_ft)
1367
+ else
1368
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_cap_ft curve, will not be set.")
1369
+ successfully_set_all_properties = false
1370
+ end
1371
+
1372
+ # Make the COOL-CAP-FFLOW curve
1373
+ cool_cap_fflow = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_cap_fflow'])
1374
+ if cool_cap_fflow
1375
+ coil_cooling_dx_single_speed.setTotalCoolingCapacityFunctionOfFlowFractionCurve(cool_cap_fflow)
1376
+ else
1377
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_cap_fflow curve, will not be set.")
1378
+ successfully_set_all_properties = false
1379
+ end
1380
+
1381
+ # Make the COOL-EIR-FT curve
1382
+ cool_eir_ft = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_eir_ft'])
1383
+ if cool_eir_ft
1384
+ coil_cooling_dx_single_speed.setEnergyInputRatioFunctionOfTemperatureCurve(cool_eir_ft)
1385
+ else
1386
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_eir_ft curve, will not be set.")
1387
+ successfully_set_all_properties = false
1388
+ end
1389
+
1390
+ # Make the COOL-EIR-FFLOW curve
1391
+ cool_eir_fflow = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_eir_fflow'])
1392
+ if cool_eir_fflow
1393
+ coil_cooling_dx_single_speed.setEnergyInputRatioFunctionOfFlowFractionCurve(cool_eir_fflow)
1394
+ else
1395
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find cool_eir_fflow curve, will not be set.")
1396
+ successfully_set_all_properties = false
1397
+ end
1398
+
1399
+ # Make the COOL-PLF-FPLR curve
1400
+ cool_plf_fplr = model_add_curve(coil_cooling_dx_single_speed.model, ac_props['cool_plf_fplr'])
1401
+ if cool_plf_fplr
1402
+ coil_cooling_dx_single_speed.setPartLoadFractionCorrelationCurve(cool_plf_fplr)
1403
+ else
1404
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_Single_speed.name}, cannot find cool_plf_fplr curve, will not be set.")
1405
+ successfully_set_all_properties = false
1406
+ end
1407
+
1408
+ # Find the minimum COP and rename with efficiency rating
1409
+ cop = coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_speed, search_criteria, false)
1410
+
1411
+ # Set the efficiency values
1412
+ coil_cooling_dx_single_speed.setRatedCOP(cop.to_f) unless cop.nil?
1413
+ end
1414
+
1415
+ # =============================================================================================================================
1416
+ # Applies the standard efficiency ratings and typical performance curves to "CoilHeatingSingleSpeed" object.
1417
+ def coil_heating_dx_single_speed_apply_efficiency_and_curves(coil_heating_dx_single_speed, eqpt_name)
574
1418
  successfully_set_all_properties = true
575
1419
 
576
1420
  # Get the search criteria
577
- search_criteria = coil_dx_find_search_criteria(coil_cooling_dx_variable_speed)
1421
+ search_criteria = {}
1422
+ search_criteria['name'] = eqpt_name
1423
+
1424
+ # Get the capacity
1425
+ capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed)
1426
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1427
+ capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1428
+
1429
+ # Lookup efficiencies
1430
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, capacity_btu_per_hr)
1431
+
1432
+ # Check to make sure properties were found
1433
+ if props.nil?
1434
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
1435
+ successfully_set_all_properties = false
1436
+ end
1437
+
1438
+ # Make the HEAT-CAP-FT curve
1439
+ heat_cap_ft = model_add_curve(coil_heating_dx_single_speed.model, props['heat_cap_ft'])
1440
+ if heat_cap_ft
1441
+ coil_heating_dx_single_speed.setTotalHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft)
1442
+ else
1443
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_cap_ft curve, will not be set.")
1444
+ successfully_set_all_properties = false
1445
+ end
1446
+
1447
+ # Make the HEAT-CAP-FFLOW curve
1448
+ heat_cap_fflow = model_add_curve(coil_heating_dx_single_speed.model, props['heat_cap_fflow'])
1449
+ if heat_cap_fflow
1450
+ coil_heating_dx_single_speed.setTotalHeatingCapacityFunctionofFlowFractionCurve(heat_cap_fflow)
1451
+ else
1452
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_cap_fflow curve, will not be set.")
1453
+ successfully_set_all_properties = false
1454
+ end
1455
+
1456
+ # Make the HEAT-EIR-FT curve
1457
+ heat_eir_ft = model_add_curve(coil_heating_dx_single_speed.model, props['heat_eir_ft'])
1458
+ if heat_eir_ft
1459
+ coil_heating_dx_single_speed.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft)
1460
+ else
1461
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_eir_ft curve, will not be set.")
1462
+ successfully_set_all_properties = false
1463
+ end
1464
+
1465
+ # Make the HEAT-EIR-FFLOW curve
1466
+ heat_eir_fflow = model_add_curve(coil_heating_dx_single_speed.model, props['heat_eir_fflow'])
1467
+ if heat_eir_fflow
1468
+ coil_heating_dx_single_speed.setEnergyInputRatioFunctionofFlowFractionCurve(heat_eir_fflow)
1469
+ else
1470
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_eir_fflow curve, will not be set.")
1471
+ successfully_set_all_properties = false
1472
+ end
1473
+
1474
+ # Make the HEAT-PLF-FPLR curve
1475
+ heat_plf_fplr = model_add_curve(coil_heating_dx_single_speed.model, props['heat_plf_fplr'])
1476
+ if heat_plf_fplr
1477
+ coil_heating_dx_single_speed.setPartLoadFractionCorrelationCurve(heat_plf_fplr)
1478
+ else
1479
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find heat_plf_fplr curve, will not be set.")
1480
+ successfully_set_all_properties = false
1481
+ end
1482
+
1483
+ # Find the minimum COP and rename with efficiency rating
1484
+ cop = coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, search_criteria, false)
1485
+
1486
+ # Set the efficiency values
1487
+ coil_heating_dx_single_speed.setRatedCOP(cop.to_f) unless cop.nil?
1488
+ end
1489
+
1490
+ # =============================================================================================================================
1491
+ # Applies the standard efficiency ratings and typical performance curves "CoilCoolingDXVariableSpeed" object.
1492
+ def coil_cooling_dx_variable_speed_apply_efficiency_and_curves(coil_cooling_dx_variable_speed, eqpt_name)
1493
+ successfully_set_all_properties = true
578
1494
 
579
1495
  # Get the capacity
580
1496
  capacity_w = coil_cooling_dx_variable_speed_find_capacity(coil_cooling_dx_variable_speed)
@@ -582,11 +1498,9 @@ class ECMS
582
1498
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
583
1499
 
584
1500
  # Lookup efficiencies depending on whether it is a unitary AC or a heat pump
585
- ac_props = if coil_dx_heat_pump?(coil_cooling_dx_variable_speed)
586
- model_find_object(standards_data['tables']["heat_pumps_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
587
- else
588
- model_find_object(standards_data['tables']["unitary_acs_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
589
- end
1501
+ search_criteria = {}
1502
+ search_criteria['name'] = eqpt_name
1503
+ ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
590
1504
 
591
1505
  # Check to make sure properties were found
592
1506
  if ac_props.nil?
@@ -597,7 +1511,7 @@ class ECMS
597
1511
  # Make the COOL-CAP-FT curve
598
1512
  cool_cap_ft = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_cap_ft'])
599
1513
  if cool_cap_ft
600
- coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft)}
1514
+ coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft) }
601
1515
  else
602
1516
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_cap_ft curve, will not be set.")
603
1517
  successfully_set_all_properties = false
@@ -606,7 +1520,7 @@ class ECMS
606
1520
  # Make the COOL-CAP-FFLOW curve
607
1521
  cool_cap_fflow = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_cap_fflow'])
608
1522
  if cool_cap_fflow
609
- coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setTotalCoolingCapacityFunctionofAirFlowFractionCurve(cool_cap_fflow)}
1523
+ coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setTotalCoolingCapacityFunctionofAirFlowFractionCurve(cool_cap_fflow) }
610
1524
  else
611
1525
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standard.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_cap_fflow curve, will not be set.")
612
1526
  successfully_set_all_properties = false
@@ -615,7 +1529,7 @@ class ECMS
615
1529
  # Make the COOL-EIR-FT curve
616
1530
  cool_eir_ft = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_eir_ft'])
617
1531
  if cool_eir_ft
618
- coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(cool_eir_ft)}
1532
+ coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(cool_eir_ft) }
619
1533
  else
620
1534
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_eir_ft curve, will not be set.")
621
1535
  successfully_set_all_properties = false
@@ -624,7 +1538,7 @@ class ECMS
624
1538
  # Make the COOL-EIR-FFLOW curve
625
1539
  cool_eir_fflow = model_add_curve(coil_cooling_dx_variable_speed.model, ac_props['cool_eir_fflow'])
626
1540
  if cool_eir_fflow
627
- coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(cool_eir_fflow)}
1541
+ coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(cool_eir_fflow) }
628
1542
  else
629
1543
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{coil_cooling_dx_variable_speed.name}, cannot find cool_eir_fflow curve, will not be set.")
630
1544
  successfully_set_all_properties = false
@@ -640,22 +1554,20 @@ class ECMS
640
1554
  end
641
1555
 
642
1556
  # Find the minimum COP and rename with efficiency rating
643
- cop = coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed, true,ecm_name)
1557
+ cop = coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed, search_criteria, false)
644
1558
 
645
1559
  # Set the efficiency values
646
- unless cop.nil?
647
- coil_cooling_dx_variable_speed.speeds.each {|speed| speed.setReferenceUnitGrossRatedCoolingCOP(cop.to_f)}
648
- end
649
-
1560
+ coil_cooling_dx_variable_speed.speeds.each { |speed| speed.setReferenceUnitGrossRatedCoolingCOP(cop.to_f) } unless cop.nil?
650
1561
  end
651
1562
 
652
1563
  # =============================================================================================================================
653
1564
  # Applies the standard efficiency ratings and typical performance curves to "CoilHeatingVariableSpeed" object.
654
- def coil_heating_dx_variable_speed_apply_efficiency_and_curves(coil_heating_dx_variable_speed,ecm_name)
1565
+ def coil_heating_dx_variable_speed_apply_efficiency_and_curves(coil_heating_dx_variable_speed, eqpt_name)
655
1566
  successfully_set_all_properties = true
656
1567
 
657
1568
  # Get the search criteria
658
- search_criteria = coil_dx_find_search_criteria(coil_heating_dx_variable_speed)
1569
+ search_criteria = {}
1570
+ search_criteria['name'] = eqpt_name
659
1571
 
660
1572
  # Get the capacity
661
1573
  capacity_w = coil_heating_dx_variable_speed_find_capacity(coil_heating_dx_variable_speed)
@@ -663,18 +1575,18 @@ class ECMS
663
1575
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
664
1576
 
665
1577
  # Lookup efficiencies
666
- props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
1578
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, capacity_btu_per_hr)
667
1579
 
668
1580
  # Check to make sure properties were found
669
1581
  if props.nil?
670
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
1582
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
671
1583
  successfully_set_all_properties = false
672
1584
  end
673
1585
 
674
1586
  # Make the HEAT-CAP-FT curve
675
1587
  heat_cap_ft = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_cap_ft'])
676
1588
  if heat_cap_ft
677
- coil_heating_dx_variable_speed.speeds.each {|speed| speed.setHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft)}
1589
+ coil_heating_dx_variable_speed.speeds.each { |speed| speed.setHeatingCapacityFunctionofTemperatureCurve(heat_cap_ft) }
678
1590
  else
679
1591
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_cap_ft curve, will not be set.")
680
1592
  successfully_set_all_properties = false
@@ -683,7 +1595,7 @@ class ECMS
683
1595
  # Make the HEAT-CAP-FFLOW curve
684
1596
  heat_cap_fflow = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_cap_fflow'])
685
1597
  if heat_cap_fflow
686
- coil_heating_dx_variable_speed.speeds.each {|speed| speed.setTotalHeatingCapacityFunctionofAirFlowFractionCurve(heat_cap_fflow)}
1598
+ coil_heating_dx_variable_speed.speeds.each { |speed| speed.setTotalHeatingCapacityFunctionofAirFlowFractionCurve(heat_cap_fflow) }
687
1599
  else
688
1600
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_cap_fflow curve, will not be set.")
689
1601
  successfully_set_all_properties = false
@@ -692,7 +1604,7 @@ class ECMS
692
1604
  # Make the HEAT-EIR-FT curve
693
1605
  heat_eir_ft = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_eir_ft'])
694
1606
  if heat_eir_ft
695
- coil_heating_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft)}
1607
+ coil_heating_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofTemperatureCurve(heat_eir_ft) }
696
1608
  else
697
1609
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSingleSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_eir_ft curve, will not be set.")
698
1610
  successfully_set_all_properties = false
@@ -701,7 +1613,7 @@ class ECMS
701
1613
  # Make the HEAT-EIR-FFLOW curve
702
1614
  heat_eir_fflow = model_add_curve(coil_heating_dx_variable_speed.model, props['heat_eir_fflow'])
703
1615
  if heat_eir_fflow
704
- coil_heating_dx_variable_speed.speeds.each {|speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(heat_eir_fflow)}
1616
+ coil_heating_dx_variable_speed.speeds.each { |speed| speed.setEnergyInputRatioFunctionofAirFlowFractionCurve(heat_eir_fflow) }
705
1617
  else
706
1618
  OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{coil_heating_dx_variable_speed.name}, cannot find heat_eir_fflow curve, will not be set.")
707
1619
  successfully_set_all_properties = false
@@ -717,22 +1629,19 @@ class ECMS
717
1629
  end
718
1630
 
719
1631
  # Find the minimum COP and rename with efficiency rating
720
- cop = coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed, true,ecm_name)
1632
+ cop = coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed, search_criteria, false)
721
1633
 
722
1634
  # Set the efficiency values
723
- unless cop.nil?
724
- coil_heating_dx_variable_speed.speeds.each {|speed| speed.setReferenceUnitGrossRatedHeatingCOP(cop.to_f)}
725
- end
726
-
1635
+ coil_heating_dx_variable_speed.speeds.each { |speed| speed.setReferenceUnitGrossRatedHeatingCOP(cop.to_f) } unless cop.nil?
727
1636
  end
728
1637
 
729
1638
  # =============================================================================================================================
730
1639
  # Applies the standard cooling efficiency ratings and typical performance curves to "AirConditionerVariableRefrigerantFlow" object.
731
- def airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow,ecm_name)
1640
+ def airconditioner_variablerefrigerantflow_cooling_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow, eqpt_name)
732
1641
  successfully_set_all_properties = true
733
1642
 
734
- # Get the search criteria
735
- search_criteria = coil_dx_find_search_criteria(airconditioner_variablerefrigerantflow)
1643
+ search_criteria = {}
1644
+ search_criteria['name'] = eqpt_name
736
1645
 
737
1646
  # Get the capacity
738
1647
  capacity_w = airconditioner_variablerefrigerantflow_cooling_find_capacity(airconditioner_variablerefrigerantflow)
@@ -740,7 +1649,7 @@ class ECMS
740
1649
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
741
1650
 
742
1651
  # Lookup efficiencies
743
- props = model_find_object(standards_data['tables']["heat_pumps_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
1652
+ props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
744
1653
 
745
1654
  # Check to make sure properties were found
746
1655
  if props.nil?
@@ -857,22 +1766,19 @@ class ECMS
857
1766
  end
858
1767
 
859
1768
  # Find the minimum COP
860
- cop = airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow, false, ecm_name)
1769
+ cop = airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow, search_criteria, false)
861
1770
 
862
1771
  # Set the efficiency values
863
- unless cop.nil?
864
- airconditioner_variablerefrigerantflow.setRatedCoolingCOP(cop.to_f)
865
- end
866
-
1772
+ airconditioner_variablerefrigerantflow.setRatedCoolingCOP(cop.to_f) unless cop.nil?
867
1773
  end
868
1774
 
869
1775
  # =============================================================================================================================
870
1776
  # Applies the standard heating efficiency ratings and typical performance curves to "AirConditionerVariableRefrigerantFlow" object.
871
- def airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow,ecm_name)
1777
+ def airconditioner_variablerefrigerantflow_heating_apply_efficiency_and_curves(airconditioner_variablerefrigerantflow, eqpt_name)
872
1778
  successfully_set_all_properties = true
873
1779
 
874
- # Get the search criteria
875
- search_criteria = coil_dx_find_search_criteria(airconditioner_variablerefrigerantflow)
1780
+ search_criteria = {}
1781
+ search_criteria['name'] = eqpt_name
876
1782
 
877
1783
  # Get the capacity
878
1784
  capacity_w = airconditioner_variablerefrigerantflow_heating_find_capacity(airconditioner_variablerefrigerantflow)
@@ -880,7 +1786,7 @@ class ECMS
880
1786
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
881
1787
 
882
1788
  # Lookup efficiencies
883
- props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
1789
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm']['table'], search_criteria, capacity_btu_per_hr)
884
1790
 
885
1791
  # Check to make sure properties were found
886
1792
  if props.nil?
@@ -988,32 +1894,156 @@ class ECMS
988
1894
  end
989
1895
 
990
1896
  # Find the minimum COP and rename with efficiency rating
991
- cop = airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow, true, ecm_name)
1897
+ cop = airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow, search_criteria, false)
992
1898
 
993
1899
  # Set the efficiency values
994
- unless cop.nil?
995
- airconditioner_variablerefrigerantflow.setRatedHeatingCOP(cop.to_f)
1900
+ airconditioner_variablerefrigerantflow.setRatedHeatingCOP(cop.to_f) unless cop.nil?
1901
+ end
1902
+
1903
+ # =============================================================================================================================
1904
+ # Find minimum efficiency for "CoilCoolingDXSingleSpeed" object
1905
+ def coil_cooling_dx_single_speed_standard_minimum_cop(coil_cooling_dx_single_speed,
1906
+ search_criteria,
1907
+ rename = false)
1908
+
1909
+ capacity_w = coil_cooling_dx_single_speed_find_capacity(coil_cooling_dx_single_speed)
1910
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1911
+ capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1912
+
1913
+ # Look up the efficiency characteristics
1914
+ ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
1915
+
1916
+ # Check to make sure properties were found
1917
+ if ac_props.nil?
1918
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{coil_cooling_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
1919
+ successfully_set_all_properties = false
1920
+ return successfully_set_all_properties
1921
+ end
1922
+
1923
+ # Get the minimum efficiency standards
1924
+ cop = nil
1925
+
1926
+ # If specified as SEER
1927
+ unless ac_props['minimum_seasonal_energy_efficiency_ratio'].nil?
1928
+ min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
1929
+ cop = seer_to_cop_cooling_with_fan(min_seer)
1930
+ new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
1931
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1932
+ end
1933
+
1934
+ # If specified as EER
1935
+ unless ac_props['minimum_energy_efficiency_ratio'].nil?
1936
+ min_eer = ac_props['minimum_energy_efficiency_ratio']
1937
+ cop = eer_to_cop(min_eer)
1938
+ new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1939
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1940
+ end
1941
+
1942
+ # if specified as SEER (heat pump)
1943
+ unless ac_props['minimum_seasonal_efficiency'].nil?
1944
+ min_seer = ac_props['minimum_seasonal_efficiency']
1945
+ cop = seer_to_cop_cooling_with_fan(min_seer)
1946
+ new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
1947
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1948
+ end
1949
+
1950
+ # If specified as EER (heat pump)
1951
+ unless ac_props['minimum_full_load_efficiency'].nil?
1952
+ min_eer = ac_props['minimum_full_load_efficiency']
1953
+ cop = eer_to_cop(min_eer)
1954
+ new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1955
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1956
+ end
1957
+
1958
+ # If specified as COP
1959
+ unless ac_props['minimum_coefficient_of_performance_cooling'].nil?
1960
+ cop = ac_props['minimum_coefficient_of_performance_cooling']
1961
+ new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
1962
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXSingleSpeed', "For #{template}: #{coil_cooling_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COP = #{cop}")
1963
+ end
1964
+
1965
+ # Rename
1966
+ if rename
1967
+ coil_cooling_dx_single_speed.setName(new_comp_name)
1968
+ end
1969
+
1970
+ return cop
1971
+ end
1972
+
1973
+ # =============================================================================================================================
1974
+ # Find minimum efficiency for "CoilHeatingDXSingleSpeed" object
1975
+ def coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed,
1976
+ search_criteria,
1977
+ rename = false)
1978
+
1979
+ capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed)
1980
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1981
+ capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1982
+
1983
+ # Look up the efficiency characteristics
1984
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm'], search_criteria, capacity_btu_per_hr)
1985
+
1986
+ # Check to make sure properties were found
1987
+ if props.nil?
1988
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
1989
+ successfully_set_all_properties = false
1990
+ return successfully_set_all_properties
1991
+ end
1992
+
1993
+ # Get the minimum efficiency standards
1994
+ cop = nil
1995
+
1996
+ # If specified as EER
1997
+ unless props['minimum_energy_efficiency_ratio'].nil?
1998
+ min_eer = props['minimum_energy_efficiency_ratio']
1999
+ cop = eer_to_cop(min_eer)
2000
+ new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
2001
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2002
+ end
2003
+
2004
+ # if specified as HSPF (heat pump)
2005
+ unless props['minimum_heating_seasonal_performance_factor'].nil?
2006
+ min_hspf = props['minimum_heating_seasonal_performance_factor']
2007
+ cop = hspf_to_cop_heating_with_fan(min_hspf)
2008
+ new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
2009
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
2010
+ end
2011
+
2012
+ # If specified as EER (heat pump)
2013
+ unless props['minimum_full_load_efficiency'].nil?
2014
+ min_eer = props['minimum_full_load_efficiency']
2015
+ cop = eer_to_cop(min_eer)
2016
+ new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
2017
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2018
+ end
2019
+
2020
+ # If specified as COP
2021
+ unless props['minimum_coefficient_of_performance_heating'].nil?
2022
+ cop = props['minimum_coefficient_of_performance_heating']
2023
+ new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
2024
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2025
+ end
2026
+
2027
+ # Rename
2028
+ if rename
2029
+ coil_heating_dx_single_speed.setName(new_comp_name)
996
2030
  end
997
2031
 
2032
+ return cop
998
2033
  end
999
2034
 
1000
2035
  # =============================================================================================================================
1001
2036
  # Find minimum efficiency for "CoilCoolingDXVariableSpeed" object
1002
- def coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed, rename = false,ecm_name)
1003
- search_criteria = coil_dx_find_search_criteria(coil_cooling_dx_variable_speed)
1004
- cooling_type = search_criteria['cooling_type']
1005
- heating_type = search_criteria['heating_type']
1006
- sub_category = search_criteria['subcategory']
2037
+ def coil_cooling_dx_variable_speed_standard_minimum_cop(coil_cooling_dx_variable_speed,
2038
+ search_criteria,
2039
+ rename = false)
2040
+
1007
2041
  capacity_w = coil_cooling_dx_variable_speed_find_capacity(coil_cooling_dx_variable_speed)
1008
2042
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1009
2043
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1010
2044
 
1011
2045
  # Look up the efficiency characteristics
1012
- ac_props = if coil_dx_heat_pump?(coil_cooling_dx_variable_speed)
1013
- model_find_object(standards_data['tables']["heat_pumps_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
1014
- else
1015
- model_find_object(standards_data['tables']["unitary_acs_ecm_#{ecm_name.downcase}"]['table'], search_criteria, capacity_btu_per_hr, Date.today)
1016
- end
2046
+ ac_props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm']['table'], search_criteria, capacity_btu_per_hr)
1017
2047
 
1018
2048
  # Check to make sure properties were found
1019
2049
  if ac_props.nil?
@@ -1030,15 +2060,15 @@ class ECMS
1030
2060
  min_seer = ac_props['minimum_seasonal_energy_efficiency_ratio']
1031
2061
  cop = seer_to_cop_cooling_with_fan(min_seer)
1032
2062
  new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
1033
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
2063
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1034
2064
  end
1035
2065
 
1036
2066
  # If specified as EER
1037
2067
  unless ac_props['minimum_energy_efficiency_ratio'].nil?
1038
2068
  min_eer = ac_props['minimum_energy_efficiency_ratio']
1039
2069
  cop = eer_to_cop(min_eer)
1040
- new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1041
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2070
+ new_comp_name = "#{coil_cooling_dx_single_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
2071
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1042
2072
  end
1043
2073
 
1044
2074
  # if specified as SEER (heat pump)
@@ -1046,7 +2076,7 @@ class ECMS
1046
2076
  min_seer = ac_props['minimum_seasonal_efficiency']
1047
2077
  cop = seer_to_cop_cooling_with_fan(min_seer)
1048
2078
  new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}SEER"
1049
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
2079
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1050
2080
  end
1051
2081
 
1052
2082
  # If specified as EER (heat pump)
@@ -1054,14 +2084,14 @@ class ECMS
1054
2084
  min_eer = ac_props['minimum_full_load_efficiency']
1055
2085
  cop = eer_to_cop(min_eer)
1056
2086
  new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1057
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2087
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1058
2088
  end
1059
2089
 
1060
2090
  # If specified as COP
1061
2091
  unless ac_props['minimum_coefficient_of_performance_cooling'].nil?
1062
2092
  cop = ac_props['minimum_coefficient_of_performance_cooling']
1063
2093
  new_comp_name = "#{coil_cooling_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
1064
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COP = #{cop}")
2094
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilCoolingDXVariableSpeed', "For #{template}: #{coil_cooling_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COP = #{cop}")
1065
2095
  end
1066
2096
 
1067
2097
  # Rename
@@ -1073,18 +2103,17 @@ class ECMS
1073
2103
  end
1074
2104
 
1075
2105
  # =============================================================================================================================
1076
- # Find minimum efficiency for "CoilHeatingDXVariableSingleSpeed" object
1077
- def coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed, rename = false,ecm_name)
1078
- search_criteria = coil_dx_find_search_criteria(coil_heating_dx_variable_speed)
1079
- cooling_type = search_criteria['cooling_type']
1080
- heating_type = search_criteria['heating_type']
1081
- sub_category = search_criteria['subcategory']
2106
+ # Find minimum efficiency for "CoilHeatingDXVariableSpeed" object
2107
+ def coil_heating_dx_variable_speed_standard_minimum_cop(coil_heating_dx_variable_speed,
2108
+ search_criteria,
2109
+ rename = false)
2110
+
1082
2111
  capacity_w = coil_heating_dx_variable_speed_find_capacity(coil_heating_dx_variable_speed)
1083
2112
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1084
2113
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1085
2114
 
1086
2115
  # Look up the efficiency characteristics
1087
- props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_#{ecm_name.downcase}"], search_criteria, capacity_btu_per_hr, Date.today)
2116
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm'], search_criteria, capacity_btu_per_hr)
1088
2117
 
1089
2118
  # Check to make sure properties were found
1090
2119
  if props.nil?
@@ -1101,7 +2130,7 @@ class ECMS
1101
2130
  min_eer = props['minimum_energy_efficiency_ratio']
1102
2131
  cop = eer_to_cop(min_eer)
1103
2132
  new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1104
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2133
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1105
2134
  end
1106
2135
 
1107
2136
  # if specified as HSPF (heat pump)
@@ -1109,7 +2138,7 @@ class ECMS
1109
2138
  min_hspf = props['minimum_heating_seasonal_performance_factor']
1110
2139
  cop = hspf_to_cop_heating_with_fan(min_hspf)
1111
2140
  new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
1112
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
2141
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1113
2142
  end
1114
2143
 
1115
2144
  # If specified as EER (heat pump)
@@ -1117,14 +2146,14 @@ class ECMS
1117
2146
  min_eer = props['minimum_full_load_efficiency']
1118
2147
  cop = eer_to_cop(min_eer)
1119
2148
  new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1120
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2149
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1121
2150
  end
1122
2151
 
1123
2152
  # If specified as COP
1124
2153
  unless props['minimum_coefficient_of_performance_heating'].nil?
1125
2154
  cop = props['minimum_coefficient_of_performance_heating']
1126
2155
  new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
1127
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2156
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXVariableSpeed', "For #{template}: #{coil_heating_dx_variable_speed.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1128
2157
  end
1129
2158
 
1130
2159
  # Rename
@@ -1137,17 +2166,16 @@ class ECMS
1137
2166
 
1138
2167
  # =============================================================================================================================
1139
2168
  # Find minimum cooling efficiency for "AirConditionerVariableRefrigerantFlow" object
1140
- def airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow, rename = false, ecm_name)
1141
- search_criteria = coil_dx_find_search_criteria(airconditioner_variablerefrigerantflow)
1142
- cooling_type = search_criteria['cooling_type']
1143
- heating_type = search_criteria['heating_type']
1144
- sub_category = search_criteria['subcategory']
2169
+ def airconditioner_variablerefrigerantflow_cooling_standard_minimum_cop(airconditioner_variablerefrigerantflow,
2170
+ search_criteria,
2171
+ rename = false)
2172
+
1145
2173
  capacity_w = airconditioner_variablerefrigerantflow_cooling_find_capacity(airconditioner_variablerefrigerantflow)
1146
2174
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1147
2175
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1148
2176
 
1149
2177
  # Look up the efficiency characteristics
1150
- props = model_find_object(standards_data['tables']["heat_pumps_ecm_#{ecm_name.downcase}"], search_criteria, capacity_btu_per_hr, Date.today)
2178
+ props = model_find_object(standards_data['tables']['heat_pump_cooling_ecm'], search_criteria, capacity_btu_per_hr)
1151
2179
 
1152
2180
  # Check to make sure properties were found
1153
2181
  if props.nil?
@@ -1164,7 +2192,7 @@ class ECMS
1164
2192
  min_eer = props['minimum_energy_efficiency_ratio']
1165
2193
  cop = eer_to_cop(min_eer)
1166
2194
  new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1167
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2195
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1168
2196
  end
1169
2197
 
1170
2198
  # if specified as HSPF (heat pump)
@@ -1172,7 +2200,7 @@ class ECMS
1172
2200
  min_hspf = props['minimum_heating_seasonal_performance_factor']
1173
2201
  cop = hspf_to_cop_heating_with_fan(min_hspf)
1174
2202
  new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
1175
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
2203
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1176
2204
  end
1177
2205
 
1178
2206
  # If specified as EER (heat pump)
@@ -1180,14 +2208,14 @@ class ECMS
1180
2208
  min_eer = props['minimum_full_load_efficiency']
1181
2209
  cop = eer_to_cop(min_eer)
1182
2210
  new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1183
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2211
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1184
2212
  end
1185
2213
 
1186
2214
  # If specified as COP
1187
2215
  unless props['minimum_coefficient_of_performance_cooling'].nil?
1188
2216
  cop = props['minimum_coefficient_of_performance_cooling']
1189
2217
  new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
1190
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2218
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1191
2219
  end
1192
2220
 
1193
2221
  # Rename
@@ -1200,17 +2228,16 @@ class ECMS
1200
2228
 
1201
2229
  # =============================================================================================================================
1202
2230
  # Find minimum heating efficiency for "AirConditionerVariableRefrigerantFlow" object
1203
- def airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow, rename = false, ecm_name)
1204
- search_criteria = coil_dx_find_search_criteria(airconditioner_variablerefrigerantflow)
1205
- cooling_type = search_criteria['cooling_type']
1206
- heating_type = search_criteria['heating_type']
1207
- sub_category = search_criteria['subcategory']
2231
+ def airconditioner_variablerefrigerantflow_heating_standard_minimum_cop(airconditioner_variablerefrigerantflow,
2232
+ search_criteria,
2233
+ rename = false)
2234
+
1208
2235
  capacity_w = airconditioner_variablerefrigerantflow_heating_find_capacity(airconditioner_variablerefrigerantflow)
1209
2236
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
1210
2237
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
1211
2238
 
1212
2239
  # Look up the efficiency characteristics
1213
- props = model_find_object(standards_data['tables']["heat_pumps_heating_ecm_#{ecm_name.downcase}"], search_criteria, capacity_btu_per_hr, Date.today)
2240
+ props = model_find_object(standards_data['tables']['heat_pump_heating_ecm'], search_criteria, capacity_btu_per_hr)
1214
2241
 
1215
2242
  # Check to make sure properties were found
1216
2243
  if props.nil?
@@ -1227,7 +2254,7 @@ class ECMS
1227
2254
  min_eer = props['minimum_energy_efficiency_ratio']
1228
2255
  cop = eer_to_cop(min_eer)
1229
2256
  new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1230
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2257
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1231
2258
  end
1232
2259
 
1233
2260
  # if specified as HSPF (heat pump)
@@ -1235,7 +2262,7 @@ class ECMS
1235
2262
  min_hspf = props['minimum_heating_seasonal_performance_factor']
1236
2263
  cop = hspf_to_cop_heating_with_fan(min_hspf)
1237
2264
  new_comp_name = "#{coil_heating_dx_variable_speed.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_seer}HSPF"
1238
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
2265
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
1239
2266
  end
1240
2267
 
1241
2268
  # If specified as EER (heat pump)
@@ -1243,14 +2270,14 @@ class ECMS
1243
2270
  min_eer = props['minimum_full_load_efficiency']
1244
2271
  cop = eer_to_cop(min_eer)
1245
2272
  new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_eer}EER"
1246
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2273
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1247
2274
  end
1248
2275
 
1249
2276
  # If specified as COP
1250
2277
  unless props['minimum_coefficient_of_performance_heating'].nil?
1251
2278
  cop = props['minimum_coefficient_of_performance_heating']
1252
2279
  new_comp_name = "#{airconditioner_variablerefrigerantflow.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{cop}COP"
1253
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: #{cooling_type} #{heating_type} #{sub_category} Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
2280
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.AirConditionerVariableRefrigerantFlow', "For #{template}: #{airconditioner_variablerefrigerantflow.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
1254
2281
  end
1255
2282
 
1256
2283
  # Rename
@@ -1346,33 +2373,33 @@ class ECMS
1346
2373
  # It also renames the boiler to include the "boiler_eff"["name"].
1347
2374
  def modify_boiler_efficiency(model:, boiler_eff: nil)
1348
2375
  return if boiler_eff.nil?
2376
+
1349
2377
  # If boiler_eff is a string rather than a hash then assume it is the name of a boiler efficiency package and look
1350
2378
  # for a package with that name in boiler_set.json.
1351
2379
  if boiler_eff.is_a?(String)
1352
2380
  eff_packages = @standards_data['tables']['boiler_eff_ecm']['table']
1353
- eff_package = eff_packages.select{|eff_pack_info| eff_pack_info["name"] == boiler_eff}
1354
- if eff_package.empty?
1355
- raise "Cannot not find #{boiler_eff} in the ECMS boiler_set.json file. Please check that the name is correctly spelled in the ECMS class boiler_set.json and in the code calling (directly or through another method) the ECMS class modify_boiler_efficiency method."
1356
- elsif eff_package.size > 1
1357
- raise "More than one boiler efficiency package with the name #{boiler_eff} was found. Please check the ECMS class boiler_set.json file and make sure that each boiler efficiency package has a unique name."
1358
- else
1359
- ecm_name = boiler_eff
1360
- boiler_eff = {
1361
- "name" => ecm_name,
1362
- "efficiency" => eff_package[0]['efficiency'],
1363
- "part_load_curve" => eff_package[0]['part_load_curve']
1364
- }
1365
- end
2381
+ eff_package = eff_packages.select { |eff_pack_info| eff_pack_info['name'] == boiler_eff }
2382
+
2383
+ raise "Cannot not find #{boiler_eff} in the ECMS boiler_set.json file. Please check that the name is correctly spelled in the ECMS class boiler_set.json and in the code calling (directly or through another method) the ECMS class modify_boiler_efficiency method." if eff_package.empty?
2384
+ raise "More than one boiler efficiency package with the name #{boiler_eff} was found. Please check the ECMS class boiler_set.json file and make sure that each boiler efficiency package has a unique name." if eff_package.size > 1
2385
+
2386
+ ecm_name = boiler_eff
2387
+ boiler_eff = {
2388
+ 'name' => ecm_name,
2389
+ 'efficiency' => eff_package[0]['efficiency'],
2390
+ 'part_load_curve' => eff_package[0]['part_load_curve']
2391
+ }
1366
2392
  end
1367
2393
  # If nothing is passed in the boiler_eff hash then assume this was not supposed to be used and return without doing
1368
2394
  # anything.
1369
- return if boiler_eff["name"].nil? && boiler_eff["efficiency"].nil? && boiler_eff["part_load_curve"].nil?
2395
+ return if boiler_eff['name'].nil? && boiler_eff['efficiency'].nil? && boiler_eff['part_load_curve'].nil?
1370
2396
  # If no efficiency or partload curve are found (either passed directly or via the boiler_set.json file) then assume
1371
2397
  # that the current SHW setting should not be changed. Return without changing anything.
1372
- return if boiler_eff["efficiency"].nil? && boiler_eff["part_load_curve"].nil?
1373
- raise "You attempted to set the efficiency of boilers in this model to nil. Please check the ECMS class boiler_set.json and make sure the efficiency is properly set" if boiler_eff["efficiency"].nil?
1374
- raise "You attempted to set the efficiency of boilers in this model to: #{boiler_eff['efficiency']}. Please check the ECMS class boiler_set.json and make sure the efficiency you set is between 0.01 and 1.0." if (boiler_eff['efficiency'] < 0.01 || boiler_eff['efficiency'] > 1.0)
1375
- raise "You attempted to set the part load curve of boilers in this model to nil. Please check the ECMS class boiler_set.json file and ensure that both the efficiency and part load curve are set." if boiler_eff['part_load_curve'].nil?
2398
+ return if boiler_eff['efficiency'].nil? && boiler_eff['part_load_curve'].nil?
2399
+ raise 'You attempted to set the efficiency of boilers in this model to nil. Please check the ECMS class boiler_set.json and make sure the efficiency is properly set' if boiler_eff['efficiency'].nil?
2400
+ raise "You attempted to set the efficiency of boilers in this model to: #{boiler_eff['efficiency']}. Please check the ECMS class boiler_set.json and make sure the efficiency you set is between 0.01 and 1.0." if boiler_eff['efficiency'] < 0.01 || boiler_eff['efficiency'] > 1.0
2401
+ raise 'You attempted to set the part load curve of boilers in this model to nil. Please check the ECMS class boiler_set.json file and ensure that both the efficiency and part load curve are set.' if boiler_eff['part_load_curve'].nil?
2402
+
1376
2403
  model.getBoilerHotWaters.sort.each do |mod_boiler|
1377
2404
  reset_boiler_efficiency(model: model, component: mod_boiler.to_BoilerHotWater.get, eff: boiler_eff)
1378
2405
  end
@@ -1395,38 +2422,37 @@ class ECMS
1395
2422
  # "Primary/Secondary eff["name"] capacity kBtu/hr".
1396
2423
  def reset_boiler_efficiency(model:, component:, eff:)
1397
2424
  component.setNominalThermalEfficiency(eff['efficiency'])
1398
- part_load_curve_name = eff["part_load_curve"].to_s
2425
+ part_load_curve_name = eff['part_load_curve'].to_s
1399
2426
  existing_curve = @standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name }
1400
2427
  raise "No boiler with the name #{part_load_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class boiler_set.json and class curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
1401
- part_load_curve_data = (@standards_data["curves"].select { |curve| curve['name'] == part_load_curve_name })[0]
2428
+
2429
+ part_load_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name })[0]
1402
2430
  if part_load_curve_data['independent_variable_1'].to_s.upcase == 'TEnteringBoiler'.upcase || part_load_curve_data['independent_variable_2'].to_s.upcase == 'TEnteringBoiler'.upcase
1403
2431
  component.setEfficiencyCurveTemperatureEvaluationVariable('EnteringBoiler')
1404
2432
  elsif part_load_curve_data['independent_variable_1'].to_s.upcase == 'TLeavingBoiler'.upcase || part_load_curve_data['independent_variable_2'].to_s.upcase == 'TLeavingBoiler'.upcase
1405
2433
  component.setEfficiencyCurveTemperatureEvaluationVariable('LeavingBoiler')
1406
2434
  end
1407
2435
  part_load_curve = model_add_curve(model, part_load_curve_name)
1408
- if part_load_curve
1409
- component.setNormalizedBoilerEfficiencyCurve(part_load_curve)
1410
- if component.isNominalCapacityAutosized
1411
- boiler_size_W = model.getAutosizedValue(component, 'Design Size Nominal Capacity', 'W').to_f
1412
- else
1413
- boiler_size_W = component.nominalCapacity.to_f
1414
- end
1415
- boiler_size_kbtu_per_hour = (OpenStudio.convert(boiler_size_W, 'W', 'kBtu/h').get)
1416
- boiler_primacy = 'Primary '
1417
- if boiler_size_W < 1.0
1418
- boiler_primacy = 'Secondary '
1419
- end
1420
- if eff['name'].nil?
1421
- eff_measure_name = "Revised Performance Boiler"
1422
- else
1423
- eff_measure_name = eff['name']
1424
- end
1425
- new_boiler_name = boiler_primacy + eff_measure_name + " #{boiler_size_kbtu_per_hour.round(0)}kBtu/hr #{component.nominalThermalEfficiency} Thermal Eff"
1426
- component.setName(new_boiler_name)
2436
+ raise "There was a problem setting the boiler part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and boiler_set.json files." unless part_load_curve
2437
+
2438
+ component.setNormalizedBoilerEfficiencyCurve(part_load_curve)
2439
+ if component.isNominalCapacityAutosized
2440
+ boiler_size_W = model.getAutosizedValue(component, 'Design Size Nominal Capacity', 'W').to_f
2441
+ else
2442
+ boiler_size_W = component.nominalCapacity.to_f
2443
+ end
2444
+ boiler_size_kbtu_per_hour = OpenStudio.convert(boiler_size_W, 'W', 'kBtu/h').get
2445
+ boiler_primacy = 'Primary '
2446
+ if boiler_size_W < 1.0
2447
+ boiler_primacy = 'Secondary '
2448
+ end
2449
+ if eff['name'].nil?
2450
+ eff_measure_name = 'Revised Performance Boiler'
1427
2451
  else
1428
- raise "There was a problem setting the boiler part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and boiler_set.json files."
2452
+ eff_measure_name = eff['name']
1429
2453
  end
2454
+ new_boiler_name = boiler_primacy + eff_measure_name + " #{boiler_size_kbtu_per_hour.round(0)}kBtu/hr #{component.nominalThermalEfficiency} Thermal Eff"
2455
+ component.setName(new_boiler_name)
1430
2456
  end
1431
2457
 
1432
2458
  # ============================================================================================================================
@@ -1447,33 +2473,33 @@ class ECMS
1447
2473
  # also renames the furnace to include the "furnace_eff"["name"].
1448
2474
  def modify_furnace_efficiency(model:, furnace_eff: nil)
1449
2475
  return if furnace_eff.nil?
2476
+
1450
2477
  # If furnace_eff is a string rather than a hash then assume it is the name of a furnace efficiency package and look
1451
2478
  # for a package with that name in furnace_set.json.
1452
2479
  if furnace_eff.is_a?(String)
1453
2480
  eff_packages = @standards_data['tables']['furnace_eff_ecm']['table']
1454
- eff_package = eff_packages.select{|eff_pack_info| eff_pack_info["name"] == furnace_eff}
1455
- if eff_package.empty?
1456
- raise "Cannot not find #{furnace_eff} in the ECMS furnace_set.json file. Please check that the name is correctly spelled in the ECMS class furnace_set.json and in the code calling (directly or through another method) the ECMS class modify_furnace_efficiency method."
1457
- elsif eff_package.size > 1
1458
- raise "More than one furnace efficiency package with the name #{furnace_eff} was found. Please check the ECMS class furnace_set.json file and make sure that each furnace efficiency package has a unique name."
1459
- else
1460
- ecm_name = furnace_eff
1461
- furnace_eff = {
1462
- "name" => ecm_name,
1463
- "efficiency" => eff_package[0]['efficiency'],
1464
- "part_load_curve" => eff_package[0]['part_load_curve']
1465
- }
1466
- end
2481
+ eff_package = eff_packages.select { |eff_pack_info| eff_pack_info['name'] == furnace_eff }
2482
+
2483
+ raise "Cannot not find #{furnace_eff} in the ECMS furnace_set.json file. Please check that the name is correctly spelled in the ECMS class furnace_set.json and in the code calling (directly or through another method) the ECMS class modify_furnace_efficiency method." if eff_package.empty?
2484
+ raise "More than one furnace efficiency package with the name #{furnace_eff} was found. Please check the ECMS class furnace_set.json file and make sure that each furnace efficiency package has a unique name." if eff_package.size > 1
2485
+
2486
+ ecm_name = furnace_eff
2487
+ furnace_eff = {
2488
+ 'name' => ecm_name,
2489
+ 'efficiency' => eff_package[0]['efficiency'],
2490
+ 'part_load_curve' => eff_package[0]['part_load_curve']
2491
+ }
1467
2492
  end
1468
2493
  # If nothing is passed in the furnace_eff hash then assume this was not supposed to be used and return without doing
1469
2494
  # anything.
1470
- return if furnace_eff["name"].nil? && furnace_eff["efficiency"].nil? && furnace_eff["part_load_curve"].nil?
2495
+ return if furnace_eff['name'].nil? && furnace_eff['efficiency'].nil? && furnace_eff['part_load_curve'].nil?
1471
2496
  # If no efficiency or partload curve are found (either passed directly or via the furnace_set.json file) then assume
1472
2497
  # that the current furance performance settings should not be changed. Return without changing anything.
1473
- return if furnace_eff["efficiency"].nil? && furnace_eff["part_load_curve"].nil?
1474
- raise "You attempted to set the efficiency of furnaces in this model to nil. Please check the ECMS class furnace_set.json file and make sure the efficiency is set" if furnace_eff["efficiency"].nil?
1475
- raise "You attempted to set the efficiency of furnaces in this model to: #{furnace_eff['efficiency']}. Please check the ECMS class furnace_set.json file and make sure the efficiency you set is between 0.01 and 1.0." if (furnace_eff['efficiency'] < 0.01 || furnace_eff['efficiency'] > 1.0)
1476
- raise "You attempted to set the part load curve of furnaces in this model to nil. Please check the ECMS class furnace_set.json file and ensure that both the efficiency and part load curve are set." if furnace_eff['part_load_curve'].nil?
2498
+ return if furnace_eff['efficiency'].nil? && furnace_eff['part_load_curve'].nil?
2499
+ raise 'You attempted to set the efficiency of furnaces in this model to nil. Please check the ECMS class furnace_set.json file and make sure the efficiency is set' if furnace_eff['efficiency'].nil?
2500
+ raise "You attempted to set the efficiency of furnaces in this model to: #{furnace_eff['efficiency']}. Please check the ECMS class furnace_set.json file and make sure the efficiency you set is between 0.01 and 1.0." if furnace_eff['efficiency'] < 0.01 || furnace_eff['efficiency'] > 1.0
2501
+ raise 'You attempted to set the part load curve of furnaces in this model to nil. Please check the ECMS class furnace_set.json file and ensure that both the efficiency and part load curve are set.' if furnace_eff['part_load_curve'].nil?
2502
+
1477
2503
  model.getCoilHeatingGass.sort.each do |mod_furnace|
1478
2504
  reset_furnace_efficiency(model: model, component: mod_furnace.to_CoilHeatingGas.get, eff: furnace_eff)
1479
2505
  end
@@ -1492,14 +2518,16 @@ class ECMS
1492
2518
  # "eff["name"] + <furnace number (whatever was there before)>".
1493
2519
  def reset_furnace_efficiency(model:, component:, eff:)
1494
2520
  component.setGasBurnerEfficiency(eff['efficiency'])
1495
- part_load_curve_name = eff["part_load_curve"].to_s
2521
+ part_load_curve_name = eff['part_load_curve'].to_s
1496
2522
  existing_curve = @standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name }
1497
2523
  raise "No furnace part load curve with the name #{part_load_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class curves.json and the measure furnace_set.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
2524
+
1498
2525
  part_load_curve = model_add_curve(model, part_load_curve_name)
1499
2526
  raise "There was a problem setting the furnace part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json or measure furnace_set.json files." unless part_load_curve
2527
+
1500
2528
  component.setPartLoadFractionCorrelationCurve(part_load_curve)
1501
2529
  if eff['name'].nil?
1502
- ecm_package_name = "Revised Performance Furnace"
2530
+ ecm_package_name = 'Revised Performance Furnace'
1503
2531
  else
1504
2532
  ecm_package_name = eff['name']
1505
2533
  end
@@ -1525,33 +2553,33 @@ class ECMS
1525
2553
  # {valume}Gal {eff_name} Water Heater - {Capacity}kBtu/hr {efficiency} Therm Eff
1526
2554
  def modify_shw_efficiency(model:, shw_eff: nil)
1527
2555
  return if shw_eff.nil?
2556
+
1528
2557
  # If shw_eff is a string rather than a hash then assume it is the name of a shw efficiency package and look
1529
2558
  # for a package with that name in shw_set.json.
1530
2559
  if shw_eff.is_a?(String)
1531
2560
  eff_packages = @standards_data['tables']['shw_eff_ecm']['table']
1532
- eff_package = eff_packages.select{|eff_pack_info| eff_pack_info["name"] == shw_eff}
1533
- if eff_package.empty?
1534
- raise "Cannot not find #{shw_eff} in the ECMS shw_set.json file. Please check that the name is correctly spelled in the ECMS class shw_set.json and in the code calling (directly or through another method) the ECMS class modify_shw_efficiency method."
1535
- elsif eff_package.size > 1
1536
- raise "More than one shw tank efficiency package with the name #{shw_eff} was found. Please check the ECMS class shw_set.json file and make sure that each shw tank efficiency package has a unique name."
1537
- else
1538
- ecm_name = shw_eff
1539
- shw_eff = {
1540
- "name" => ecm_name,
1541
- "efficiency" => eff_package[0]['efficiency'],
1542
- "part_load_curve" => eff_package[0]['part_load_curve']
1543
- }
1544
- end
2561
+ eff_package = eff_packages.select { |eff_pack_info| eff_pack_info['name'] == shw_eff }
2562
+
2563
+ raise "Cannot not find #{shw_eff} in the ECMS shw_set.json file. Please check that the name is correctly spelled in the ECMS class shw_set.json and in the code calling (directly or through another method) the ECMS class modify_shw_efficiency method." if eff_package.empty?
2564
+ raise "More than one shw tank efficiency package with the name #{shw_eff} was found. Please check the ECMS class shw_set.json file and make sure that each shw tank efficiency package has a unique name." if eff_package.size > 1
2565
+
2566
+ ecm_name = shw_eff
2567
+ shw_eff = {
2568
+ 'name' => ecm_name,
2569
+ 'efficiency' => eff_package[0]['efficiency'],
2570
+ 'part_load_curve' => eff_package[0]['part_load_curve']
2571
+ }
1545
2572
  end
1546
2573
  # If nothing is passed in the shw_eff hash then assume this was not supposed to be used and return without doing
1547
2574
  # anything.
1548
- return if shw_eff["name"].nil? && shw_eff["efficiency"].nil? && shw_eff["part_load_curve"].nil?
2575
+ return if shw_eff['name'].nil? && shw_eff['efficiency'].nil? && shw_eff['part_load_curve'].nil?
1549
2576
  # If no efficiency or partload curve are found (either passed directly or via the shw_set.json file) then assume
1550
2577
  # that the current shw performance settings should not be changed. Return without changing anything.
1551
- return if shw_eff["efficiency"].nil? && shw_eff["part_load_curve"].nil?
1552
- raise "You attempted to set the efficiency of shw tanks in this model to nil. Please check the ECMS class shw_set.json file and make sure the efficiency is set" if shw_eff["efficiency"].nil?
1553
- raise "You attempted to set the efficiency of shw tanks in this model to: #{shw_eff['efficiency']}. Please check the ECMS class shw_set.json and make sure the efficiency you set is between 0.01 and 1.0." if (shw_eff['efficiency'] < 0.01 || shw_eff['efficiency'] > 1.0)
1554
- raise "You attempted to set the part load curve of shw tanks in this model to nil. Please check the ECMS class shw_set.json file and ensure that both the efficiency and part load curve are set." if shw_eff['part_load_curve'].nil?
2578
+ return if shw_eff['efficiency'].nil? && shw_eff['part_load_curve'].nil?
2579
+ raise 'You attempted to set the efficiency of shw tanks in this model to nil. Please check the ECMS class shw_set.json file and make sure the efficiency is set' if shw_eff['efficiency'].nil?
2580
+ raise "You attempted to set the efficiency of shw tanks in this model to: #{shw_eff['efficiency']}. Please check the ECMS class shw_set.json and make sure the efficiency you set is between 0.01 and 1.0." if shw_eff['efficiency'] < 0.01 || shw_eff['efficiency'] > 1.0
2581
+ raise 'You attempted to set the part load curve of shw tanks in this model to nil. Please check the ECMS class shw_set.json file and ensure that both the efficiency and part load curve are set.' if shw_eff['part_load_curve'].nil?
2582
+
1555
2583
  model.getWaterHeaterMixeds.sort.each do |shw_mod|
1556
2584
  reset_shw_efficiency(model: model, component: shw_mod, eff: shw_eff)
1557
2585
  end
@@ -1570,34 +2598,38 @@ class ECMS
1570
2598
  # {valume}Gal {eff_name} Water Heater - {Capacity}kBtu/hr {efficiency} Therm Eff
1571
2599
  def reset_shw_efficiency(model:, component:, eff:)
1572
2600
  return if component.heaterFuelType.to_s.upcase == 'ELECTRICITY'
2601
+
1573
2602
  eff_result = component.setHeaterThermalEfficiency(eff['efficiency'].to_f)
1574
- raise "There was a problem setting the efficiency of the SHW #{component.name.to_s}. Please check the ECMS class shw_set.json file or the model." unless eff_result
1575
- part_load_curve_name = eff["part_load_curve"].to_s
2603
+ raise "There was a problem setting the efficiency of the SHW #{component.name}. Please check the ECMS class shw_set.json file or the model." unless eff_result
2604
+
2605
+ part_load_curve_name = eff['part_load_curve'].to_s
1576
2606
  existing_curve = @standards_data['curves'].select { |curve| curve['name'] == part_load_curve_name }
1577
2607
  raise "No shw tank part load curve with the name #{part_load_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class curves.json and the measure shw_set.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
2608
+
1578
2609
  part_load_curve = model_add_curve(model, part_load_curve_name)
1579
2610
  raise "There was a problem setting the shw tank part load curve named #{part_load_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and shw_set.json files." unless part_load_curve
2611
+
1580
2612
  component.setPartLoadFactorCurve(part_load_curve)
1581
- #Get the volume and capacity of the SHW tank.
2613
+ # Get the volume and capacity of the SHW tank.
1582
2614
  if component.isTankVolumeAutosized
1583
- shw_vol_gal = "auto_size"
2615
+ shw_vol_gal = 'auto_size'
1584
2616
  else
1585
2617
  shw_vol_m3 = component.tankVolume.to_f
1586
- shw_vol_gal = (OpenStudio.convert(shw_vol_m3, 'm^3', 'gal').get).to_f.round(0)
2618
+ shw_vol_gal = OpenStudio.convert(shw_vol_m3, 'm^3', 'gal').get.to_f.round(0)
1587
2619
  end
1588
2620
  if component.isHeaterMaximumCapacityAutosized
1589
- shw_capacity_kBtu_hr = "auto_cap"
2621
+ shw_capacity_kBtu_hr = 'auto_cap'
1590
2622
  else
1591
2623
  shw_capacity_W = component.heaterMaximumCapacity.to_f
1592
- shw_capacity_kBtu_hr = (OpenStudio.convert(shw_capacity_W, 'W', 'kBtu/h').get).to_f.round(0)
2624
+ shw_capacity_kBtu_hr = OpenStudio.convert(shw_capacity_W, 'W', 'kBtu/h').get.to_f.round(0)
1593
2625
  end
1594
2626
  # Set a default revised shw tank name if no name is present in the eff hash.
1595
- if eff["name"].nil?
1596
- shw_ecm_package_name = "Revised"
2627
+ if eff['name'].nil?
2628
+ shw_ecm_package_name = 'Revised'
1597
2629
  else
1598
- shw_ecm_package_name = eff["name"]
2630
+ shw_ecm_package_name = eff['name']
1599
2631
  end
1600
- shw_name = "#{shw_vol_gal} Gal #{shw_ecm_package_name} Water Heater - #{shw_capacity_kBtu_hr}kBtu/hr #{eff["efficiency"]} Therm Eff"
2632
+ shw_name = "#{shw_vol_gal} Gal #{shw_ecm_package_name} Water Heater - #{shw_capacity_kBtu_hr}kBtu/hr #{eff['efficiency']} Therm Eff"
1601
2633
  component.setName(shw_name)
1602
2634
  end
1603
2635
 
@@ -1605,46 +2637,48 @@ class ECMS
1605
2637
  # Method to update the cop and/or the performance curves of unitary dx coils. The method input 'unitary_cop' can either be a
1606
2638
  # string or a hash. When it's a string it's used to find a hash in the json table 'unitary_cop_ecm'. When it's a hash it holds
1607
2639
  # the parameters needed to update the cop and/or the performance curves of the unitary coil.
1608
- def modify_unitary_cop(model:, unitary_cop:,sql_db_vars_map:)
1609
- return if (unitary_cop.nil? || (unitary_cop.to_s == "NECB_Default"))
2640
+ def modify_unitary_cop(model:, unitary_cop:, sql_db_vars_map:)
2641
+ return if unitary_cop.nil? || (unitary_cop.to_s == 'NECB_Default')
2642
+
1610
2643
  coils = model.getCoilCoolingDXSingleSpeeds + model.getCoilCoolingDXMultiSpeeds
1611
2644
  unitary_cop_copy = unitary_cop.dup
1612
2645
  coils.sort.each do |coil|
1613
- coil_type = "SingleSpeed"
1614
- coil_type = "MultiSpeed" if coil.class.name.to_s.include? 'CoilCoolingDXMultiSpeed'
2646
+ coil_type = 'SingleSpeed'
2647
+ coil_type = 'MultiSpeed' if coil.class.name.to_s.include? 'CoilCoolingDXMultiSpeed'
1615
2648
  # if the parameter 'unitary_cop' is a string then get the information on the new parameters for the coils from
1616
2649
  # the json table 'unitary_cop_ecm'
1617
2650
  if unitary_cop_copy.is_a?(String)
1618
2651
  search_criteria = {}
1619
2652
  search_criteria['name'] = unitary_cop_copy
1620
2653
  coil_name = coil.name.to_s
1621
- coil.setName(sql_db_vars_map[coil_name])
1622
- if coil_type == "SingleSpeed"
2654
+ if sql_db_vars_map.has_key? coil_name then coil.setName(sql_db_vars_map[coil_name]) end
2655
+ if coil_type == 'SingleSpeed'
1623
2656
  capacity_w = coil_cooling_dx_single_speed_find_capacity(coil)
1624
- elsif coil_type == "MultiSpeed"
2657
+ elsif coil_type == 'MultiSpeed'
1625
2658
  capacity_w = coil_cooling_dx_multi_speed_find_capacity(coil)
1626
2659
  end
1627
2660
  coil.setName(coil_name)
1628
2661
  cop_package = model_find_object(@standards_data['tables']['unitary_cop_ecm'], search_criteria, capacity_w)
1629
2662
  raise "Cannot not find #{unitary_cop_ecm} in the ECMS unitary_acs.json file. Please check that the name is correctly spelled in the ECMS class unitary_acs.json file and in the code calling (directly or through another method) the ECMS class modify_unitary_eff method." if cop_package.empty?
2663
+
1630
2664
  ecm_name = unitary_cop_copy
1631
2665
  unitary_cop = {
1632
- "name" => ecm_name,
1633
- "minimum_energy_efficiency_ratio" => cop_package['minimum_energy_efficiency_ratio'],
1634
- "minimum_seasonal_energy_efficiency_ratio" => cop_package['minimum_seasonal_energy_efficiency_ratio'],
1635
- "cool_cap_ft" => cop_package['cool_cap_ft'],
1636
- "cool_cap_fflow" => cop_package['cool_cap_fflow'],
1637
- "cool_eir_ft" => cop_package['cool_eir_ft'],
1638
- "cool_eir_fflow" => cop_package['cool_eir_fflow'],
1639
- "cool_plf_fplr" => cop_package['cool_eir_fplr']
2666
+ 'name' => ecm_name,
2667
+ 'minimum_energy_efficiency_ratio' => cop_package['minimum_energy_efficiency_ratio'],
2668
+ 'minimum_seasonal_energy_efficiency_ratio' => cop_package['minimum_seasonal_energy_efficiency_ratio'],
2669
+ 'cool_cap_ft' => cop_package['cool_cap_ft'],
2670
+ 'cool_cap_fflow' => cop_package['cool_cap_fflow'],
2671
+ 'cool_eir_ft' => cop_package['cool_eir_ft'],
2672
+ 'cool_eir_fflow' => cop_package['cool_eir_fflow'],
2673
+ 'cool_plf_fplr' => cop_package['cool_eir_fplr']
1640
2674
  }
1641
2675
  end
1642
- next if (unitary_cop['minimum_energy_efficiency_ratio'].nil? && unitary_cop['minimum_seasonal_energy_efficiency_ratio'].nil? && unitary_cop['cool_cap_ft'].nil? &&
1643
- unitary_cop['cool_cap_fflow'].nil? && unitary_cop['cool_eir_ft'].nil? && unitary_cop['cool_eir_fflow'].nil? && unitary_cop['cool_plf_fplr'].nil?)
2676
+ next if unitary_cop['minimum_energy_efficiency_ratio'].nil? && unitary_cop['minimum_seasonal_energy_efficiency_ratio'].nil? && unitary_cop['cool_cap_ft'].nil? &&
2677
+ unitary_cop['cool_cap_fflow'].nil? && unitary_cop['cool_eir_ft'].nil? && unitary_cop['cool_eir_fflow'].nil? && unitary_cop['cool_plf_fplr'].nil?
1644
2678
 
1645
2679
  # If the dx coil is on an air loop then update its cop and the performance curves when these are specified in the ecm data
1646
- if (coil_type == "SingleSpeed" && coil.airLoopHVAC.is_initialized) ||
1647
- (coil_type == "MultiSpeed" && coil.containingHVACComponent.get.airLoopHVAC.is_initialized)
2680
+ if (coil_type == 'SingleSpeed' && coil.airLoopHVAC.is_initialized && (!coil.name.to_s.include? "_ASHP")) ||
2681
+ (coil_type == 'MultiSpeed' && coil.containingHVACComponent.get.airLoopHVAC.is_initialized)
1648
2682
  cop = nil
1649
2683
  if unitary_cop['minimum_energy_efficiency_ratio']
1650
2684
  cop = eer_to_cop(unitary_cop['minimum_energy_efficiency_ratio'].to_f)
@@ -1661,14 +2695,14 @@ class ECMS
1661
2695
  cool_eir_fflow = @standards_data['curves'].select { |curve| curve['name'] == unitary_cop['cool_eir_fflow'] } if unitary_cop['cool_eir_fflow']
1662
2696
  cool_plf_fplr = nil
1663
2697
  cool_plf_fplr = @standards_data['curves'].select { |curve| curve['name'] == unitary_cop['cool_plf_fplr'] } if unitary_cop['cool_plf_fplr']
1664
- if coil_type == "SingleSpeed"
2698
+ if coil_type == 'SingleSpeed'
1665
2699
  coil.setRatedCOP(cop) if cop
1666
2700
  coil.setTotalCoolingCapacityFunctionOfTemperatureCurve(cool_cap_ft) if cool_cap_ft
1667
2701
  coil.setTotalCoolingCapacityFunctionOfFlowFractionCurve(cool_cap_fflow) if cool_cap_fflow
1668
2702
  coil.setEnergyInputRatioFunctionOfTemperatureCurve(cool_eir_ft) if cool_eir_ft
1669
2703
  coil.setEnergyInputRatioFunctionOfFlowFractionCurve(cool_eir_fflow) if cool_eir_fflow
1670
2704
  coil.setPartLoadFractionCorrelationCurve(cool_plf_fplr) if cool_plf_fplr
1671
- elsif coil_type == "MultiSpeed"
2705
+ elsif coil_type == 'MultiSpeed'
1672
2706
  coil.stages.sort.each do |stage|
1673
2707
  stage.setGrossRatedCoolingCOP(cop) if cop
1674
2708
  stage.setTotalCoolingCapacityFunctionofTemperatureCurve(cool_cap_ft) if cool_cap_ft
@@ -1678,8 +2712,8 @@ class ECMS
1678
2712
  stage.setPartLoadFractionCorrelationCurve(cool_plf_fplr) if cool_plf_fplr
1679
2713
  end
1680
2714
  end
1681
- coil.setName("CoilCoolingDXSingleSpeed_dx-adv") if (cop && coil_type == "SingleSpeed")
1682
- coil.setName("CoilCoolingDXMultiSpeed_dx-adv") if (cop && coil_type == "MultiSpeed")
2715
+ coil.setName('CoilCoolingDXSingleSpeed_dx-adv') if cop && coil_type == 'SingleSpeed'
2716
+ coil.setName('CoilCoolingDXMultiSpeed_dx-adv') if cop && coil_type == 'MultiSpeed'
1683
2717
  end
1684
2718
  end
1685
2719
  end
@@ -1692,32 +2726,38 @@ class ECMS
1692
2726
  # loops and other stuff from being created if someone did not want them. But others felt that that was not a clear
1693
2727
  # way of doing things and did not feel the performance penalty of creating objects, then removing them, then creating
1694
2728
  # them again was significant.
1695
- def add_ecm_remove_airloops_add_zone_baseboards(model:,system_zones_map:, system_doas_flags: nil, zone_clg_eqpt_type: nil, standard:, primary_heating_fuel:)
2729
+ def add_ecm_remove_airloops_add_zone_baseboards(model:,
2730
+ system_zones_map:,
2731
+ system_doas_flags: nil,
2732
+ zone_clg_eqpt_type: nil,
2733
+ standard:,
2734
+ primary_heating_fuel:)
1696
2735
  # Set the primary fuel set to default to to specific fuel type.
1697
2736
  standards_info = standard.standards_data
1698
2737
 
1699
2738
  if primary_heating_fuel == 'DefaultFuel'
1700
2739
  epw = BTAP::Environment::WeatherFile.new(model.weatherFile.get.path.get)
1701
- primary_heating_fuel = standards_info['regional_fuel_use'].detect {|fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region)}['fueltype_set']
2740
+ primary_heating_fuel = standards_info['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.state_province_region) }['fueltype_set']
1702
2741
  end
1703
2742
  # Get fuelset.
1704
- system_fuel_defaults = standards_info['fuel_type_sets'].detect {|fuel_type_set| fuel_type_set['name'] == primary_heating_fuel}
2743
+ system_fuel_defaults = standards_info['fuel_type_sets'].detect { |fuel_type_set| fuel_type_set['name'] == primary_heating_fuel }
1705
2744
  raise("fuel_type_sets named #{primary_heating_fuel} not found in fuel_type_sets table.") if system_fuel_defaults.nil?
1706
2745
 
1707
-
1708
2746
  # Assign fuel sources.
1709
2747
  boiler_fueltype = system_fuel_defaults['boiler_fueltype']
1710
2748
  baseboard_type = system_fuel_defaults['baseboard_type']
1711
- mau_heating_coil_type = "none"
2749
+ mau_heating_coil_type = 'none'
1712
2750
 
1713
2751
  # Create the hot water loop if necessary.
1714
- hw_loop = standard.create_hw_loop_if_required(baseboard_type,
1715
- boiler_fueltype,
1716
- mau_heating_coil_type,
1717
- model)
2752
+ hw_loop = standard.create_hw_loop_if_required(
2753
+ baseboard_type,
2754
+ boiler_fueltype,
2755
+ mau_heating_coil_type,
2756
+ model
2757
+ )
1718
2758
 
1719
2759
  # Add baseboard heaters to each heated zone.
1720
- system_zones_map.sort.each do |sname,zones|
2760
+ system_zones_map.sort.each do |sname, zones|
1721
2761
  zones.each do |zone|
1722
2762
  standard.add_zone_baseboards(baseboard_type: baseboard_type,
1723
2763
  hw_loop: hw_loop,
@@ -1726,4 +2766,145 @@ class ECMS
1726
2766
  end
1727
2767
  end
1728
2768
  end
2769
+
2770
+ # ============================================================================================================================
2771
+ # Apply advanced chiller measure
2772
+ def modify_chiller_efficiency(model:, chiller_type:)
2773
+ return if chiller_type.nil? || chiller_type == false || chiller_type == 'none' || chiller_type == 'NECB_Default'
2774
+
2775
+ model.getChillerElectricEIRs.sort.each do |mod_chiller|
2776
+ ref_capacity_w = mod_chiller.referenceCapacity
2777
+ ref_capacity_w = ref_capacity_w.to_f
2778
+
2779
+ ##### Look for a chiller set in chiller_set.json (with a capacity close to that of the existing chiller)
2780
+ chiller_set, chiller_min_cap, chiller_max_cap = find_chiller_set(chiller_type: chiller_type, ref_capacity_w: ref_capacity_w)
2781
+
2782
+ ##### No need to replace any chillers with capacity = 0.001 W as per Kamel Haddad's comment
2783
+ if ref_capacity_w > 0.0011
2784
+ reset_chiller_efficiency(model: model, component: mod_chiller.to_ChillerElectricEIR.get, cop: chiller_set)
2785
+ end
2786
+ end
2787
+
2788
+ ##### Change fan power of single-speed Cooling towers from 'Hard Sized' to Autosized (Otherwise, E+ gives the fatal error 'Autosizing of cooling tower UA failed for tower')
2789
+ model.getCoolingTowerSingleSpeeds.sort.each(&:autosizeFanPoweratDesignAirFlowRate)
2790
+ end
2791
+
2792
+ def find_chiller_set(chiller_type:, ref_capacity_w:)
2793
+ if chiller_type.is_a?(String)
2794
+ ##### Find the chiller that has the required capacity
2795
+ search_criteria = {}
2796
+ search_criteria['name'] = chiller_type
2797
+ capacity_w = ref_capacity_w
2798
+ chiller_packages = model_find_object(@standards_data['tables']['chiller_eff_ecm'], search_criteria, capacity_w)
2799
+ chiller_name = chiller_packages['notes']
2800
+ ecm_name = chiller_name
2801
+ chiller_set = {
2802
+ 'notes' => ecm_name,
2803
+ 'capacity_w' => chiller_packages['capacity_w'],
2804
+ 'cop_w_by_w' => chiller_packages['cop_w_by_w'],
2805
+ 'ref_leaving_chilled_water_temp_c' => chiller_packages['ref_leaving_chilled_water_temp_c'],
2806
+ 'ref_entering_condenser_fluid_temp_c' => chiller_packages['ref_entering_condenser_fluid_temp_c'],
2807
+ 'ref_chilled_water_flow_rate_m3_s' => chiller_packages['ref_chilled_water_flow_rate_m3_s'],
2808
+ 'ref_condenser_fluid_flow_rate_m3_s' => chiller_packages['ref_condenser_fluid_flow_rate_m3_s'],
2809
+ 'capft_curve' => chiller_packages['capft_curve'],
2810
+ 'eirft_curve' => chiller_packages['eirft_curve'],
2811
+ 'eirfplr_curve' => chiller_packages['eirfplr_curve'],
2812
+ 'min_part_load_ratio' => chiller_packages['min_part_load_ratio'],
2813
+ 'max_part_load_ratio' => chiller_packages['max_part_load_ratio'],
2814
+ 'opt_part_load_ratio' => chiller_packages['opt_part_load_ratio'],
2815
+ 'min_unloading_ratio' => chiller_packages['min_unloading_ratio'],
2816
+ 'condenser_type' => chiller_packages['condenser_type'],
2817
+ 'fraction_of_compressor_electric_consumption_rejected_by_condenser' => chiller_packages['fraction_of_compressor_electric_consumption_rejected_by_condenser'],
2818
+ 'leaving_chilled_water_lower_temperature_limit_c' => chiller_packages['leaving_chilled_water_lower_temperature_limit_c'],
2819
+ 'chiller_flow_mode' => chiller_packages['chiller_flow_mode'],
2820
+ 'design_heat_recovery_water_flow_rate_m3_s' => chiller_packages['design_heat_recovery_water_flow_rate_m3_s']
2821
+ }
2822
+ chiller_min_cap = chiller_packages['minimum_capacity']
2823
+ chiller_max_cap = chiller_packages['maximum_capacity']
2824
+ end
2825
+ return chiller_set, chiller_min_cap, chiller_max_cap
2826
+ end
2827
+
2828
+ # ============================================================================================================================
2829
+ def reset_chiller_efficiency(model:, component:, cop:)
2830
+ # Note that all parameters (except for the capacity) of an existing chiller are replaced with the ones of the VSD chiller, as per Kamel Haddad's comment.
2831
+ component.setName('ChillerElectricEIR_VSDCentrifugalWaterChiller')
2832
+ component.setReferenceCOP(cop['cop_w_by_w'])
2833
+ component.setReferenceLeavingChilledWaterTemperature(cop['ref_leaving_chilled_water_temp_c'])
2834
+ component.setReferenceEnteringCondenserFluidTemperature(cop['ref_entering_condenser_fluid_temp_c'])
2835
+ component.isReferenceChilledWaterFlowRateAutosized
2836
+ component.isReferenceCondenserFluidFlowRateAutosized
2837
+ component.setMinimumPartLoadRatio(cop['min_part_load_ratio'])
2838
+ component.setMaximumPartLoadRatio(cop['max_part_load_ratio'])
2839
+ component.setOptimumPartLoadRatio(cop['opt_part_load_ratio'])
2840
+ component.setMinimumUnloadingRatio(cop['min_unloading_ratio'])
2841
+ component.setCondenserType(cop['condenser_type'])
2842
+ component.setFractionofCompressorElectricConsumptionRejectedbyCondenser(cop['fraction_of_compressor_electric_consumption_rejected_by_condenser'])
2843
+ component.setLeavingChilledWaterLowerTemperatureLimit(cop['leaving_chilled_water_lower_temperature_limit_c'])
2844
+ component.setChillerFlowMode(cop['chiller_flow_mode'])
2845
+ component.setDesignHeatRecoveryWaterFlowRate(cop['design_heat_recovery_water_flow_rate_m3_s'])
2846
+
2847
+ # set other fields of this object to nothing #Note that this could not be done for the 'Condenser Heat Recovery Relative Capacity Fraction' field as there is no 'reset' for this field.
2848
+ component.resetCondenserFanPowerRatio
2849
+ component.resetSizingFactor
2850
+ component.resetBasinHeaterCapacity
2851
+ component.resetBasinHeaterSetpointTemperature
2852
+ component.resetBasinHeaterSchedule
2853
+ component.resetHeatRecoveryInletHighTemperatureLimitSchedule
2854
+ component.resetHeatRecoveryLeavingTemperatureSetpointNode
2855
+
2856
+ ##### Replace cooling_capacity_function_of_temperature (CAPFT) curve
2857
+ capft_curve_name = cop['capft_curve'].to_s
2858
+ existing_curve = @standards_data['curves'].select { |curve| curve['name'] == capft_curve_name }
2859
+ raise "No chiller with the name #{capft_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class chiller_set.json and curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
2860
+
2861
+ capft_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == capft_curve_name })[0]
2862
+ capft_curve = model_add_curve(model, capft_curve_name)
2863
+ component.setCoolingCapacityFunctionOfTemperature(capft_curve) if capft_curve
2864
+ raise "There was a problem setting the CoolingCapacityFunctionOfTemperature curve named #{capft_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and chiller_set.json files." if !capft_curve
2865
+
2866
+ ##### Replace electric_input_to_cooling_output_ratio_function_of_temperature (EIRFT) curve
2867
+ eirft_curve_name = cop['eirft_curve'].to_s
2868
+ existing_curve = @standards_data['curves'].select { |curve| curve['name'] == eirft_curve_name }
2869
+ raise "No chiller with the name #{eirft_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class chiller_set.json and curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
2870
+
2871
+ eirft_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == eirft_curve_name })[0]
2872
+ eirft_curve = model_add_curve(model, eirft_curve_name)
2873
+ component.setElectricInputToCoolingOutputRatioFunctionOfTemperature(eirft_curve) if eirft_curve
2874
+ raise "There was a problem setting the ElectricInputToCoolingOutputRatioFunctionOfTemperature curve named #{eirft_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and chiller_set.json files." if !eirft_curve
2875
+
2876
+ ##### Replace electric_input_to_cooling_output_ratio_function_of_part_load_ratio (EIRFPLR) curve
2877
+ eirfplr_curve_name = cop['eirfplr_curve'].to_s
2878
+ existing_curve = @standards_data['curves'].select { |curve| curve['name'] == eirfplr_curve_name }
2879
+ raise "No chiller with the name #{eirfplr_curve_name} could be found in the ECMS class curves.json file. Please check both the ECMS class chiller_set.json and curves.json files to ensure the curve is entered and referenced correctly." if existing_curve.empty?
2880
+
2881
+ eirfplr_curve_data = (@standards_data['curves'].select { |curve| curve['name'] == eirfplr_curve_name })[0]
2882
+ eirfplr_curve = model_add_curve(model, eirfplr_curve_name)
2883
+ component.setElectricInputToCoolingOutputRatioFunctionOfPLR(eirfplr_curve) if eirfplr_curve
2884
+ raise "There was a problem setting the ElectricInputToCoolingOutputRatioFunctionOfPLR curve named #{eirfplr_curve_name} for #{component.name}. Please ensure that the curve is entered and referenced correctly in the ECMS class curves.json and chiller_set.json files." if !eirfplr_curve
2885
+ end
2886
+
2887
+ # ============================================================================================================================
2888
+ # Add air side economizer for each airloop
2889
+ def add_airloop_economizer(model:, airloop_economizer_type:)
2890
+ return if airloop_economizer_type.nil? || (airloop_economizer_type.to_s == 'NECB_Default')
2891
+
2892
+ if airloop_economizer_type.downcase == "differentialenthalpy"
2893
+ economizer_type = 'DifferentialEnthalpy'
2894
+ elsif airloop_economizer_type.downcase == "differentialdrybulb"
2895
+ economizer_type = 'DifferentialDryBulb'
2896
+ else
2897
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.airLoopHVACOutdoorAirSystem', "The air loop economizer type #{airloop_economizer_type} is not recognized. Please make sure that the economizer being applied by the ECM is either a DifferentialEnthalpy or DifferentialDryBulb type. No economizer will be applied.")
2898
+ return
2899
+ end
2900
+
2901
+ model.getAirLoopHVACs.sort.each do |air_loop|
2902
+ oa_sys = air_loop.airLoopHVACOutdoorAirSystem
2903
+ if oa_sys.is_initialized
2904
+ oa_sys = oa_sys.get
2905
+ oa_control = oa_sys.getControllerOutdoorAir
2906
+ oa_control.setEconomizerControlType(economizer_type)
2907
+ end
2908
+ end
2909
+ end
1729
2910
  end