openstudio-standards 0.2.12 → 0.2.13.rc3

Sign up to get free protection for your applications and to get access to all the features.
Files changed (492) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAE90120162019HighriseApartment.json +1042 -0
  3. data/data/geometry/ASHRAE90120162019Hospital.json +199 -0
  4. data/data/geometry/ASHRAE90120162019LargeHotel.json +73 -0
  5. data/data/geometry/ASHRAE90120162019LargeOffice.json +109 -0
  6. data/data/geometry/ASHRAE90120162019SecondarySchool.json +205 -0
  7. data/data/geometry/ASHRAECourthouse.json +112 -0
  8. data/data/geometry/ASHRAECourthouse.osm +26470 -0
  9. data/data/geometry/ASHRAELargeHotel.osm +11 -1
  10. data/data/geometry/ASHRAELargeOffice.json +4 -0
  11. data/data/standards/OpenStudio_Standards-ashrae_90_1(space_types).xlsx +0 -0
  12. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  13. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  14. data/data/standards/exclude_list.csv +19 -0
  15. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.boilers.json +49 -0
  16. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.chillers.json +293 -0
  17. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +25426 -0
  18. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_sets.json +1600 -0
  19. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +564 -0
  20. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.elevators.json +349 -0
  21. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ext_ltg.json +164 -0
  22. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ground_temperatures.json +10663 -0
  23. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +508 -0
  24. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +156 -0
  25. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +44 -0
  26. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.motors.json +184 -0
  27. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +3094 -0
  28. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_cases.json +829 -0
  29. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.ref_lnup.json +562 -0
  30. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_compressors.json +52 -0
  31. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_condenser.json +220 -0
  32. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_system.json +156 -0
  33. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.refrigeration_walkins.json +1316 -0
  34. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +21446 -0
  35. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.unitary_acs.json +554 -0
  36. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +68 -0
  37. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps.json +28 -0
  38. data/data/standards/export/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_source_heat_pumps_heating.json +12 -0
  39. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.boilers.json +49 -0
  40. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.chillers.json +293 -0
  41. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +12487 -0
  42. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_sets.json +1600 -0
  43. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +564 -0
  44. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.elevators.json +349 -0
  45. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ext_ltg.json +164 -0
  46. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ground_temperatures.json +10663 -0
  47. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +466 -0
  48. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +137 -0
  49. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +44 -0
  50. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.motors.json +184 -0
  51. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +3094 -0
  52. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_cases.json +829 -0
  53. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.ref_lnup.json +562 -0
  54. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_compressors.json +52 -0
  55. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_condenser.json +220 -0
  56. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_system.json +156 -0
  57. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.refrigeration_walkins.json +1316 -0
  58. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +21380 -0
  59. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.unitary_acs.json +554 -0
  60. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +68 -0
  61. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps.json +28 -0
  62. data/data/standards/export/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_source_heat_pumps_heating.json +12 -0
  63. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.boilers.json +49 -0
  64. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.chillers.json +395 -0
  65. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +12487 -0
  66. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_sets.json +1600 -0
  67. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +592 -0
  68. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.elevators.json +349 -0
  69. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +550 -0
  70. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ext_ltg.json +164 -0
  71. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ground_temperatures.json +10663 -0
  72. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +466 -0
  73. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +137 -0
  74. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +44 -0
  75. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.motors.json +238 -0
  76. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +3094 -0
  77. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_cases.json +829 -0
  78. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.ref_lnup.json +562 -0
  79. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_compressors.json +52 -0
  80. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_condenser.json +220 -0
  81. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_system.json +156 -0
  82. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.refrigeration_walkins.json +1316 -0
  83. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +21548 -0
  84. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.unitary_acs.json +554 -0
  85. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +68 -0
  86. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps.json +28 -0
  87. data/data/standards/export/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_source_heat_pumps_heating.json +12 -0
  88. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +64 -0
  89. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +871 -0
  90. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +12487 -0
  91. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_sets.json +1600 -0
  92. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +592 -0
  93. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.elevators.json +349 -0
  94. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +1096 -0
  95. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ext_ltg.json +164 -0
  96. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ground_temperatures.json +10663 -0
  97. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +886 -0
  98. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +194 -0
  99. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +44 -0
  100. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.motors.json +247 -0
  101. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +3094 -0
  102. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_cases.json +829 -0
  103. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.ref_lnup.json +562 -0
  104. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_compressors.json +52 -0
  105. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_condenser.json +220 -0
  106. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_system.json +156 -0
  107. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.refrigeration_walkins.json +1316 -0
  108. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +22079 -0
  109. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.unitary_acs.json +994 -0
  110. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +68 -0
  111. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps.json +28 -0
  112. data/data/standards/export/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +12 -0
  113. data/data/standards/manage_OpenStudio_Standards.rb +87 -37
  114. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1-ALL-comstockspace_types.csv +236 -0
  115. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1.csv +622 -0
  116. data/data/standards/metadata_units_OpenStudio_Standards-ashrae_90_1space_types.csv +191 -0
  117. data/data/standards/openstudio_standards_duplicates_log.csv +16 -25
  118. data/data/standards/test_performance_expected_dd_results.csv +1934 -1134
  119. data/lib/openstudio-standards.rb +68 -17
  120. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +28 -0
  121. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.FanVariableVolume.rb +0 -1
  122. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +28 -0
  123. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Model.rb +53 -2
  124. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +29 -0
  125. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.Model.rb +157 -2
  126. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +29 -0
  127. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +24 -0
  128. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanConstantVolume.rb +32 -0
  129. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanOnOff.rb +33 -0
  130. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +32 -0
  131. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.elevators.rb +25 -0
  132. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +366 -0
  133. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +144 -0
  134. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.hvac_systems.rb +11 -0
  135. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +24 -0
  136. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanConstantVolume.rb +32 -0
  137. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanOnOff.rb +33 -0
  138. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +32 -0
  139. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.elevators.rb +25 -0
  140. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +367 -0
  141. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +144 -0
  142. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.hvac_systems.rb +11 -0
  143. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.AirTerminalSingleDuctVAVReheat.rb +0 -1
  144. data/lib/openstudio-standards/prototypes/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.AirTerminalSingleDuctVAVReheat.rb +0 -1
  145. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.HeatExchangerAirToAirSensibleAndLatent.rb +1 -1
  146. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.Model.rb +1 -1
  147. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.HeatExchangerAirToAirSensibleAndLatent.rb +1 -1
  148. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +1 -1
  149. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +3 -3
  150. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Courthouse.rb +74 -0
  151. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.FullServiceRestaurant.rb +46 -30
  152. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +15 -7
  153. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +26 -15
  154. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +8 -11
  155. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterHighITE.rb +54 -60
  156. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeDataCenterLowITE.rb +56 -60
  157. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +38 -12
  158. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +218 -134
  159. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOfficeDetailed.rb +6 -2
  160. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +222 -133
  161. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOfficeDetailed.rb +60 -62
  162. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MidriseApartment.rb +25 -15
  163. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +34 -22
  164. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +31 -7
  165. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.QuickServiceRestaurant.rb +43 -28
  166. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStandalone.rb +48 -38
  167. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.RetailStripmall.rb +9 -5
  168. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +567 -344
  169. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterHighITE.rb +13 -19
  170. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallDataCenterLowITE.rb +13 -17
  171. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallHotel.rb +9 -5
  172. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOffice.rb +79 -51
  173. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +60 -60
  174. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperMarket.rb +2 -4
  175. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SuperTallBuilding.rb +133 -120
  176. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.TallBuilding.rb +124 -112
  177. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Warehouse.rb +138 -66
  178. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +7275 -199
  179. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +35 -35
  180. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +2 -2
  181. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +2 -2
  182. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +3 -3
  183. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +1 -1
  184. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +2 -2
  185. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +2 -2
  186. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +1 -1
  187. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +2 -2
  188. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +2 -2
  189. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
  190. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoolingTower.rb +1 -1
  191. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +4 -3
  192. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +7 -8
  193. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +7 -8
  194. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +13 -14
  195. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +7 -5
  196. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.elevators.rb +2 -0
  197. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.exterior_lights.rb +0 -1
  198. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +25 -14
  199. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +474 -89
  200. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.swh.rb +35 -33
  201. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +3 -0
  202. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +72 -0
  203. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ServiceWaterHeating.rb +120 -120
  204. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +103 -125
  205. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +9 -3
  206. data/lib/openstudio-standards/prototypes/common/objects/Prototype.refrigeration.rb +11 -5
  207. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +26 -14
  208. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +270 -247
  209. data/lib/openstudio-standards/prototypes/deer/deer.Model.rb +1 -1
  210. data/lib/openstudio-standards/refs/references.rb +5 -2
  211. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +41 -28
  212. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -1
  213. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +0 -1
  214. data/lib/openstudio-standards/standards/Standards.BuildingStory.rb +1 -0
  215. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +2 -4
  216. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +8 -10
  217. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +4 -5
  218. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +0 -1
  219. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +1 -1
  220. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +12 -9
  221. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -1
  222. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +3 -1
  223. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +0 -3
  224. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +4 -7
  225. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +1 -3
  226. data/lib/openstudio-standards/standards/Standards.Construction.rb +124 -118
  227. data/lib/openstudio-standards/standards/Standards.CoolingTower.rb +0 -1
  228. data/lib/openstudio-standards/standards/Standards.CoolingTowerSingleSpeed.rb +0 -1
  229. data/lib/openstudio-standards/standards/Standards.CoolingTowerTwoSpeed.rb +0 -1
  230. data/lib/openstudio-standards/standards/Standards.CoolingTowerVariableSpeed.rb +0 -1
  231. data/lib/openstudio-standards/standards/Standards.Fan.rb +0 -1
  232. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -1
  233. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -1
  234. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +2 -4
  235. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -1
  236. data/lib/openstudio-standards/standards/Standards.FluidCooler.rb +10 -3
  237. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -1
  238. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -1
  239. data/lib/openstudio-standards/standards/Standards.Model.rb +282 -253
  240. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +2 -0
  241. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -9
  242. data/lib/openstudio-standards/standards/Standards.Pump.rb +0 -1
  243. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -1
  244. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +0 -1
  245. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +0 -1
  246. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +0 -1
  247. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +103 -121
  248. data/lib/openstudio-standards/standards/Standards.Space.rb +42 -35
  249. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +9 -17
  250. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +25 -27
  251. data/lib/openstudio-standards/standards/Standards.Surface.rb +97 -52
  252. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +39 -21
  253. data/lib/openstudio-standards/standards/Standards.WaterHeaterMixed.rb +6 -7
  254. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +15 -10
  255. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1.Standards.FanVariableVolume.rb +0 -1
  256. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.AirLoopHVAC.rb +10 -2
  257. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +2 -2
  258. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +63 -99
  259. 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 +7 -7
  260. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.construction_properties.json +2420 -0
  261. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.economizers.json +32 -0
  262. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_rejection.json +9 -0
  263. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.prototype_inputs.json +68 -38
  264. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +105 -40
  265. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.AirLoopHVAC.rb +5 -1
  266. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +63 -99
  267. 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 +7 -7
  268. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.construction_properties.json +1460 -0
  269. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.economizers.json +32 -0
  270. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_rejection.json +9 -0
  271. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.prototype_inputs.json +68 -38
  272. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +104 -17
  273. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirLoopHVAC.rb +25 -13
  274. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.Space.rb +1 -1
  275. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +63 -99
  276. 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 +7 -7
  277. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.construction_properties.json +1460 -0
  278. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.economizers.json +64 -0
  279. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.energy_recovery.json +52 -0
  280. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_rejection.json +9 -0
  281. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.prototype_inputs.json +68 -38
  282. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +112 -25
  283. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirLoopHVAC.rb +21 -7
  284. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.WaterHeaterMixed.rb +1 -1
  285. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +63 -99
  286. 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 +7 -7
  287. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.boilers.json +1 -1
  288. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.chillers.json +2 -2
  289. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.construction_properties.json +1460 -0
  290. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.economizers.json +64 -0
  291. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +104 -0
  292. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_rejection.json +9 -0
  293. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.prototype_inputs.json +70 -40
  294. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +172 -55
  295. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +4 -4
  296. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_source_heat_pumps_heating.json +1 -1
  297. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirLoopHVAC.rb +456 -0
  298. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +24 -0
  299. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTower.rb +19 -0
  300. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerSingleSpeed.rb +5 -0
  301. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerTwoSpeed.rb +5 -0
  302. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.CoolingTowerVariableSpeed.rb +16 -0
  303. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.FanVariableVolume.rb +37 -0
  304. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Space.rb +189 -0
  305. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ThermalZone.rb +57 -0
  306. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.ZoneHVACComponent.rb +22 -0
  307. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.rb +16 -0
  308. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.boilers.json +68 -0
  309. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.chillers.json +490 -0
  310. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_properties.json +21244 -0
  311. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.construction_sets.json +2111 -0
  312. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.economizers.json +676 -0
  313. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.elevators.json +372 -0
  314. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.energy_recovery.json +1096 -0
  315. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ext_ltg.json +169 -0
  316. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +532 -0
  317. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +164 -0
  318. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_rejection.json +49 -0
  319. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.motors.json +274 -0
  320. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.prototype_inputs.json +3094 -0
  321. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ref_cases.json +854 -0
  322. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.ref_lnup.json +562 -0
  323. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_compressors.json +58 -0
  324. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_condenser.json +238 -0
  325. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_system.json +12 -0
  326. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.refrigeration_walkins.json +1316 -0
  327. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +23067 -0
  328. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.unitary_acs.json +648 -0
  329. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +72 -0
  330. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_source_heat_pumps.json +31 -0
  331. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_source_heat_pumps_heating.json +13 -0
  332. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +456 -0
  333. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +24 -0
  334. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTower.rb +19 -0
  335. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerSingleSpeed.rb +5 -0
  336. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerTwoSpeed.rb +5 -0
  337. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoolingTowerVariableSpeed.rb +16 -0
  338. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.FanVariableVolume.rb +37 -0
  339. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Space.rb +189 -0
  340. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ThermalZone.rb +57 -0
  341. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.ZoneHVACComponent.rb +22 -0
  342. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.rb +16 -0
  343. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.boilers.json +68 -0
  344. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.chillers.json +490 -0
  345. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_properties.json +21244 -0
  346. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.construction_sets.json +2111 -0
  347. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.economizers.json +676 -0
  348. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.elevators.json +372 -0
  349. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.energy_recovery.json +1096 -0
  350. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ext_ltg.json +169 -0
  351. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +664 -0
  352. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +204 -0
  353. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_rejection.json +49 -0
  354. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.motors.json +274 -0
  355. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.prototype_inputs.json +3094 -0
  356. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ref_cases.json +854 -0
  357. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.ref_lnup.json +562 -0
  358. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_compressors.json +58 -0
  359. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_condenser.json +238 -0
  360. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_system.json +12 -0
  361. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.refrigeration_walkins.json +1316 -0
  362. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +23067 -0
  363. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.unitary_acs.json +671 -0
  364. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +72 -0
  365. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_source_heat_pumps.json +31 -0
  366. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_source_heat_pumps_heating.json +13 -0
  367. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +1662 -332
  368. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.materials.json +5049 -289
  369. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +1743 -161
  370. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +63 -99
  371. 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 +11 -11
  372. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.heat_rejection.json +9 -0
  373. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.prototype_inputs.json +8 -8
  374. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +9 -9
  375. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/doe_ref_1980_2004.Model.rb +4 -4
  376. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +63 -99
  377. 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 +10 -10
  378. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.heat_rejection.json +9 -0
  379. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.prototype_inputs.json +7 -7
  380. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +9 -9
  381. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/doe_ref_pre_1980.Model.rb +4 -4
  382. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/data/nrel_zne_ready_2017.heat_rejection.json +9 -0
  383. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +0 -1
  384. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.Model.rb +4 -4
  385. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +1 -1
  386. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.ZoneHVACComponent.rb +1 -1
  387. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.heat_rejection.json +9 -0
  388. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/data/ze_aedg_multifamily.water_heaters.json +2 -2
  389. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirLoopHVAC.rb +3 -6
  390. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.Model.rb +4 -4
  391. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +1 -1
  392. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.ZoneHVACComponent.rb +1 -1
  393. data/lib/openstudio-standards/standards/cbes/cbes.Model.rb +1 -3
  394. data/lib/openstudio-standards/standards/cbes/cbes.rb +1 -1
  395. data/lib/openstudio-standards/standards/deer/deer.AirLoopHVAC.rb +8 -13
  396. data/lib/openstudio-standards/standards/deer/deer.Model.rb +2 -2
  397. data/lib/openstudio-standards/standards/deer/deer.PlanarSurface.rb +2 -0
  398. data/lib/openstudio-standards/standards/deer/deer.Space.rb +1 -1
  399. data/lib/openstudio-standards/standards/deer/deer_2011/deer_2011.rb +0 -1
  400. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.Space.rb +0 -1
  401. data/lib/openstudio-standards/standards/deer/deer_2014/deer_2014.rb +0 -1
  402. data/lib/openstudio-standards/standards/deer/deer_2015/deer_2015.Space.rb +0 -1
  403. data/lib/openstudio-standards/standards/deer/deer_2017/deer_2017.Space.rb +0 -1
  404. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.AirLoopHVAC.rb +1 -1
  405. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.FanVariableVolume.rb +1 -1
  406. data/lib/openstudio-standards/standards/deer/deer_2020/deer_2020.Space.rb +0 -1
  407. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.AirLoopHVAC.rb +1 -1
  408. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.FanVariableVolume.rb +1 -1
  409. data/lib/openstudio-standards/standards/deer/deer_2025/deer_2025.Space.rb +0 -1
  410. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.AirLoopHVAC.rb +1 -1
  411. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.FanVariableVolume.rb +1 -1
  412. data/lib/openstudio-standards/standards/deer/deer_2030/deer_2030.Space.rb +0 -1
  413. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.AirLoopHVAC.rb +1 -1
  414. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.FanVariableVolume.rb +1 -1
  415. data/lib/openstudio-standards/standards/deer/deer_2035/deer_2035.Space.rb +0 -1
  416. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.AirLoopHVAC.rb +1 -1
  417. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.FanVariableVolume.rb +1 -1
  418. data/lib/openstudio-standards/standards/deer/deer_2040/deer_2040.Space.rb +0 -1
  419. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.AirLoopHVAC.rb +1 -1
  420. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.FanVariableVolume.rb +1 -1
  421. data/lib/openstudio-standards/standards/deer/deer_2045/deer_2045.Space.rb +0 -1
  422. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.AirLoopHVAC.rb +1 -1
  423. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.FanVariableVolume.rb +1 -1
  424. data/lib/openstudio-standards/standards/deer/deer_2050/deer_2050.Space.rb +0 -1
  425. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.AirLoopHVAC.rb +1 -1
  426. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.FanVariableVolume.rb +1 -1
  427. data/lib/openstudio-standards/standards/deer/deer_2055/deer_2055.Space.rb +0 -1
  428. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.AirLoopHVAC.rb +1 -1
  429. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.FanVariableVolume.rb +1 -1
  430. data/lib/openstudio-standards/standards/deer/deer_2060/deer_2060.Space.rb +0 -1
  431. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.AirLoopHVAC.rb +1 -1
  432. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.FanVariableVolume.rb +1 -1
  433. data/lib/openstudio-standards/standards/deer/deer_2065/deer_2065.Space.rb +0 -1
  434. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.AirLoopHVAC.rb +1 -1
  435. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.FanVariableVolume.rb +1 -1
  436. data/lib/openstudio-standards/standards/deer/deer_2070/deer_2070.Space.rb +0 -1
  437. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.AirLoopHVAC.rb +1 -1
  438. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.FanVariableVolume.rb +1 -1
  439. data/lib/openstudio-standards/standards/deer/deer_2075/deer_2075.Space.rb +0 -1
  440. data/lib/openstudio-standards/standards/icc_iecc/icc_iecc_2015/icc_iecc_2015.rb +0 -1
  441. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +28 -7
  442. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +16 -2
  443. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +15 -0
  444. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +14 -0
  445. data/lib/openstudio-standards/standards/necb/ECMS/data/erv.json +11 -7
  446. data/lib/openstudio-standards/standards/necb/ECMS/data/pv.json +112 -0
  447. data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +50 -0
  448. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +21 -8
  449. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +17 -6
  450. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +142 -6
  451. data/lib/openstudio-standards/standards/necb/ECMS/nv.rb +189 -0
  452. data/lib/openstudio-standards/standards/necb/ECMS/pv_ground.rb +104 -0
  453. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +19 -13
  454. data/lib/openstudio-standards/standards/necb/NECB2011/data/erv.json +1 -1
  455. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/LowriseApartment.osm +39278 -0
  456. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +17 -1
  457. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +15 -0
  458. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +14 -2
  459. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +13 -0
  460. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +12 -0
  461. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +154 -12
  462. data/lib/openstudio-standards/standards/necb/NECB2011/lighting.rb +21 -3
  463. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +140 -21
  464. data/lib/openstudio-standards/standards/necb/NECB2011/nv.md +74 -0
  465. data/lib/openstudio-standards/standards/necb/NECB2011/pv_ground.md +44 -0
  466. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/necb_qaqc.rb +2 -2
  467. data/lib/openstudio-standards/standards/necb/NECB2011/qaqc/qaqc_resources/neb_end_use_prices.csv +39 -84
  468. data/lib/openstudio-standards/standards/oeesc/oeesc_2014/oeesc_2014.rb +0 -1
  469. data/lib/openstudio-standards/standards/standard.rb +6 -5
  470. data/lib/openstudio-standards/utilities/Add_template_field_to_json.rb +3 -3
  471. data/lib/openstudio-standards/utilities/convert_surfaces_to_adiabatic_necb_8426.rb +54 -54
  472. data/lib/openstudio-standards/utilities/generate_prototype_database.rb +2 -2
  473. data/lib/openstudio-standards/utilities/generate_space_types.rb +3 -3
  474. data/lib/openstudio-standards/utilities/logging.rb +7 -7
  475. data/lib/openstudio-standards/utilities/necb_to_epw_map.rb +14 -14
  476. data/lib/openstudio-standards/utilities/os_sim_extract.rb +25 -25
  477. data/lib/openstudio-standards/utilities/rename_surfaces.rb +10 -13
  478. data/lib/openstudio-standards/utilities/round_surf_coords.rb +18 -20
  479. data/lib/openstudio-standards/utilities/sched_create.rb +39 -41
  480. data/lib/openstudio-standards/utilities/set_mult_to_adiabatic.rb +31 -31
  481. data/lib/openstudio-standards/utilities/simulation.rb +5 -3
  482. data/lib/openstudio-standards/utilities/speacetype_map_converter.rb +10 -11
  483. data/lib/openstudio-standards/utilities/sqlfile.rb +6 -8
  484. data/lib/openstudio-standards/utilities/template_measure/measure.rb +108 -0
  485. data/lib/openstudio-standards/utilities/template_measure/measure.xml +162 -0
  486. data/lib/openstudio-standards/utilities/template_measure/resources/BTAPMeasureHelper.rb +448 -0
  487. data/lib/openstudio-standards/utilities/template_measure/tests/test.rb +160 -0
  488. data/lib/openstudio-standards/utilities/weatherData1_xlsx_to_json.rb +23 -26
  489. data/lib/openstudio-standards/version.rb +1 -1
  490. data/lib/openstudio-standards/weather/Weather.Model.rb +74 -80
  491. data/lib/openstudio-standards/weather/Weather.stat_file.rb +17 -17
  492. metadata +217 -2
@@ -99,10 +99,10 @@ class Standard
99
99
  end_use_subcategory: nil)
100
100
  fan = OpenStudio::Model::FanOnOff.new(model)
101
101
  PrototypeFan.apply_base_fan_variables(fan,
102
- fan_name:fan_name,
102
+ fan_name: fan_name,
103
103
  fan_efficiency: fan_efficiency,
104
104
  pressure_rise: pressure_rise,
105
- end_use_subcategory:end_use_subcategory)
105
+ end_use_subcategory: end_use_subcategory)
106
106
  fan.setMotorEfficiency(motor_efficiency) unless motor_efficiency.nil?
107
107
  fan.setMotorInAirstreamFraction(motor_in_airstream_fraction) unless motor_in_airstream_fraction.nil?
108
108
  return fan
@@ -117,10 +117,10 @@ class Standard
117
117
  motor_in_airstream_fraction: nil,
118
118
  end_use_subcategory: nil)
119
119
  # check values to use
120
- fan_efficiency = fan_efficiency ? fan_efficiency : fan_json['fan_efficiency']
121
- pressure_rise = pressure_rise ? pressure_rise : fan_json['pressure_rise']
122
- motor_efficiency = motor_efficiency ? motor_efficiency : fan_json['motor_efficiency']
123
- motor_in_airstream_fraction = motor_in_airstream_fraction ? motor_in_airstream_fraction : fan_json['motor_in_airstream_fraction']
120
+ fan_efficiency ||= fan_json['fan_efficiency']
121
+ pressure_rise ||= fan_json['pressure_rise']
122
+ motor_efficiency ||= fan_json['motor_efficiency']
123
+ motor_in_airstream_fraction ||= fan_json['motor_in_airstream_fraction']
124
124
 
125
125
  # convert values
126
126
  pressure_rise = pressure_rise ? OpenStudio.convert(pressure_rise, 'inH_{2}O', 'Pa').get : nil
@@ -135,5 +135,4 @@ class Standard
135
135
  end_use_subcategory: end_use_subcategory)
136
136
  return fan
137
137
  end
138
-
139
- end
138
+ end
@@ -130,24 +130,24 @@ class Standard
130
130
  fan_power_coefficient_4: nil,
131
131
  fan_power_coefficient_5: nil)
132
132
  # check values to use
133
- fan_efficiency = fan_efficiency ? fan_efficiency : fan_json['fan_efficiency']
134
- pressure_rise = pressure_rise ? pressure_rise : fan_json['pressure_rise']
135
- motor_efficiency = motor_efficiency ? motor_efficiency : fan_json['motor_efficiency']
136
- motor_in_airstream_fraction = motor_in_airstream_fraction ? motor_in_airstream_fraction : fan_json['motor_in_airstream_fraction']
137
- fan_power_minimum_flow_rate_input_method = fan_power_minimum_flow_rate_input_method ? fan_power_minimum_flow_rate_input_method : fan_json['fan_power_minimum_flow_rate_input_method']
138
- fan_power_minimum_flow_rate_fraction = fan_power_minimum_flow_rate_fraction ? fan_power_minimum_flow_rate_fraction : fan_json['fan_power_minimum_flow_rate_fraction']
139
- fan_power_coefficient_1 = fan_power_coefficient_1 ? fan_power_coefficient_1 : fan_json['fan_power_coefficient_1']
140
- fan_power_coefficient_2 = fan_power_coefficient_2 ? fan_power_coefficient_2 : fan_json['fan_power_coefficient_2']
141
- fan_power_coefficient_3 = fan_power_coefficient_3 ? fan_power_coefficient_3 : fan_json['fan_power_coefficient_3']
142
- fan_power_coefficient_4 = fan_power_coefficient_4 ? fan_power_coefficient_4 : fan_json['fan_power_coefficient_4']
143
- fan_power_coefficient_5 = fan_power_coefficient_5 ? fan_power_coefficient_5 : fan_json['fan_power_coefficient_5']
133
+ fan_efficiency ||= fan_json['fan_efficiency']
134
+ pressure_rise ||= fan_json['pressure_rise']
135
+ motor_efficiency ||= fan_json['motor_efficiency']
136
+ motor_in_airstream_fraction ||= fan_json['motor_in_airstream_fraction']
137
+ fan_power_minimum_flow_rate_input_method ||= fan_json['fan_power_minimum_flow_rate_input_method']
138
+ fan_power_minimum_flow_rate_fraction ||= fan_json['fan_power_minimum_flow_rate_fraction']
139
+ fan_power_coefficient_1 ||= fan_json['fan_power_coefficient_1']
140
+ fan_power_coefficient_2 ||= fan_json['fan_power_coefficient_2']
141
+ fan_power_coefficient_3 ||= fan_json['fan_power_coefficient_3']
142
+ fan_power_coefficient_4 ||= fan_json['fan_power_coefficient_4']
143
+ fan_power_coefficient_5 ||= fan_json['fan_power_coefficient_5']
144
144
 
145
145
  # convert values
146
146
  pressure_rise_pa = OpenStudio.convert(pressure_rise, 'inH_{2}O', 'Pa').get unless pressure_rise.nil?
147
147
 
148
148
  # create fan
149
149
  fan = create_fan_variable_volume(model,
150
- fan_name:fan_name,
150
+ fan_name: fan_name,
151
151
  fan_efficiency: fan_efficiency,
152
152
  pressure_rise: pressure_rise_pa,
153
153
  motor_efficiency: motor_efficiency,
@@ -162,5 +162,4 @@ class Standard
162
162
  fan_power_coefficient_5: fan_power_coefficient_5)
163
163
  return fan
164
164
  end
165
-
166
- end
165
+ end
@@ -5,6 +5,9 @@ class Standard
5
5
 
6
6
  # Sets the fan pressure rise based on the Prototype buildings inputs
7
7
  def fan_zone_exhaust_apply_prototype_fan_pressure_rise(fan_zone_exhaust)
8
+ # Do not modify dummy exhaust fans
9
+ return true if fan_zone_exhaust.name.to_s.downcase.include? 'dummy'
10
+
8
11
  # All exhaust fans are assumed to have a pressure rise of
9
12
  # 0.5 in w.c. in the prototype building models.
10
13
  pressure_rise_in_h2o = 0.5
@@ -27,9 +30,9 @@ class Standard
27
30
  end_use_subcategory: nil)
28
31
 
29
32
  # check values to use
30
- fan_efficiency = fan_efficiency ? fan_efficiency : fan_json['fan_efficiency']
31
- pressure_rise = pressure_rise ? pressure_rise : fan_json['pressure_rise']
32
- system_availability_manager_coupling_mode = system_availability_manager_coupling_mode ? system_availability_manager_coupling_mode : fan_json['system_availability_manager_coupling_mode']
33
+ fan_efficiency ||= fan_json['fan_efficiency']
34
+ pressure_rise ||= fan_json['pressure_rise']
35
+ system_availability_manager_coupling_mode ||= fan_json['system_availability_manager_coupling_mode']
33
36
 
34
37
  # convert values
35
38
  pressure_rise = pressure_rise ? OpenStudio.convert(pressure_rise, 'inH_{2}O', 'Pa').get : nil
@@ -59,5 +62,4 @@ class Standard
59
62
  fan.setSystemAvailabilityManagerCouplingMode(system_availability_manager_coupling_mode) unless system_availability_manager_coupling_mode.nil?
60
63
  return fan
61
64
  end
62
-
63
- end
65
+ end
@@ -166,6 +166,7 @@ class Standard
166
166
  bottom_story = effective_num_stories[:story_hash].keys.first
167
167
  bottom_story.spaces.each do |space|
168
168
  next if space.multiplier > 1
169
+
169
170
  bottom_spaces[space] = space.floorArea
170
171
  end
171
172
  target_space = bottom_spaces.key(bottom_spaces.values.max)
@@ -342,6 +343,7 @@ class Standard
342
343
  elevator_hourly_fractions[0]
343
344
  end
344
345
  next if value == value_plus
346
+
345
347
  day_schedule.addValue(t, elevator_hourly_fractions[hr])
346
348
  end
347
349
  end
@@ -284,7 +284,6 @@ class Standard
284
284
  # @todo - add code in to determine number of entries and canopy area from model geoemtry
285
285
  # @todo - come up with better logic for entry widths
286
286
  def model_create_exterior_lighting_area_length_count_hash(model, space_type_hash, use_model_for_entries_and_canopies)
287
-
288
287
  # populate building_type_hashes from space_type_hash
289
288
  building_type_hashes = {}
290
289
  space_type_hash.each do |space_type, hash|
@@ -1,6 +1,5 @@
1
1
  class Standard
2
2
  def model_add_hvac(model, building_type, climate_zone, prototype_input, epw_file)
3
-
4
3
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding HVAC')
5
4
 
6
5
  # Get the list of HVAC systems, as defined for each building in the Prototype.building_name files
@@ -33,17 +32,17 @@ class Standard
33
32
  else
34
33
  # get num_chillers from prototype_input
35
34
  num_chillers = prototype_input['chw_number_chillers']
36
- if num_chillers == nil || num_chillers.to_i < 1
35
+ if num_chillers.nil? || num_chillers.to_i < 1
37
36
  num_chillers = 1
38
37
  end
39
38
  # update num_chillers if specified in @system_to_space_map
40
- if system['chw_number_chillers'] !=nil && system['chw_number_chillers'].to_i >0
39
+ if !system['chw_number_chillers'].nil? && system['chw_number_chillers'].to_i > 0
41
40
  num_chillers = system['chw_number_chillers']
42
41
  end
43
42
 
44
43
  # get number_cooling_towers if specified in @system_to_space_map
45
44
  number_cooling_towers = 1
46
- if system['number_cooling_towers'] !=nil && system['number_cooling_towers'].to_i >0
45
+ if !system['number_cooling_towers'].nil? && system['number_cooling_towers'].to_i > 0
47
46
  number_cooling_towers = system['number_cooling_towers']
48
47
  end
49
48
 
@@ -133,7 +132,15 @@ class Standard
133
132
  # Special logic to make a heat pump loop if necessary
134
133
  heat_pump_loop = nil
135
134
  if system['heating_type'] == 'Water To Air Heat Pump'
136
- heat_pump_loop = model_get_or_add_heat_pump_loop(model, 'NaturalGas', 'Electricity', heat_pump_loop_cooling_type: 'EvaporativeFluidCooler')
135
+ # @code_sections [90.1-2016_6.5.5.2.1]
136
+ # change highrise apartment heat rejection fan (< 5hp) from single speed to two speed evaporative fluid cooler
137
+ # TODO: this is temporary fix, it should be applied to all heat rejection devices smaller than 5hp.
138
+ if system['heat_pump_loop_cooling_type'].nil?
139
+ hp_loop_cooling_type = 'EvaporativeFluidCooler'
140
+ else
141
+ hp_loop_cooling_type = system['heat_pump_loop_cooling_type']
142
+ end
143
+ heat_pump_loop = model_get_or_add_heat_pump_loop(model, 'NaturalGas', 'Electricity', heat_pump_loop_cooling_type: hp_loop_cooling_type)
137
144
  end
138
145
  # if water to air heat pump is using existing chilled water loop and hot water loop as source
139
146
  # get existing loops, and assign heat_pump_cool_loop = chilled_water_loop, heat_pump_heat_loop = hot_water_loop
@@ -159,7 +166,7 @@ class Standard
159
166
  model.getPlantLoopByName('Hot Water Loop').get
160
167
  elsif building_type == 'MediumOffice'
161
168
  nil
162
- elsif building_type == 'MediumOfficeDetailed'
169
+ elsif building_type == 'MediumOfficeDetailed'
163
170
  nil
164
171
  else
165
172
  model_add_hw_loop(model,
@@ -196,7 +203,7 @@ class Standard
196
203
  chilled_water_loop = model.getPlantLoopByName('Chilled Water Loop').get
197
204
  else
198
205
  num_chillers = 1
199
- if (not system['num_chillers'].nil?) && (system['num_chillers'].to_i > 0)
206
+ if !system['num_chillers'].nil? && system['num_chillers'].to_i > 0
200
207
  num_chillers = system['num_chillers'].to_i
201
208
  end
202
209
  condenser_water_loop = nil
@@ -248,11 +255,11 @@ class Standard
248
255
  model_add_hw_loop(model, 'NaturalGas')
249
256
  end
250
257
  # check inputs
251
- doas_type = system['doas_type'] ? system['doas_type'] : 'DOASCV'
252
- econo_ctrl_mthd = system['economizer_control_method'] ? system['economizer_control_method'] : 'NoEconomizer'
253
- doas_control_strategy = system['doas_control_strategy'] ? system['doas_control_strategy'] : 'NeutralSupplyAir'
254
- clg_dsgn_sup_air_temp = system['cooling_design_supply_air_temperature'] ? system['cooling_design_supply_air_temperature'] : 60.0
255
- htg_dsgn_sup_air_temp = system['heating_design_supply_air_temperature'] ? system['heating_design_supply_air_temperature'] : 70.0
258
+ doas_type = system['doas_type'] || 'DOASCV'
259
+ econo_ctrl_mthd = system['economizer_control_method'] || 'NoEconomizer'
260
+ doas_control_strategy = system['doas_control_strategy'] || 'NeutralSupplyAir'
261
+ clg_dsgn_sup_air_temp = system['cooling_design_supply_air_temperature'] || 60.0
262
+ htg_dsgn_sup_air_temp = system['heating_design_supply_air_temperature'] || 70.0
256
263
 
257
264
  # for boolean input, this makes sure we get the correct input translation
258
265
  if system['include_exhaust_fan'].nil? || true?(system['include_exhaust_fan'])
@@ -286,8 +293,12 @@ class Standard
286
293
  when 'DC' # Data Center in Large Office building
287
294
  # Retrieve the existing hot water loop or add a new one if necessary.
288
295
  hot_water_loop = model_get_or_add_hot_water_loop(model, 'NaturalGas')
289
- # Retrieve the existing heat pump loop or add a new one if necessary.
290
- heat_pump_loop = model_get_or_add_heat_pump_loop(model, 'NaturalGas', 'Electricity', heat_pump_loop_cooling_type: 'CoolingTowerTwoSpeed')
296
+
297
+ # Set heat pump loop cooling type to CoolingTowerTwoSpeed if not specified in system hash
298
+ heat_pump_loop_cooling_type = system['heat_pump_loop_cooling_type'].nil? ? 'CoolingTowerTwoSpeed' : system['heat_pump_loop_cooling_type']
299
+
300
+ heat_pump_loop = model_get_or_add_heat_pump_loop(model, 'NaturalGas', 'Electricity',
301
+ heat_pump_loop_cooling_type: heat_pump_loop_cooling_type)
291
302
  model_add_data_center_hvac(model,
292
303
  thermal_zones,
293
304
  hot_water_loop,
@@ -4,11 +4,12 @@ Standard.class_eval do
4
4
  def model_create_prototype_model(climate_zone, epw_file, sizing_run_dir = Dir.pwd, debug = false, measure_model = nil)
5
5
  building_type = @instvarbuilding_type
6
6
  raise 'no building_type!' if @instvarbuilding_type.nil?
7
+
7
8
  model = nil
8
9
  # There are no reference models for HighriseApartment and data centers at vintages Pre-1980 and 1980-2004,
9
10
  # nor for NECB2011. This is a quick check.
10
11
  case @instvarbuilding_type
11
- when 'HighriseApartment','SmallDataCenterLowITE','SmallDataCenterHighITE','LargeDataCenterLowITE','LargeDataCenterHighITE','Laboratory','TallBuilding','SuperTallBuilding'
12
+ when 'HighriseApartment', 'SmallDataCenterLowITE', 'SmallDataCenterHighITE', 'LargeDataCenterLowITE', 'LargeDataCenterHighITE', 'Laboratory', 'TallBuilding', 'SuperTallBuilding'
12
13
  if template == 'DOE Ref Pre-1980' || template == 'DOE Ref 1980-2004'
13
14
  OpenStudio.logFree(OpenStudio::Error, 'Not available', "DOE Reference models for #{@instvarbuilding_type} at are not available, the measure is disabled for this specific type.")
14
15
  return false
@@ -17,8 +18,6 @@ Standard.class_eval do
17
18
  # delete this case statement once the College model is complete
18
19
  OpenStudio.logFree(OpenStudio::Error, 'Not available', 'While this release includes data for colleges, this only an early draft and should not be used for anything other that early testing or work to improve the college prototype.')
19
20
  return false
20
- else
21
- # do nothing
22
21
  end
23
22
  # optionally determine the climate zone from the epw and stat files.
24
23
  if climate_zone == 'NECB HDD Method'
@@ -36,12 +35,15 @@ Standard.class_eval do
36
35
  model_add_loads(model)
37
36
  model_apply_infiltration_standard(model)
38
37
  model_modify_infiltration_coefficients(model, @instvarbuilding_type, climate_zone)
38
+ model_add_door_infiltration(model, climate_zone)
39
39
  model_modify_surface_convection_algorithm(model)
40
40
  model_create_thermal_zones(model, @space_multiplier_map)
41
41
  model_add_design_days_and_weather_file(model, climate_zone, epw_file)
42
42
  model_add_hvac(model, @instvarbuilding_type, climate_zone, @prototype_input, epw_file)
43
43
  model_add_constructions(model, @instvarbuilding_type, climate_zone)
44
+ model_fenestration_orientation(model, climate_zone)
44
45
  model_custom_hvac_tweaks(building_type, climate_zone, @prototype_input, model)
46
+ model_add_transfer_air(model)
45
47
  model_add_internal_mass(model, @instvarbuilding_type)
46
48
  model_add_swh(model, @instvarbuilding_type, climate_zone, @prototype_input, epw_file)
47
49
  model_add_exterior_lights(model, @instvarbuilding_type, climate_zone, @prototype_input)
@@ -52,8 +54,10 @@ Standard.class_eval do
52
54
  model.yearDescription.get.setDayofWeekforStartDay('Sunday')
53
55
  model.getBuilding.setStandardsBuildingType(building_type)
54
56
  model_set_climate_zone(model, climate_zone)
57
+ model_add_lights_shutoff(model)
55
58
  # Perform a sizing model_run(model)
56
59
  return false if model_run_sizing_run(model, "#{sizing_run_dir}/SR1") == false
60
+
57
61
  # If there are any multizone systems, reset damper positions
58
62
  # to achieve a 60% ventilation effectiveness minimum for the system
59
63
  # following the ventilation rate procedure from 62.1
@@ -65,7 +69,7 @@ Standard.class_eval do
65
69
  # custom economizer controls
66
70
  # For 90.1-2010 Outpatient, AHU1 doesn't have economizer and AHU2 set minimum outdoor air flow rate as 0
67
71
  model_modify_oa_controller(model)
68
- # For operating room 1&2 in 2010 and 2013, VAV minimum air flow is set by schedule
72
+ # For operating room 1&2 in 2010, 2013, 2016, and 2019, VAV minimum air flow is set by schedule
69
73
  model_reset_or_room_vav_minimum_damper(@prototype_input, model)
70
74
  # Apply the HVAC efficiency standard
71
75
  model_apply_hvac_efficiency_standard(model, climate_zone)
@@ -111,7 +115,7 @@ Standard.class_eval do
111
115
 
112
116
  # put contents of new_model into model_to_replace
113
117
  model_to_replace.addObjects(new_model.toIdfFile.objects)
114
- BTAP::runner_register("Info", "Model name is now #{model_to_replace.building.get.name}.", runner)
118
+ BTAP.runner_register('Info', "Model name is now #{model_to_replace.building.get.name}.", runner)
115
119
  end
116
120
 
117
121
  # Replaces all objects in the current model
@@ -124,7 +128,7 @@ Standard.class_eval do
124
128
  # Take the existing model and remove all the objects
125
129
  # (this is cheesy), but need to keep the same memory block
126
130
  handles = OpenStudio::UUIDVector.new
127
- model.objects.each {|objects| handles << objects.handle}
131
+ model.objects.each { |objects| handles << objects.handle }
128
132
  model.removeObjects(handles)
129
133
  model = nil
130
134
  if File.dirname(__FILE__)[0] == ':'
@@ -182,6 +186,7 @@ Standard.class_eval do
182
186
  if all_space_types_have_standard_space_types
183
187
  return space_type_map
184
188
  end
189
+
185
190
  return nil
186
191
  end
187
192
 
@@ -210,6 +215,7 @@ Standard.class_eval do
210
215
  space_names.each do |space_name|
211
216
  space = model.getSpaceByName(space_name)
212
217
  next if space.empty?
218
+
213
219
  space = space.get
214
220
  space.setBuildingStory(stub_building_story)
215
221
  end
@@ -293,8 +299,6 @@ Standard.class_eval do
293
299
  floor_adiabatic_construction.setLayers(floor_layers)
294
300
 
295
301
  return floor_adiabatic_construction
296
-
297
-
298
302
  end
299
303
 
300
304
  # Checks to see if the an adiabatic wall construction has been constructed in an OpenStudio model.
@@ -329,8 +333,6 @@ Standard.class_eval do
329
333
  wall_adiabatic_construction.setLayers(wall_layers)
330
334
 
331
335
  return wall_adiabatic_construction
332
-
333
-
334
336
  end
335
337
 
336
338
  # Adds code-minimum constructions based on the building type
@@ -460,6 +462,7 @@ Standard.class_eval do
460
462
  if new_lookup_building_type == 'SmallHotel' && template != 'NECB2011'
461
463
  model.getBuildingStorys.sort.each do |story|
462
464
  next if story.name.get == 'AtticStory'
465
+
463
466
  # puts "story = #{story.name}"
464
467
  is_residential = 'No' # default for building story level
465
468
  exterior_spaces_area = 0
@@ -468,13 +471,14 @@ Standard.class_eval do
468
471
  # calculate the propotion of residential area in exterior spaces, see if this story is residential or not
469
472
  story.spaces.each do |space|
470
473
  next if space.exteriorWallArea.zero?
474
+
471
475
  space_type = space.spaceType.get
472
476
  if space_type.standardsSpaceType.is_initialized
473
477
  space_type_name = space_type.standardsSpaceType.get
474
478
  end
475
- data = standards_lookup_table_first(table_name: 'space_types', search_criteria: {'template' => template,
476
- 'building_type' => new_lookup_building_type,
477
- 'space_type' => space_type_name})
479
+ data = standards_lookup_table_first(table_name: 'space_types', search_criteria: { 'template' => template,
480
+ 'building_type' => new_lookup_building_type,
481
+ 'space_type' => space_type_name })
478
482
  exterior_spaces_area += space.floorArea
479
483
  story_exterior_residential_area += space.floorArea if data['is_residential'] == 'Yes' # "Yes" is residential, "No" or nil is nonresidential
480
484
  end
@@ -495,6 +499,7 @@ Standard.class_eval do
495
499
  # loop through ceiling surfaces and assign the plenum acoustical tile construction if the adjacent surface is a plenum floor
496
500
  model.getSurfaces.each do |surface|
497
501
  next unless surface.surfaceType == 'RoofCeiling' && surface.outsideBoundaryCondition == 'Surface'
502
+
498
503
  adj_surface = surface.adjacentSurface.get
499
504
  adj_space = adj_surface.space.get
500
505
  if adj_space.spaceType.is_initialized && adj_space.spaceType.get.standardsSpaceType.is_initialized
@@ -526,7 +531,6 @@ Standard.class_eval do
526
531
  # @param building_type [string] the type of building
527
532
  # @return [void]
528
533
  def model_set_below_grade_wall_constructions(model, building_type, climate_zone)
529
-
530
534
  # Find ground contact wall building category
531
535
  construction_set_data = model_get_construction_set(building_type)
532
536
  building_type_category = construction_set_data['exterior_wall_building_category']
@@ -546,7 +550,6 @@ Standard.class_eval do
546
550
 
547
551
  # iterate through spaces and set any necessary CFactorUndergroundWallConstructions
548
552
  model.getSpaces.each do |space|
549
-
550
553
  # Get height of the first below grade wall in this space. Will return nil if none are found.
551
554
  below_grade_wall_height = model_get_space_below_grade_wall_height(space)
552
555
  next if below_grade_wall_height.nil?
@@ -579,7 +582,6 @@ Standard.class_eval do
579
582
  # @param space [OpenStudio::Model::Space] space to determine below grade wall height
580
583
  # @return [Numeric, nil]
581
584
  def model_get_space_below_grade_wall_height(space)
582
-
583
585
  # find height of first below-grade wall adjacent to the ground
584
586
  space.surfaces.each do |surface|
585
587
  next unless surface.surfaceType == 'Wall'
@@ -605,20 +607,19 @@ Standard.class_eval do
605
607
  # @param building_type [string] the type of building
606
608
  # @param climate_zone [string] climate zone as described for prototype models. F-Factor is based on this parameter
607
609
  def model_set_floor_constructions(model, building_type, climate_zone)
608
-
609
- #Find ground contact wall building category
610
+ # Find ground contact wall building category
610
611
  construction_set_data = model_get_construction_set(building_type)
611
612
  building_type_category = construction_set_data['ground_contact_floor_building_category']
612
613
 
613
614
  # Find Floor F factor
614
615
  floor_construction_properties = model_get_construction_properties(model, 'GroundContactFloor', 'Unheated', building_type_category, climate_zone)
615
616
 
616
- #If no construction properties are found at all, return and allow code to use default constructions
617
+ # If no construction properties are found at all, return and allow code to use default constructions
617
618
  return if floor_construction_properties.nil?
618
619
 
619
620
  f_factor_ip = floor_construction_properties['assembly_maximum_f_factor']
620
621
 
621
- #If no f-factor is found in construction properties, return and allow code to use defaults
622
+ # If no f-factor is found in construction properties, return and allow code to use defaults
622
623
  return if f_factor_ip.nil?
623
624
 
624
625
  f_factor_si = f_factor_ip * OpenStudio.convert(1.0, 'Btu/ft*h*R', 'W/m*K').get
@@ -659,7 +660,6 @@ Standard.class_eval do
659
660
  # @param space[OpenStudio::Model::Space]
660
661
  # @return [Numeric, Numeric]
661
662
  def model_get_f_floor_geometry(space)
662
-
663
663
  perimeter = 0
664
664
 
665
665
  floors = []
@@ -673,8 +673,8 @@ Standard.class_eval do
673
673
 
674
674
  # Raise a warning for any space with more than 1 ground contact floor surface.
675
675
  if floors.length > 1
676
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "Space: #{space.name.to_s} has more than one ground contact floor. FFactorGroundFloorConstruction constructions in this space may be incorrect")
677
- elsif floors.empty? #If this space has no ground contact floors, return 0
676
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.model.Model', "Space: #{space.name} has more than one ground contact floor. FFactorGroundFloorConstruction constructions in this space may be incorrect")
677
+ elsif floors.empty? # If this space has no ground contact floors, return 0
678
678
  return 0, 0
679
679
  end
680
680
 
@@ -682,10 +682,8 @@ Standard.class_eval do
682
682
 
683
683
  # cycle through surfaces in space
684
684
  space.surfaces.each do |surface|
685
-
686
685
  # find perimeter of floor by finding intersecting outdoor walls and measuring the intersection
687
686
  if surface.surfaceType == 'Wall' && surface.outsideBoundaryCondition == 'Outdoors'
688
-
689
687
  perimeter += model_calculate_wall_and_floor_intersection(surface, floor)
690
688
  end
691
689
  end
@@ -706,7 +704,6 @@ Standard.class_eval do
706
704
  # @param floor[OpenStudio::Model::Surface] floor occupying same space as wall. Edges checked for interesections with wall
707
705
  # @return [Numeric] returns the intersection/overlap length of the wall and floor of interest
708
706
  def model_calculate_wall_and_floor_intersection(wall, floor)
709
-
710
707
  # Used for determining if two points are 'equal' if within this length
711
708
  tolerance = 0.0001
712
709
 
@@ -719,7 +716,6 @@ Standard.class_eval do
719
716
 
720
717
  # Iterate through wall edges
721
718
  wall_edge_array.each do |wall_edge|
722
-
723
719
  wall_edge_p1 = wall_edge[0]
724
720
  wall_edge_p2 = wall_edge[1]
725
721
 
@@ -737,14 +733,12 @@ Standard.class_eval do
737
733
 
738
734
  # If the edge is parallel with the floor and in the same x-y plane as the floor, assume an intersection the
739
735
  # length of the wall edge
740
- edge_vector = OpenStudio::Vector3d.new(wall_edge_p1-wall_edge_p2)
736
+ edge_vector = OpenStudio::Vector3d.new(wall_edge_p1 - wall_edge_p2)
741
737
  return(edge_vector.length)
742
-
743
738
  end
744
739
 
745
740
  # If no edges intersected, return 0
746
741
  return 0
747
-
748
742
  end
749
743
 
750
744
  # Returns an array of OpenStudio::Point3D pairs of an OpenStudio::Model::Surface's edges. Used to calculate surface
@@ -752,7 +746,6 @@ Standard.class_eval do
752
746
  # @param surface[OpenStudio::Model::Surface] - surface whose edges are being returned
753
747
  # @return [Array<Array(OpenStudio::Point3D, OpenStudio::Point3D)>] - array of pair of points describing the line segment of an edge
754
748
  def model_get_surface_edges(surface)
755
-
756
749
  vertices = surface.vertices
757
750
  n_vertices = vertices.length
758
751
 
@@ -764,7 +757,7 @@ Standard.class_eval do
764
757
  for edge_counter in 0..n_vertices - 1
765
758
 
766
759
  # If not the last vertex in surface
767
- if edge_counter < n_vertices-1
760
+ if edge_counter < n_vertices - 1
768
761
  edge_array << [vertices[edge_counter], vertices[edge_counter + 1]]
769
762
  else # Make index adjustments for final index in vertices array
770
763
  edge_array << [vertices[edge_counter], vertices[0]]
@@ -779,7 +772,6 @@ Standard.class_eval do
779
772
  # @param building_type [String] the type of building
780
773
  # @return [Bool] returns true if successful, false if not
781
774
  def model_add_internal_mass(model, building_type)
782
-
783
775
  # Assign a material to all internal mass objects
784
776
  material = OpenStudio::Model::StandardOpaqueMaterial.new(model)
785
777
  material.setName('Std Wood 6inch')
@@ -808,10 +800,10 @@ Standard.class_eval do
808
800
 
809
801
  # add internal mass
810
802
  # not required for NECB2011
811
- unless (template == 'NECB2011') ||
812
- (building_type.include?('DataCenter')) ||
803
+ unless template == 'NECB2011' ||
804
+ building_type.include?('DataCenter') ||
813
805
  ((building_type == 'SmallHotel') &&
814
- (template == '90.1-2004' || template == '90.1-2007' || template == '90.1-2010' || template == '90.1-2013' || template == 'NREL ZNE Ready 2017'))
806
+ (template == '90.1-2004' || template == '90.1-2007' || template == '90.1-2010' || template == '90.1-2013' || template == '90.1-2016' || template == '90.1-2019' || template == 'NREL ZNE Ready 2017'))
815
807
  internal_mass_def = OpenStudio::Model::InternalMassDefinition.new(model)
816
808
  internal_mass_def.setSurfaceAreaperSpaceFloorArea(2.0)
817
809
  internal_mass_def.setConstruction(construction)
@@ -819,6 +811,7 @@ Standard.class_eval do
819
811
  # only add internal mass objects to conditioned spaces
820
812
  next unless space_cooled?(space)
821
813
  next unless space_heated?(space)
814
+
822
815
  internal_mass = OpenStudio::Model::InternalMass.new(internal_mass_def)
823
816
  internal_mass.setName("#{space.name} Mass")
824
817
  internal_mass.setSpace(space)
@@ -860,13 +853,13 @@ Standard.class_eval do
860
853
  end
861
854
  space.setThermalZone(zone)
862
855
 
863
- # Skip thermostat for spaces with no space type
864
- next if space.spaceType.empty?
856
+ # Skip thermostat for spaces with no space type
857
+ next if space.spaceType.empty?
865
858
 
866
- # Add a thermostat
867
- space_type_name = space.spaceType.get.name.get
868
- thermostat_name = space_type_name + ' Thermostat'
869
- thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name)
859
+ # Add a thermostat
860
+ space_type_name = space.spaceType.get.name.get
861
+ thermostat_name = space_type_name + ' Thermostat'
862
+ thermostat = model.getThermostatSetpointDualSetpointByName(thermostat_name)
870
863
  if thermostat.empty?
871
864
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.model.Model', "Thermostat #{thermostat_name} not found for space name: #{space.name}")
872
865
  else
@@ -877,7 +870,7 @@ Standard.class_eval do
877
870
  ideal_loads = OpenStudio::Model::ZoneHVACIdealLoadsAirSystem.new(model)
878
871
  ideal_loads.addToThermalZone(zone)
879
872
  end
880
- end
873
+ end
881
874
  end
882
875
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished creating thermal zones')
883
876
  end
@@ -927,6 +920,7 @@ Standard.class_eval do
927
920
  thermal_zone.spaces.each do |space|
928
921
  next unless space.spaceType.is_initialized
929
922
  next unless space.partofTotalFloorArea
923
+
930
924
  space_type = space.spaceType.get
931
925
  next unless space_type.standardsBuildingType.is_initialized
932
926
  next unless space_type.standardsSpaceType.is_initialized
@@ -1017,6 +1011,7 @@ Standard.class_eval do
1017
1011
 
1018
1012
  # add exhaust
1019
1013
  next if zones_applied.include?(largest_target_zone) # would only hit this if zone has two space types each requesting makeup air
1014
+
1020
1015
  zone_exhaust_hash = thermal_zone_add_exhaust(largest_target_zone, exhaust_makeup_inputs)
1021
1016
  zones_applied << largest_target_zone
1022
1017
  zone_exhaust_fans.merge!(zone_exhaust_hash)
@@ -1102,6 +1097,136 @@ Standard.class_eval do
1102
1097
  return zone_exhaust_fans
1103
1098
  end
1104
1099
 
1100
+ # Add guestroom vacancy controls
1101
+ #
1102
+ # @code_sections [90.1-2016_6.4.3.3.5]
1103
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
1104
+ # @param building_type [String] Building type
1105
+ # @return [Boolean] Returns true if successful, false otherwise
1106
+ def model_add_guestroom_vacancy_controls(model, building_type)
1107
+ # Guestrooms are currently only included in the small and large hotel prototypes
1108
+ return true unless (building_type == 'LargeHotel') || (building_type == 'SmallHotel')
1109
+
1110
+ # Guestrooms controls only required for 90.1-2016 and onward
1111
+ return true unless (template == '90.1-2016') || (template == '90.1-2019')
1112
+
1113
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding Guestroom Vacancy Controls')
1114
+
1115
+ # Define guestroom vacancy maps
1116
+ # List of all spaces that represent vacant rooms
1117
+ guestroom_vacancy_map = {
1118
+ 'LargeHotel' => [
1119
+ 'Room_3_Mult19_Flr_3'
1120
+ ],
1121
+ 'SmallHotel' => [
1122
+ 'GuestRoom101',
1123
+ 'GuestRoom102',
1124
+ 'GuestRoom201',
1125
+ 'GuestRoom215_218',
1126
+ 'GuestRoom301',
1127
+ 'GuestRoom302_305',
1128
+ 'GuestRoom313',
1129
+ 'GuestRoom319',
1130
+ 'GuestRoom324',
1131
+ 'GuestRoom402_405',
1132
+ 'GuestRoom406_408',
1133
+ 'GuestRoom413',
1134
+ 'GuestRoom414'
1135
+ ]
1136
+ }
1137
+
1138
+ # Iterate through spaces and apply for guestroom vacancy controls
1139
+ thermostat_schedules = {}
1140
+ thermostat_schedules['Heating'] = []
1141
+ thermostat_schedules['Cooling'] = []
1142
+ model.getSpaces.sort.each do |space|
1143
+ # Get space name
1144
+ space_name = space.name
1145
+
1146
+ # Get space type
1147
+ space_type = space.spaceType.get
1148
+
1149
+ # Skip space types with no standards building type
1150
+ next if space_type.standardsBuildingType.empty?
1151
+
1152
+ stds_bldg_type = space_type.standardsBuildingType.get
1153
+
1154
+ # Skip space types with no standards space type
1155
+ next if space_type.standardsSpaceType.empty?
1156
+
1157
+ stds_spc_type = space_type.standardsSpaceType.get
1158
+
1159
+ # Skip building types and space types that aren't listed in the guestroom vacancy maps
1160
+ next unless guestroom_vacancy_map.key?(stds_bldg_type)
1161
+ next unless guestroom_vacancy_map[stds_bldg_type].include?(space_name.to_s)
1162
+
1163
+ # Get thermal zone and thermostat schedules associated with space
1164
+ thermal_zone = space.thermalZone.get
1165
+ if thermal_zone.thermostatSetpointDualSetpoint.is_initialized
1166
+ thermostat = thermal_zone.thermostatSetpointDualSetpoint.get
1167
+ if thermostat.heatingSetpointTemperatureSchedule.is_initialized && thermostat.heatingSetpointTemperatureSchedule.get.to_ScheduleRuleset.is_initialized
1168
+ thermostat_schedules['Heating'] << thermostat.heatingSetpointTemperatureSchedule.get.to_ScheduleRuleset.get
1169
+ end
1170
+ if thermostat.coolingSetpointTemperatureSchedule.is_initialized && thermostat.coolingSetpointTemperatureSchedule.get.to_ScheduleRuleset.is_initialized
1171
+ thermostat_schedules['Cooling'] << thermostat.coolingSetpointTemperatureSchedule.get.to_ScheduleRuleset.get
1172
+ end
1173
+ end
1174
+
1175
+ # Get zone equipment fan
1176
+ # Currently prototypes with guestrooms use PTAC and 4PFC
1177
+ # TODO: Implement additional system type (zonal and air loop-based)
1178
+ thermal_zone.equipment.sort.each do |zone_equipment|
1179
+ if zone_equipment.to_ZoneHVACPackagedTerminalAirConditioner.is_initialized
1180
+ equipment = zone_equipment.to_ZoneHVACPackagedTerminalAirConditioner.get
1181
+ elsif zone_equipment.to_ZoneHVACFourPipeFanCoil.is_initialized
1182
+ equipment = zone_equipment.to_ZoneHVACFourPipeFanCoil.get
1183
+ else
1184
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', "#{thermal_zone} is not served by either a packaged terminal air-conditioner or four pipe fan coil, vacancy fan schedule has not been adjusted")
1185
+ next
1186
+ end
1187
+
1188
+ # Change fan operation schedule
1189
+ fan = if equipment.supplyAirFan.to_FanConstantVolume.is_initialized
1190
+ equipment.supplyAirFan.to_FanConstantVolume.get
1191
+ elsif equipment.supplyAirFan.to_FanVariableVolume.is_initialized
1192
+ equipment.supplyAirFan.to_FanVariableVolume.get
1193
+ elsif equipment.supplyAirFan.to_FanOnOff.is_initialized
1194
+ equipment.supplyAirFan.to_FanOnOff.get
1195
+ end
1196
+ fan.setAvailabilitySchedule(model_add_schedule(model, 'GuestroomVacantFanSchedule'))
1197
+ end
1198
+
1199
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished Adding Guestroom Vacancy Controls')
1200
+ end
1201
+
1202
+ # Adjust thermostat schedules:
1203
+ # Increase set-up/back to comply with code requirements
1204
+ thermostat_schedules.keys.each do |sch_type|
1205
+ thermostat_schedules[sch_type].uniq.each do |sch|
1206
+ # Skip non-ruleset schedules
1207
+ next if sch.to_ScheduleRuleset.empty?
1208
+
1209
+ # Get schedule modifier
1210
+ case template
1211
+ when '90.1-2016', '90.1-2019'
1212
+ case sch_type
1213
+ when 'Heating'
1214
+ sch_mult = 15.556 / 18.889 # Set thermostat to 15.556
1215
+ when 'Cooling'
1216
+ sch_mult = 26.667 / 23.333 # Set thermostat to 26.667
1217
+ else
1218
+ sch_mult = 1 # No adjustments
1219
+ end
1220
+ else
1221
+ shc_mult = 1 # No adjustments
1222
+ end
1223
+
1224
+ # Modify schedules
1225
+ model_multiply_schedule(model, sch.defaultDaySchedule, sch_mult, 0)
1226
+ end
1227
+ end
1228
+ end
1229
+
1105
1230
  # Adds occupancy sensors to certain space types per
1106
1231
  # the PNNL documentation.
1107
1232
  #
@@ -1110,26 +1235,35 @@ Standard.class_eval do
1110
1235
  # @todo genericize and move this method to Standards.Space
1111
1236
  def model_add_occupancy_sensors(model, building_type, climate_zone)
1112
1237
  # Only add occupancy sensors for 90.1-2010
1238
+ # Currently deactivated for all 90.1 versions
1239
+ # of the prototype because occupancy sensor is
1240
+ # currently modeled using different schedules
1241
+ # hence this code double counts savings from
1242
+ # sensors.
1243
+ # TODO: Move occupancy sensor modeling from
1244
+ # schedule to code.
1113
1245
  case template
1114
- when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007'
1246
+ when 'DOE Ref Pre-1980', 'DOE Ref 1980-2004', '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', '90.1-2016', '90.1-2019'
1115
1247
  return true
1116
1248
  end
1117
1249
 
1118
1250
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started Adding Occupancy Sensors')
1119
1251
 
1120
1252
  space_type_reduction_map = {
1121
- 'SecondarySchool' => {'Classroom' => 0.32, 'Restroom' => 0.34, 'Office' => 0.22},
1122
- 'PrimarySchool' => {'Classroom' => 0.32, 'Restroom' => 0.34, 'Office' => 0.22}
1253
+ 'SecondarySchool' => { 'Classroom' => 0.32, 'Restroom' => 0.34, 'Office' => 0.22 },
1254
+ 'PrimarySchool' => { 'Classroom' => 0.32, 'Restroom' => 0.34, 'Office' => 0.22 }
1123
1255
  }
1124
1256
 
1125
1257
  # Loop through all the space types and reduce lighting operation schedule fractions as-specified
1126
1258
  model.getSpaceTypes.sort.each do |space_type|
1127
1259
  # Skip space types with no standards building type
1128
1260
  next if space_type.standardsBuildingType.empty?
1261
+
1129
1262
  stds_bldg_type = space_type.standardsBuildingType.get
1130
1263
 
1131
1264
  # Skip space types with no standards space type
1132
1265
  next if space_type.standardsSpaceType.empty?
1266
+
1133
1267
  stds_spc_type = space_type.standardsSpaceType.get
1134
1268
 
1135
1269
  # Skip building types and space types that aren't listed in the hash
@@ -1148,6 +1282,7 @@ Standard.class_eval do
1148
1282
  space_type.lights.each do |light|
1149
1283
  # Skip lights that don't have a schedule
1150
1284
  next if light.schedule.empty?
1285
+
1151
1286
  lights_sch = light.schedule.get
1152
1287
  lights_schs[lights_sch.name.to_s] = lights_sch
1153
1288
  lights_sch_names << lights_sch.name.to_s
@@ -1173,13 +1308,14 @@ Standard.class_eval do
1173
1308
  new_lights_sch.scheduleRules.each do |sch_rule|
1174
1309
  model_multiply_schedule(model, sch_rule.daySchedule, red_multiplier, 0.25)
1175
1310
  end
1176
- end # end of lights_sch_names.uniq.each do
1311
+ end
1177
1312
 
1178
1313
  # Loop through all lights instances, replacing old lights
1179
1314
  # schedules with the reduced schedules.
1180
1315
  space_type.lights.each do |light|
1181
1316
  # Skip lights that don't have a schedule
1182
1317
  next if light.schedule.empty?
1318
+
1183
1319
  old_lights_sch_name = light.schedule.get.name.to_s
1184
1320
  if reduced_lights_schs[old_lights_sch_name]
1185
1321
  light.setSchedule(reduced_lights_schs[old_lights_sch_name])
@@ -1271,8 +1407,6 @@ Standard.class_eval do
1271
1407
  return true
1272
1408
  end
1273
1409
 
1274
- # add exterior lights
1275
-
1276
1410
  # Changes the infiltration coefficients for the prototype vintages.
1277
1411
  #
1278
1412
  # @param (see #add_constructions)
@@ -1283,7 +1417,7 @@ Standard.class_eval do
1283
1417
  # impacts wind speed, and in turn infiltration
1284
1418
  terrain = 'City'
1285
1419
  case template
1286
- when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', 'NREL ZNE Ready 2017'
1420
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', '90.1-2016', '90.1-2019', 'NREL ZNE Ready 2017'
1287
1421
  case building_type
1288
1422
  when 'Warehouse'
1289
1423
  terrain = 'Urban'
@@ -1338,10 +1472,8 @@ Standard.class_eval do
1338
1472
  end
1339
1473
 
1340
1474
  # Set up daylight savings
1341
- #
1342
1475
  def model_add_daylight_savings(model)
1343
-
1344
- start_date = '2nd Sunday in March'
1476
+ start_date = '2nd Sunday in March'
1345
1477
  end_date = '1st Sunday in November'
1346
1478
 
1347
1479
  runperiodctrl_daylgtsaving = model.getRunPeriodControlDaylightSavingTime
@@ -1365,7 +1497,7 @@ Standard.class_eval do
1365
1497
  thanksgiving.setName('Thanksgiving')
1366
1498
  thanksgiving.setSpecialDayType('Holiday')
1367
1499
 
1368
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', "Added holidays: New Years, Thanksgiving.")
1500
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', 'Added holidays: New Years, Thanksgiving.')
1369
1501
  end
1370
1502
 
1371
1503
  # Changes the infiltration coefficients for the prototype vintages.
@@ -1388,12 +1520,12 @@ Standard.class_eval do
1388
1520
  clg = 1.33
1389
1521
  htg = 1.33
1390
1522
  end
1391
- when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013'
1523
+ when '90.1-2004', '90.1-2007', '90.1-2010', '90.1-2013', '90.1-2016', '90.1-2019'
1392
1524
  # exit if is one of the 90.1 templates as their sizing paramters are explicitly specified in geometry osms
1393
1525
  return
1394
1526
  when 'CBES Pre-1978', 'CBES T24 1978', 'CBES T24 1992', 'CBES T24 2001', 'CBES T24 2005', 'CBES T24 2008'
1395
1527
  case building_type
1396
- when 'Hospital', 'LargeHotel', 'MediumOffice', 'LargeOffice', 'MediumOfficeDetailed','LargeOfficeDetailed', 'Outpatient', 'PrimarySchool'
1528
+ when 'Hospital', 'LargeHotel', 'MediumOffice', 'LargeOffice', 'MediumOfficeDetailed', 'LargeOfficeDetailed', 'Outpatient', 'PrimarySchool'
1397
1529
  clg = 1.0
1398
1530
  htg = 1.0
1399
1531
  end
@@ -1415,34 +1547,33 @@ Standard.class_eval do
1415
1547
  def model_apply_prototype_hvac_assumptions(model, building_type, climate_zone)
1416
1548
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Started applying prototype HVAC assumptions.')
1417
1549
 
1418
- ##### Apply equipment efficiencies
1419
-
1420
- # Fans
1421
- # Pressure Rise
1422
-
1423
- model.getFanConstantVolumes.sort.each {|obj| fan_constant_volume_apply_prototype_fan_pressure_rise(obj)}
1424
- model.getFanVariableVolumes.sort.each {|obj| fan_variable_volume_apply_prototype_fan_pressure_rise(obj)}
1425
- model.getFanOnOffs.sort.each {|obj| fan_on_off_apply_prototype_fan_pressure_rise(obj)}
1426
- model.getFanZoneExhausts.sort.each {|obj| fan_zone_exhaust_apply_prototype_fan_pressure_rise(obj)}
1550
+ # Fan pressure rise
1551
+ model.getFanConstantVolumes.sort.each { |obj| fan_constant_volume_apply_prototype_fan_pressure_rise(obj) }
1552
+ model.getFanVariableVolumes.sort.each { |obj| fan_variable_volume_apply_prototype_fan_pressure_rise(obj) }
1553
+ model.getFanOnOffs.sort.each { |obj| fan_on_off_apply_prototype_fan_pressure_rise(obj) }
1554
+ model.getFanZoneExhausts.sort.each { |obj| fan_zone_exhaust_apply_prototype_fan_pressure_rise(obj) }
1427
1555
 
1428
- # Motor Efficiency
1429
- model.getFanConstantVolumes.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
1430
- model.getFanVariableVolumes.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
1431
- model.getFanOnOffs.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
1432
- model.getFanZoneExhausts.sort.each {|obj| prototype_fan_apply_prototype_fan_efficiency(obj)}
1556
+ # Fan motor efficiency
1557
+ model.getFanConstantVolumes.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
1558
+ model.getFanVariableVolumes.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
1559
+ model.getFanOnOffs.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
1560
+ model.getFanZoneExhausts.sort.each { |obj| prototype_fan_apply_prototype_fan_efficiency(obj) }
1433
1561
 
1434
1562
  # Gas Heating Coil
1435
- model.getCoilHeatingGass.sort.each {|obj| coil_heating_gas_apply_prototype_efficiency(obj)}
1563
+ model.getCoilHeatingGass.sort.each { |obj| coil_heating_gas_apply_prototype_efficiency(obj) }
1436
1564
 
1437
- ##### Add Economizers
1565
+ # Add Economizers
1438
1566
  apply_economizers(climate_zone, model)
1439
1567
 
1440
1568
  # TODO: What is the logic behind hard-sizing
1441
1569
  # hot water coil convergence tolerances?
1442
- model.getControllerWaterCoils.sort.each {|obj| controller_water_coil_set_convergence_limits(obj)}
1570
+ model.getControllerWaterCoils.sort.each { |obj| controller_water_coil_set_convergence_limits(obj) }
1443
1571
 
1444
- # adjust defrost curve limits for coil heating dx single speed
1445
- model.getCoilHeatingDXSingleSpeeds.sort.each {|obj| coil_heating_dx_single_speed_apply_defrost_eir_curve_limits(obj)}
1572
+ # Adjust defrost curve limits for coil heating dx single speed
1573
+ model.getCoilHeatingDXSingleSpeeds.sort.each { |obj| coil_heating_dx_single_speed_apply_defrost_eir_curve_limits(obj) }
1574
+
1575
+ # Pump part load performances
1576
+ model.getPumpVariableSpeeds.sort.each { |obj| pump_variable_speed_control_type(obj) }
1446
1577
 
1447
1578
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.model.Model', 'Finished applying prototype HVAC assumptions.')
1448
1579
  end
@@ -1452,12 +1583,10 @@ Standard.class_eval do
1452
1583
  #
1453
1584
  # @param model [OpenStudio::Model::Model] the model
1454
1585
  def model_apply_prototype_hvac_efficiency_adjustments(model)
1455
-
1456
1586
  # ERVs
1457
1587
  # Applies the DOE Prototype Building assumption that ERVs use
1458
1588
  # enthalpy wheels and therefore exceed the minimum effectiveness specified by 90.1
1459
- model.getHeatExchangerAirToAirSensibleAndLatents.each {|obj| heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_efficiency(obj)}
1460
-
1589
+ model.getHeatExchangerAirToAirSensibleAndLatents.each { |obj| heat_exchanger_air_to_air_sensible_and_latent_apply_prototype_efficiency(obj) }
1461
1590
  return true
1462
1591
  end
1463
1592
 
@@ -1807,12 +1936,12 @@ Standard.class_eval do
1807
1936
 
1808
1937
  # Return the dominant standards building type
1809
1938
  def model_get_standards_building_type(model)
1810
-
1811
1939
  # determine areas of each building type
1812
1940
  building_type_areas = {}
1813
1941
  model.getSpaces.each do |space|
1814
1942
  # ignore space if not part of total area
1815
1943
  next unless space.partofTotalFloorArea
1944
+
1816
1945
  if space.spaceType.is_initialized
1817
1946
  space_type = space.spaceType.get
1818
1947
  if space_type.standardsBuildingType.is_initialized
@@ -1830,7 +1959,7 @@ Standard.class_eval do
1830
1959
  building_type = building_type_areas.key(building_type_areas.values.max)
1831
1960
 
1832
1961
  if building_type.nil?
1833
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', "Model has no dominant standards building type.")
1962
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', 'Model has no dominant standards building type.')
1834
1963
  else
1835
1964
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.prototype.Model', "#{building_type} is the dominant standards building type.")
1836
1965
  end
@@ -1860,8 +1989,8 @@ Standard.class_eval do
1860
1989
  end
1861
1990
 
1862
1991
  # Group the zones by occupancy type
1863
- type_to_area = Hash.new {0.0}
1864
- zones_grouped_by_occ = zones.group_by {|z| z['occ']}
1992
+ type_to_area = Hash.new { 0.0 }
1993
+ zones_grouped_by_occ = zones.group_by { |z| z['occ'] }
1865
1994
 
1866
1995
  # Determine the dominant occupancy type by area
1867
1996
  zones_grouped_by_occ.each do |occ_type, zns|
@@ -1869,7 +1998,7 @@ Standard.class_eval do
1869
1998
  type_to_area[occ_type] += zn['area']
1870
1999
  end
1871
2000
  end
1872
- dom_occ = type_to_area.sort_by {|k, v| v}.reverse[0][0]
2001
+ dom_occ = type_to_area.sort_by { |k, v| v }.reverse[0][0]
1873
2002
 
1874
2003
  # Get the dominant occupancy type group
1875
2004
  dom_occ_group = zones_grouped_by_occ[dom_occ]
@@ -1957,8 +2086,8 @@ Standard.class_eval do
1957
2086
  end
1958
2087
 
1959
2088
  # Group the zones by building type
1960
- type_to_area = Hash.new {0.0}
1961
- zones_grouped_by_bldg_type = zones.group_by {|z| z['bldg_type']}
2089
+ type_to_area = Hash.new { 0.0 }
2090
+ zones_grouped_by_bldg_type = zones.group_by { |z| z['bldg_type'] }
1962
2091
 
1963
2092
  # Determine the dominant building type by area
1964
2093
  zones_grouped_by_bldg_type.each do |bldg_type, zns|
@@ -1966,7 +2095,7 @@ Standard.class_eval do
1966
2095
  type_to_area[bldg_type] += zn['area']
1967
2096
  end
1968
2097
  end
1969
- dom_bldg_type = type_to_area.sort_by {|k, v| v}.reverse[0][0]
2098
+ dom_bldg_type = type_to_area.sort_by { |k, v| v }.reverse[0][0]
1970
2099
 
1971
2100
  # Get the dominant building type group
1972
2101
  dom_bldg_type_group = zones_grouped_by_bldg_type[dom_bldg_type]
@@ -2097,9 +2226,17 @@ Standard.class_eval do
2097
2226
  economizer_required = false
2098
2227
 
2099
2228
  if air_loop_hvac_humidifier_count(air_loop) > 0
2100
- # If airloop includes it is assumed that exception c to 90.1-2004 Section 6.5.1 applies
2101
- # This exception exist through 90.1-2013, see Section 6.5.1.3
2102
- economizer_required = false
2229
+ # If airloop includes a humidifier it is assumed
2230
+ # that exception c to 90.1-2004/7 Section 6.5.1 applies.
2231
+ if template == '90.1-2004' || template == '90.1-2007'
2232
+ economizer_required = false
2233
+ end
2234
+ # This exception exist through 90.1-2019, for hospitals
2235
+ # see Section 6.5.1 exception 4
2236
+ if @instvarbuilding_type == 'Hospital' &&
2237
+ (template == '90.1-2013' || template == '90.1-2016' || template == '90.1-2019')
2238
+ economizer_required = false
2239
+ end
2103
2240
  elsif @instvarbuilding_type == 'LargeOffice' &&
2104
2241
  air_loop.name.to_s.downcase.include?('datacenter') &&
2105
2242
  air_loop.name.to_s.downcase.include?('basement') &&
@@ -2161,4 +2298,252 @@ Standard.class_eval do
2161
2298
  end
2162
2299
  end
2163
2300
 
2301
+ # Implement occupancy based lighting level threshold (0.02 W/sqft). This is only for ASHRAE 90.1 2016 onwards.
2302
+ #
2303
+ # @code_sections [90.1-2016_9.4.1.1.h/i]
2304
+ # @author Xuechen (Jerry) Lei, PNNL
2305
+ # @param model [OpenStudio::Model::Model] OpenStudio Model
2306
+ #
2307
+ def model_add_lights_shutoff(model)
2308
+ return false
2309
+ end
2310
+
2311
+ # Get building door information to update infiltration
2312
+ #
2313
+ # return [Hash] Door infiltration information
2314
+ def get_building_door_info(model)
2315
+ get_building_door_info = {}
2316
+
2317
+ return get_building_door_info
2318
+ end
2319
+
2320
+ # Metal coiling door code minimum infiltration rate at 75 Pa
2321
+ #
2322
+ # @param [String] Climate zone
2323
+ # @return [Float] Minimum infiltration rate for metal coiling doors
2324
+ def model_door_infil_flow_rate_metal_coiling_cfm_ft2(climate_zone)
2325
+ case climate_zone
2326
+ when 'ASHRAE 169-2006-7A',
2327
+ 'ASHRAE 169-2006-7B',
2328
+ 'ASHRAE 169-2006-8A',
2329
+ 'ASHRAE 169-2006-8B'
2330
+ return 0.4
2331
+ else
2332
+ return 4.4
2333
+ end
2334
+ end
2335
+
2336
+ # Metal rollup door code minimum infiltration rate at 75 Pa
2337
+ #
2338
+ # @param [String] Climate zone
2339
+ # @return [Float] Minimum infiltration rate for metal coiling doors
2340
+ def model_door_infil_flow_rate_rollup_cfm_ft2(climate_zone)
2341
+ return 0.4
2342
+ end
2343
+
2344
+ # Open door infiltration rate at 75 Pa
2345
+ #
2346
+ # @param [String] Climate zone
2347
+ # @return [Float] Open door infiltration rate
2348
+ def model_door_infil_flow_rate_open_cfm_ft2(climate_zone)
2349
+ return 9.7875
2350
+ end
2351
+
2352
+ # Add door infiltration
2353
+ #
2354
+ # @param [OpenStudio:Model::Model] OpenStudio model object
2355
+ # @climate_zone [String] Climate zone
2356
+ # @return [Boolean] Returns true if successful, false otherwise or not applicable
2357
+ def model_add_door_infiltration(model, climate_zone)
2358
+ # Get door parameters for the building model
2359
+ bldg_door_types = get_building_door_info(model)
2360
+ return false if bldg_door_types.empty?
2361
+
2362
+ bldg_door_types.each do |door_type, door_info|
2363
+ # Get infiltration flow rate at 75 Pa
2364
+ case door_type
2365
+ when 'Metal coiling'
2366
+ door_infil_flow_rate_cfm_per_ft2 = model_door_infil_flow_rate_metal_coiling_cfm_ft2(climate_zone)
2367
+ when 'Rollup'
2368
+ door_infil_flow_rate_cfm_per_ft2 = model_door_infil_flow_rate_rollup_cfm_ft2(climate_zone)
2369
+ when 'Open'
2370
+ door_infil_flow_rate_cfm_per_ft2 = model_door_infil_flow_rate_open_cfm_ft2(climate_zone)
2371
+ else
2372
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.prototype.Model', "The #{door_type.downcase} type of door is not currently supported.")
2373
+ next
2374
+ end
2375
+
2376
+ # Calculate door infiltration
2377
+ door_infil_cfm = door_info['number_of_doors'] * door_info['door_area_ft2'] * door_infil_flow_rate_cfm_per_ft2
2378
+
2379
+ # Conversion factor
2380
+ conv_fact = OpenStudio.convert(1, 'm^3/s', 'ft^3/min').to_f
2381
+
2382
+ # Adjust the infiltration rate to the average pressure for the prototype buildings.
2383
+ adj_door_infil_cfm = adjust_infiltration_to_prototype_building_conditions(door_infil_cfm)
2384
+ adj_door_infil_m3_per_s = adj_door_infil_cfm / conv_fact
2385
+
2386
+ # Create door infiltration object
2387
+ door_infil_obj = OpenStudio::Model::SpaceInfiltrationDesignFlowRate.new(model)
2388
+ door_infil_obj.setName("#{door_info['number_of_doors']} #{door_info['door_area_ft2']} ft2 #{door_type.downcase} Door Infiltration")
2389
+ door_infil_obj.setSchedule(door_info['schedule'])
2390
+ door_infil_obj.setDesignFlowRate(adj_door_infil_m3_per_s)
2391
+ door_infil_obj.setSpace(model.getSpaceByName(door_info['space']).get)
2392
+ door_infil_obj.setConstantTermCoefficient(0.0)
2393
+ door_infil_obj.setTemperatureTermCoefficient 0.0
2394
+ door_infil_obj.setVelocityTermCoefficient(0.224)
2395
+ door_infil_obj.setVelocitySquaredTermCoefficient(0.0)
2396
+ end
2397
+
2398
+ return true
2399
+ end
2400
+
2401
+ # Set the model's north axis (degrees from true North)
2402
+ #
2403
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
2404
+ # @param north_axis [Float] Degrees from true North
2405
+ # @return [Boolean] Returns true if successful, false otherwise
2406
+ def model_set_building_north_axis(model, north_axis)
2407
+ return false if north_axis.nil?
2408
+
2409
+ building = model.getBuilding
2410
+ building.setNorthAxis(north_axis)
2411
+
2412
+ return true
2413
+ end
2414
+
2415
+ # Calculate a model's window or WWR for a specific orientation
2416
+ # Disregard space conditioning (assume all spaces are conditioned)
2417
+ # which is true for most of not all prototypes
2418
+ #
2419
+ # @param model [OpenStudio::Model::Model] OpenStudio model objetc
2420
+ # @param orientation [String] Orientation: "N", "E", "S", "W"
2421
+ # @return [Boolean] Returns true if successful, false otherwise
2422
+ def model_get_window_area_info_for_orientation(model, orientation, wwr: true)
2423
+ return false unless ['N', 'E', 'S', 'W'].include? orientation
2424
+
2425
+ window_area = 0
2426
+ wall_area = 0
2427
+
2428
+ model.getSpaces.each do |space|
2429
+ # Get zone multiplier
2430
+ multiplier = space.thermalZone.get.multiplier
2431
+
2432
+ space.surfaces.each do |surface|
2433
+ next if surface.surfaceType != 'Wall'
2434
+ next if surface.outsideBoundaryCondition != 'Outdoors'
2435
+
2436
+ case orientation
2437
+ when 'N'
2438
+ next unless surface_cardinal_direction(surface) == 'N'
2439
+ when 'E'
2440
+ next unless surface_cardinal_direction(surface) == 'E'
2441
+ when 'S'
2442
+ next unless surface_cardinal_direction(surface) == 'S'
2443
+ when 'W'
2444
+ next unless surface_cardinal_direction(surface) == 'W'
2445
+ end
2446
+
2447
+ # Get wall and window area
2448
+ wall_area += surface.grossArea * multiplier
2449
+ surface.subSurfaces.each do |subsurface|
2450
+ subsurface_type = subsurface.subSurfaceType.to_s.downcase
2451
+ # Do not count doors
2452
+ next unless (subsurface_type.include? 'window') || (subsurface_type.include? 'glass')
2453
+
2454
+ window_area += subsurface.grossArea * subsurface.multiplier * multiplier
2455
+ end
2456
+ end
2457
+ end
2458
+
2459
+ if wwr
2460
+ return window_area / wall_area
2461
+ else
2462
+ window_area
2463
+ end
2464
+ end
2465
+
2466
+ # Adjust model to comply with fenestration orientation
2467
+ #
2468
+ # @param [OpenStudio::Model::Model] OpenStudio model object
2469
+ # @return [Boolean] Returns true if successful, false otherwise
2470
+ def model_fenestration_orientation(model, climate_zone)
2471
+ return true
2472
+ end
2473
+
2474
+ # Is transfer air required?
2475
+ #
2476
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
2477
+ # @return [Boolean] true if transfer air is required, false otherwise
2478
+ def model_transfer_air_required?(model)
2479
+ return false
2480
+ end
2481
+
2482
+ # List transfer air target and source zones, and air flow (cfm)
2483
+ #
2484
+ # code_sections [90.1-2019_6.5.7.1], [90.1-2016_6.5.7.1]
2485
+ # @return [Hash] target zones (key) and source zones (value) and air flow (value)
2486
+ def model_transfer_air_target_and_source_zones(model)
2487
+ model_transfer_air_target_and_source_zones_hash = {}
2488
+
2489
+ return model_transfer_air_target_and_source_zones_hash
2490
+ end
2491
+
2492
+ # Add transfer to prototype for spaces that require it
2493
+ #
2494
+ # @param model [OpenStudio::Model::Model] OpenStudio model object
2495
+ # @return [Boolean] true if successful, false otherwise
2496
+ def model_add_transfer_air(model)
2497
+ # Do not add transfer air if not required
2498
+ return true unless model_transfer_air_required?(model)
2499
+
2500
+ # Get target and source zones
2501
+ target_and_source_zones = model_transfer_air_target_and_source_zones(model)
2502
+ return true if target_and_source_zones.empty?
2503
+
2504
+ model.getFanZoneExhausts.sort.each do |exhaust_fan|
2505
+ # Target zone (zone with exhaust fan)
2506
+ target_zone = exhaust_fan.thermalZone.get
2507
+
2508
+ # Get zone name of an exhaust fan
2509
+ exhaust_fan_zone_name = target_zone.name.to_s
2510
+
2511
+ # Go to next exhaust fan if this zone isn't using transfer air
2512
+ next unless target_and_source_zones.keys.include? exhaust_fan_zone_name
2513
+
2514
+ # Add dummy exhaust fan in source zone
2515
+ source_zone_name, transfer_air_flow_cfm = target_and_source_zones[exhaust_fan_zone_name]
2516
+ source_zone = model.getThermalZoneByName(source_zone_name).get
2517
+ transfer_air_source_zone_exhaust_fan = OpenStudio::Model::FanZoneExhaust.new(model)
2518
+ transfer_air_source_zone_exhaust_fan.setName(source_zone.name.to_s + ' Dummy Transfer Air (Source) Fan')
2519
+ transfer_air_source_zone_exhaust_fan.setAvailabilitySchedule(exhaust_fan.availabilitySchedule.get)
2520
+ # Convert transfer air flow to m3/s
2521
+ transfer_air_flow_m3s = OpenStudio.convert(transfer_air_flow_cfm, 'cfm', 'm^3/s').get
2522
+ transfer_air_source_zone_exhaust_fan.setMaximumFlowRate(transfer_air_flow_m3s)
2523
+ transfer_air_source_zone_exhaust_fan.setFanEfficiency(1.0)
2524
+ transfer_air_source_zone_exhaust_fan.setPressureRise(0.0)
2525
+ transfer_air_source_zone_exhaust_fan.addToThermalZone(source_zone)
2526
+
2527
+ # Set exhaust fan balanced air flow schedule to only consider the transfer air to be balanced air flow
2528
+ balanced_air_flow_schedule = exhaust_fan.availabilitySchedule.get.clone(model).to_ScheduleRuleset.get
2529
+ balanced_air_flow_schedule.setName("#{exhaust_fan_zone_name} Exhaust Fan Balanced Air Flow Schedule")
2530
+ model_multiply_schedule(model, balanced_air_flow_schedule.defaultDaySchedule, transfer_air_flow_m3s / exhaust_fan.maximumFlowRate.get, 0)
2531
+ balanced_air_flow_schedule.scheduleRules.each do |sch_rule|
2532
+ model_multiply_schedule(model, sch_rule.daySchedule, transfer_air_flow_m3s / exhaust_fan.maximumFlowRate.get, 0)
2533
+ end
2534
+ transfer_air_source_zone_exhaust_fan.setBalancedExhaustFractionSchedule(balanced_air_flow_schedule)
2535
+
2536
+ # Modify design specification OA to take into account transfer air for sizing only
2537
+ # OA is zero'd out for other days
2538
+ target_zone.spaces.sort.each do |space|
2539
+ target_zone_ventilation = space.designSpecificationOutdoorAir.get
2540
+ target_zone_ventilation.setOutdoorAirFlowperPerson(0)
2541
+ target_zone_ventilation.setOutdoorAirFlowperFloorArea(0)
2542
+ target_zone_ventilation.setOutdoorAirFlowRate(exhaust_fan.maximumFlowRate.get - transfer_air_flow_m3s)
2543
+ target_zone_ventilation.setOutdoorAirFlowRateFractionSchedule(model_add_schedule(model, 'DesignDaysOnly'))
2544
+ end
2545
+ end
2546
+
2547
+ return true
2548
+ end
2164
2549
  end