openstudio-standards 0.2.14 → 0.2.15.pre.rc1

Sign up to get free protection for your applications and to get access to all the features.
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