openstudio-standards 0.7.1 → 0.8.0.rc2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (363) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAE90120162019LargeHotel.json +58 -13
  3. data/data/geometry/ASHRAELargeHotel.json +58 -13
  4. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  5. data/data/standards/export_OpenStudio_libraries.rb +2 -2
  6. data/data/standards/manage_OpenStudio_Standards.rb +6 -6
  7. data/data/standards/openstudio_standards_duplicates_log.csv +7961 -1
  8. data/data/standards/test_performance_expected_dd_results.csv +2016 -2004
  9. data/lib/openstudio-standards/btap/fileio.rb +171 -5
  10. data/lib/openstudio-standards/constructions/create.rb +38 -4
  11. data/lib/openstudio-standards/constructions/modify.rb +10 -3
  12. data/lib/openstudio-standards/create_typical/create_typical.rb +42 -28
  13. data/lib/openstudio-standards/create_typical/space_type_information.rb +160 -0
  14. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +22 -21
  15. data/lib/openstudio-standards/exterior_lighting/create.rb +454 -0
  16. data/lib/openstudio-standards/exterior_lighting/data/entryways.csv +52 -0
  17. data/lib/openstudio-standards/exterior_lighting/data/parking.csv +54 -0
  18. data/lib/openstudio-standards/exterior_lighting/data/typical_exterior_lighting.json +37 -0
  19. data/lib/openstudio-standards/exterior_lighting/information.rb +202 -0
  20. data/lib/openstudio-standards/geometry/information.rb +49 -2
  21. data/lib/openstudio-standards/hvac/components/create.rb +169 -0
  22. data/lib/openstudio-standards/hvac/components/modify.rb +42 -0
  23. data/lib/openstudio-standards/hvac/exhaust/create_exhaust_fan.rb +108 -0
  24. data/lib/openstudio-standards/hvac/exhaust/data/convert_data.rb +86 -0
  25. data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.csv +18 -0
  26. data/lib/openstudio-standards/hvac/exhaust/data/typical_exhaust.json +89 -0
  27. data/lib/openstudio-standards/infiltration/nist_infiltration.rb +25 -13
  28. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +0 -64
  29. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +0 -25
  30. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +0 -25
  31. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +1 -11
  32. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +5 -1
  33. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +1 -1
  34. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -7
  35. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +36 -18
  36. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +1 -1
  37. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +121 -239
  38. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +179 -151
  39. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +0 -466
  40. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +18 -2
  41. data/lib/openstudio-standards/refrigeration/create_case.rb +125 -0
  42. data/lib/openstudio-standards/refrigeration/create_compressor.rb +78 -0
  43. data/lib/openstudio-standards/refrigeration/create_compressor_rack.rb +48 -0
  44. data/lib/openstudio-standards/refrigeration/create_refrigeration_system.rb +74 -0
  45. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +161 -0
  46. data/lib/openstudio-standards/refrigeration/create_walkin.rb +116 -0
  47. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -0
  48. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -0
  49. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +13 -0
  50. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_cases.csv +17 -0
  51. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_walkins.csv +53 -0
  52. data/lib/openstudio-standards/refrigeration/information.rb +130 -0
  53. data/lib/openstudio-standards/schedules/parametric.rb +1 -1
  54. data/lib/openstudio-standards/service_water_heating/create_typical.rb +299 -0
  55. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -14
  56. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +119 -0
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +54 -0
  58. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +810 -0
  59. data/lib/openstudio-standards/service_water_heating/information.rb +69 -0
  60. data/lib/openstudio-standards/sql_file/fenestration.rb +1 -1
  61. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +154 -0
  62. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +35 -12
  63. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +110 -61
  64. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +128 -29
  65. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +103 -38
  66. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  67. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +106 -5
  68. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +8 -8
  69. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +44 -17
  70. data/lib/openstudio-standards/standards/Standards.Fan.rb +32 -21
  71. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +45 -18
  72. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +14 -9
  73. data/lib/openstudio-standards/standards/Standards.Model.rb +294 -76
  74. data/lib/openstudio-standards/standards/Standards.Motor.rb +66 -0
  75. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -1
  76. data/lib/openstudio-standards/standards/Standards.Pump.rb +34 -20
  77. data/lib/openstudio-standards/standards/Standards.ServiceWaterHeating.rb +0 -353
  78. data/lib/openstudio-standards/standards/Standards.Space.rb +3 -107
  79. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +2 -57
  80. data/lib/openstudio-standards/standards/Standards.Surface.rb +11 -3
  81. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -120
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +142 -0
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +1006 -596
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.energy_recovery.json +724 -0
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +1258 -163
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +1070 -140
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +33 -3374
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +1400 -340
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.vrfs.json +769 -0
  90. 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 +2 -5338
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +142 -0
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +1006 -596
  93. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.energy_recovery.json +724 -0
  94. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +1258 -163
  95. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +1070 -140
  96. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +15 -3343
  97. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +1840 -372
  98. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.vrfs.json +769 -0
  99. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +20 -10
  100. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +0 -9
  101. 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 +0 -5382
  102. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +142 -0
  103. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +1006 -628
  104. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +718 -712
  105. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +1438 -163
  106. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +2552 -182
  107. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +14 -3368
  108. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +2348 -352
  109. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.vrfs.json +769 -0
  110. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +47 -61
  111. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +6 -0
  112. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Motor.rb +11 -0
  113. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +0 -9
  114. 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 +2 -5522
  115. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +142 -0
  116. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +1006 -628
  117. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1358 -1346
  118. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +1438 -163
  119. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +1359 -189
  120. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +19 -3451
  121. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +2176 -616
  122. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.vrfs.json +616 -0
  123. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +47 -61
  124. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +9 -0
  125. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Motor.rb +11 -0
  126. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +0 -9
  127. 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 +8 -6055
  128. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +142 -0
  129. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +1006 -628
  130. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1188 -1424
  131. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +1498 -163
  132. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +1769 -189
  133. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +15 -3422
  134. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +1807 -408
  135. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.vrfs.json +1024 -0
  136. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +70 -87
  137. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +9 -0
  138. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Motor.rb +11 -0
  139. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +0 -9
  140. 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 +8 -6080
  141. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +142 -0
  142. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +1006 -628
  143. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2806 -3296
  144. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +1558 -163
  145. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +1759 -189
  146. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +16 -3448
  147. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +2758 -422
  148. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.vrfs.json +684 -0
  149. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +14 -3318
  150. 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 +2 -4786
  151. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.chillers.json +1 -1
  152. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +953 -207
  153. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.energy_recovery.json +724 -0
  154. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.ext_ltg.json +5 -5
  155. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +11 -2858
  156. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirConditionerVariableRefrigerantFlow.rb +13 -0
  157. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +0 -18
  158. 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 +1 -4739
  159. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.chillers.json +0 -51
  160. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +953 -207
  161. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.energy_recovery.json +724 -0
  162. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.ext_ltg.json +5 -5
  163. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -2830
  164. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirConditionerVariableRefrigerantFlow.rb +13 -0
  165. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +0 -18
  166. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.economizers.json +1006 -564
  167. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.energy_recovery.json +1264 -0
  168. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ext_ltg.json +5 -5
  169. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +0 -1079
  170. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +132 -288
  171. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +44 -20
  172. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +11 -0
  173. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +0 -8
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +1006 -564
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.energy_recovery.json +1264 -0
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +5 -5
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +0 -1079
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +137 -288
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +44 -20
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +11 -0
  181. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +0 -9
  182. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +12 -10
  183. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +8 -6
  184. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +8 -6
  185. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +9 -3
  186. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +6 -40
  187. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +30 -337
  188. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +4 -5
  189. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -2
  190. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +56 -3
  191. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +80 -0
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +0 -10
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +35 -0
  194. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.economizers.json +550 -0
  195. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.energy_recovery.json +724 -0
  196. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.ext_ltg.json +1216 -0
  197. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +5 -5
  198. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +225 -245
  199. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +174 -78
  200. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +354 -317
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +19 -3
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac.json +185 -0
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac_doas.json +127 -0
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_building.json +121 -0
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_design_specification_outdoor_air.json +49 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_electric_equipment.json +113 -0
  207. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_exterior_lights.json +120 -0
  208. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_space.json +388 -0
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_spacetype.json +367 -0
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_thermal_zone.json +56 -0
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_connections.json +37 -0
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment.json +69 -0
  213. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment_definition.json +37 -0
  214. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/data/cbes_pre_1978.ext_ltg.json +5 -5
  215. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/data/cbes_t24_1978.ext_ltg.json +5 -5
  216. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/data/cbes_t24_1992.ext_ltg.json +5 -5
  217. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/data/cbes_t24_2001.ext_ltg.json +5 -5
  218. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/data/cbes_t24_2005.ext_ltg.json +5 -5
  219. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/data/cbes_t24_2008.ext_ltg.json +5 -5
  220. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +5 -5
  221. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ext_ltg.json +5 -5
  222. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +5 -5
  223. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ext_ltg.json +5 -5
  224. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +5 -5
  225. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ext_ltg.json +5 -5
  226. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +5 -5
  227. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ext_ltg.json +5 -5
  228. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +5 -5
  229. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ext_ltg.json +5 -5
  230. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +5 -5
  231. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ext_ltg.json +5 -5
  232. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +5 -5
  233. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ext_ltg.json +5 -5
  234. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +5 -5
  235. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ext_ltg.json +5 -5
  236. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.ext_ltg.json +5 -5
  237. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ext_ltg.json +5 -5
  238. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.ext_ltg.json +5 -5
  239. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ext_ltg.json +5 -5
  240. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.ext_ltg.json +5 -5
  241. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ext_ltg.json +5 -5
  242. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.ext_ltg.json +5 -5
  243. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ext_ltg.json +5 -5
  244. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.ext_ltg.json +5 -5
  245. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ext_ltg.json +5 -5
  246. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.ext_ltg.json +5 -5
  247. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ext_ltg.json +5 -5
  248. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.ext_ltg.json +5 -5
  249. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ext_ltg.json +5 -5
  250. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.ext_ltg.json +5 -5
  251. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ext_ltg.json +5 -5
  252. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.ext_ltg.json +5 -5
  253. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ext_ltg.json +5 -5
  254. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.ext_ltg.json +5 -5
  255. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ext_ltg.json +5 -5
  256. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.ext_ltg.json +5 -5
  257. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ext_ltg.json +5 -5
  258. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.ext_ltg.json +5 -5
  259. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ext_ltg.json +5 -5
  260. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +5 -5
  261. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ext_ltg.json +5 -5
  262. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +10 -1
  263. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/unitary_acs.json +20 -20
  264. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +379 -27
  265. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +1 -4
  266. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +0 -1
  267. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +1 -1
  268. data/lib/openstudio-standards/standards/necb/NECB2011/data/unitary_acs.json +20 -20
  269. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +34 -22
  270. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +76 -23
  271. data/lib/openstudio-standards/standards/necb/NECB2011/necb_shw_calculation.xlsx +0 -0
  272. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -5
  273. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +6 -2
  274. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +26 -24
  275. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -1
  276. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +38 -32
  277. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +215 -18
  278. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +190 -15
  279. data/lib/openstudio-standards/standards/necb/common/national_carbon_price_sched_feb_2025.json +60 -0
  280. data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +92 -0
  281. data/lib/openstudio-standards/utilities/ruleset_check.rb +204 -0
  282. data/lib/openstudio-standards/version.rb +1 -1
  283. data/lib/openstudio-standards/weather/information.rb +1 -1
  284. data/lib/openstudio-standards.rb +32 -12
  285. metadata +78 -80
  286. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +0 -13
  287. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +0 -13
  288. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +0 -13
  289. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -432
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +0 -11
  291. 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 +0 -169
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_cases.json +0 -1456
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.ref_lnup.json +0 -562
  294. 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 +0 -20804
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +0 -11
  296. 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 +0 -169
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_cases.json +0 -1456
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.ref_lnup.json +0 -562
  299. 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 +0 -169
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_cases.json +0 -1456
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.ref_lnup.json +0 -562
  302. 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 +0 -169
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_cases.json +0 -1456
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.ref_lnup.json +0 -562
  305. 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 +0 -169
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_cases.json +0 -763
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.ref_lnup.json +0 -562
  308. 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 +0 -169
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_cases.json +0 -763
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.ref_lnup.json +0 -562
  311. 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 +0 -169
  312. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_cases.json +0 -1456
  313. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.ref_lnup.json +0 -562
  314. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ext_ltg.json +0 -169
  315. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_cases.json +0 -1456
  316. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.ref_lnup.json +0 -562
  317. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +0 -213
  318. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +0 -11
  319. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +0 -11
  320. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +0 -11
  321. data/lib/openstudio-standards/standards/deer/deer.Space.rb +0 -20
  322. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_cases.json +0 -1456
  323. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_lnup.json +0 -562
  324. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_cases.json +0 -1456
  325. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_lnup.json +0 -562
  326. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_cases.json +0 -1456
  327. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_lnup.json +0 -562
  328. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_cases.json +0 -1456
  329. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_lnup.json +0 -562
  330. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_cases.json +0 -1456
  331. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_lnup.json +0 -562
  332. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_cases.json +0 -1456
  333. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_lnup.json +0 -562
  334. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_cases.json +0 -1456
  335. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_lnup.json +0 -562
  336. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_cases.json +0 -1456
  337. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_lnup.json +0 -562
  338. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_cases.json +0 -1456
  339. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_lnup.json +0 -562
  340. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_cases.json +0 -1456
  341. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_lnup.json +0 -562
  342. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_cases.json +0 -1456
  343. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_lnup.json +0 -562
  344. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_cases.json +0 -1456
  345. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_lnup.json +0 -562
  346. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_cases.json +0 -1456
  347. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_lnup.json +0 -562
  348. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_cases.json +0 -1456
  349. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_lnup.json +0 -562
  350. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_cases.json +0 -1456
  351. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_lnup.json +0 -562
  352. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_cases.json +0 -1456
  353. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_lnup.json +0 -562
  354. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_cases.json +0 -1456
  355. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_lnup.json +0 -562
  356. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_cases.json +0 -1456
  357. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_lnup.json +0 -562
  358. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_cases.json +0 -1456
  359. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_lnup.json +0 -562
  360. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_cases.json +0 -1456
  361. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_lnup.json +0 -562
  362. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_cases.json +0 -1456
  363. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_lnup.json +0 -562
@@ -388,472 +388,6 @@ class Standard
388
388
  return compressor
389
389
  end
390
390
 
391
- # Find the thermal zone that is best for adding refrigerated display cases into.
392
- # First, check for space types that typically have refrigeration.
393
- # Fall back to largest zone in the model if no typical space types are found.
394
- #
395
- # @param model [OpenStudio::Model::Model] OpenStudio model object
396
- # @return [OpenStudio::Model::ThermalZone] returns a thermal zone if found, nil if not.
397
- def model_typical_display_case_zone(model)
398
- # Ideally, look for one of the space types
399
- # that would typically have refrigeration.
400
- display_case_zone = nil
401
- display_case_zone_area_m2 = 0
402
- model.getThermalZones.each do |zone|
403
- space_type = OpenstudioStandards::ThermalZone.thermal_zone_get_space_type(zone)
404
- next if space_type.empty?
405
-
406
- space_type = space_type.get
407
- next if space_type.standardsSpaceType.empty?
408
- next if space_type.standardsBuildingType.empty?
409
-
410
- stds_spc_type = space_type.standardsSpaceType.get
411
- stds_bldg_type = space_type.standardsBuildingType.get
412
- case "#{stds_bldg_type} #{stds_spc_type}"
413
- when 'PrimarySchool Kitchen',
414
- 'SecondarySchool Kitchen',
415
- 'SuperMarket Sales',
416
- 'QuickServiceRestaurant Kitchen',
417
- 'FullServiceRestaurant Kitchen',
418
- 'LargeHotel Kitchen',
419
- 'Hospital Kitchen',
420
- 'EPr Kitchen',
421
- 'ESe Kitchen',
422
- 'Gro GrocSales',
423
- 'RFF StockRoom',
424
- 'RSD StockRoom',
425
- 'Htl Kitchen',
426
- 'Hsp Kitchen'
427
- if zone.floorArea > display_case_zone_area_m2
428
- display_case_zone = zone
429
- display_case_zone_area_m2 = zone.floorArea
430
- end
431
- end
432
- end
433
-
434
- unless display_case_zone.nil?
435
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Display case zone is #{display_case_zone.name}, the largest zone with a space type typical for display cases.")
436
- return display_case_zone
437
- end
438
-
439
- # If no typical space type was found,
440
- # choose the largest zone in the model.
441
- display_case_zone = nil
442
- display_case_zone_area_m2 = 0
443
- model.getThermalZones.each do |zone|
444
- if zone.floorArea > display_case_zone_area_m2
445
- display_case_zone = zone
446
- display_case_zone_area_m2 = zone.floorArea
447
- end
448
- end
449
-
450
- unless display_case_zone.nil?
451
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "No space types typical for display cases were found, so the display cases will be placed in #{display_case_zone.name}, the largest zone.")
452
- return display_case_zone
453
- end
454
-
455
- return display_case_zone
456
- end
457
-
458
- # Find the thermal zone that is best for adding refrigerated walkins into.
459
- # First, check for space types that typically have refrigeration.
460
- # Fall back to largest zone in the model if no typical space types are found.
461
- #
462
- # @param model [OpenStudio::Model::Model] OpenStudio model object
463
- # @return [OpenStudio::Model::ThermalZone] returns a thermal zone if found, nil if not.
464
- def model_typical_walkin_zone(model)
465
- # Ideally, look for one of the space types
466
- # that would typically have refrigeration walkins.
467
- walkin_zone = nil
468
- walkin_zone_area_m2 = 0
469
- model.getThermalZones.each do |zone|
470
- space_type = OpenstudioStandards::ThermalZone.thermal_zone_get_space_type(zone)
471
- next if space_type.empty?
472
-
473
- space_type = space_type.get
474
- next if space_type.standardsSpaceType.empty?
475
- next if space_type.standardsBuildingType.empty?
476
-
477
- stds_spc_type = space_type.standardsSpaceType.get
478
- stds_bldg_type = space_type.standardsBuildingType.get
479
- case "#{stds_bldg_type} #{stds_spc_type}"
480
- when 'PrimarySchool Kitchen',
481
- 'SecondarySchool Kitchen',
482
- 'SuperMarket DryStorage',
483
- 'QuickServiceRestaurant Kitchen',
484
- 'FullServiceRestaurant Kitchen',
485
- 'LargeHotel Kitchen',
486
- 'Hospital Kitchen',
487
- 'EPr Kitchen',
488
- 'ESe Kitchen',
489
- 'Gro RefWalkInCool',
490
- 'Gro RefWalkInFreeze',
491
- 'RFF StockRoom',
492
- 'RSD StockRoom',
493
- 'Htl Kitchen',
494
- 'Hsp Kitchen'
495
- if zone.floorArea > walkin_zone_area_m2
496
- walkin_zone = zone
497
- walkin_zone_area_m2 = zone.floorArea
498
- end
499
- end
500
- end
501
-
502
- unless walkin_zone.nil?
503
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Walkin zone is #{walkin_zone.name}, the largest zone with a space type typical for walkins.")
504
- return walkin_zone
505
- end
506
-
507
- # If no typical space type was found,
508
- # choose the largest zone in the model.
509
- walkin_zone = nil
510
- walkin_zone_area_m2 = 0
511
- model.getThermalZones.each do |zone|
512
- if zone.floorArea > walkin_zone_area_m2
513
- walkin_zone = zone
514
- walkin_zone_area_m2 = zone.floorArea
515
- end
516
- end
517
-
518
- unless walkin_zone.nil?
519
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "No space types typical for walkins were found, so the walkins will be placed in #{walkin_zone.name}, the largest zone.")
520
- return walkin_zone
521
- end
522
-
523
- return walkin_zone
524
- end
525
-
526
- # Add a typical refrigeration system to the model, including cases, walkins,
527
- # compressors, and condensors. For small stores, each case and walkin is served
528
- # by one compressor and one condenser. For larger stores, all medium temp cases and walkins
529
- # are served by one multi-compressor rack, and all low temp cases and walkins another.
530
- #
531
- # @param model [OpenStudio::Model::Model] OpenStudio model object
532
- # @param building_type [String] building type
533
- # @return [Boolean] returns true if successful, false if not
534
- def model_add_typical_refrigeration(model, building_type)
535
- # Define system category and scaling factor
536
- floor_area_ft2 = OpenStudio.convert(model.getBuilding.floorArea, 'm^2', 'ft^2').get
537
- case building_type
538
- when 'SuperMarket', 'Gro'
539
- if floor_area_ft2 < 35_000 # this is in m2
540
- size_category = '<35k ft2'
541
- floor_area_scaling_factor = floor_area_ft2 / 35_000
542
- elsif floor_area_ft2 < 50_000
543
- size_category = '35k - 50k ft2'
544
- floor_area_scaling_factor = floor_area_ft2 / 50_000
545
- else
546
- size_category = '>50k ft2'
547
- floor_area_scaling_factor = floor_area_ft2 / 50_000
548
- end
549
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration size category is #{size_category}, with a scaling factor of #{floor_area_scaling_factor} because the floor area is #{floor_area_ft2.round} ft2. All cases and walkins added later will subsequently be scaled by this factor.")
550
- else
551
- size_category = 'Kitchen'
552
- floor_area_scaling_factor = 1 # Do not scale kitchen systems
553
- end
554
-
555
- # Add a low and medium temperature system
556
- ['Medium Temperature', 'Low Temperature'].each do |system_type|
557
- # Find refrigeration system lineup
558
- search_criteria = {
559
- 'template' => template,
560
- 'building_type' => building_type,
561
- 'size_category' => size_category,
562
- 'system_type' => system_type
563
- }
564
- props_lineup = model_find_object(standards_data['refrigeration_system_lineup'], search_criteria)
565
- if props_lineup.nil?
566
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "No refrigeration system lineup found for #{search_criteria}, no system will be added.")
567
- next
568
- end
569
- number_of_display_cases = props_lineup['number_of_display_cases']
570
- number_of_walkins = props_lineup['number_of_walkins']
571
- compressor_name = props_lineup['compressor_name']
572
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Refrigeration system lineup found for #{search_criteria}: #{number_of_display_cases} display cases and #{number_of_walkins} walkins, with compressor '#{compressor_name}'.")
573
-
574
- # Find the thermal zones most suited for holding the display cases
575
- thermal_zone_case = nil
576
- if number_of_display_cases > 0
577
- thermal_zone_case = model_typical_display_case_zone(model)
578
- if thermal_zone_case.nil?
579
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_display_cases} display cases to the model, but could find no thermal zone to put them into.")
580
- return false
581
- end
582
- end
583
-
584
- # Add display cases
585
- display_cases = []
586
- (1..number_of_display_cases).each_with_index do |display_case_number, def_start_hr_iterator|
587
- case_type = props_lineup["case_type_#{display_case_number}"]
588
-
589
- # Add the basic case
590
- ref_case = model_add_refrigeration_case(model, thermal_zone_case, case_type, size_category)
591
- return false if ref_case.nil?
592
-
593
- # Scale based on floor area
594
- ref_case.setCaseLength(ref_case.caseLength * floor_area_scaling_factor)
595
-
596
- # Find defrost and dripdown properties
597
- search_criteria = {
598
- 'template' => template,
599
- 'case_type' => case_type,
600
- 'size_category' => size_category
601
- }
602
- props_case = model_find_object(standards_data['refrigerated_cases'], search_criteria)
603
- if props_case.nil?
604
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigerated case properties for: #{search_criteria}.")
605
- next
606
- end
607
- numb_defrosts_per_day = props_case['defrost_per_day']
608
- minutes_defrost = props_case['minutes_defrost']
609
- minutes_dripdown = props_case['minutes_dripdown']
610
- minutes_defrost = 59 if minutes_defrost > 59 # Just to make sure to remain in the same hour
611
- minutes_dripdown = 59 if minutes_dripdown > 59 # Just to make sure to remain in the same hour
612
-
613
- # Add defrost and dripdown schedules
614
- defrost_sch = OpenStudio::Model::ScheduleRuleset.new(model)
615
- defrost_sch.setName("#{ref_case.name} Defrost")
616
- defrost_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
617
- dripdown_sch = OpenStudio::Model::ScheduleRuleset.new(model)
618
- dripdown_sch.setName("#{ref_case.name} Dripdown")
619
- dripdown_sch.defaultDaySchedule.setName("#{ref_case.name} Dripdown Default")
620
-
621
- # Stagger the defrosts for cases by 1 hr
622
- interval_defrost = (24 / numb_defrosts_per_day).floor # Hour interval between each defrost period
623
- if (def_start_hr_iterator + (interval_defrost * numb_defrosts_per_day)) > 23
624
- first_def_start_hr = 0 # Start over again at midnight when time reaches 23hrs
625
- else
626
- first_def_start_hr = def_start_hr_iterator
627
- end
628
-
629
- # Add the specified number of defrost periods to the daily schedule
630
- (1..numb_defrosts_per_day).each do |defrost_of_day|
631
- def_start_hr = first_def_start_hr + ((1 - defrost_of_day) * interval_defrost)
632
- defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0)
633
- defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_defrost.to_int, 0), 1)
634
- dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0) # Dripdown is synced with defrost
635
- dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_dripdown.to_int, 0), 1)
636
- end
637
- defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
638
- dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
639
-
640
- # Assign the defrost and dripdown schedules
641
- ref_case.setCaseDefrostSchedule(defrost_sch)
642
- ref_case.setCaseDefrostDripDownSchedule(dripdown_sch)
643
-
644
- display_cases << ref_case
645
- end
646
-
647
- # Find the thermal zones most suited for holding the walkins
648
- thermal_zone_walkin = nil
649
- if number_of_walkins > 0
650
- thermal_zone_walkin = model_typical_walkin_zone(model)
651
- if thermal_zone_walkin.nil?
652
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Attempted to add #{number_of_walkins} walkins to the model, but could find no thermal zone to put them into.")
653
- return false
654
- end
655
- end
656
-
657
- # Add walkin cases
658
- walkins = []
659
- (1..number_of_walkins).each_with_index do |walkin_number, def_start_hr_iterator|
660
- walkin_type = props_lineup["walkin_type_#{walkin_number}"]
661
-
662
- # Add the basic walkin
663
- ref_walkin = model_add_refrigeration_walkin(model, thermal_zone_walkin, size_category, walkin_type)
664
- return false if ref_walkin.nil?
665
-
666
- # Scale based on floor area
667
- ref_walkin.setRatedTotalLightingPower(ref_walkin.ratedTotalLightingPower * floor_area_scaling_factor)
668
- ref_walkin.setRatedCoolingCoilFanPower(ref_walkin.ratedCoolingCoilFanPower * floor_area_scaling_factor)
669
- ref_walkin.setDefrostPower(ref_walkin.defrostPower.get * floor_area_scaling_factor)
670
- ref_walkin.setRatedCoilCoolingCapacity(ref_walkin.ratedCoilCoolingCapacity * floor_area_scaling_factor)
671
- ref_walkin.setZoneBoundaryTotalInsulatedSurfaceAreaFacingZone(ref_walkin.zoneBoundaryTotalInsulatedSurfaceAreaFacingZone.get * floor_area_scaling_factor)
672
- ref_walkin.setInsulatedFloorSurfaceArea(ref_walkin.insulatedFloorSurfaceArea * floor_area_scaling_factor)
673
-
674
- # Check that walkin physically fits inside the thermal zone.
675
- # If not, remove the walkin and warn.
676
- walkin_floor_area_ft2 = OpenStudio.convert(ref_walkin.insulatedFloorSurfaceArea, 'm^2', 'ft^2').get.round
677
- walkin_zone_floor_area_ft2 = OpenStudio.convert(thermal_zone_walkin.floorArea, 'm^2', 'ft^2').get.round
678
- if walkin_floor_area_ft2 > walkin_zone_floor_area_ft2
679
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "Walkin #{ref_walkin.name} has an area of #{walkin_floor_area_ft2} ft^2, which is larger than the #{walkin_zone_floor_area_ft2} ft^2 zone. Walkin will be kept in the model, but considered re-sizing the zone '#{thermal_zone_walkin.name}'.")
680
- end
681
-
682
- # Find defrost and dripdown properties
683
- search_criteria = {
684
- 'template' => template,
685
- 'walkin_type' => walkin_type,
686
- 'size_category' => size_category
687
- }
688
- props_walkin = model_find_object(standards_data['refrigeration_walkins'], search_criteria)
689
- if props_walkin.nil?
690
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find walkin properties for: #{search_criteria}.")
691
- next
692
- end
693
- numb_defrosts_per_day = props_walkin['defrost_per_day']
694
- minutes_defrost = props_walkin['minutes_defrost']
695
- minutes_dripdown = props_walkin['minutes_dripdown']
696
- minutes_defrost = 59 if minutes_defrost > 59 # Just to make sure to remain in the same hour
697
- minutes_dripdown = 59 if minutes_dripdown > 59 # Just to make sure to remain in the same hour
698
-
699
- # Add defrost and dripdown schedules
700
- defrost_sch_walkin = OpenStudio::Model::ScheduleRuleset.new(model)
701
- defrost_sch_walkin.setName("#{ref_walkin.name} Defrost")
702
- defrost_sch_walkin.defaultDaySchedule.setName("#{ref_walkin.name} Defrost Default")
703
- dripdown_sch_walkin = OpenStudio::Model::ScheduleRuleset.new(model)
704
- dripdown_sch_walkin.setName("#{ref_walkin.name} Dripdown")
705
- dripdown_sch_walkin.defaultDaySchedule.setName("#{ref_walkin.name} Dripdown Default")
706
-
707
- # Stagger the defrosts for cases by 1 hr
708
- interval_defrost = (24 / numb_defrosts_per_day).floor # Hour interval between each defrost period
709
- if (def_start_hr_iterator + (interval_defrost * numb_defrosts_per_day)) > 23
710
- first_def_start_hr = 0 # Start over again at midnight when time reaches 23hrs
711
- else
712
- first_def_start_hr = def_start_hr_iterator
713
- end
714
-
715
- # Add the specified number of defrost periods to the daily schedule
716
- (1..numb_defrosts_per_day).each do |defrost_of_day|
717
- def_start_hr = first_def_start_hr + ((1 - defrost_of_day) * interval_defrost)
718
- defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0)
719
- defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_defrost.to_int, 0), 1)
720
- dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, 0, 0), 0) # Dripdown is synced with defrost
721
- dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, def_start_hr, minutes_dripdown.to_int, 0), 1)
722
- end
723
- defrost_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
724
- dripdown_sch_walkin.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
725
-
726
- # Assign the defrost and dripdown schedules
727
- ref_walkin.setDefrostSchedule(defrost_sch_walkin)
728
- ref_walkin.setDefrostDripDownSchedule(dripdown_sch_walkin)
729
-
730
- walkins << ref_walkin
731
- end
732
-
733
- # Divide cases and walkins into one or more refrigeration systems depending on store type
734
- # For small stores and kitchens one system with one compressor and one condenser per case is employed.
735
- # For larger stores, multiple cases and walkins are served by a rack with multiple compressors.
736
- ref_system_lineups = []
737
- case system_type
738
- when '<35k ft2', 'Kitchen'
739
- # Put each case on its own system
740
- display_cases.each do |ref_case|
741
- ref_system_lineups << { 'ref_cases' => [ref_case], 'walkins' => [] }
742
- end
743
- # Put each walkin on its own system
744
- walkins.each do |walkin|
745
- ref_system_lineups << { 'ref_cases' => [], 'walkins' => [walkin] }
746
- end
747
- else
748
- # Put all cases and walkins on one system
749
- ref_system_lineups << { 'ref_cases' => display_cases, 'walkins' => walkins }
750
- end
751
-
752
- # Find refrigeration system properties
753
- search_criteria = {
754
- 'template' => template,
755
- 'building_type' => building_type,
756
- 'size_category' => size_category,
757
- 'system_type' => system_type
758
- }
759
- props_ref_system = model_find_object(standards_data['refrigeration_system'], search_criteria)
760
- if props_ref_system.nil?
761
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration system properties for: #{search_criteria}.")
762
- next
763
- end
764
-
765
- # Add refrigeration systems
766
- ref_system_lineups.each do |ref_system_lineup|
767
- # Skip if no cases or walkins are attached to the system
768
- next if ref_system_lineup['ref_cases'].empty? && ref_system_lineup['walkins'].empty?
769
-
770
- # Add refrigeration system
771
- ref_system = OpenStudio::Model::RefrigerationSystem.new(model)
772
- ref_system.setName(system_type)
773
- ref_system.setRefrigerationSystemWorkingFluidType(props_ref_system['refrigerant'])
774
- ref_system.setSuctionTemperatureControlType(props_ref_system['refrigerant'])
775
-
776
- # Sum the capacity required by all cases and walkins
777
- # and attach the cases and walkins to the system.
778
- rated_case_capacity_w = 0
779
- ref_system_lineup['ref_cases'].each do |ref_case|
780
- rated_case_capacity_w += ref_case.ratedTotalCoolingCapacityperUnitLength * ref_case.caseLength
781
- ref_system.addCase(ref_case)
782
- end
783
- ref_system_lineup['walkins'].each do |walkin|
784
- rated_case_capacity_w += walkin.ratedCoilCoolingCapacity
785
- ref_system.addWalkin(walkin)
786
- end
787
-
788
- # Find the compressor properties
789
- search_criteria = {
790
- 'template' => template,
791
- 'compressor_name' => compressor_name
792
- }
793
- props_compressor = model_find_object(standards_data['refrigeration_compressors'], search_criteria)
794
- if props_compressor.nil?
795
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration compressor properties for: #{search_criteria}.")
796
- next
797
- end
798
-
799
- # Calculate the number of compressors required to meet the
800
- # combined rated capacity of all the cases
801
- # and add them to the system
802
- rated_compressor_capacity_btu_per_hr = props_compressor['rated_capacity']
803
- number_of_compressors = (rated_case_capacity_w / OpenStudio.convert(rated_compressor_capacity_btu_per_hr, 'Btu/h', 'W').get).ceil
804
- (1..number_of_compressors).each do |compressor_number|
805
- compressor = model_add_refrigeration_compressor(model, compressor_name)
806
- ref_system.addCompressor(compressor)
807
- end
808
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.Model.Model', "Added #{number_of_compressors} compressors, each with a capacity of #{rated_compressor_capacity_btu_per_hr.round} Btu/hr to serve #{OpenStudio.convert(rated_case_capacity_w, 'W', 'Btu/hr').get.round} Btu/hr of case and walkin load.")
809
-
810
- # Find the condenser properties
811
- search_criteria = {
812
- 'template' => template,
813
- 'building_type' => building_type,
814
- 'system_type' => system_type,
815
- 'size_category' => size_category
816
- }
817
- props_condenser = model_find_object(standards_data['refrigeration_condenser'], search_criteria)
818
- if props_condenser.nil?
819
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', "Could not find refrigeration condenser properties for: #{search_criteria}.")
820
- next
821
- end
822
-
823
- # Heat rejection as a function of temperature
824
- heat_rejection_curve = OpenStudio::Model::CurveLinear.new(model)
825
- heat_rejection_curve.setName('Condenser Heat Rejection Function of Temperature')
826
- heat_rejection_curve.setCoefficient1Constant(0)
827
- heat_rejection_curve.setCoefficient2x(props_condenser['heatrejectioncurve_c1'])
828
- heat_rejection_curve.setMinimumValueofx(-50)
829
- heat_rejection_curve.setMaximumValueofx(50)
830
-
831
- # Add condenser
832
- condenser = OpenStudio::Model::RefrigerationCondenserAirCooled.new(model)
833
- condenser.setRatedEffectiveTotalHeatRejectionRateCurve(heat_rejection_curve)
834
- condenser.setRatedSubcoolingTemperatureDifference(OpenStudio.convert(props_condenser['subcool_t'], 'F', 'C').get)
835
- condenser.setMinimumFanAirFlowRatio(props_condenser['min_airflow'])
836
- condenser.setRatedFanPower(props_condenser['fan_power_per_q_rejected'].to_f * rated_case_capacity_w)
837
- condenser.setCondenserFanSpeedControlType(props_condenser['fan_speed_control'])
838
- ref_system.setRefrigerationCondenser(condenser)
839
-
840
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Added #{system_type} refrigeration system")
841
- end
842
- end
843
-
844
- return true
845
- end
846
-
847
- # Determine the latent case credit curve to use for walkins. Defaults to values after 90.1-2007.
848
- # @todo Should probably use the model_add_refrigeration_walkin and lookups from the spreadsheet instead of hard-coded values
849
- #
850
- # @param model [OpenStudio::Model::Model] OpenStudio model object
851
- # @return [Boolean] returns true if successful, false if not
852
- def model_walkin_freezer_latent_case_credit_curve(model)
853
- latent_case_credit_curve_name = 'Single Shelf Horizontal Latent Energy Multiplier_After2004'
854
- return latent_case_credit_curve_name
855
- end
856
-
857
391
  # Adds a full commercial refrigeration rack to the model, as would be found in a supermarket
858
392
  # @todo Move refrigeration compressors to spreadsheet
859
393
  #
@@ -321,7 +321,7 @@ class Standard
321
321
  return cop
322
322
  end
323
323
 
324
- # Convert from EER to COP
324
+ # Convert from EER to COP (no fan)
325
325
  # @ref [References::USDOEPrototypeBuildings] If capacity is not supplied, use DOE Prototype Building method.
326
326
  # @ref [References::ASHRAE9012013] If capacity is supplied, use the 90.1-2013 method
327
327
  #
@@ -345,7 +345,7 @@ class Standard
345
345
  return cop
346
346
  end
347
347
 
348
- # Convert from COP to EER
348
+ # Convert from COP (no fan) to EER
349
349
  # @ref [References::USDOEPrototypeBuildings]
350
350
  #
351
351
  # @param cop [Double] COP
@@ -367,6 +367,22 @@ class Standard
367
367
  return eer
368
368
  end
369
369
 
370
+ # Convert from IEER to COP (no fan)
371
+ #
372
+ # @note IEER is a weighted-average efficiency metrics at different load percentages, operataional and environemental conditions
373
+ # @note IEER should be modeled by using performance curves that match a targeted efficiency values
374
+ # @note This method estimates what a reasonable full load rated EER would be for a targeted IEER value
375
+ # @note The regression used in this method is based on a survey of over 1,000 rated AHRI units with IEER ranging from 11.8 to 25.6
376
+ # @todo Implement methods to handle IEER modeling
377
+ #
378
+ # @param ieer [Double] Energy Efficiency Ratio (EER)
379
+ # @return [Double] Coefficient of Performance (COP)
380
+ def ieer_to_cop_no_fan(ieer)
381
+ eer = 0.0183 * ieer * ieer - 0.4552 * ieer + 13.21
382
+
383
+ return eer_to_cop_no_fan(eer)
384
+ end
385
+
370
386
  # Convert from EER to COP
371
387
  #
372
388
  # @param eer [Double] Energy Efficiency Ratio (EER)
@@ -0,0 +1,125 @@
1
+ module OpenstudioStandards
2
+ # The Refrigeration module provides methods to create, modify, and get information about refrigeration
3
+ module Refrigeration
4
+ # @!group Create Case
5
+ # Methods to add refrigerated cases
6
+
7
+ # Adds a refrigerated case to the model.
8
+ #
9
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
10
+ # @param template [String] Technology or standards level, either 'old', 'new', or 'advanced'
11
+ # @param case_type [String] The case type. See refrigeration_cases data for valid options under case_name.
12
+ # @param case_length [String] The case length in meters.
13
+ # @param thermal_zone [OpenStudio::Model::ThermalZone] Thermal zone with the case. If nil, will look up from the model.
14
+ # @return [OpenStudio::Model::RefrigerationCase] the refrigeration case
15
+ def self.create_case(model,
16
+ template: 'new',
17
+ case_type: 'Vertical Open - All',
18
+ case_length: nil,
19
+ thermal_zone: nil)
20
+ # get thermal zone if not provided
21
+ if thermal_zone.nil?
22
+ # Find the thermal zones most suited for holding the display cases
23
+ thermal_zone = OpenstudioStandards::Refrigeration.refrigeration_case_zone(model)
24
+ if thermal_zone.nil?
25
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', 'Attempted to add display cases to the model, but could find no thermal zone to put them into.')
26
+ return nil
27
+ end
28
+ end
29
+
30
+ # load refrigeration cases data
31
+ cases_csv = "#{__dir__}/data/refrigerated_cases.csv"
32
+ unless File.exist?(cases_csv)
33
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', "Unable to find file: #{cases_csv}")
34
+ return nil
35
+ end
36
+ cases_tbl = CSV.table(cases_csv, encoding: 'ISO8859-1:utf-8')
37
+ cases_hsh = cases_tbl.map(&:to_hash)
38
+
39
+ # get case properties
40
+ case_properties = cases_hsh.select { |r| (r[:template] == template) && (r[:case_name] == case_type) }[0]
41
+
42
+ if case_properties.nil?
43
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Refrigeration', "Unable to find case data for template #{template} case type #{case_type}.")
44
+ return nil
45
+ end
46
+
47
+ # add case
48
+ ref_case = OpenStudio::Model::RefrigerationCase.new(model, model.alwaysOnDiscreteSchedule)
49
+ ref_case.setName(case_type)
50
+ case_length_m = case_length.nil? ? case_properties[:unit_length] : case_length
51
+ ref_case.setCaseLength(case_length_m)
52
+ ref_case.setRatedTotalCoolingCapacityperUnitLength(case_properties[:rated_capacity])
53
+ ref_case.setCaseOperatingTemperature(case_properties[:case_operating_temperature])
54
+ ref_case.setDesignEvaporatorTemperatureorBrineInletTemperature(case_properties[:evaporator_temperature])
55
+ ref_case.setRatedLatentHeatRatio(case_properties[:rated_latent_heat_ratio])
56
+ ref_case.setRatedRuntimeFraction(case_properties[:rated_runtime_fraction])
57
+ ref_case.setLatentCaseCreditCurveType(case_properties[:latent_case_credit_curve_type])
58
+ # TODO: replace once curves are standardized
59
+ std = Standard.build('90.1-2013')
60
+ latent_case_credit_curve = std.model_add_curve(model, case_properties[:latent_case_credit_curve_name])
61
+ ref_case.setLatentCaseCreditCurve(latent_case_credit_curve)
62
+ ref_case.setStandardCaseFanPowerperUnitLength(case_properties[:fan_power])
63
+ ref_case.setOperatingCaseFanPowerperUnitLength(case_properties[:fan_power])
64
+ ref_case.setStandardCaseLightingPowerperUnitLength(case_properties[:lighting_power])
65
+ ref_case.setInstalledCaseLightingPowerperUnitLength(case_properties[:lighting_power])
66
+ ref_case.setCaseLightingSchedule(model.alwaysOnDiscreteSchedule)
67
+ ref_case.setFractionofLightingEnergytoCase(case_properties[:fraction_of_lighting_energy_to_case]) unless case_properties[:fraction_of_lighting_energy_to_case].nil?
68
+ ref_case.setCaseAntiSweatHeaterPowerperUnitLength(case_properties[:anti_sweat_power]) unless case_properties[:anti_sweat_power].nil?
69
+ ref_case.setMinimumAntiSweatHeaterPowerperUnitLength(0.0)
70
+ ref_case.setHumidityatZeroAntiSweatHeaterEnergy(0.0)
71
+ ref_case.setAntiSweatHeaterControlType(case_properties[:anti_sweat_heater_control_type])
72
+ ref_case.setFractionofAntiSweatHeaterEnergytoCase(case_properties[:fraction_of_anti_sweat_heater_energy_to_cases]) unless case_properties[:fraction_of_anti_sweat_heater_energy_to_cases].nil?
73
+ ref_case.setCaseDefrostPowerperUnitLength(case_properties[:defrost_power]) unless case_properties[:defrost_power].nil?
74
+ ref_case.setCaseDefrostType(case_properties[:defrost_type])
75
+ ref_case.setDefrostEnergyCorrectionCurveType(case_properties[:defrost_energy_correction_curve_type]) unless case_properties[:defrost_energy_correction_curve_type].nil?
76
+ unless case_properties[:defrost_energy_correction_curve_name].nil?
77
+ # TODO: replace once curves are standardized
78
+ defrost_correction_curve_name = std.model_add_curve(model, case_properties[:defrost_energy_correction_curve_name])
79
+ ref_case.setDefrostEnergyCorrectionCurve(defrost_correction_curve_name)
80
+ end
81
+ ref_case.setUnderCaseHVACReturnAirFraction(0.0)
82
+ ref_case.resetRefrigeratedCaseRestockingSchedule
83
+ ref_case.setAvailabilitySchedule(model.alwaysOnDiscreteSchedule)
84
+ ref_case.setThermalZone(thermal_zone)
85
+ ref_case.setRatedAmbientTemperature(OpenStudio.convert(75.0, 'F', 'C').get)
86
+
87
+ # place holders for schedules until data provided from ORNL
88
+ i = 0
89
+ # Defrost schedule
90
+ defrost_sch = OpenStudio::Model::ScheduleRuleset.new(model)
91
+ defrost_sch.setName("#{ref_case.name} Defrost")
92
+ defrost_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
93
+ defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 0, 0), 0)
94
+ defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 59, 0), 1)
95
+ defrost_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
96
+
97
+ # Dripdown schedule
98
+ dripdown_sch = OpenStudio::Model::ScheduleRuleset.new(model)
99
+ dripdown_sch.setName("#{ref_case.name} Defrost")
100
+ dripdown_sch.defaultDaySchedule.setName("#{ref_case.name} Defrost Default")
101
+ dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 0, 0), 0)
102
+ dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, i, 59, 0), 1)
103
+ dripdown_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0)
104
+
105
+ # Case Credit Schedule
106
+ case_credit_sch = OpenStudio::Model::ScheduleRuleset.new(model)
107
+ case_credit_sch.setName("#{ref_case.name} Case Credit")
108
+ case_credit_sch.defaultDaySchedule.setName("#{ref_case.name} Case Credit Default")
109
+ case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 7, 0, 0), 0.2)
110
+ case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 21, 0, 0), 0.4)
111
+ case_credit_sch.defaultDaySchedule.addValue(OpenStudio::Time.new(0, 24, 0, 0), 0.2)
112
+ ref_case.setCaseDefrostSchedule(defrost_sch)
113
+ ref_case.setCaseDefrostDripDownSchedule(dripdown_sch)
114
+ ref_case.setCaseCreditFractionSchedule(case_credit_sch)
115
+
116
+ # reporting
117
+ length_ft = OpenStudio.convert(ref_case.caseLength, 'm', 'ft').get
118
+ cooling_capacity_w = ref_case.caseLength * ref_case.ratedTotalCoolingCapacityperUnitLength
119
+ cooling_capacity_btu_per_hr = OpenStudio.convert(cooling_capacity_w, 'W', 'Btu/hr').get
120
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Refrigeration', "Added #{length_ft.round} ft display case called #{case_type} with a cooling capacity of #{cooling_capacity_btu_per_hr.round} Btu/hr to #{thermal_zone&.name}.")
121
+
122
+ return ref_case
123
+ end
124
+ end
125
+ end