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
@@ -13,6 +13,12 @@ class Standard
13
13
 
14
14
  # @!group Model
15
15
 
16
+ # Returns the PRM building envelope infiltration rate at a pressure differential of 75 Pa in cfm per ft^2
17
+ # @return [Double] infiltration rate in cfm per ft^2 at 75 Pa
18
+ def prm_building_envelope_infiltration_rate
19
+ return 1.0
20
+ end
21
+
16
22
  # Creates a Performance Rating Method (aka Appendix G aka LEED) baseline building model
17
23
  # Method used for 90.1-2016 and onward
18
24
  #
@@ -102,6 +108,9 @@ class Standard
102
108
 
103
109
  # Check proposed model unmet load hours
104
110
  if unmet_load_hours_check
111
+ # Set proposed model export data in json format
112
+ OpenStudioStandards::RulesetChecking.export_json_output(proposed_model)
113
+
105
114
  # Run user model; need annual simulation to get unmet load hours
106
115
  if model_run_simulation_and_log_errors(proposed_model, run_dir = "#{sizing_run_dir}/PROP")
107
116
  umlh = OpenstudioStandards::SqlFile.model_get_annual_occupied_unmet_hours(proposed_model)
@@ -128,8 +137,17 @@ class Standard
128
137
  proposed_model.save(OpenStudio::Path.new("#{sizing_run_dir}/proposed_final.osm"), true)
129
138
  forward_translator = OpenStudio::EnergyPlus::ForwardTranslator.new
130
139
  idf = forward_translator.translateModel(proposed_model)
140
+
141
+ proposed_model.getSpaces.sort.each do |space|
142
+ space_cond_type = space_conditioning_category(space)
143
+ next if space_cond_type == 'Unconditioned'
144
+ OpenStudioStandards::RulesetChecking.tag_spaces(idf, space)
145
+ end
131
146
  idf_path = OpenStudio::Path.new("#{sizing_run_dir}/proposed_final.idf")
132
147
  idf.save(idf_path, true)
148
+
149
+ # export to epjson
150
+ OpenStudioStandards::RulesetChecking.export_epjson(proposed_model, sizing_run_dir, 'proposed_final')
133
151
  end
134
152
 
135
153
  # Define different orientation from original orientation
@@ -219,9 +237,8 @@ class Standard
219
237
  set_electric_equipment = false
220
238
  set_gas_equipment = false
221
239
  set_ventilation = false
222
- set_infiltration = false
223
240
  # For PRM, it only applies lights for now.
224
- space_type_apply_internal_loads(space_type, set_people, set_lights, set_electric_equipment, set_gas_equipment, set_ventilation, set_infiltration)
241
+ space_type_apply_internal_loads(space_type, set_people, set_lights, set_electric_equipment, set_gas_equipment, set_ventilation)
225
242
  end
226
243
 
227
244
  # Modify the lighting schedule to handle lighting occupancy sensors
@@ -239,7 +256,7 @@ class Standard
239
256
  model_add_prm_elevators(model)
240
257
 
241
258
  # Calculate infiltration as per 90.1 PRM rules
242
- model_apply_standard_infiltration(model)
259
+ model_apply_standard_infiltration(model, infiltration_rate: prm_building_envelope_infiltration_rate)
243
260
 
244
261
  # Apply user outdoor air specs as per 90.1 PRM rules exceptions
245
262
  model_apply_userdata_outdoor_air(model)
@@ -255,11 +272,9 @@ class Standard
255
272
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', '*** Adding Daylighting Controls ***')
256
273
 
257
274
  # Run a sizing run to calculate VLT for layer-by-layer windows.
258
- if model_create_prm_baseline_building_requires_vlt_sizing_run(model)
259
- if model_run_sizing_run(model, "#{sizing_run_dir}/SRVLT") == false
275
+ if model_create_prm_baseline_building_requires_vlt_sizing_run(model) && (model_run_sizing_run(model, "#{sizing_run_dir}/SRVLT") == false)
260
276
  return false
261
277
  end
262
- end
263
278
 
264
279
  # Add or remove daylighting controls to each space
265
280
  # Add daylighting controls for 90.1-2013 and prior
@@ -287,7 +302,7 @@ class Standard
287
302
  zone_fan_scheds = get_fan_schedule_for_each_zone(model)
288
303
 
289
304
  # Set the construction properties of all the surfaces in the model
290
- model_apply_constructions(model, climate_zone, wwr_building_type, wwr_info)
305
+ model_apply_standard_constructions(model, climate_zone, wwr_building_type: wwr_building_type, wwr_info: wwr_info)
291
306
 
292
307
  # Update ground temperature profile (for F/C-factor construction objects)
293
308
  model_update_ground_temperature_profile(model, climate_zone)
@@ -323,7 +338,7 @@ class Standard
323
338
 
324
339
  # Modify the service water heating loops per the baseline rules
325
340
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', '*** Cleaning up Service Water Heating Loops ***')
326
- model_apply_baseline_swh_loops(model, building_type)
341
+ model_apply_baseline_swh_loops(model, building_type, swh_building_type)
327
342
 
328
343
  # Determine the baseline HVAC system type for each of the groups of zones and add that system type.
329
344
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', '*** Adding Baseline HVAC Systems ***')
@@ -494,15 +509,21 @@ class Standard
494
509
  # @todo: turn off self shading
495
510
  # Set Solar Distribution to MinimalShadowing... problem is when you also have detached shading such as surrounding buildings etc
496
511
  # It won't be taken into account, while it should: only self shading from the building itself should be turned off but to my knowledge there isn't a way to do this in E+
497
-
498
512
  model_status = degs > 0 ? "baseline_final_#{degs}" : 'baseline_final'
513
+ OpenStudioStandards::RulesetChecking.export_json_output(model)
499
514
  model.save(OpenStudio::Path.new("#{sizing_run_dir}/#{model_status}.osm"), true)
500
515
 
501
516
  # Translate to IDF and save for debugging
502
517
  forward_translator = OpenStudio::EnergyPlus::ForwardTranslator.new
503
518
  idf = forward_translator.translateModel(model)
519
+ model.getSpaces.sort.each do |space|
520
+ space_cond_type = space_conditioning_category(space)
521
+ next if space_cond_type == 'Unconditioned'
522
+ OpenStudioStandards::RulesetChecking.tag_spaces(idf, space)
523
+ end
504
524
  idf_path = OpenStudio::Path.new("#{sizing_run_dir}/#{model_status}.idf")
505
525
  idf.save(idf_path, true)
526
+ OpenStudioStandards::RulesetChecking.export_epjson(model, sizing_run_dir, "#{model_status}")
506
527
 
507
528
  # Check unmet load hours
508
529
  if unmet_load_hours_check
@@ -598,20 +619,23 @@ class Standard
598
619
  end
599
620
 
600
621
  # Calculate total infiltration flow rate per envelope area
601
- building_envelope_area_m2 = model_building_envelope_area(proposed_model)
622
+ building_envelope_area_m2 = OpenstudioStandards::Geometry.model_get_envelope_area(proposed_model)
602
623
  curr_tot_infil_m3_per_s_per_envelope_area = model_current_building_envelope_infiltration_at_75pa(proposed_model, building_envelope_area_m2)
603
624
  curr_tot_infil_cfm_per_envelope_area = OpenStudio.convert(curr_tot_infil_m3_per_s_per_envelope_area, 'm^3/s*m^2', 'cfm/ft^2').get
604
625
 
605
626
  # Warn users if the infiltration modeling in the user/proposed model is not based on field verification
606
- # If not modeled based on field verification, it should be modeled as 0.6 cfm/ft2
607
- unless infiltration_modeled_from_field_verification_results.casecmp('true')
627
+ # If model based on field verification use 0.6 cfm/ft^2, otherwise use 1.0 cfm/ft^2
628
+ if infiltration_modeled_from_field_verification_results == 'true'
608
629
  if curr_tot_infil_cfm_per_envelope_area < 0.6
609
630
  OpenStudio.logFree(OpenStudio::Info, 'prm.log', "The user model's I_75Pa is estimated to be #{curr_tot_infil_cfm_per_envelope_area} m3/s per m2 of total building envelope")
610
631
  end
611
- end
612
632
 
613
- # Modify model to follow the PRM infiltration modeling method
614
- model_apply_standard_infiltration(proposed_model, curr_tot_infil_cfm_per_envelope_area)
633
+ # Modify model to follow the PRM infiltration modeling method
634
+ model_apply_standard_infiltration(proposed_model, infiltration_rate: 0.6)
635
+ else
636
+ # Modify model to follow the PRM infiltration modeling method with the default infiltration rate
637
+ model_apply_standard_infiltration(proposed_model, infiltration_rate: prm_building_envelope_infiltration_rate)
638
+ end
615
639
  end
616
640
 
617
641
  # If needed, remove all non-adiabatic pipes of SWH loops
@@ -675,11 +699,9 @@ class Standard
675
699
 
676
700
  # Check if the object needs to be checked for autosizing
677
701
  obj_to_be_checked_for_autosizing = false
678
- if obj_type.include?('chiller') || obj_type.include?('boiler') || obj_type.include?('coil') || obj_type.include?('fan') || obj_type.include?('pump') || obj_type.include?('waterheater')
679
- if !obj_type.include?('controller')
702
+ if (obj_type.include?('chiller') || obj_type.include?('boiler') || obj_type.include?('coil') || obj_type.include?('fan') || obj_type.include?('pump') || obj_type.include?('waterheater')) && !obj_type.include?('controller')
680
703
  obj_to_be_checked_for_autosizing = true
681
704
  end
682
- end
683
705
 
684
706
  # Check for autosizing
685
707
  if obj_to_be_checked_for_autosizing
@@ -688,12 +710,10 @@ class Standard
688
710
  next if casted_obj.nil?
689
711
 
690
712
  casted_obj.methods.each do |method|
691
- if method.to_s.include?('is') && method.to_s.include?('Autosized')
692
- if casted_obj.public_send(method) == true
713
+ if method.to_s.include?('is') && method.to_s.include?('Autosized') && (casted_obj.public_send(method) == true)
693
714
  is_hvac_autosized = true
694
715
  OpenStudio.logFree(OpenStudio::Info, 'prm.log', "The #{method.to_s.sub('is', '').sub('Autosized', '').sub(':', '')} field of the #{obj_type} named #{casted_obj.name} is autosized. It should be hard sized.")
695
716
  end
696
- end
697
717
  end
698
718
  end
699
719
  end
@@ -748,13 +768,11 @@ class Standard
748
768
  next
749
769
  end
750
770
 
751
- if !applicable_zones.nil?
752
- # This is only used for the stable baseline (2016 and later)
753
- if !applicable_zones.include?(zone)
771
+ # This is only used for the stable baseline (2016 and later)
772
+ if !applicable_zones.nil? && !applicable_zones.include?(zone)
754
773
  # This zone is not part of the current hvac_building_type
755
774
  next
756
775
  end
757
- end
758
776
 
759
777
  # Skip unconditioned zones
760
778
  heated = OpenstudioStandards::ThermalZone.thermal_zone_heated?(zone)
@@ -2293,6 +2311,9 @@ class Standard
2293
2311
  model.getCoilHeatingGass.sort.each { |obj| coil_heating_gas_apply_efficiency_and_curves(obj) }
2294
2312
  model.getCoilHeatingGasMultiStages.each { |obj| coil_heating_gas_multi_stage_apply_efficiency_and_curves(obj) }
2295
2313
 
2314
+ # VRFs
2315
+ model.getAirConditionerVariableRefrigerantFlows.sort.each { |obj| air_conditioner_variable_refrigerant_flow_apply_efficiency_and_curves(obj) }
2316
+
2296
2317
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', "Finished applying HVAC efficiency standards for #{template} template.")
2297
2318
  return true
2298
2319
  end
@@ -2313,32 +2334,28 @@ class Standard
2313
2334
  return true
2314
2335
  end
2315
2336
 
2316
- # For backward compatibility, infiltration standard not used for 2013 and earlier
2317
- #
2318
- # @return [Boolean] true if successful, false if not
2319
- def model_apply_standard_infiltration(model, specific_space_infiltration_rate_75_pa = nil)
2320
- return true
2337
+ # Default 5-sided (exterior walls and roof) airtightness design value (m^3/h-m^2) from a building pressurization test at 75 Pascals.
2338
+ def default_airtightness
2339
+ airtightness_value = 13.8
2340
+ return airtightness_value
2321
2341
  end
2322
2342
 
2323
- # Apply the air leakage requirements to the model, as described in PNNL section 5.2.1.6.
2324
- # This method creates customized infiltration objects for each space
2325
- # and removes the SpaceType-level infiltration objects.
2326
- #
2327
- # @param model [OpenStudio::Model::Model] OpenStudio model object
2328
- # @return [Boolean] returns true if successful, false if not
2329
- # @todo This infiltration method is not used by the Reference buildings, fix this inconsistency.
2330
- def model_apply_infiltration_standard(model)
2331
- # Set the infiltration rate at each space
2332
- model.getSpaces.sort.each do |space|
2333
- space_apply_infiltration_rate(space)
2334
- end
2335
-
2336
- # Remove infiltration rates set at the space type
2337
- model.getSpaceTypes.sort.each do |space_type|
2338
- space_type.spaceInfiltrationDesignFlowRates.each(&:remove)
2339
- end
2343
+ # Buildings by default are assumed to not have an air barrier
2344
+ def default_air_barrier
2345
+ return false
2346
+ end
2340
2347
 
2341
- return true
2348
+ # Get the maximum value for a field of a hash
2349
+ #
2350
+ # @param hash_of_objects [Hash] hash of objects to search through
2351
+ # @param field [String] field name from the hash
2352
+ # @return [float] Return the first matching object hash if successful, nil if not.
2353
+ def model_find_maximum_value(hash_of_objects, field)
2354
+ maximum_value = 0
2355
+ hash_of_objects.each do |set|
2356
+ maximum_value = [maximum_value, set[field]].max if set[field].to_f > 0
2357
+ end
2358
+ return maximum_value
2342
2359
  end
2343
2360
 
2344
2361
  # Method to search through a hash for the objects that meets the desired search criteria, as passed via a hash.
@@ -2471,7 +2488,7 @@ class Standard
2471
2488
  matching_capacity_objects = matching_objects.reject { |object| fan_motor_bhp.to_f <= object['minimum_capacity'].to_f || fan_motor_bhp.to_f > object['maximum_capacity'].to_f }
2472
2489
 
2473
2490
  # Filter based on motor type
2474
- matching_capacity_objects = matching_capacity_objects.select { |object| object['type'].downcase == search_criteria['type'].downcase } if search_criteria.keys.include?('type')
2491
+ matching_capacity_objects = matching_capacity_objects.select { |object| object['type'].to_s.downcase == search_criteria['type'].to_s.downcase } if search_criteria.keys.include?('type')
2475
2492
 
2476
2493
  # If no object was found, round the fan_motor_bhp down in case the number fell between the limits in the json file.
2477
2494
  if matching_capacity_objects.empty?
@@ -2540,7 +2557,7 @@ class Standard
2540
2557
  # the objects will only be returned if the specified area is between the minimum_area and maximum_area values.
2541
2558
  # @param num_floors [Double] capacity of the object in question. If num_floors is supplied,
2542
2559
  # the objects will only be returned if the specified num_floors is between the minimum_floors and maximum_floors values.
2543
- # @return [Hash] Return tbe first matching object hash if successful, nil if not.
2560
+ # @return [Hash] Return the first matching object hash if successful, nil if not.
2544
2561
  # @example Find the motor that meets these size criteria
2545
2562
  # search_criteria = {
2546
2563
  # 'template' => template,
@@ -2712,7 +2729,7 @@ class Standard
2712
2729
  # the objects will only be returned if the specified capacity is between the minimum_capacity and maximum_capacity values.
2713
2730
  # @param date [<OpenStudio::Date>] date of the object in question. If date is supplied,
2714
2731
  # the objects will only be returned if the specified date is between the start_date and end_date.
2715
- # @return [Hash] Return tbe first matching object hash if successful, nil if not.
2732
+ # @return [Hash] Return the first matching object hash if successful, nil if not.
2716
2733
  # @example Find the motor that meets these size criteria
2717
2734
  # search_criteria = {
2718
2735
  # 'template' => template,
@@ -3293,6 +3310,12 @@ class Standard
3293
3310
  props = model_find_object(standards_data['construction_properties'], search_criteria)
3294
3311
  end
3295
3312
 
3313
+ if !props
3314
+ # Third search for legacy energy codes (2016 or earlier), which does not have standards_construction_type
3315
+ search_criteria.delete('standards_construction_type')
3316
+ props = model_find_object(standards_data['construction_properties'], search_criteria)
3317
+ end
3318
+
3296
3319
  if !props
3297
3320
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.standards.Model', "Could not find construction properties for: #{template}-#{climate_zone_set}-#{intended_surface_type}-#{standards_construction_type}-#{building_category}.")
3298
3321
  # Return an empty construction
@@ -4061,6 +4084,17 @@ class Standard
4061
4084
  # Surface
4062
4085
  # Outdoors
4063
4086
  # Ground
4087
+ # Foundation
4088
+ # GroundFCfactorMethod
4089
+ # OtherSideCoefficients
4090
+ # OtherSideConditionsModel
4091
+ # GroundSlabPreprocessorAverage
4092
+ # GroundSlabPreprocessorCore
4093
+ # GroundSlabPreprocessorPerimeter
4094
+ # GroundBasementPreprocessorAverageWall
4095
+ # GroundBasementPreprocessorAverageFloor
4096
+ # GroundBasementPreprocessorUpperWall
4097
+ # GroundBasementPreprocessorLowerWall
4064
4098
 
4065
4099
  # Possible surface types are
4066
4100
  # AtticFloor
@@ -4117,17 +4151,123 @@ class Standard
4117
4151
  types_to_modify << ['Outdoors', 'ExteriorWall', 'SteelFramed']
4118
4152
  types_to_modify << ['Outdoors', 'ExteriorRoof', 'IEAD']
4119
4153
  types_to_modify << ['Outdoors', 'ExteriorFloor', 'SteelFramed']
4154
+ types_to_modify << ['Outdoors', 'ExteriorWindow', 'Any Vertical Glazing']
4155
+ types_to_modify << ['Outdoors', 'GlassDoor', 'Any Vertical Glazing']
4156
+ types_to_modify << ['Outdoors', 'ExteriorDoor', 'NonSwinging']
4157
+ types_to_modify << ['Outdoors', 'ExteriorDoor', 'Swinging']
4120
4158
  types_to_modify << ['Ground', 'GroundContactFloor', 'Unheated']
4121
4159
  types_to_modify << ['Ground', 'GroundContactWall', 'Mass']
4122
4160
 
4161
+ # Surface
4162
+ types_to_modify << ['Surface', 'ExteriorWall', 'SteelFramed']
4163
+ types_to_modify << ['Surface', 'ExteriorRoof', 'IEAD']
4164
+ types_to_modify << ['Surface', 'ExteriorFloor', 'SteelFramed']
4165
+ types_to_modify << ['Surface', 'ExteriorWindow', 'Any Vertical Glazing']
4166
+ types_to_modify << ['Surface', 'GlassDoor', 'Any Vertical Glazing']
4167
+ types_to_modify << ['Surface', 'ExteriorDoor', 'NonSwinging']
4168
+ types_to_modify << ['Surface', 'ExteriorDoor', 'Swinging']
4169
+
4170
+ # Foundation
4171
+ types_to_modify << ['Foundation', 'GroundContactFloor', 'Unheated']
4172
+ types_to_modify << ['Foundation', 'GroundContactWall', 'Mass']
4173
+
4174
+ # F/C-Factor methods
4175
+ types_to_modify << ['GroundFCfactorMethod', 'GroundContactFloor', 'Unheated']
4176
+ types_to_modify << ['GroundFCfactorMethod', 'GroundContactWall', 'Mass']
4177
+
4178
+ # Other side coefficients
4179
+ types_to_modify << ['OtherSideCoefficients', 'GroundContactFloor', 'Unheated']
4180
+ types_to_modify << ['OtherSideConditionsModel', 'GroundContactFloor', 'Unheated']
4181
+ types_to_modify << ['OtherSideCoefficients', 'GroundContactWall', 'Mass']
4182
+ types_to_modify << ['OtherSideConditionsModel', 'GroundContactWall', 'Mass']
4183
+
4184
+ # Slab preprocessor
4185
+ types_to_modify << ['GroundSlabPreprocessorAverage', 'GroundContactFloor', 'Unheated']
4186
+ types_to_modify << ['GroundSlabPreprocessorCore', 'GroundContactFloor', 'Unheated']
4187
+ types_to_modify << ['GroundSlabPreprocessorPerimeter', 'GroundContactFloor', 'Unheated']
4188
+
4189
+ # Basement preprocessor
4190
+ types_to_modify << ['GroundBasementPreprocessorAverageWall', 'GroundContactWall', 'Mass']
4191
+ types_to_modify << ['GroundBasementPreprocessorAverageFloor', 'GroundContactFloor', 'Unheated']
4192
+ types_to_modify << ['GroundBasementPreprocessorUpperWall', 'GroundContactWall', 'Mass']
4193
+ types_to_modify << ['GroundBasementPreprocessorLowerWall', 'GroundContactWall', 'Mass']
4194
+
4123
4195
  # Modify all constructions of each type
4196
+ construction_modified = {}
4124
4197
  types_to_modify.each do |boundary_cond, surf_type, const_type|
4125
- constructions = OpenstudioStandards::Constructions.model_get_constructions(model, boundary_cond, surf_type)
4198
+ # constructions = OpenstudioStandards::Constructions.model_get_constructions(model, boundary_cond, surf_type)
4199
+ # Hard-assigned surfaces
4200
+ model.getSurfaces.sort.each do |surface|
4201
+ # surfaces with outside / ground / underground boundary conditions
4202
+ next unless surface.outsideBoundaryCondition == boundary_cond
4203
+
4204
+ # identify true interior surface from surfaces that is next to unconditioned spaces
4205
+ if has_space_conditioning_category && surface.outsideBoundaryCondition == 'Surface'
4206
+ space_cond_type = space_conditioning_category(surface.space.get)
4207
+ adj_space_cond_type = space_conditioning_category(surface.adjacentSurface.get.space.get)
4208
+ next unless (space_cond_type != 'Unconditioned') && (adj_space_cond_type == 'Unconditioned')
4209
+ elsif boundary_cond == 'Surface'
4210
+ # Legacy code will skip processing surfaces.
4211
+ next
4212
+ end
4213
+
4214
+ if surface.surfaceType == 'Floor' || surface.surfaceType == 'Wall'
4215
+ next unless surf_type.include?(surface.surfaceType)
4216
+ elsif surface.surfaceType == 'RoofCeiling'
4217
+ next unless surf_type.include?('Roof') || surf_type.include?('Ceiling')
4218
+ end
4126
4219
 
4127
- constructions.sort.each do |const|
4128
- standards_info = const.standardsInformation
4129
- standards_info.setIntendedSurfaceType(surf_type)
4130
- standards_info.setStandardsConstructionType(const_type)
4220
+ # check if need to duplicate the construction for the surface
4221
+ const = surface.construction
4222
+ next unless const.is_initialized
4223
+
4224
+ const = const.get
4225
+ const_name = const.name.to_s
4226
+ # Reset the name by including surf_type and boundary_cond
4227
+ new_const_name = "#{const_name}_#{surf_type}_#{boundary_cond}"
4228
+ unless construction_modified.key?(new_const_name)
4229
+ # create a copy for each of constructions to meet its unique boundary_cond, surf_type and const_type
4230
+ new_const = OpenstudioStandards::Constructions.construction_deep_copy(const)
4231
+ new_const.setName(new_const_name)
4232
+ standards_info = new_const.standardsInformation
4233
+ standards_info.setIntendedSurfaceType(surf_type)
4234
+ standards_info.setStandardsConstructionType(const_type)
4235
+ construction_modified[new_const_name] = new_const
4236
+ end
4237
+ surface.setConstruction(construction_modified[new_const_name])
4238
+ end
4239
+
4240
+ # Hard-assigned subsurfaces
4241
+ model.getSubSurfaces.sort.each do |surface|
4242
+ next unless surface.outsideBoundaryCondition == boundary_cond
4243
+
4244
+ case surface.subSurfaceType
4245
+ when 'FixedWindow', 'OperableWindow'
4246
+ next unless surf_type == 'ExteriorWindow'
4247
+ when 'Door'
4248
+ next unless surf_type.include?('Door')
4249
+ else
4250
+ next unless surface.subSurfaceType == surf_type
4251
+ end
4252
+
4253
+ # check if need to duplicate the construction for the surface
4254
+ const = surface.construction
4255
+ next unless const.is_initialized
4256
+
4257
+ const = const.get
4258
+ const_name = const.name.to_s
4259
+ # Reset the name by including surf_type and boundary_cond
4260
+ new_const_name = "#{const_name}_#{surf_type}_#{boundary_cond}"
4261
+ unless construction_modified.key?(new_const_name)
4262
+ # create a copy for each of constructions to meet its unique boundary_cond, surf_type and const_type
4263
+ new_const = OpenstudioStandards::Constructions.construction_deep_copy(const)
4264
+ new_const.setName(new_const_name)
4265
+ standards_info = new_const.standardsInformation
4266
+ standards_info.setIntendedSurfaceType(surf_type)
4267
+ standards_info.setStandardsConstructionType(const_type)
4268
+ construction_modified[new_const_name] = new_const
4269
+ end
4270
+ surface.setConstruction(construction_modified[new_const_name])
4131
4271
  end
4132
4272
  end
4133
4273
 
@@ -4138,6 +4278,8 @@ class Standard
4138
4278
  #
4139
4279
  # @param model [OpenStudio::Model::Model] OpenStudio model object
4140
4280
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
4281
+ # @param wwr_building_type [String] building type used for defining window to wall ratio, e.g. 'Office > 50,000 sq ft'
4282
+ # @param wwr_info [Hash] A map that maps each building area type to its correspondent wwr.
4141
4283
  # @return [Boolean] returns true if successful, false if not
4142
4284
  def model_apply_standard_constructions(model, climate_zone, wwr_building_type: nil, wwr_info: {})
4143
4285
  types_to_modify = []
@@ -4147,6 +4289,17 @@ class Standard
4147
4289
  # Surface
4148
4290
  # Outdoors
4149
4291
  # Ground
4292
+ # Foundation
4293
+ # GroundFCfactorMethod
4294
+ # OtherSideCoefficients
4295
+ # OtherSideConditionsModel
4296
+ # GroundSlabPreprocessorAverage
4297
+ # GroundSlabPreprocessorCore
4298
+ # GroundSlabPreprocessorPerimeter
4299
+ # GroundBasementPreprocessorAverageWall
4300
+ # GroundBasementPreprocessorAverageFloor
4301
+ # GroundBasementPreprocessorUpperWall
4302
+ # GroundBasementPreprocessorLowerWall
4150
4303
 
4151
4304
  # Possible surface types are
4152
4305
  # Floor
@@ -4169,23 +4322,69 @@ class Standard
4169
4322
  types_to_modify << ['Outdoors', 'OperableWindow']
4170
4323
  types_to_modify << ['Outdoors', 'Door']
4171
4324
  types_to_modify << ['Outdoors', 'GlassDoor']
4325
+ types_to_modify << ['Outdoors', 'ExteriorDoor']
4172
4326
  types_to_modify << ['Outdoors', 'OverheadDoor']
4173
4327
  types_to_modify << ['Outdoors', 'Skylight']
4328
+ types_to_modify << ['Surface', 'Floor']
4329
+ types_to_modify << ['Surface', 'Wall']
4330
+ types_to_modify << ['Surface', 'RoofCeiling']
4331
+ types_to_modify << ['Surface', 'FixedWindow']
4332
+ types_to_modify << ['Surface', 'OperableWindow']
4333
+ types_to_modify << ['Surface', 'Door']
4334
+ types_to_modify << ['Surface', 'GlassDoor']
4335
+ types_to_modify << ['Surface', 'OverheadDoor']
4174
4336
  types_to_modify << ['Ground', 'Floor']
4175
4337
  types_to_modify << ['Ground', 'Wall']
4338
+ types_to_modify << ['Foundation', 'Wall']
4339
+ types_to_modify << ['GroundFCfactorMethod', 'Wall']
4340
+ types_to_modify << ['OtherSideCoefficients', 'Wall']
4341
+ types_to_modify << ['OtherSideConditionsModel', 'Wall']
4342
+ types_to_modify << ['GroundBasementPreprocessorAverageWall', 'Wall']
4343
+ types_to_modify << ['GroundBasementPreprocessorUpperWall', 'Wall']
4344
+ types_to_modify << ['GroundBasementPreprocessorLowerWall', 'Wall']
4345
+ types_to_modify << ['Foundation', 'Floor']
4346
+ types_to_modify << ['GroundFCfactorMethod', 'Floor']
4347
+ types_to_modify << ['OtherSideCoefficients', 'Floor']
4348
+ types_to_modify << ['OtherSideConditionsModel', 'Floor']
4349
+ types_to_modify << ['GroundSlabPreprocessorAverage', 'Floor']
4350
+ types_to_modify << ['GroundSlabPreprocessorCore', 'Floor']
4351
+ types_to_modify << ['GroundSlabPreprocessorPerimeter', 'Floor']
4176
4352
 
4177
4353
  # Find just those surfaces
4178
4354
  surfaces_to_modify = []
4179
4355
  surface_category = {}
4356
+ org_surface_boundary_conditions = {}
4180
4357
  types_to_modify.each do |boundary_condition, surface_type|
4181
4358
  # Surfaces
4182
4359
  model.getSurfaces.sort.each do |surf|
4183
4360
  next unless surf.outsideBoundaryCondition == boundary_condition
4184
4361
  next unless surf.surfaceType == surface_type
4362
+ # legacy energy code does not require processing surface type surface.
4363
+ if surf.outsideBoundaryCondition == 'Surface' && !has_space_conditioning_category
4364
+ next
4365
+ end
4366
+
4367
+ # Check if surface is adjacent to an unenclosed or unconditioned space (e.g. attic or parking garage)
4368
+ if has_space_conditioning_category && surf.outsideBoundaryCondition == 'Surface'
4369
+ adj_space = surf.adjacentSurface.get.space.get
4370
+ adj_space_cond_type = space_conditioning_category(adj_space)
4371
+ if adj_space_cond_type == 'Unconditioned'
4372
+ # Get adjacent surface
4373
+ adjacent_surf = surf.adjacentSurface.get
4374
+
4375
+ # Store original boundary condition type
4376
+ org_surface_boundary_conditions[surf.name.to_s] = adjacent_surf
4185
4377
 
4186
- if boundary_condition == 'Outdoors'
4378
+ # Identify this surface as exterior
4379
+ surface_category[surf] = 'ExteriorSurface'
4380
+
4381
+ # Temporary change the surface's boundary condition to 'Outdoors' so it can be assigned a baseline construction
4382
+ surf.setOutsideBoundaryCondition('Outdoors')
4383
+ adjacent_surf.setOutsideBoundaryCondition('Outdoors')
4384
+ end
4385
+ elsif boundary_condition == 'Outdoors'
4187
4386
  surface_category[surf] = 'ExteriorSurface'
4188
- elsif boundary_condition == 'Ground'
4387
+ elsif ['Ground', 'Foundation', 'GroundFCfactorMethod', 'OtherSideCoefficients', 'OtherSideConditionsModel', 'GroundSlabPreprocessorAverage', 'GroundSlabPreprocessorCore', 'GroundSlabPreprocessorPerimeter', 'GroundBasementPreprocessorAverageWall', 'GroundBasementPreprocessorAverageFloor', 'GroundBasementPreprocessorUpperWall', 'GroundBasementPreprocessorLowerWall'].include?(boundary_condition)
4189
4388
  surface_category[surf] = 'GroundSurface'
4190
4389
  else
4191
4390
  surface_category[surf] = 'NA'
@@ -4206,7 +4405,21 @@ class Standard
4206
4405
  # Modify these surfaces
4207
4406
  prev_created_consts = {}
4208
4407
  surfaces_to_modify.sort.each do |surf|
4209
- prev_created_consts = planar_surface_apply_standard_construction(surf, climate_zone, prev_created_consts, wwr_building_type, wwr_info, surface_category[surf])
4408
+ if has_space_conditioning_category
4409
+ # Get space conditioning
4410
+ space = surf.space.get
4411
+ space_cond_type = space_conditioning_category(space)
4412
+ # Do not modify constructions for unconditioned spaces
4413
+ prev_created_consts = planar_surface_apply_standard_construction(surf, climate_zone, prev_created_consts, wwr_building_type, wwr_info, surface_category[surf]) unless space_cond_type == 'Unconditioned'
4414
+ else
4415
+ # No space conditioning requirements for legacy code
4416
+ prev_created_consts = planar_surface_apply_standard_construction(surf, climate_zone, prev_created_consts, wwr_building_type, wwr_info, surface_category[surf])
4417
+ end
4418
+
4419
+ # Reset boundary conditions to original if they were temporary modified
4420
+ if org_surface_boundary_conditions.include?(surf.name.to_s)
4421
+ surf.setAdjacentSurface(org_surface_boundary_conditions[surf.name.to_s])
4422
+ end
4210
4423
  end
4211
4424
 
4212
4425
  # List the unique array of constructions
@@ -4218,7 +4431,7 @@ class Standard
4218
4431
  end
4219
4432
  end
4220
4433
 
4221
- return true
4434
+ true
4222
4435
  end
4223
4436
 
4224
4437
  # Returns standards data for selected construction
@@ -5542,7 +5755,7 @@ class Standard
5542
5755
  if sch_type == 'Constant'
5543
5756
  day_sch.addValue(OpenStudio::Time.new(0, 24, 0, 0), values[0])
5544
5757
  elsif sch_type == 'Hourly'
5545
- (0..23).each do |i|
5758
+ 24.times do |i|
5546
5759
  next if values[i] == values[i + 1]
5547
5760
 
5548
5761
  day_sch.addValue(OpenStudio::Time.new(0, i + 1, 0, 0), values[i])
@@ -5558,7 +5771,9 @@ class Standard
5558
5771
  # @param building_type [String] the building type
5559
5772
  # @return [Boolean] returns true if successful, false if not
5560
5773
  # @author Julien Marrec
5561
- def model_apply_baseline_swh_loops(model, building_type)
5774
+ def model_apply_baseline_swh_loops(model,
5775
+ building_type,
5776
+ swh_building_type = 'All others')
5562
5777
  model.getPlantLoops.sort.each do |plant_loop|
5563
5778
  # Skip non service water heating loops
5564
5779
  next unless plant_loop_swh_loop?(plant_loop)
@@ -6069,25 +6284,14 @@ class Standard
6069
6284
  reporting_tolerances.setToleranceforTimeHeatingSetpointNotMet(heating_tolerance_deg_c)
6070
6285
  reporting_tolerances.setToleranceforTimeCoolingSetpointNotMet(cooling_tolerance_deg_c)
6071
6286
 
6072
- return true
6073
- end
6074
-
6075
- # Apply the standard construction to each surface in the model, based on the construction type currently assigned.
6076
- #
6077
- # @param model [OpenStudio::Model::Model] OpenStudio model object
6078
- # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
6079
- # @return [Boolean] returns true if successful, false if not
6080
- def model_apply_constructions(model, climate_zone, wwr_building_type, wwr_info)
6081
- model_apply_standard_constructions(model, climate_zone, wwr_building_type: nil, wwr_info: {})
6082
-
6083
- return true
6287
+ true
6084
6288
  end
6085
6289
 
6086
6290
  # Generate baseline log to a specific file directory
6087
6291
  # @param file_directory [String] file directory
6088
6292
  # @return [Boolean] returns true if successful, false if not
6089
6293
  def generate_baseline_log(file_directory)
6090
- return true
6294
+ true
6091
6295
  end
6092
6296
 
6093
6297
  # Update ground temperature profile based on the weather file specified in the model
@@ -6096,6 +6300,20 @@ class Standard
6096
6300
  # @param climate_zone [String] ASHRAE climate zone, e.g. 'ASHRAE 169-2013-4A'
6097
6301
  # @return [Boolean] returns true if successful, false if not
6098
6302
  def model_update_ground_temperature_profile(model, climate_zone)
6099
- return true
6303
+ true
6100
6304
  end
6101
6305
  end
6306
+
6307
+ # Flag function to indicate whether the energy code uses conditioning category
6308
+ # for PRM calculation - default to false for legacy energy codes
6309
+ def has_space_conditioning_category
6310
+ false
6311
+ end
6312
+
6313
+ # Dummy method to avoid adjusting infiltration in PRM models using older ASHRAE 90.1 PRM methodology.
6314
+ # @param model [OpenStudio::Model::Model] openstudio model
6315
+ # @param infiltration_rate [Double] space infiltration rate at a pressure differential of 75 Pa in cfm per ft^2
6316
+ # @return [Boolean] true if successful, false if not
6317
+ def model_apply_standard_infiltration(model, infiltration_rate: nil)
6318
+ true
6319
+ end