openstudio-standards 0.2.16 → 0.2.17.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (181) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/manage_OpenStudio_Standards.rb +31 -4
  3. data/lib/openstudio-standards/btap/geometry.rb +1 -1
  4. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +354 -2
  5. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +79 -0
  6. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +1 -1
  7. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +1 -1
  8. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3313 -0
  9. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +12 -0
  10. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +3 -4
  11. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  12. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +167 -93
  13. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +2 -4
  14. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +1 -0
  15. data/lib/openstudio-standards/refs/references.rb +3 -0
  16. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +279 -6
  17. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +50 -2
  18. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +4 -0
  19. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -1
  20. data/lib/openstudio-standards/standards/Standards.Construction.rb +185 -3
  21. data/lib/openstudio-standards/standards/Standards.Fan.rb +14 -6
  22. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +1 -0
  23. data/lib/openstudio-standards/standards/Standards.Model.rb +1751 -383
  24. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +130 -9
  25. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +50 -3
  26. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +44 -0
  27. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +27 -0
  28. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +543 -0
  29. data/lib/openstudio-standards/standards/Standards.Space.rb +665 -15
  30. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +141 -4
  31. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +2 -1
  32. data/lib/openstudio-standards/standards/Standards.Surface.rb +117 -0
  33. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +197 -49
  34. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +41 -0
  35. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +6 -8
  36. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +45 -45
  37. 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 +7 -7
  38. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +45 -45
  39. 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 +7 -7
  40. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +45 -45
  41. 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 +9 -9
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +45 -45
  43. 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 +4 -4
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +45 -45
  45. 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 +5 -5
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +5 -5
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +45 -45
  48. 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 +5 -5
  49. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +2 -2
  50. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +12 -0
  51. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +45 -45
  52. 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 +10 -10
  53. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +45 -45
  54. 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 +10 -10
  55. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +1 -0
  56. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +792 -0
  57. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +10 -0
  58. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +31 -0
  59. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +91 -0
  60. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +84 -0
  61. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +145 -0
  62. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +106 -0
  63. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +71 -0
  64. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +194 -0
  65. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +120 -0
  66. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +110 -0
  67. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +5 -0
  68. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +73 -0
  69. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +5 -0
  70. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +5 -0
  71. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +24 -0
  72. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +5 -0
  73. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +55 -0
  74. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +3045 -0
  75. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +187 -0
  76. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +450 -0
  77. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +106 -0
  78. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +666 -0
  79. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +54 -0
  80. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +168 -0
  81. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +132 -0
  82. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +239 -0
  83. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +176 -0
  84. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +25 -0
  85. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.boilers.json +52 -0
  86. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.chillers.json +112 -0
  87. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.climate_zone_sets.json +210 -0
  88. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_properties.json +10384 -0
  89. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_sets.json +133 -0
  90. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.furnaces.json +43 -0
  91. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +119 -0
  92. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +130 -0
  93. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +13 -0
  94. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.lpd_space_type.json +568 -0
  95. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +264 -0
  96. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_baseline_hvac.json +439 -0
  97. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_constructions.json +685 -0
  98. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +213 -0
  99. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_ext_ltg.json +32 -0
  100. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_heat_type.json +136 -0
  101. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_hvac_bldg_type.json +32 -0
  102. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json +1837 -0
  103. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_swh_bldg_type.json +184 -0
  104. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_wwr_bldg_type.json +84 -0
  105. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +148 -0
  106. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +157 -0
  107. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.climate_zone_sets.json +210 -0
  108. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +18329 -0
  109. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +340 -0
  110. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.materials.json +49924 -0
  111. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_building_rotation_exception.md +44 -0
  112. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/check_pump_power_and_control.md +71 -0
  113. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/dcv.md +68 -0
  114. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/dcv_implementation.png +0 -0
  115. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/elevators.md +14 -0
  116. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/exhaust_air_energy_recovery.md +36 -0
  117. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/f_c_factors.md +19 -0
  118. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/fan_power_credits.md +15 -0
  119. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/preheat_coil.md +59 -0
  120. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/pump_power_control.md +46 -0
  121. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/return_air_type.md +31 -0
  122. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_baseline_wwr.md +191 -0
  123. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_hw_and_chw_supply_water_temp_reset_control.md +24 -0
  124. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_num_boilers_chillers_towers.md +49 -0
  125. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +80 -0
  126. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_space_lpd.md +73 -0
  127. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/unenclosed_and_unconditioned_spaces.md +11 -0
  128. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/unmet_load_hours.md +20 -0
  129. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/vav_parallel_piu_terminals_fan_control.md +23 -0
  130. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/vav_terminals_min_flow_setpoint.md +21 -0
  131. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_airloop_hvac.csv +1 -0
  132. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_airloop_hvac_doas.csv +1 -0
  133. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_building.csv +1 -0
  134. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_design_specification_outdoor_air.csv +1 -0
  135. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_electric_equipment.csv +1 -0
  136. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_exterior_lights.csv +1 -0
  137. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_gas_equipment.csv +1 -0
  138. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_lights.csv +1 -0
  139. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -0
  140. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_spacetype.csv +1 -0
  141. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_thermal_zone.csv +1 -0
  142. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_connections.csv +1 -0
  143. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_equipment.csv +1 -0
  144. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_equipment_definition.csv +1 -0
  145. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_zone_hvac.csv +1 -0
  146. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_zone_infiltration.csv +1 -0
  147. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +12 -0
  148. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +12 -0
  149. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +1 -1
  150. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +1 -1
  151. data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +24 -11
  152. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +13 -15
  153. data/lib/openstudio-standards/standards/necb/NECB2011/data/province_map.json +17 -0
  154. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +1 -1
  155. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +1 -1
  156. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +2 -2
  157. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +6 -5
  158. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +3 -2
  159. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +2 -3
  160. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +2 -2
  161. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +33 -924
  162. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +15 -15
  163. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +135 -29
  164. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +16 -4
  165. data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +40 -42
  166. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +1 -1
  167. data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +89 -89
  168. data/lib/openstudio-standards/utilities/array.rb +11 -0
  169. data/lib/openstudio-standards/utilities/logging.rb +48 -0
  170. data/lib/openstudio-standards/utilities/object_info.rb +20 -0
  171. data/lib/openstudio-standards/utilities/schedule_translator.rb +348 -0
  172. data/lib/openstudio-standards/utilities/sqlfile.rb +68 -0
  173. data/lib/openstudio-standards/version.rb +2 -2
  174. data/lib/openstudio-standards/weather/Weather.Model.rb +42 -55
  175. data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
  176. data/lib/openstudio-standards.rb +35 -1
  177. metadata +111 -6
  178. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  179. data/data/standards/OpenStudio_Standards-ashrae_90_1_28Jan2022.xlsx +0 -0
  180. data/data/standards/OpenStudio_Standards-ashrae_90_1_28_Jan2022_2.xlsx +0 -0
  181. data/data/standards/openstudio_standards_duplicates_log.csv +0 -143
@@ -0,0 +1,194 @@
1
+ class ASHRAE901PRM < Standard
2
+ # @!group CoilHeatingDXSingleSpeed
3
+
4
+ include ASHRAEPRMCoilDX
5
+
6
+ # Finds capacity in W. This is the cooling capacity of the paired DX cooling coil.
7
+ #
8
+ # @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
9
+ # @param sys_type [String] HVAC system type
10
+ # @return [Double] capacity in W to be used for find object
11
+ def coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, sys_type)
12
+ capacity_w = nil
13
+
14
+ # Get the paired cooling coil
15
+ clg_coil = nil
16
+
17
+ # Unitary and zone equipment
18
+ if coil_heating_dx_single_speed.airLoopHVAC.empty?
19
+ if coil_heating_dx_single_speed.containingHVACComponent.is_initialized
20
+ containing_comp = coil_heating_dx_single_speed.containingHVACComponent.get
21
+ if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
22
+ clg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get.coolingCoil
23
+ elsif containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
24
+ unitary = containing_comp.to_AirLoopHVACUnitarySystem.get
25
+ if unitary.coolingCoil.is_initialized
26
+ clg_coil = unitary.coolingCoil.get
27
+ end
28
+ end
29
+ elsif coil_heating_dx_single_speed.containingZoneHVACComponent.is_initialized
30
+ containing_comp = coil_heating_dx_single_speed.containingZoneHVACComponent.get
31
+ # PTHP
32
+ if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
33
+ pthp = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get
34
+ clg_coil = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil
35
+ end
36
+ end
37
+ end
38
+
39
+ # On AirLoop directly
40
+ if coil_heating_dx_single_speed.airLoopHVAC.is_initialized
41
+ air_loop = coil_heating_dx_single_speed.airLoopHVAC.get
42
+ # Check for the presence of any other type of cooling coil
43
+ clg_types = ['OS:Coil:Cooling:DX:SingleSpeed',
44
+ 'OS:Coil:Cooling:DX:TwoSpeed']
45
+ clg_types.each do |ct|
46
+ coils = air_loop.supplyComponents(ct.to_IddObjectType)
47
+ next if coils.empty?
48
+
49
+ clg_coil = coils[0]
50
+ break # Stop on first DX cooling coil found
51
+ end
52
+ end
53
+
54
+ # If no paired cooling coil was found, throw an error and fall back to the heating capacity of the DX heating coil
55
+ if clg_coil.nil?
56
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, the paired DX cooling coil could not be found to determine capacity. Efficiency will incorrectly be based on DX coil's heating capacity.")
57
+ if coil_heating_dx_single_speed.ratedTotalHeatingCapacity.is_initialized
58
+ capacity_w = coil_heating_dx_single_speed.ratedTotalHeatingCapacity.get
59
+ elsif coil_heating_dx_single_speed.autosizedRatedTotalHeatingCapacity.is_initialized
60
+ capacity_w = coil_heating_dx_single_speed.autosizedRatedTotalHeatingCapacity.get
61
+ else
62
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name} capacity is not available, cannot apply efficiency standard to paired DX heating coil.")
63
+ return 0.0
64
+ end
65
+ return capacity_w
66
+ end
67
+
68
+ # If a coil was found, cast to the correct type
69
+ if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized
70
+ clg_coil = clg_coil.to_CoilCoolingDXSingleSpeed.get
71
+ capacity_w = coil_cooling_dx_single_speed_find_capacity(clg_coil, sys_type)
72
+ elsif clg_coil.to_CoilCoolingDXTwoSpeed.is_initialized
73
+ clg_coil = clg_coil.to_CoilCoolingDXTwoSpeed.get
74
+ capacity_w = coil_cooling_dx_two_speed_find_capacity(clg_coil, sys_type)
75
+ end
76
+
77
+ # Check for user data that indicates multiple systems per thermal zone
78
+ # This could be true for a data center where this is common practice
79
+ # Or it could be for a thermal zone that represents multiple real building zones
80
+ mult = 1
81
+ thermal_zone = nil
82
+ comp = coil_heating_dx_single_speed.containingHVACComponent
83
+ if comp.is_initialized
84
+ if comp.get.to_AirLoopHVACUnitarySystem.is_initialized
85
+ unitary = comp.get.to_AirLoopHVACUnitarySystem.get
86
+ thermal_zone = unitary.controllingZoneorThermostatLocation.get
87
+ end
88
+ end
89
+ # meth = comp.methods
90
+ comp = coil_heating_dx_single_speed.containingZoneHVACComponent
91
+ if comp.is_initialized
92
+ if comp.get.thermalZone.is_initialized
93
+ thermal_zone = comp.get.thermalZone.get
94
+ end
95
+ end
96
+
97
+ if !thermal_zone.nil?
98
+ if standards_data.key?('userdata_thermal_zone')
99
+ standards_data['userdata_thermal_zone'].each do |row|
100
+ next unless row['name'].to_s.downcase.strip == thermal_zone.name.to_s.downcase.strip
101
+
102
+ if row['number_of_systems'].to_s.upcase.strip != ''
103
+ mult = row['number_of_systems'].to_s
104
+ if mult.to_i.to_s == mult
105
+ mult = mult.to_i
106
+ capacity_w /= mult
107
+ else
108
+ OpenStudio.logFree(OpenStudio::Error, 'prm.log', 'In userdata_thermalzone, number_of_systems requires integer input.')
109
+ end
110
+ break
111
+ end
112
+ end
113
+ end
114
+ end
115
+
116
+ # If it's a PTAC or PTHP System, we need to divide the capacity by the potential zone multiplier
117
+ # because the COP is dependent on capacity, and the capacity should be the capacity of a single zone, not all the zones
118
+ if sys_type == 'PTHP'
119
+ mult = 1
120
+ comp = coil_heating_dx_single_speed.containingZoneHVACComponent
121
+ if comp.is_initialized
122
+ if comp.get.thermalZone.is_initialized
123
+ mult = comp.get.thermalZone.get.multiplier
124
+ if mult > 1
125
+ total_cap = capacity_w
126
+ capacity_w /= mult
127
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, total capacity of #{OpenStudio.convert(total_cap, 'W', 'kBtu/hr').get.round(2)}kBTU/hr was divided by the zone multiplier of #{mult} to give #{capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get.round(2)}kBTU/hr.")
128
+ end
129
+ end
130
+ end
131
+ end
132
+
133
+ return capacity_w
134
+ end
135
+
136
+ # Finds lookup object in standards and return efficiency
137
+ #
138
+ # @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
139
+ # @param sys_type [String] HVAC system type
140
+ # @param rename [Bool] if true, object will be renamed to include capacity and efficiency level
141
+ # @return [Double] full load efficiency (COP)
142
+ def coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, sys_type, rename = false)
143
+ # find ac properties
144
+ capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, sys_type)
145
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
146
+ search_criteria = coil_dx_find_search_criteria(coil_heating_dx_single_speed, capacity_btu_per_hr, sys_type)
147
+
148
+ # find object
149
+ ac_props = nil
150
+ ac_props = model_find_object(standards_data['heat_pumps_heating'], search_criteria, capacity_btu_per_hr, Date.today)
151
+ # Get the minimum efficiency standards
152
+ cop = nil
153
+
154
+ # Check to make sure properties were found
155
+ if ac_props.nil?
156
+ 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.")
157
+ return cop # value of nil
158
+ end
159
+
160
+ cop = ac_props['copnfcooling']
161
+ new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_btu_per_hr.round}Btu/hr #{cop}COP"
162
+
163
+ # Rename
164
+ if rename
165
+ coil_heating_dx_single_speed.setName(new_comp_name)
166
+ end
167
+
168
+ return cop
169
+ end
170
+
171
+ # Applies the standard efficiency ratings and typical performance curves to this object.
172
+ #
173
+ # @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
174
+ # @param sql_db_vars_map [Hash] hash map
175
+ # @param sys_type [String] HVAC system type
176
+ # @return [Hash] hash of coil objects
177
+ def coil_heating_dx_single_speed_apply_efficiency_and_curves(coil_heating_dx_single_speed, sql_db_vars_map, sys_type)
178
+ # Preserve the original name
179
+ orig_name = coil_heating_dx_single_speed.name.to_s
180
+
181
+ # Find the minimum COP and rename with efficiency rating
182
+ cop = coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, sys_type, false)
183
+
184
+ # Map the original name to the new name
185
+ sql_db_vars_map[coil_heating_dx_single_speed.name.to_s] = orig_name
186
+
187
+ # Set the efficiency values
188
+ unless cop.nil?
189
+ coil_heating_dx_single_speed.setRatedCOP(cop)
190
+ end
191
+
192
+ return sql_db_vars_map
193
+ end
194
+ end
@@ -0,0 +1,120 @@
1
+ class ASHRAE901PRM < Standard
2
+ # @!group BoilerHotWater
3
+
4
+ # find search criteria
5
+ #
6
+ # @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
7
+ # @param sys_type [String] HVAC system type
8
+ # @return [Hash] used for standards_lookup_table(model)
9
+ def coil_heating_gas_find_search_criteria(coil_heating_gas, sys_type)
10
+ # Define the criteria to find the furnace properties
11
+ # in the hvac standards data set.
12
+ search_criteria = {}
13
+ search_criteria['fuel_type'] = 'Gas'
14
+ if sys_type == 'PSZ_AC'
15
+ search_criteria['subcategory'] = 'Furnace'
16
+ elsif sys_type == 'Gas_Furnace'
17
+ search_criteria['subcategory'] = 'Unit Heater'
18
+ else
19
+ search_criteria['subcategory'] = 'Furnace'
20
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "#{coil_heating_gas.name} is not for a PSZ-AC or Gas Furnace and cannot apply efficiency standard.")
21
+ end
22
+
23
+ return search_criteria
24
+ end
25
+
26
+ # find furnace capacity
27
+ #
28
+ # @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
29
+ # @return [Double] capacity in W to be used for find object
30
+ def coil_heating_gas_find_capacity(coil_heating_gas)
31
+ # Get the coil capacity
32
+ capacity_w = nil
33
+ if coil_heating_gas.nominalCapacity.is_initialized
34
+ capacity_w = coil_heating_gas.nominalCapacity.get
35
+ elsif coil_heating_gas.autosizedNominalCapacity.is_initialized
36
+ capacity_w = coil_heating_gas.autosizedNominalCapacity.get
37
+ else
38
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name} capacity is not available, cannot apply efficiency standard.")
39
+ successfully_set_all_properties = false
40
+ return successfully_set_all_properties
41
+ end
42
+
43
+ return capacity_w
44
+ end
45
+
46
+ # Finds lookup object in standards and return minimum thermal efficiency
47
+ #
48
+ # @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
49
+ # @param sys_type [String] HVAC system type
50
+ # @param rename [Bool] if true, object will be renamed to include capacity and efficiency level
51
+ # @return [Double] minimum thermal efficiency
52
+ def coil_heating_gas_standard_minimum_thermal_efficiency(coil_heating_gas, sys_type, rename = false)
53
+ # Get the coil properties
54
+ search_criteria = coil_heating_gas_find_search_criteria(coil_heating_gas, sys_type)
55
+ capacity_w = coil_heating_gas_find_capacity(coil_heating_gas)
56
+ capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
57
+ capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
58
+
59
+ # Get the minimum efficiency standards
60
+ thermal_eff = nil
61
+
62
+ # Get the coil properties
63
+ coil_table = @standards_data['furnaces']
64
+ coil_props = model_find_object(coil_table, search_criteria, [capacity_btu_per_hr, 0.001].max)
65
+
66
+ # Check to make sure properties were found
67
+ if coil_props.nil?
68
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name}, cannot find efficiency info using #{search_criteria}, cannot apply efficiency standard.")
69
+ successfully_set_all_properties = false
70
+ return successfully_set_all_properties
71
+ end
72
+
73
+ # New name initial value
74
+ new_comp_name = coil_heating_gas.name
75
+
76
+ # If specified as thermal efficiency
77
+ unless coil_props['minimum_thermal_efficiency'].nil?
78
+ thermal_eff = coil_props['minimum_thermal_efficiency']
79
+ new_comp_name = "#{coil_heating_gas.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{thermal_eff} Thermal Eff"
80
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGas', "For #{template}: #{coil_heating_gas.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; Thermal Efficiency = #{thermal_eff}")
81
+ end
82
+
83
+ # If specified as combustion efficiency
84
+ unless coil_props['minimum_combustion_efficiency'].nil?
85
+ min_comb_eff = coil_props['minimum_combustion_efficiency']
86
+ thermal_eff = combustion_eff_to_thermal_eff(min_comb_eff)
87
+ new_comp_name = "#{coil_heating_gas.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_comb_eff} Combustion Eff"
88
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGas', "For #{template}: #{coil_heating_gas.name}: Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; Combustion Efficiency = #{min_comb_eff}")
89
+ end
90
+
91
+ unless thermal_eff
92
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{CoilHeatingGas.name}, cannot find coil efficiency, cannot apply efficiency standard.")
93
+ successfully_set_all_properties = false
94
+ return successfully_set_all_properties
95
+ end
96
+
97
+ # Rename
98
+ if rename
99
+ coil_heating_gas.setName(new_comp_name)
100
+ end
101
+
102
+ return thermal_eff
103
+ end
104
+
105
+ # Applies the standard efficiency ratings and typical performance curves to this object.
106
+ #
107
+ # @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] coil heating gas object
108
+ # @param sql_db_vars_map [Hash] hash map
109
+ # @param sys_type [String] HVAC system type
110
+ # @return [Hash] hash of coil objects
111
+ def coil_heating_gas_apply_efficiency_and_curves(coil_heating_gas, sql_db_vars_map, sys_type)
112
+ # Thermal efficiency
113
+ thermal_eff = coil_heating_gas_standard_minimum_thermal_efficiency(coil_heating_gas, sys_type)
114
+
115
+ # Set the efficiency values
116
+ coil_heating_gas.setGasBurnerEfficiency(thermal_eff.to_f)
117
+
118
+ return sql_db_vars_map
119
+ end
120
+ end
@@ -0,0 +1,110 @@
1
+ # A variety of cooling tower methods that are the same regardless of type.
2
+ # These methods are available to CoolingTowerSingleSpeed, CoolingTowerTwoSpeed, and CoolingTowerVariableSpeed
3
+ module ASHRAEPRMCoolingTower
4
+ # @!group CoolingTower
5
+
6
+ # Set the cooling tower fan power such that the tower
7
+ # hits the minimum performance (gpm/hp) specified by the standard.
8
+ # Note that in this case hp is motor nameplate hp, per 90.1.
9
+ # This method assumes that the fan brake horsepower is 90%
10
+ # of the motor nameplate hp.
11
+ # This method determines the minimum motor efficiency
12
+ # for the nameplate motor hp and sets the actual
13
+ # fan power by multiplying the brake horsepower
14
+ # by the efficiency. Thus the fan power used as
15
+ # an input to the simulation divided by the design flow
16
+ # rate will not (and should not)
17
+ # exactly equal the minimum tower performance.
18
+ #
19
+ # @param cooling_tower [OpenStudio::Model::StraightComponent] cooling tower object, allowable types:
20
+ # CoolingTowerSingleSpeed, CoolingTowerTwoSpeed, and CoolingTowerVariableSpeed
21
+ # @return [Bool] returns true if successful, false if not
22
+ def cooling_tower_apply_minimum_power_per_flow(cooling_tower)
23
+ # Get the design water flow rate
24
+ design_water_flow_m3_per_s = nil
25
+ if cooling_tower.designWaterFlowRate.is_initialized
26
+ design_water_flow_m3_per_s = cooling_tower.designWaterFlowRate.get
27
+ elsif cooling_tower.autosizedDesignWaterFlowRate.is_initialized
28
+ design_water_flow_m3_per_s = cooling_tower.autosizedDesignWaterFlowRate.get
29
+ else
30
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name} design water flow rate is not available, cannot apply efficiency standard.")
31
+ return false
32
+ end
33
+ design_water_flow_gpm = OpenStudio.convert(design_water_flow_m3_per_s, 'm^3/s', 'gal/min').get
34
+
35
+ # Get the table of cooling tower efficiencies
36
+ heat_rejection = standards_data['heat_rejection']
37
+
38
+ # Define the criteria to find the cooling tower properties
39
+ # in the hvac standards data set.
40
+ search_criteria = {}
41
+ search_criteria['template'] = template
42
+
43
+ # By definition cooling towers in E+ are open.
44
+ # Closed cooling towers are the fluidcooler objects.
45
+ search_criteria['equipment_type'] = 'Open Cooling Tower'
46
+
47
+ # Define the criteria to find the fan type
48
+ search_criteria['fan_type'] = 'Axial'
49
+
50
+ # Get the cooling tower properties
51
+ ct_props = model_find_object(heat_rejection, search_criteria)
52
+ unless ct_props
53
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, cannot find heat rejection properties, cannot apply standard efficiencies or curves.")
54
+ return false
55
+ end
56
+
57
+ # Get cooling tower efficiency
58
+ min_gpm_per_hp = ct_props['minimum_performance']
59
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, design water flow = #{design_water_flow_gpm.round} gpm, minimum performance = #{min_gpm_per_hp} gpm/hp (nameplate).")
60
+
61
+ # Calculate the allowed fan brake horsepower
62
+ # per method used in PNNL prototype buildings.
63
+ # Assumes that the fan brake horsepower is 90%
64
+ # of the fan nameplate rated motor power.
65
+ fan_motor_nameplate_hp = design_water_flow_gpm / min_gpm_per_hp
66
+ fan_bhp = 0.9 * fan_motor_nameplate_hp
67
+
68
+ # Lookup the minimum motor efficiency
69
+ fan_motor_eff = 0.85
70
+ motors = standards_data['motors']
71
+
72
+ # Assuming all fan motors are 4-pole Enclosed
73
+ search_criteria = {
74
+ 'template' => template,
75
+ 'number_of_poles' => 'Any',
76
+ 'type' => 'Any'
77
+ }
78
+
79
+ motor_properties = model_find_object(motors, search_criteria, fan_motor_nameplate_hp)
80
+ if motor_properties.nil?
81
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, could not find motor properties using search criteria: #{search_criteria}, motor_hp = #{fan_motor_nameplate_hp} hp.")
82
+ return false
83
+ end
84
+
85
+ fan_motor_eff = motor_properties['nominal_full_load_efficiency']
86
+ nominal_hp = motor_properties['maximum_capacity'].to_f.round(1)
87
+ # Round to nearest whole HP for niceness
88
+ if nominal_hp >= 2
89
+ nominal_hp = nominal_hp.round
90
+ end
91
+
92
+ # Calculate the fan motor power
93
+ fan_motor_actual_power_hp = fan_bhp / fan_motor_eff
94
+ # Convert to W
95
+ fan_motor_actual_power_w = fan_motor_actual_power_hp * 745.7 # 745.7 W/HP
96
+
97
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoolingTower', "For #{cooling_tower.name}, allowed fan motor nameplate hp = #{fan_motor_nameplate_hp.round(1)} hp, fan brake horsepower = #{fan_bhp.round(1)}, and fan motor actual power = #{fan_motor_actual_power_hp.round(1)} hp (#{fan_motor_actual_power_w.round} W) at #{fan_motor_eff} motor efficiency.")
98
+
99
+ # Append the efficiency to the name
100
+ cooling_tower.setName("#{cooling_tower.name} #{min_gpm_per_hp.round(1)} gpm/hp")
101
+
102
+ # Hard size the design fan power.
103
+ # Leave the water flow and air flow autosized.
104
+ if cooling_tower.to_CoolingTowerVariableSpeed.is_initialized
105
+ cooling_tower.setDesignFanPower(fan_motor_actual_power_w)
106
+ end
107
+
108
+ return true
109
+ end
110
+ end
@@ -0,0 +1,5 @@
1
+ class ASHRAE901PRM < Standard
2
+ # @!group CoolingTowerVariableSpeed
3
+
4
+ include ASHRAEPRMCoolingTower
5
+ end
@@ -0,0 +1,73 @@
1
+ # A variety of fan calculation methods that are the same regardless of fan type.
2
+ # These methods are available to FanConstantVolume, FanOnOff, FanVariableVolume, and FanZoneExhaust
3
+ module ASHRAE901PRMFan
4
+ # Determines the minimum fan motor efficiency and nominal size for a given motor bhp.
5
+ # This should be the total brake horsepower with any desired safety factor already included.
6
+ # This method picks the next nominal motor catgory larger than the required brake horsepower,
7
+ # and the efficiency is based on that size.
8
+ # For example, if the bhp = 6.3, the nominal size will be 7.5HP and the efficiency
9
+ # for 90.1-2010 will be 91.7% from Table 10.8B.
10
+ # This method assumes 4-pole, 1800rpm totally-enclosed fan-cooled motors.
11
+ #
12
+ # @param fan [OpenStudio::Model::StraightComponent] fan object, allowable types:
13
+ # FanConstantVolume, FanOnOff, FanVariableVolume, and FanZoneExhaust
14
+ # @param motor_bhp [Double] motor brake horsepower (hp)
15
+ # @return [Array<Double>] minimum motor efficiency (0.0 to 1.0), nominal horsepower
16
+ def fan_standard_minimum_motor_efficiency_and_size(fan, motor_bhp)
17
+ fan_motor_eff = 0.85
18
+ nominal_hp = motor_bhp
19
+
20
+ # Don't attempt to look up motor efficiency
21
+ # for zero-hp fans, which may occur when there is no
22
+ # airflow required for a particular system, typically
23
+ # heated-only spaces with high internal gains
24
+ # and no OA requirements such as elevator shafts.
25
+ return [fan_motor_eff, 0] if motor_bhp == 0.0
26
+
27
+ # Lookup the minimum motor efficiency
28
+ motors = standards_data['motors']
29
+
30
+ # Assuming all fan motors are 4-pole ODP
31
+ search_criteria = {
32
+ 'template' => template,
33
+ 'number_of_poles' => 4.0,
34
+ 'type' => 'Enclosed'
35
+ }
36
+
37
+ # Exception for small fans, including
38
+ # zone exhaust, fan coil, and fan powered terminals.
39
+ # In this case, use the 0.5 HP for the lookup.
40
+ if fan_small_fan?(fan)
41
+ nominal_hp = 0.5
42
+ else
43
+ motor_properties = model_find_object(motors, search_criteria, capacity = nil, date = nil, area = nil, num_floors = nil, fan_motor_bhp = motor_bhp)
44
+ if motor_properties.nil?
45
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Fan', "For #{fan.name}, could not find motor properties using search criteria: #{search_criteria}, motor_bhp = #{motor_bhp} hp.")
46
+ return [fan_motor_eff, nominal_hp]
47
+ end
48
+
49
+ # If the biggest fan motor size is hit, use the highest category efficiency
50
+ if nominal_hp == 9999.0
51
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Fan', "For #{fan.name}, there is no greater nominal HP. Use the efficiency of the largest motor category.")
52
+ nominal_hp = motor_bhp
53
+ end
54
+
55
+ # Round to nearest whole HP for niceness
56
+ if nominal_hp >= 2
57
+ nominal_hp = nominal_hp.round
58
+ end
59
+ end
60
+
61
+ # Get the efficiency based on the nominal horsepower
62
+ motor_properties = model_find_object(motors, search_criteria, fan_motor_bhp = motor_bhp)
63
+
64
+ if motor_properties.nil?
65
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Fan', "For #{fan.name}, could not find nominal motor properties using search criteria: #{search_criteria}, motor_hp = #{nominal_hp} hp.")
66
+ return [fan_motor_eff, nominal_hp]
67
+ end
68
+ fan_motor_eff = motor_properties['nominal_full_load_efficiency']
69
+ nominal_hp = motor_properties['maximum_capacity'].round(1)
70
+
71
+ return [fan_motor_eff, nominal_hp]
72
+ end
73
+ end
@@ -0,0 +1,5 @@
1
+ class ASHRAE901PRM
2
+ # @!group FanConstantVolume
3
+
4
+ include ASHRAE901PRMFan
5
+ end
@@ -0,0 +1,5 @@
1
+ class ASHRAE901PRM
2
+ # @!group FanOnOff
3
+
4
+ include ASHRAE901PRMFan
5
+ end
@@ -0,0 +1,24 @@
1
+ class ASHRAE901PRM
2
+ # @!group FanVariableVolume
3
+
4
+ include ASHRAE901PRMFan
5
+
6
+ # Determines whether there is a requirement to have a VSD or some other method to reduce fan power at low part load ratios.
7
+ # Required for all VAV fans for stable baseline
8
+ # @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
9
+ # @return [Bool] returns true if required, false if not
10
+ def fan_variable_volume_part_load_fan_power_limitation?(fan_variable_volume)
11
+ part_load_control_required = true
12
+ return part_load_control_required
13
+ end
14
+
15
+ # The threhold horsepower below which part load control is not required.
16
+ # always required for stable baseline, so threshold is zero
17
+ #
18
+ # @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
19
+ # @return [Double] the limit, in horsepower. Return zero for no limit by default.
20
+ def fan_variable_volume_part_load_fan_power_limitation_hp_limit(fan_variable_volume)
21
+ hp_limit = 0
22
+ return hp_limit
23
+ end
24
+ end
@@ -0,0 +1,5 @@
1
+ class ASHRAE901PRM
2
+ # @!group FanZoneExhaust
3
+
4
+ include ASHRAE901PRMFan
5
+ end
@@ -0,0 +1,55 @@
1
+ class ASHRAE901PRM < Standard
2
+ # @!group HeatExchangerSensLat
3
+
4
+ # Defines the minimum sensible and latent effectiveness of the heat exchanger.
5
+ # Assumed to apply to sensible and latent effectiveness at all flow rates.
6
+ #
7
+ # @param heat_exchanger_air_to_air_sensible_and_latent [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio heat exchanger object
8
+ # @return [Array] List of full and part load heat exchanger effectiveness
9
+ def heat_exchanger_air_to_air_sensible_and_latent_minimum_effectiveness(heat_exchanger_air_to_air_sensible_and_latent)
10
+ # Get required ERR
11
+ enthalpy_recovery_ratio = heat_exchanger_air_to_air_sensible_and_latent_enthalpy_recovery_ratio(heat_exchanger_air_to_air_sensible_and_latent)
12
+
13
+ # Get design condition for climate zones
14
+ climate_zone = model_standards_climate_zone(heat_exchanger_air_to_air_sensible_and_latent.model)
15
+ design_conditions = heat_exchanger_air_to_air_sensible_and_latent_design_conditions(heat_exchanger_air_to_air_sensible_and_latent, climate_zone)
16
+
17
+ # Adjust, and convert ERR to Effectiveness for input to the model
18
+ enthalpy_recovery_ratio = enthalpy_recovery_ratio_design_to_typical_adjustment(enthalpy_recovery_ratio, climate_zone)
19
+ full_htg_sens_eff, full_htg_lat_eff, part_htg_sens_eff, part_htg_lat_eff, full_cool_sens_eff, full_cool_lat_eff, part_cool_sens_eff, part_cool_lat_eff = heat_exchanger_air_to_air_sensible_and_latent_enthalpy_recovery_ratio_to_effectiveness(enthalpy_recovery_ratio, design_conditions)
20
+
21
+ return full_htg_sens_eff, full_htg_lat_eff, part_htg_sens_eff, part_htg_lat_eff, full_cool_sens_eff, full_cool_lat_eff, part_cool_sens_eff, part_cool_lat_eff
22
+ end
23
+
24
+ # Determine the heat exchanger design conditions for a specific climate zones
25
+ #
26
+ # @param heat_exchanger_air_to_air_sensible_and_latent [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio heat exchanger object
27
+ # @param climate_zone [String] Climate zone used to generate the model
28
+ # @return [String] Heat exchanger design conditions
29
+ def heat_exchanger_air_to_air_sensible_and_latent_design_conditions(heat_exchanger_air_to_air_sensible_and_latent, climate_zone)
30
+ case climate_zone
31
+ when 'ASHRAE 169-2006-6B',
32
+ 'ASHRAE 169-2013-6B',
33
+ 'ASHRAE 169-2006-7A',
34
+ 'ASHRAE 169-2013-7A',
35
+ 'ASHRAE 169-2006-7B',
36
+ 'ASHRAE 169-2013-7B',
37
+ 'ASHRAE 169-2006-8A',
38
+ 'ASHRAE 169-2013-8A',
39
+ 'ASHRAE 169-2006-8B',
40
+ 'ASHRAE 169-2013-8B'
41
+ design_conditions = 'heating'
42
+ else
43
+ design_conditions = 'cooling'
44
+ end
45
+ return design_conditions
46
+ end
47
+
48
+ # Determine the required enthalpy recovery ratio (ERR)
49
+ #
50
+ # @param heat_exchanger_air_to_air_sensible_and_latent [OpenStudio::Model::HeatExchangerAirToAirSensibleAndLatent] OpenStudio heat exchanger object
51
+ # @return [Float] ERR
52
+ def heat_exchanger_air_to_air_sensible_and_latent_enthalpy_recovery_ratio(heat_exchanger_air_to_air_sensible_and_latent)
53
+ return 0.5
54
+ end
55
+ end