openstudio-standards 0.7.1 → 0.8.0.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (362) 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 +16 -19
  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.Fan.rb +0 -7
  34. data/lib/openstudio-standards/prototypes/common/objects/Prototype.HeatExchangerAirToAirSensibleAndLatent.rb +36 -18
  35. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +1 -1
  36. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +121 -239
  37. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +179 -151
  38. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +0 -466
  39. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +18 -2
  40. data/lib/openstudio-standards/refrigeration/create_case.rb +125 -0
  41. data/lib/openstudio-standards/refrigeration/create_compressor.rb +78 -0
  42. data/lib/openstudio-standards/refrigeration/create_compressor_rack.rb +48 -0
  43. data/lib/openstudio-standards/refrigeration/create_refrigeration_system.rb +74 -0
  44. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +161 -0
  45. data/lib/openstudio-standards/refrigeration/create_walkin.rb +116 -0
  46. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -0
  47. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -0
  48. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +13 -0
  49. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_cases.csv +17 -0
  50. data/lib/openstudio-standards/refrigeration/data/typical_refrigerated_walkins.csv +53 -0
  51. data/lib/openstudio-standards/refrigeration/information.rb +130 -0
  52. data/lib/openstudio-standards/schedules/parametric.rb +1 -1
  53. data/lib/openstudio-standards/service_water_heating/create_typical.rb +299 -0
  54. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -14
  55. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +119 -0
  56. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +54 -0
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +810 -0
  58. data/lib/openstudio-standards/service_water_heating/information.rb +69 -0
  59. data/lib/openstudio-standards/sql_file/fenestration.rb +1 -1
  60. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +154 -0
  61. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +35 -12
  62. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +110 -61
  63. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +128 -29
  64. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +103 -38
  65. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  66. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +106 -5
  67. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +8 -8
  68. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +44 -17
  69. data/lib/openstudio-standards/standards/Standards.Fan.rb +32 -21
  70. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +45 -18
  71. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +14 -9
  72. data/lib/openstudio-standards/standards/Standards.Model.rb +294 -76
  73. data/lib/openstudio-standards/standards/Standards.Motor.rb +66 -0
  74. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -1
  75. data/lib/openstudio-standards/standards/Standards.Pump.rb +34 -20
  76. data/lib/openstudio-standards/standards/Standards.ServiceWaterHeating.rb +0 -353
  77. data/lib/openstudio-standards/standards/Standards.Space.rb +3 -107
  78. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +2 -57
  79. data/lib/openstudio-standards/standards/Standards.Surface.rb +11 -3
  80. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +1 -120
  81. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +142 -0
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +1006 -596
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.energy_recovery.json +724 -0
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +1258 -163
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +1070 -140
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +33 -3374
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +1400 -340
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.vrfs.json +769 -0
  89. 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
  90. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +142 -0
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +1006 -596
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.energy_recovery.json +724 -0
  93. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +1258 -163
  94. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +1070 -140
  95. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +15 -3343
  96. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +1840 -372
  97. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.vrfs.json +769 -0
  98. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +20 -10
  99. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +0 -9
  100. 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
  101. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +142 -0
  102. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +1006 -628
  103. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +718 -712
  104. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +1438 -163
  105. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +2552 -182
  106. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +14 -3368
  107. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +2348 -352
  108. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.vrfs.json +769 -0
  109. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +47 -61
  110. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +6 -0
  111. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Motor.rb +11 -0
  112. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Space.rb +0 -9
  113. 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
  114. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +142 -0
  115. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +1006 -628
  116. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1358 -1346
  117. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +1438 -163
  118. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +1359 -189
  119. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +19 -3451
  120. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +2176 -616
  121. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.vrfs.json +616 -0
  122. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +47 -61
  123. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +9 -0
  124. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Motor.rb +11 -0
  125. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +0 -9
  126. 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
  127. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +142 -0
  128. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +1006 -628
  129. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1188 -1424
  130. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +1498 -163
  131. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +1769 -189
  132. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +15 -3422
  133. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +1807 -408
  134. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.vrfs.json +1024 -0
  135. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +70 -87
  136. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +9 -0
  137. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Motor.rb +11 -0
  138. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +0 -9
  139. 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
  140. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +142 -0
  141. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +1006 -628
  142. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +2806 -3296
  143. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +1558 -163
  144. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +1759 -189
  145. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +16 -3448
  146. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +2758 -422
  147. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.vrfs.json +684 -0
  148. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +14 -3318
  149. 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
  150. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.chillers.json +1 -1
  151. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.economizers.json +953 -207
  152. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.energy_recovery.json +724 -0
  153. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.ext_ltg.json +5 -5
  154. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +11 -2858
  155. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirConditionerVariableRefrigerantFlow.rb +13 -0
  156. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +0 -18
  157. 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
  158. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.chillers.json +0 -51
  159. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.economizers.json +953 -207
  160. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.energy_recovery.json +724 -0
  161. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.ext_ltg.json +5 -5
  162. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -2830
  163. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirConditionerVariableRefrigerantFlow.rb +13 -0
  164. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +0 -18
  165. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.economizers.json +1006 -564
  166. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.energy_recovery.json +1264 -0
  167. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.ext_ltg.json +5 -5
  168. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.spc_typ.json +0 -1079
  169. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +132 -288
  170. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.HeatExchangerSensLat.rb +44 -20
  171. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +11 -0
  172. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Space.rb +0 -8
  173. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.economizers.json +1006 -564
  174. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.energy_recovery.json +1264 -0
  175. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.ext_ltg.json +5 -5
  176. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.spc_typ.json +0 -1079
  177. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +137 -288
  178. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerSensLat.rb +44 -20
  179. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +11 -0
  180. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Space.rb +0 -9
  181. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +12 -10
  182. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +8 -6
  183. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +8 -6
  184. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +9 -3
  185. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +6 -40
  186. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +30 -337
  187. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +4 -5
  188. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -2
  189. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +56 -3
  190. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +80 -0
  191. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +0 -10
  192. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +35 -0
  193. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.economizers.json +550 -0
  194. 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
  195. 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
  196. 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
  197. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +225 -245
  198. 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
  199. 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
  200. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +19 -3
  201. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac.json +185 -0
  202. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_airloop_hvac_doas.json +127 -0
  203. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_building.json +121 -0
  204. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_design_specification_outdoor_air.json +49 -0
  205. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_electric_equipment.json +113 -0
  206. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_exterior_lights.json +120 -0
  207. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_space.json +388 -0
  208. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_spacetype.json +367 -0
  209. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_thermal_zone.json +56 -0
  210. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_connections.json +37 -0
  211. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment.json +69 -0
  212. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_json/userdata_wateruse_equipment_definition.json +37 -0
  213. data/lib/openstudio-standards/standards/cbes/cbes_pre_1978/data/cbes_pre_1978.ext_ltg.json +5 -5
  214. data/lib/openstudio-standards/standards/cbes/cbes_t24_1978/data/cbes_t24_1978.ext_ltg.json +5 -5
  215. data/lib/openstudio-standards/standards/cbes/cbes_t24_1992/data/cbes_t24_1992.ext_ltg.json +5 -5
  216. data/lib/openstudio-standards/standards/cbes/cbes_t24_2001/data/cbes_t24_2001.ext_ltg.json +5 -5
  217. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/data/cbes_t24_2005.ext_ltg.json +5 -5
  218. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/data/cbes_t24_2008.ext_ltg.json +5 -5
  219. data/lib/openstudio-standards/standards/deer/deer_1985/comstock_deer_1985/data/comstock_deer_1985.ext_ltg.json +5 -5
  220. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ext_ltg.json +5 -5
  221. data/lib/openstudio-standards/standards/deer/deer_1996/comstock_deer_1996/data/comstock_deer_1996.ext_ltg.json +5 -5
  222. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ext_ltg.json +5 -5
  223. data/lib/openstudio-standards/standards/deer/deer_2003/comstock_deer_2003/data/comstock_deer_2003.ext_ltg.json +5 -5
  224. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ext_ltg.json +5 -5
  225. data/lib/openstudio-standards/standards/deer/deer_2007/comstock_deer_2007/data/comstock_deer_2007.ext_ltg.json +5 -5
  226. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ext_ltg.json +5 -5
  227. data/lib/openstudio-standards/standards/deer/deer_2011/comstock_deer_2011/data/comstock_deer_2011.ext_ltg.json +5 -5
  228. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ext_ltg.json +5 -5
  229. data/lib/openstudio-standards/standards/deer/deer_2014/comstock_deer_2014/data/comstock_deer_2014.ext_ltg.json +5 -5
  230. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ext_ltg.json +5 -5
  231. data/lib/openstudio-standards/standards/deer/deer_2015/comstock_deer_2015/data/comstock_deer_2015.ext_ltg.json +5 -5
  232. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ext_ltg.json +5 -5
  233. data/lib/openstudio-standards/standards/deer/deer_2017/comstock_deer_2017/data/comstock_deer_2017.ext_ltg.json +5 -5
  234. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ext_ltg.json +5 -5
  235. data/lib/openstudio-standards/standards/deer/deer_2020/comstock_deer_2020/data/comstock_deer_2020.ext_ltg.json +5 -5
  236. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ext_ltg.json +5 -5
  237. data/lib/openstudio-standards/standards/deer/deer_2025/comstock_deer_2025/data/comstock_deer_2025.ext_ltg.json +5 -5
  238. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ext_ltg.json +5 -5
  239. data/lib/openstudio-standards/standards/deer/deer_2030/comstock_deer_2030/data/comstock_deer_2030.ext_ltg.json +5 -5
  240. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ext_ltg.json +5 -5
  241. data/lib/openstudio-standards/standards/deer/deer_2035/comstock_deer_2035/data/comstock_deer_2035.ext_ltg.json +5 -5
  242. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ext_ltg.json +5 -5
  243. data/lib/openstudio-standards/standards/deer/deer_2040/comstock_deer_2040/data/comstock_deer_2040.ext_ltg.json +5 -5
  244. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ext_ltg.json +5 -5
  245. data/lib/openstudio-standards/standards/deer/deer_2045/comstock_deer_2045/data/comstock_deer_2045.ext_ltg.json +5 -5
  246. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ext_ltg.json +5 -5
  247. data/lib/openstudio-standards/standards/deer/deer_2050/comstock_deer_2050/data/comstock_deer_2050.ext_ltg.json +5 -5
  248. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ext_ltg.json +5 -5
  249. data/lib/openstudio-standards/standards/deer/deer_2055/comstock_deer_2055/data/comstock_deer_2055.ext_ltg.json +5 -5
  250. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ext_ltg.json +5 -5
  251. data/lib/openstudio-standards/standards/deer/deer_2060/comstock_deer_2060/data/comstock_deer_2060.ext_ltg.json +5 -5
  252. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ext_ltg.json +5 -5
  253. data/lib/openstudio-standards/standards/deer/deer_2065/comstock_deer_2065/data/comstock_deer_2065.ext_ltg.json +5 -5
  254. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ext_ltg.json +5 -5
  255. data/lib/openstudio-standards/standards/deer/deer_2070/comstock_deer_2070/data/comstock_deer_2070.ext_ltg.json +5 -5
  256. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ext_ltg.json +5 -5
  257. data/lib/openstudio-standards/standards/deer/deer_2075/comstock_deer_2075/data/comstock_deer_2075.ext_ltg.json +5 -5
  258. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ext_ltg.json +5 -5
  259. data/lib/openstudio-standards/standards/deer/deer_pre_1975/comstock_deer_pre_1975/data/comstock_deer_pre_1975.ext_ltg.json +5 -5
  260. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ext_ltg.json +5 -5
  261. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +10 -1
  262. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/unitary_acs.json +20 -20
  263. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +379 -27
  264. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +1 -4
  265. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +0 -1
  266. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +1 -1
  267. data/lib/openstudio-standards/standards/necb/NECB2011/data/unitary_acs.json +20 -20
  268. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +34 -22
  269. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +76 -23
  270. data/lib/openstudio-standards/standards/necb/NECB2011/necb_shw_calculation.xlsx +0 -0
  271. data/lib/openstudio-standards/standards/necb/NECB2011/service_water_heating.rb +4 -5
  272. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +6 -2
  273. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +26 -24
  274. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +2 -1
  275. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +38 -32
  276. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +215 -18
  277. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +190 -15
  278. data/lib/openstudio-standards/standards/necb/common/national_carbon_price_sched_feb_2025.json +60 -0
  279. data/lib/openstudio-standards/standards/necb/common/utility_pricing_2025-02-20.csv +92 -0
  280. data/lib/openstudio-standards/utilities/ruleset_check.rb +204 -0
  281. data/lib/openstudio-standards/version.rb +1 -1
  282. data/lib/openstudio-standards/weather/information.rb +1 -1
  283. data/lib/openstudio-standards.rb +32 -12
  284. metadata +78 -80
  285. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.refrigeration.rb +0 -13
  286. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.refrigeration.rb +0 -13
  287. data/lib/openstudio-standards/prototypes/cbes/cbes.refrigeration.rb +0 -13
  288. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -432
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Space.rb +0 -11
  290. 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
  291. 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
  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_lnup.json +0 -562
  293. 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
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.Space.rb +0 -11
  295. 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
  296. 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
  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_lnup.json +0 -562
  298. 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
  299. 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
  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_lnup.json +0 -562
  301. 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
  302. 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
  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_lnup.json +0 -562
  304. 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
  305. 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
  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_lnup.json +0 -562
  307. 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
  308. 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
  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_lnup.json +0 -562
  310. 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
  311. 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
  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_lnup.json +0 -562
  313. 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
  314. 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
  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_lnup.json +0 -562
  316. 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
  317. data/lib/openstudio-standards/standards/cbes/cbes.Space.rb +0 -11
  318. data/lib/openstudio-standards/standards/cbes/cbes_t24_2005/cbes_t24_2005.Space.rb +0 -11
  319. data/lib/openstudio-standards/standards/cbes/cbes_t24_2008/cbes_t24_2008.Space.rb +0 -11
  320. data/lib/openstudio-standards/standards/deer/deer.Space.rb +0 -20
  321. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_cases.json +0 -1456
  322. data/lib/openstudio-standards/standards/deer/deer_1985/data/deer_1985.ref_lnup.json +0 -562
  323. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_cases.json +0 -1456
  324. data/lib/openstudio-standards/standards/deer/deer_1996/data/deer_1996.ref_lnup.json +0 -562
  325. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_cases.json +0 -1456
  326. data/lib/openstudio-standards/standards/deer/deer_2003/data/deer_2003.ref_lnup.json +0 -562
  327. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_cases.json +0 -1456
  328. data/lib/openstudio-standards/standards/deer/deer_2007/data/deer_2007.ref_lnup.json +0 -562
  329. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_cases.json +0 -1456
  330. data/lib/openstudio-standards/standards/deer/deer_2011/data/deer_2011.ref_lnup.json +0 -562
  331. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_cases.json +0 -1456
  332. data/lib/openstudio-standards/standards/deer/deer_2014/data/deer_2014.ref_lnup.json +0 -562
  333. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_cases.json +0 -1456
  334. data/lib/openstudio-standards/standards/deer/deer_2015/data/deer_2015.ref_lnup.json +0 -562
  335. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_cases.json +0 -1456
  336. data/lib/openstudio-standards/standards/deer/deer_2017/data/deer_2017.ref_lnup.json +0 -562
  337. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_cases.json +0 -1456
  338. data/lib/openstudio-standards/standards/deer/deer_2020/data/deer_2020.ref_lnup.json +0 -562
  339. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_cases.json +0 -1456
  340. data/lib/openstudio-standards/standards/deer/deer_2025/data/deer_2025.ref_lnup.json +0 -562
  341. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_cases.json +0 -1456
  342. data/lib/openstudio-standards/standards/deer/deer_2030/data/deer_2030.ref_lnup.json +0 -562
  343. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_cases.json +0 -1456
  344. data/lib/openstudio-standards/standards/deer/deer_2035/data/deer_2035.ref_lnup.json +0 -562
  345. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_cases.json +0 -1456
  346. data/lib/openstudio-standards/standards/deer/deer_2040/data/deer_2040.ref_lnup.json +0 -562
  347. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_cases.json +0 -1456
  348. data/lib/openstudio-standards/standards/deer/deer_2045/data/deer_2045.ref_lnup.json +0 -562
  349. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_cases.json +0 -1456
  350. data/lib/openstudio-standards/standards/deer/deer_2050/data/deer_2050.ref_lnup.json +0 -562
  351. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_cases.json +0 -1456
  352. data/lib/openstudio-standards/standards/deer/deer_2055/data/deer_2055.ref_lnup.json +0 -562
  353. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_cases.json +0 -1456
  354. data/lib/openstudio-standards/standards/deer/deer_2060/data/deer_2060.ref_lnup.json +0 -562
  355. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_cases.json +0 -1456
  356. data/lib/openstudio-standards/standards/deer/deer_2065/data/deer_2065.ref_lnup.json +0 -562
  357. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_cases.json +0 -1456
  358. data/lib/openstudio-standards/standards/deer/deer_2070/data/deer_2070.ref_lnup.json +0 -562
  359. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_cases.json +0 -1456
  360. data/lib/openstudio-standards/standards/deer/deer_2075/data/deer_2075.ref_lnup.json +0 -562
  361. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_cases.json +0 -1456
  362. data/lib/openstudio-standards/standards/deer/deer_pre_1975/data/deer_pre_1975.ref_lnup.json +0 -562
@@ -0,0 +1,66 @@
1
+ class Standard
2
+ # @!group Motor
3
+
4
+ # Determine the type of motor to model
5
+ #
6
+ # @param nominal_hp [Float] nominal or nameplate motor horsepower
7
+ # @return [String] motor type
8
+ def motor_type(nominal_hp)
9
+ return 'PSC'
10
+ end
11
+
12
+ # Determine the efficiency of fractional horsepower motors
13
+ #
14
+ # @param nominal_hp [Float] nominal or nameplate motor horsepower
15
+ # @param motor_type [String] motor type, either 'PSC' or 'ECM'
16
+ # @return [Hash, NilClass] motor efficiency
17
+ def motor_fractional_hp_efficiencies(nominal_hp, motor_type = 'PSC')
18
+ # Unless specified otherwise, the efficiencies are calculated from
19
+ # Table 5-3 from Energy Savings Potential and Research & Development Opportunities for Commercial Refrigeration, Navigant, 2009
20
+ # https://www1.eere.energy.gov/buildings/pdfs/commercial_refrigeration_equipment_research_opportunities.pdf
21
+ #
22
+ # efficiency = (rated shaft output) / (input power)
23
+ case motor_type
24
+ when 'PSC'
25
+ if nominal_hp <= 1.0 / 20.0
26
+ efficiency = 37.0 / 70.0
27
+ elsif nominal_hp <= 1.0 / 15.0
28
+ efficiency = 50.0 / 90.0
29
+ elsif nominal_hp <= 1.0 / 6.0
30
+ efficiency = 125.0 / 202.0
31
+ elsif nominal_hp <= 1.0 / 3.0
32
+ efficiency = 249.0 / 370.0
33
+ elsif nominal_hp <= 1.0 / 2.0
34
+ efficiency = 373.0 / 530.0
35
+ elsif nominal_hp <= 3.0 / 4.0
36
+ efficiency = 560.0 / 699.0 # data obtained from motorboss.com
37
+ else
38
+ return nil
39
+ end
40
+ when 'ECM'
41
+ if nominal_hp <= 1.0 / 20.0
42
+ efficiency = 37.0 / 49.0
43
+ elsif nominal_hp <= 1.0 / 15.0
44
+ efficiency = 50.0 / 65.0
45
+ elsif nominal_hp <= 1.0 / 6.0
46
+ efficiency = 125.0 / 155.0
47
+ elsif nominal_hp <= 1.0 / 3.0
48
+ efficiency = 249.0 / 304.0
49
+ elsif nominal_hp <= 1.0 / 2.0
50
+ efficiency = 373.0 / 450.0
51
+ elsif nominal_hp <= 3.0 / 4.0
52
+ efficiency = 560.0 / 674.0 # data obtained from motorboss.com
53
+ else
54
+ return nil
55
+ end
56
+ else
57
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.motor', "#{motor_type} was passed as a motor_type, it should either be ECM or PSC.")
58
+ return nil
59
+ end
60
+ motor_properties = {
61
+ 'nominal_full_load_efficiency' => efficiency,
62
+ 'maximum_capacity' => nominal_hp
63
+ }
64
+ return motor_properties
65
+ end
66
+ end
@@ -190,7 +190,8 @@ class Standard
190
190
  stds_type,
191
191
  occ_type,
192
192
  wwr_building_type: surface_std_wwr_type,
193
- wwr_info: wwr_info)
193
+ wwr_info: wwr_info,
194
+ surface: planar_surface)
194
195
  if !new_construction == false
195
196
  previous_construction_map[type] = new_construction
196
197
  end
@@ -113,7 +113,7 @@ module Pump
113
113
  # Determines the minimum pump motor efficiency and nominal size
114
114
  # for a given motor bhp. This should be the total brake horsepower with
115
115
  # any desired safety factor already included. This method picks
116
- # the next nominal motor catgory larger than the required brake
116
+ # the next nominal motor category larger than the required brake
117
117
  # horsepower, and the efficiency is based on that size. For example,
118
118
  # if the bhp = 6.3, the nominal size will be 7.5HP and the efficiency
119
119
  # for 90.1-2010 will be 91.7% from Table 10.8B. This method assumes
@@ -125,24 +125,47 @@ module Pump
125
125
  # @return [Array<Double>] minimum motor efficiency (0.0 to 1.0), nominal horsepower
126
126
  def pump_standard_minimum_motor_efficiency_and_size(pump, motor_bhp)
127
127
  motor_eff = 0.85
128
- nominal_hp = motor_bhp
128
+ # Calculate the allowed fan brake horsepower
129
+ # per method used in PNNL prototype buildings.
130
+ # Assumes that the fan brake horsepower is 90%
131
+ # of the fan nameplate rated motor power.
132
+ # Source: Thornton et al. (2011), Achieving the 30% Goal: Energy and Cost Savings Analysis of ASHRAE Standard 90.1-2010, Section 4.5.4
133
+ nominal_hp = motor_bhp * 1.1
129
134
 
130
135
  # Don't attempt to look up motor efficiency
131
136
  # for zero-hp pumps (required for circulation-pump-free
132
137
  # service water heating systems).
133
138
  return [1.0, 0] if motor_bhp < 0.0001 # under 1 watt
134
139
 
135
- # Lookup the minimum motor efficiency
136
- motors = standards_data['motors']
140
+ if nominal_hp <= 0.75
141
+ motor_type = motor_type(nominal_hp)
142
+ motor_properties = motor_fractional_hp_efficiencies(nominal_hp, motor_type = motor_type)
143
+ else
144
+ # Lookup the minimum motor efficiency
145
+ motors = standards_data['motors']
146
+
147
+ # Assuming all pump motors are 4-pole ODP
148
+ search_criteria = {
149
+ 'template' => template,
150
+ 'number_of_poles' => 4.0,
151
+ 'type' => 'Enclosed'
152
+ }
153
+
154
+ # Use the efficiency largest motor efficiency when BHP is greater than the largest size for which a requirement is provided
155
+ data = model_find_objects(motors, search_criteria)
156
+ maximum_capacity = model_find_maximum_value(data, 'maximum_capacity')
157
+ if motor_bhp > maximum_capacity
158
+ motor_bhp = maximum_capacity
159
+ end
160
+
161
+ motor_properties = model_find_object(motors, search_criteria, capacity = nil, date = Date.today, area = nil, num_floors = nil, fan_motor_bhp = motor_bhp)
137
162
 
138
- # Assuming all pump motors are 4-pole ODP
139
- search_criteria = {
140
- 'template' => template,
141
- 'number_of_poles' => 4.0,
142
- 'type' => 'Enclosed'
143
- }
163
+ if motor_properties.nil?
164
+ # Retry without the date
165
+ motor_properties = model_find_object(motors, search_criteria, capacity = nil, date = nil, area = nil, num_floors = nil, fan_motor_bhp = motor_bhp)
166
+ end
167
+ end
144
168
 
145
- motor_properties = model_find_object(motors, search_criteria, motor_bhp)
146
169
  if motor_properties.nil?
147
170
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Pump', "For #{pump.name}, could not find motor properties using search criteria: #{search_criteria}, motor_bhp = #{motor_bhp} hp.")
148
171
  return [motor_eff, nominal_hp]
@@ -155,15 +178,6 @@ module Pump
155
178
  nominal_hp = nominal_hp.round
156
179
  end
157
180
 
158
- # Get the efficiency based on the nominal horsepower
159
- # Add 0.01 hp to avoid search errors.
160
- motor_properties = model_find_object(motors, search_criteria, nominal_hp + 0.01)
161
- if motor_properties.nil?
162
- OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Fan', "For #{pump.name}, could not find nominal motor properties using search criteria: #{search_criteria}, motor_hp = #{nominal_hp} hp.")
163
- return [motor_eff, nominal_hp]
164
- end
165
- motor_eff = motor_properties['nominal_full_load_efficiency']
166
-
167
181
  return [motor_eff, nominal_hp]
168
182
  end
169
183
 
@@ -221,285 +221,6 @@ class Standard
221
221
  return true
222
222
  end
223
223
 
224
- # add typical swh demand and supply to model
225
- #
226
- # @param model [OpenStudio::Model::Model] OpenStudio model object
227
- # @param water_heater_fuel [String] water heater fuel. Valid choices are NaturalGas, Electricity, and HeatPump.
228
- # If not supplied, a smart default will be determined based on building type.
229
- # @param pipe_insul_in [Double] thickness of the pipe insulation, in inches.
230
- # @param circulating [String] whether the (circulating, noncirculating, nil) nil is smart
231
- # @return [Array<OpenStudio::Model::PlantLoop>] hot water loops
232
- # @todo - add in losses from tank and pipe insulation, etc.
233
- def model_add_typical_swh(model,
234
- water_heater_fuel: nil,
235
- pipe_insul_in: nil,
236
- circulating: nil)
237
- # array of hot water loops
238
- swh_systems = []
239
-
240
- # hash of general water use equipment awaiting loop
241
- water_use_equipment_hash = {} # key is standards building type value is array of water use equipment
242
-
243
- # create space type hash (need num_units for MidriseApartment and RetailStripmall)
244
- space_type_hash = model_create_space_type_hash(model, trust_effective_num_spaces = false)
245
-
246
- # loop through space types adding demand side of swh
247
- model.getSpaceTypes.sort.each do |space_type|
248
- next unless space_type.standardsBuildingType.is_initialized
249
- next unless space_type_hash.key?(space_type) # this is used for space types without any floor area
250
-
251
- stds_bldg_type = space_type.standardsBuildingType.get
252
-
253
- # lookup space_type_properties
254
- space_type_properties = space_type_get_standards_data(space_type)
255
- peak_flow_rate_gal_per_hr_per_ft2 = space_type_properties['service_water_heating_peak_flow_per_area'].to_f
256
- peak_flow_rate_gal_per_hr = space_type_properties['service_water_heating_peak_flow_rate'].to_f
257
- swh_system_type = space_type_properties['service_water_heating_system_type']
258
- flow_rate_fraction_schedule = model_add_schedule(model, space_type_properties['service_water_heating_schedule'])
259
- service_water_temperature_f = space_type_properties['service_water_heating_target_temperature'].to_f
260
- service_water_temperature_c = OpenStudio.convert(service_water_temperature_f, 'F', 'C').get
261
- booster_water_temperature_f = space_type_properties['booster_water_heating_target_temperature'].to_f
262
- booster_water_temperature_c = OpenStudio.convert(booster_water_temperature_f, 'F', 'C').get
263
- booster_water_heater_fraction = space_type_properties['booster_water_heater_fraction'].to_f
264
- service_water_fraction_sensible = space_type_properties['service_water_heating_fraction_sensible']
265
- service_water_fraction_latent = space_type_properties['service_water_heating_fraction_latent']
266
- floor_area_m2 = space_type_hash[space_type][:floor_area]
267
- floor_area_ft2 = OpenStudio.convert(floor_area_m2, 'm^2', 'ft^2').get
268
-
269
- # next if no service water heating demand
270
- next unless peak_flow_rate_gal_per_hr_per_ft2 > 0.0 || peak_flow_rate_gal_per_hr > 0.0
271
-
272
- # If there is no SWH schedule specified, assume
273
- # that there should be no SWH consumption for this space type.
274
- unless flow_rate_fraction_schedule
275
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "No service water heating schedule was specified for #{space_type.name}, an always off schedule will be used and no water will be used.")
276
- flow_rate_fraction_schedule = model.alwaysOffDiscreteSchedule
277
- end
278
-
279
- # Determine flow rate
280
- case swh_system_type
281
- when 'One Per Unit'
282
- water_heater_fuel = 'Electricity' if water_heater_fuel.nil?
283
- num_units = space_type_hash[space_type][:num_units].round # First try number of units
284
- num_units = space_type_hash[space_type][:effective_num_spaces].round if num_units.zero? # Fall back on number of spaces
285
- peak_flow_rate_gal_per_hr = num_units * peak_flow_rate_gal_per_hr
286
- peak_flow_rate_m3_per_s = OpenStudio.convert(peak_flow_rate_gal_per_hr, 'gal/hr', 'm^3/s').get
287
- use_name = "#{space_type.name} #{num_units} units"
288
- else
289
- # @todo add building type or sice specific logic or just assume Gas?
290
- # (SmallOffice and Warehouse are only non unit prototypes with Electric heating)
291
- water_heater_fuel = 'NaturalGas' if water_heater_fuel.nil?
292
- num_units = 1
293
- peak_flow_rate_gal_per_hr = peak_flow_rate_gal_per_hr_per_ft2 * floor_area_ft2
294
- peak_flow_rate_m3_per_s = OpenStudio.convert(peak_flow_rate_gal_per_hr, 'gal/hr', 'm^3/s').get
295
- use_name = space_type.name.to_s
296
- end
297
-
298
- # Split flow rate between main and booster uses if specified
299
- booster_water_use_equip = nil
300
- if booster_water_heater_fraction > 0.0
301
- booster_peak_flow_rate_m3_per_s = peak_flow_rate_m3_per_s * booster_water_heater_fraction
302
- peak_flow_rate_m3_per_s -= booster_peak_flow_rate_m3_per_s
303
-
304
- # Add booster water heater equipment and connections
305
- booster_water_use_equip = OpenstudioStandards::ServiceWaterHeating.create_water_use(model,
306
- name: "Booster #{use_name}",
307
- flow_rate: booster_peak_flow_rate_m3_per_s,
308
- flow_rate_fraction_schedule: flow_rate_fraction_schedule,
309
- water_use_temperature: booster_water_temperature_c,
310
- sensible_fraction: service_water_fraction_sensible,
311
- latent_fraction: service_water_fraction_latent)
312
- end
313
-
314
- # Add water use equipment and connections
315
- water_use_equip = OpenstudioStandards::ServiceWaterHeating.create_water_use(model,
316
- name: use_name,
317
- flow_rate: peak_flow_rate_m3_per_s,
318
- flow_rate_fraction_schedule: flow_rate_fraction_schedule,
319
- water_use_temperature: service_water_temperature_c,
320
- sensible_fraction: service_water_fraction_sensible,
321
- latent_fraction: service_water_fraction_latent)
322
-
323
- # Water heater sizing
324
- case swh_system_type
325
- when 'One Per Unit'
326
- water_heater_capacity_w = num_units * OpenStudio.convert(20.0, 'kBtu/hr', 'W').get
327
- water_heater_volume_m3 = num_units * OpenStudio.convert(50.0, 'gal', 'm^3').get
328
- num_water_heaters = num_units
329
- else
330
- water_use_equips = [water_use_equip]
331
- water_use_equips << booster_water_use_equip unless booster_water_use_equip.nil? # Include booster in sizing since flows will be preheated by main water heater
332
- water_heater_sizing = model_find_water_heater_capacity_volume_and_parasitic(model, water_use_equips)
333
- water_heater_capacity_w = water_heater_sizing[:water_heater_capacity]
334
- water_heater_volume_m3 = water_heater_sizing[:water_heater_volume]
335
- num_water_heaters = 1
336
- end
337
-
338
- # Add either a dedicated SWH loop or save to add to shared SWH loop
339
- case swh_system_type
340
- when 'Shared'
341
-
342
- # Store water use equip by building type to add to shared building hot water loop
343
- if water_use_equipment_hash.key?(stds_bldg_type)
344
- water_use_equipment_hash[stds_bldg_type] << water_use_equip
345
- else
346
- water_use_equipment_hash[stds_bldg_type] = [water_use_equip]
347
- end
348
-
349
- when 'One Per Unit', 'Dedicated'
350
- pipe_insul_in = 0.0 if pipe_insul_in.nil?
351
-
352
- # Add service water loop with water heater
353
- swh_loop = OpenstudioStandards::ServiceWaterHeating.create_service_water_heating_loop(model,
354
- system_name: "#{space_type.name} Service Water Loop",
355
- service_water_temperature: service_water_temperature_c,
356
- service_water_pump_head: 0.01,
357
- service_water_pump_motor_efficiency: 1.0,
358
- water_heater_capacity: water_heater_capacity_w,
359
- water_heater_volume: water_heater_volume_m3,
360
- water_heater_fuel: water_heater_fuel,
361
- number_of_water_heaters: num_water_heaters,
362
- add_piping_losses: true,
363
- pipe_insulation_thickness: OpenStudio.convert(pipe_insul_in, 'in', 'm').get,
364
- floor_area: OpenStudio.convert(950, 'ft^2', 'm^2').get,
365
- number_of_stories: 1)
366
-
367
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.Model.Model', "In model_add_typical, num_water_heaters = #{num_water_heaters}")
368
- # Add loop to list
369
- swh_systems << swh_loop
370
-
371
- # Attach water use equipment to the loop
372
- swh_connection = water_use_equip.waterUseConnections
373
- swh_loop.addDemandBranchForComponent(swh_connection.get) if swh_connection.is_initialized
374
-
375
- # If a booster fraction is specified, some percentage of the water
376
- # is assumed to be heated beyond the normal temperature by a separate
377
- # booster water heater. This booster water heater is fed by the
378
- # main water heater, so the booster is responsible for a smaller delta-T.
379
- if booster_water_heater_fraction > 0
380
- # find_water_heater_capacity_volume_and_parasitic
381
- booster_water_heater_sizing = model_find_water_heater_capacity_volume_and_parasitic(model,
382
- [booster_water_use_equip],
383
- htg_eff: 1.0,
384
- inlet_temp_f: service_water_temperature_f,
385
- target_temp_f: booster_water_temperature_f)
386
-
387
- # Add service water booster loop with water heater
388
- # Note that booster water heaters are always assumed to be electric resistance
389
- swh_booster_loop = OpenstudioStandards::ServiceWaterHeating.create_booster_water_heating_loop(model,
390
- water_heater_capacity: booster_water_heater_sizing[:water_heater_capacity],
391
- service_water_temperature: booster_water_temperature_c,
392
- service_water_loop: swh_loop)
393
-
394
- # Rename the service water booster loop
395
- swh_booster_loop.setName("#{space_type.name} Service Water Booster Loop")
396
-
397
- # Attach booster water use equipment to the booster loop
398
- booster_swh_connection = booster_water_use_equip.waterUseConnections
399
- swh_booster_loop.addDemandBranchForComponent(booster_swh_connection.get) if booster_swh_connection.is_initialized
400
- end
401
-
402
- else
403
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "'#{swh_system_type}' is not a valid Service Water Heating System Type, cannot add SWH to #{space_type.name}. Valid choices are One Per Unit, Dedicated, and Shared.")
404
- end
405
- end
406
-
407
- # get building floor area and effective number of stories
408
- bldg_floor_area_m2 = model.getBuilding.floorArea
409
- bldg_effective_num_stories_hash = model_effective_num_stories(model)
410
- bldg_effective_num_stories = bldg_effective_num_stories_hash[:below_grade] + bldg_effective_num_stories_hash[:above_grade]
411
-
412
- # add non-dedicated system(s) here. Separate systems for water use equipment from different building types
413
- water_use_equipment_hash.sort.each do |stds_bldg_type, water_use_equipment_array|
414
- # @todo find the water use equipment with the highest temperature
415
- water_heater_temp_f = 140.0
416
- water_heater_temp_c = OpenStudio.convert(water_heater_temp_f, 'F', 'C').get
417
-
418
- # find pump values
419
- # Table A.2 in PrototypeModelEnhancements_2014_0.pdf shows 10ft on everything except SecondarySchool which has 11.4ft
420
- # @todo Remove hard-coded building-type-based lookups for circulating vs. non-circulating SWH systems
421
- circulating_bldg_types = [
422
- # DOE building types
423
- 'Office',
424
- 'PrimarySchool',
425
- 'Outpatient',
426
- 'Hospital',
427
- 'SmallHotel',
428
- 'LargeHotel',
429
- 'FullServiceRestaurant',
430
- 'HighriseApartment',
431
- # DEER building types
432
- 'Asm', # 'Assembly'
433
- 'ECC', # 'Education - Community College'
434
- 'EPr', # 'Education - Primary School'
435
- 'ERC', # 'Education - Relocatable Classroom'
436
- 'ESe', # 'Education - Secondary School'
437
- 'EUn', # 'Education - University'
438
- 'Gro', # 'Grocery'
439
- 'Hsp', # 'Health/Medical - Hospital'
440
- 'Htl', # 'Lodging - Hotel'
441
- 'MBT', # 'Manufacturing Biotech'
442
- 'MFm', # 'Residential Multi-family'
443
- 'Mtl', # 'Lodging - Motel'
444
- 'Nrs', # 'Health/Medical - Nursing Home'
445
- 'OfL', # 'Office - Large'
446
- # 'RFF', # 'Restaurant - Fast-Food'
447
- 'RSD' # 'Restaurant - Sit-Down'
448
- ]
449
- if circulating_bldg_types.include?(stds_bldg_type)
450
- service_water_pump_head_pa = OpenStudio.convert(10.0, 'ftH_{2}O', 'Pa').get
451
- service_water_pump_motor_efficiency = 0.3
452
- circulating = true if circulating.nil?
453
- pipe_insul_in = 0.5 if pipe_insul_in.nil?
454
- else # values for non-circulating pump
455
- service_water_pump_head_pa = 0.01
456
- service_water_pump_motor_efficiency = 1.0
457
- circulating = false if circulating.nil?
458
- pipe_insul_in = 0.0 if pipe_insul_in.nil?
459
- end
460
-
461
- bldg_type_floor_area_m2 = 0.0
462
- space_type_hash.sort.each do |space_type, space_type_props|
463
- bldg_type_floor_area_m2 += space_type_props[:floor_area] if space_type_props[:stds_bldg_type] == stds_bldg_type
464
- end
465
-
466
- # Calculate the number of stories covered by this building type
467
- num_stories = bldg_effective_num_stories * (bldg_type_floor_area_m2 / bldg_floor_area_m2)
468
-
469
- # Water heater sizing
470
- water_heater_sizing = model_find_water_heater_capacity_volume_and_parasitic(model, water_use_equipment_array)
471
- water_heater_capacity_w = water_heater_sizing[:water_heater_capacity]
472
- water_heater_volume_m3 = water_heater_sizing[:water_heater_volume]
473
-
474
- # Add a shared service water heating loop with water heater
475
- shared_swh_loop = OpenstudioStandards::ServiceWaterHeating.create_service_water_heating_loop(model,
476
- system_name: "#{stds_bldg_type} Shared Service Water Loop",
477
- service_water_temperature: water_heater_temp_c,
478
- service_water_pump_head: service_water_pump_head_pa,
479
- service_water_pump_motor_efficiency: service_water_pump_motor_efficiency,
480
- water_heater_capacity: water_heater_capacity_w,
481
- water_heater_volume: water_heater_volume_m3,
482
- water_heater_fuel: water_heater_fuel,
483
- add_piping_losses: true,
484
- pipe_insulation_thickness: OpenStudio.convert(pipe_insul_in, 'in', 'm').get,
485
- floor_area: bldg_type_floor_area_m2,
486
- number_of_stories: num_stories)
487
-
488
- # Attach all water use equipment to the shared loop
489
- water_use_equipment_array.sort.each do |water_use_equip|
490
- swh_connection = water_use_equip.waterUseConnections
491
- shared_swh_loop.addDemandBranchForComponent(swh_connection.get) if swh_connection.is_initialized
492
- end
493
-
494
- # add to list of systems
495
- swh_systems << shared_swh_loop
496
-
497
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Adding shared water heating loop for #{stds_bldg_type}.")
498
- end
499
-
500
- return swh_systems
501
- end
502
-
503
224
  # This method will add a swh water fixture to the model for the space.
504
225
  # It will return a water fixture object, or NIL if there is no water load at all.
505
226
  #
@@ -583,78 +304,4 @@ class Standard
583
304
 
584
305
  return water_fixture
585
306
  end
586
-
587
- # Use rules from DOE Prototype Building documentation to determine water heater capacity,
588
- # volume, pipe dump losses, and pipe thermal losses.
589
- #
590
- # @param model [OpenStudio::Model::Model] OpenStudio model object
591
- # @param water_use_equipment_array [Array] array of water use equipment objects that will be using this water heater
592
- # @param storage_to_cap_ratio_gal_to_kbtu_per_hr [Double] storage volume gal to kBtu/hr of capacity
593
- # @param htg_eff [Double] water heater thermal efficiency, fraction
594
- # @param inlet_temp_f [Double] inlet cold water temperature, degrees Fahrenheit
595
- # @param target_temp_f [Double] target supply water temperature from the tank, degrees Fahrenheit
596
- # @return [Hash] hash with values needed to size water heater made with downstream method
597
- def model_find_water_heater_capacity_volume_and_parasitic(model,
598
- water_use_equipment_array,
599
- storage_to_cap_ratio_gal_to_kbtu_per_hr: 1.0,
600
- htg_eff: 0.8,
601
- inlet_temp_f: 40.0,
602
- target_temp_f: 140.0,
603
- peak_flow_fraction: 1.0)
604
- # A.1.4 Total Storage Volume and Water Heater Capacity of PrototypeModelEnhancements_2014_0.pdf shows 1 gallon of storage to 1 kBtu/h of capacity
605
-
606
- water_heater_sizing = {}
607
-
608
- # Get the maximum flow rates for all pieces of water use equipment
609
- adjusted_max_flow_rates_gal_per_hr = [] # gallons per hour
610
- water_use_equipment_array.sort.each do |water_use_equip|
611
- water_use_equip_sch = water_use_equip.flowRateFractionSchedule
612
- next if water_use_equip_sch.empty?
613
-
614
- water_use_equip_sch = water_use_equip_sch.get
615
- if water_use_equip_sch.to_ScheduleRuleset.is_initialized
616
- water_use_equip_sch = water_use_equip_sch.to_ScheduleRuleset.get
617
- max_sch_value = OpenstudioStandards::Schedules.schedule_ruleset_get_min_max(water_use_equip_sch)['max']
618
- elsif water_use_equip_sch.to_ScheduleConstant.is_initialized
619
- water_use_equip_sch = water_use_equip_sch.to_ScheduleConstant.get
620
- max_sch_value = OpenstudioStandards::Schedules.schedule_constant_get_min_max(water_use_equip_sch)['max']
621
- elsif water_use_equip_sch.to_ScheduleCompact.is_initialized
622
- water_use_equip_sch = water_use_equip_sch.to_ScheduleCompact.get
623
- max_sch_value = OpenstudioStandards::Schedules.schedule_compact_get_min_max(water_use_equip_sch)['max']
624
- else
625
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "The peak flow rate fraction for #{water_use_equip_sch.name} could not be determined, assuming 1 for water heater sizing purposes.")
626
- max_sch_value = 1.0
627
- end
628
-
629
- # Get peak flow rate from water use equipment definition
630
- peak_flow_rate_m3_per_s = water_use_equip.waterUseEquipmentDefinition.peakFlowRate
631
-
632
- # Calculate adjusted flow rate based on the peak fraction found in the flow rate fraction schedule
633
- adjusted_peak_flow_rate_m3_per_s = max_sch_value * peak_flow_rate_m3_per_s
634
- adjusted_max_flow_rates_gal_per_hr << OpenStudio.convert(adjusted_peak_flow_rate_m3_per_s, 'm^3/s', 'gal/hr').get
635
- end
636
-
637
- # Sum gph values from water use equipment to use in formula
638
- total_adjusted_flow_rate_gal_per_hr = adjusted_max_flow_rates_gal_per_hr.inject(:+)
639
-
640
- # Calculate capacity based on analysis of combined water use equipment maximum flow rates and schedules
641
- # Max gal/hr * 8.4 lb/gal * 1 Btu/lb F * (120F - 40F)/0.8 = Btu/hr
642
- water_heater_capacity_btu_per_hr = peak_flow_fraction * total_adjusted_flow_rate_gal_per_hr * 8.4 * 1.0 * (target_temp_f - inlet_temp_f) / htg_eff
643
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "Capacity of #{water_heater_capacity_btu_per_hr.round} Btu/hr = #{peak_flow_fraction} peak fraction * #{total_adjusted_flow_rate_gal_per_hr.round} gal/hr * 8.4 lb/gal * 1.0 Btu/lb F * (#{target_temp_f.round} - #{inlet_temp_f.round} deltaF / #{htg_eff} htg eff).")
644
- water_heater_capacity_m3_per_s = OpenStudio.convert(water_heater_capacity_btu_per_hr, 'Btu/hr', 'W').get
645
-
646
- # Calculate volume based on capacity
647
- # Default assumption is 1 gal of volume per 1 kBtu/hr of heating capacity
648
- water_heater_capacity_kbtu_per_hr = OpenStudio.convert(water_heater_capacity_btu_per_hr, 'Btu/hr', 'kBtu/hr').get
649
- water_heater_volume_gal = water_heater_capacity_kbtu_per_hr * storage_to_cap_ratio_gal_to_kbtu_per_hr
650
- # increase tank size to 40 galons if calculated value is smaller
651
- water_heater_volume_gal = 40.0 if water_heater_volume_gal < 40.0 # gal
652
- water_heater_volume_m3 = OpenStudio.convert(water_heater_volume_gal, 'gal', 'm^3').get
653
-
654
- # Populate return hash
655
- water_heater_sizing[:water_heater_capacity] = water_heater_capacity_m3_per_s
656
- water_heater_sizing[:water_heater_volume] = water_heater_volume_m3
657
-
658
- return water_heater_sizing
659
- end
660
307
  end
@@ -1243,110 +1243,6 @@ class Standard
1243
1243
  return [sensor_1_frac, sensor_2_frac, sensor_1_window, sensor_2_window]
1244
1244
  end
1245
1245
 
1246
- # Set the infiltration rate for this space to include the impact of air leakage requirements in the standard.
1247
- #
1248
- # @param space [OpenStudio::Model::Space] space object
1249
- # @return [Double] true if successful, false if not
1250
- # @todo handle doors and vestibules
1251
- def space_apply_infiltration_rate(space)
1252
- # data center keeps positive pressure all the time, so no infiltration
1253
- if space.spaceType.is_initialized && space.spaceType.get.standardsSpaceType.is_initialized
1254
- std_space_type = space.spaceType.get.standardsSpaceType.get
1255
- if std_space_type.downcase.include?('data center') || std_space_type.downcase.include?('datacenter')
1256
- return true
1257
- end
1258
-
1259
- if space.spaceType.get.standardsBuildingType.is_initialized
1260
- std_bldg_type = space.spaceType.get.standardsBuildingType.get
1261
- if std_bldg_type.downcase.include?('datacenter') && std_space_type.downcase.include?('computerroom')
1262
- return true
1263
- end
1264
- end
1265
- end
1266
-
1267
- # Determine the total building baseline infiltration rate in cfm per ft2 of exterior above grade wall area at 75 Pa
1268
- # exterior above grade envelope area includes any surface with boundary condition 'Outdoors' in OpenStudio/EnergyPlus
1269
- basic_infil_rate_cfm_per_ft2 = space_infiltration_rate_75_pa(space)
1270
-
1271
- # Do nothing if no infiltration
1272
- return true if basic_infil_rate_cfm_per_ft2.zero?
1273
-
1274
- # Conversion factor
1275
- # 1 m^3/s*m^2 = 196.85 cfm/ft2
1276
- conv_fact = 196.85
1277
-
1278
- # Adjust the infiltration rate to the average pressure for the prototype buildings.
1279
- adj_infil_rate_cfm_per_ft2 = OpenstudioStandards::Infiltration.adjust_infiltration_to_prototype_building_conditions(basic_infil_rate_cfm_per_ft2)
1280
- adj_infil_rate_m3_per_s_per_m2 = adj_infil_rate_cfm_per_ft2 / conv_fact
1281
- # Get the exterior wall area
1282
- exterior_wall_and_window_area_m2 = OpenstudioStandards::Geometry.space_get_exterior_wall_and_subsurface_area(space)
1283
-
1284
- # Don't create an object if there is no exterior wall area
1285
- if exterior_wall_and_window_area_m2 <= 0.0
1286
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, no exterior wall area was found, no infiltration will be added.")
1287
- return true
1288
- end
1289
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Space', "For #{space.name}, set infiltration rate to #{adj_infil_rate_cfm_per_ft2.round(3)} cfm/ft2 exterior wall area (aka #{basic_infil_rate_cfm_per_ft2} cfm/ft2 @75Pa).")
1290
-
1291
- # Calculate the total infiltration, assuming
1292
- # that it only occurs through exterior walls
1293
- tot_infil_m3_per_s = adj_infil_rate_m3_per_s_per_m2 * exterior_wall_and_window_area_m2
1294
-
1295
- # Now spread the total infiltration rate over all
1296
- # exterior surface areas (for the E+ input field)
1297
- all_ext_infil_m3_per_s_per_m2 = tot_infil_m3_per_s / space.exteriorArea
1298
-
1299
- OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Space', "For #{space.name}, adj infil = #{all_ext_infil_m3_per_s_per_m2.round(8)} m^3/s*m^2.")
1300
-
1301
- # Get any infiltration schedule already assigned to this space or its space type
1302
- # If not, the always on schedule will be applied.
1303
- infil_sch = nil
1304
- unless space.spaceInfiltrationDesignFlowRates.empty?
1305
- old_infil = space.spaceInfiltrationDesignFlowRates[0]
1306
- if old_infil.schedule.is_initialized
1307
- infil_sch = old_infil.schedule.get
1308
- end
1309
- end
1310
-
1311
- if infil_sch.nil? && space.spaceType.is_initialized
1312
- space_type = space.spaceType.get
1313
- unless space_type.spaceInfiltrationDesignFlowRates.empty?
1314
- old_infil = space_type.spaceInfiltrationDesignFlowRates[0]
1315
- if old_infil.schedule.is_initialized
1316
- infil_sch = old_infil.schedule.get
1317
- end
1318
- end
1319
- end
1320
-
1321
- if infil_sch.nil?
1322
- infil_sch = space.model.alwaysOnDiscreteSchedule
1323
- end
1324
-
1325
- # Create an infiltration rate object for this space
1326
- infiltration = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(space.model)
1327
- infiltration.setName("#{space.name} Infiltration")
1328
- # infiltration.setFlowperExteriorWallArea(adj_infil_rate_m3_per_s_per_m2)
1329
- infiltration.setFlowperExteriorSurfaceArea(all_ext_infil_m3_per_s_per_m2.round(13))
1330
- infiltration.setSchedule(infil_sch)
1331
- infiltration.setConstantTermCoefficient(0.0)
1332
- infiltration.setTemperatureTermCoefficient 0.0
1333
- infiltration.setVelocityTermCoefficient(0.224)
1334
- infiltration.setVelocitySquaredTermCoefficient(0.0)
1335
-
1336
- infiltration.setSpace(space)
1337
-
1338
- return true
1339
- end
1340
-
1341
- # Baseline infiltration rate
1342
- #
1343
- # @param space [OpenStudio::Model::Space] space object
1344
- # @return [Double] the baseline infiltration rate, in cfm/ft^2 exterior above grade wall area at 75 Pa
1345
- def space_infiltration_rate_75_pa(space = nil)
1346
- basic_infil_rate_cfm_per_ft2 = 1.8
1347
- return basic_infil_rate_cfm_per_ft2
1348
- end
1349
-
1350
1246
  # Determines whether the space is conditioned per 90.1, which is based on heating and cooling loads.
1351
1247
  #
1352
1248
  # @param space [OpenStudio::Model::Space] space object
@@ -1378,7 +1274,7 @@ class Standard
1378
1274
  space.model.getAirLoopHVACReturnPlenums.each do |return_air_plenum|
1379
1275
  if return_air_plenum.thermalZone.get.name.to_s == zone.get.name.to_s
1380
1276
  # Determine if residential
1381
- res = OpenstudioStandards::ThermalZone.thermal_zone_residential?(zone.get) ? true : false
1277
+ res = OpenstudioStandards::ThermalZone.thermal_zone_residential?(zone.get)
1382
1278
 
1383
1279
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Standards.ThermalZone', "Zone #{zone.get.name} is (indirectly) conditioned (return air plenum).")
1384
1280
  cond_cat = res ? 'ResConditioned' : 'NonResConditioned'
@@ -1391,7 +1287,7 @@ class Standard
1391
1287
  space.model.getAirLoopHVACSupplyPlenums.each do |supply_air_plenum|
1392
1288
  if supply_air_plenum.thermalZone.get.name.to_s == zone.get.name.to_s
1393
1289
  # Determine if residential
1394
- res = OpenstudioStandards::ThermalZone.thermal_zone_residential?(zone.get) ? true : false
1290
+ res = OpenstudioStandards::ThermalZone.thermal_zone_residential?(zone.get)
1395
1291
 
1396
1292
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.Standards.ThermalZone', "Zone #{zone.get.name} is (indirectly) conditioned (supply air plenum).")
1397
1293
  cond_cat = res ? 'ResConditioned' : 'NonResConditioned'
@@ -1454,7 +1350,7 @@ class Standard
1454
1350
  end
1455
1351
 
1456
1352
  # Determine if residential
1457
- res = OpenstudioStandards::ThermalZone.thermal_zone_residential?(zone.get) ? true : false
1353
+ res = OpenstudioStandards::ThermalZone.thermal_zone_residential?(zone.get)
1458
1354
 
1459
1355
  return cond_cat unless cond_ua > otr_ua
1460
1356