openstudio-standards 0.2.16.rc2 → 0.2.17.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (189) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +117 -117
  3. data/data/standards/manage_OpenStudio_Standards.rb +31 -4
  4. data/data/standards/test_performance_expected_dd_results.csv +287 -287
  5. data/lib/openstudio-standards/btap/geometry.rb +1 -1
  6. data/lib/openstudio-standards/hvac_sizing/Siz.HeatingCoolingFuels.rb +354 -2
  7. data/lib/openstudio-standards/hvac_sizing/Siz.ThermalZone.rb +79 -0
  8. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.College.rb +1 -1
  9. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Laboratory.rb +1 -1
  10. data/lib/openstudio-standards/prototypes/common/do_not_edit_metaclasses.rb +3376 -63
  11. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +12 -0
  12. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +3 -4
  13. data/lib/openstudio-standards/prototypes/common/objects/Prototype.SizingSystem.rb +1 -1
  14. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +168 -93
  15. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +2 -4
  16. data/lib/openstudio-standards/prototypes/common/prototype_metaprogramming.rb +2 -1
  17. data/lib/openstudio-standards/refs/references.rb +3 -0
  18. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +279 -6
  19. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctParallelPIUReheat.rb +50 -2
  20. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +4 -0
  21. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -1
  22. data/lib/openstudio-standards/standards/Standards.Construction.rb +185 -3
  23. data/lib/openstudio-standards/standards/Standards.Fan.rb +14 -6
  24. data/lib/openstudio-standards/standards/Standards.HeatExchangerSensLat.rb +1 -0
  25. data/lib/openstudio-standards/standards/Standards.Model.rb +1752 -384
  26. data/lib/openstudio-standards/standards/Standards.PlanarSurface.rb +130 -9
  27. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +50 -3
  28. data/lib/openstudio-standards/standards/Standards.ScheduleCompact.rb +44 -0
  29. data/lib/openstudio-standards/standards/Standards.ScheduleConstant.rb +27 -0
  30. data/lib/openstudio-standards/standards/Standards.ScheduleRuleset.rb +543 -0
  31. data/lib/openstudio-standards/standards/Standards.Space.rb +665 -15
  32. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +141 -4
  33. data/lib/openstudio-standards/standards/Standards.SubSurface.rb +2 -1
  34. data/lib/openstudio-standards/standards/Standards.Surface.rb +117 -0
  35. data/lib/openstudio-standards/standards/Standards.ThermalZone.rb +197 -49
  36. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +41 -0
  37. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.Model.rb +6 -8
  38. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/ashrae_90_1.schedules.json +45 -45
  39. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/comstock_ashrae_90_1_2004/data/comstock_ashrae_90_1_2004.spc_typ.json +7 -7
  40. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +19 -19
  41. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/ashrae_90_1.schedules.json +45 -45
  42. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/comstock_ashrae_90_1_2007/data/comstock_ashrae_90_1_2007.spc_typ.json +7 -7
  43. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +5 -5
  44. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/ashrae_90_1.schedules.json +45 -45
  45. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/comstock_ashrae_90_1_2010/data/comstock_ashrae_90_1_2010.spc_typ.json +9 -9
  46. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +3 -3
  47. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/ashrae_90_1.schedules.json +45 -45
  48. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/comstock_ashrae_90_1_2013/data/comstock_ashrae_90_1_2013.spc_typ.json +4 -4
  49. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +6 -6
  50. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/ashrae_90_1.schedules.json +45 -45
  51. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/comstock_ashrae_90_1_2016/data/comstock_ashrae_90_1_2016.spc_typ.json +5 -5
  52. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +6 -6
  53. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +5 -5
  54. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/ashrae_90_1.schedules.json +45 -45
  55. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/comstock_ashrae_90_1_2019/data/comstock_ashrae_90_1_2019.spc_typ.json +5 -5
  56. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +6 -6
  57. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.constructions.json +2 -2
  58. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.fans.json +12 -0
  59. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/ashrae_90_1.schedules.json +45 -45
  60. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/comstock_doe_ref_1980_2004/data/comstock_doe_ref_1980_2004.spc_typ.json +10 -10
  61. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/ashrae_90_1.schedules.json +45 -45
  62. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/comstock_doe_ref_pre_1980/data/comstock_doe_ref_pre_1980.spc_typ.json +10 -10
  63. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirLoopHVAC.rb +1 -0
  64. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +792 -0
  65. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctParallelPIUReheat.rb +10 -0
  66. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirTerminalSingleDuctVAVReheat.rb +31 -0
  67. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.BoilerHotWater.rb +91 -0
  68. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +84 -0
  69. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +145 -0
  70. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +106 -0
  71. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +71 -0
  72. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +194 -0
  73. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +120 -0
  74. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTower.rb +110 -0
  75. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoolingTowerVariableSpeed.rb +5 -0
  76. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Fan.rb +73 -0
  77. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +5 -0
  78. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +5 -0
  79. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanVariableVolume.rb +24 -0
  80. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +5 -0
  81. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.HeatExchangerSensLat.rb +55 -0
  82. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +3045 -0
  83. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlanarSurface.rb +187 -0
  84. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +450 -0
  85. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Space.rb +106 -0
  86. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +666 -0
  87. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Surface.rb +54 -0
  88. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ThermalZone.rb +168 -0
  89. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ZoneHVACComponent.rb +132 -0
  90. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.rb +239 -0
  91. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +176 -0
  92. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.rb +25 -0
  93. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.boilers.json +52 -0
  94. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.chillers.json +112 -0
  95. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.climate_zone_sets.json +210 -0
  96. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_properties.json +10384 -0
  97. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.construction_sets.json +133 -0
  98. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.furnaces.json +43 -0
  99. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +119 -0
  100. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +130 -0
  101. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_rejection.json +13 -0
  102. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.lpd_space_type.json +568 -0
  103. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.motors.json +264 -0
  104. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_baseline_hvac.json +439 -0
  105. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_constructions.json +685 -0
  106. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_economizers.json +213 -0
  107. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_ext_ltg.json +32 -0
  108. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_heat_type.json +136 -0
  109. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_hvac_bldg_type.json +32 -0
  110. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_interior_lighting.json +1837 -0
  111. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_swh_bldg_type.json +184 -0
  112. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.prm_wwr_bldg_type.json +84 -0
  113. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.unitary_acs.json +148 -0
  114. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +157 -0
  115. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.climate_zone_sets.json +210 -0
  116. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +18329 -0
  117. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +340 -0
  118. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.materials.json +49924 -0
  119. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/baseline_building_rotation_exception.md +44 -0
  120. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/check_pump_power_and_control.md +71 -0
  121. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/dcv.md +68 -0
  122. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/dcv_implementation.png +0 -0
  123. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/elevators.md +14 -0
  124. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/exhaust_air_energy_recovery.md +36 -0
  125. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/f_c_factors.md +19 -0
  126. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/fan_power_credits.md +15 -0
  127. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/preheat_coil.md +59 -0
  128. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/pump_power_control.md +46 -0
  129. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/return_air_type.md +31 -0
  130. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_baseline_wwr.md +191 -0
  131. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_hw_and_chw_supply_water_temp_reset_control.md +24 -0
  132. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_num_boilers_chillers_towers.md +49 -0
  133. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_plug_load_measures.md +80 -0
  134. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/set_space_lpd.md +73 -0
  135. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/unenclosed_and_unconditioned_spaces.md +11 -0
  136. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/unmet_load_hours.md +20 -0
  137. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/vav_parallel_piu_terminals_fan_control.md +23 -0
  138. data/lib/openstudio-standards/standards/ashrae_90_1_prm/docs/vav_terminals_min_flow_setpoint.md +21 -0
  139. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_airloop_hvac.csv +1 -0
  140. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_airloop_hvac_doas.csv +1 -0
  141. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_building.csv +1 -0
  142. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_design_specification_outdoor_air.csv +1 -0
  143. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_electric_equipment.csv +1 -0
  144. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_exterior_lights.csv +1 -0
  145. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_gas_equipment.csv +1 -0
  146. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_lights.csv +1 -0
  147. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_space.csv +1 -0
  148. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_spacetype.csv +1 -0
  149. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_thermal_zone.csv +1 -0
  150. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_connections.csv +1 -0
  151. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_equipment.csv +1 -0
  152. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_wateruse_equipment_definition.csv +1 -0
  153. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_zone_hvac.csv +1 -0
  154. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_zone_infiltration.csv +1 -0
  155. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +12 -0
  156. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +12 -0
  157. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps.json +1 -1
  158. data/lib/openstudio-standards/standards/necb/ECMS/data/heat_pumps_heating.json +1 -1
  159. data/lib/openstudio-standards/standards/necb/ECMS/data/unitary_acs.json +24 -11
  160. data/lib/openstudio-standards/standards/necb/ECMS/erv.rb +13 -15
  161. data/lib/openstudio-standards/standards/necb/NECB2011/data/province_map.json +17 -0
  162. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +1 -1
  163. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +1 -1
  164. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +2 -2
  165. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +6 -5
  166. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +3 -2
  167. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +2 -3
  168. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +2 -2
  169. data/lib/openstudio-standards/standards/necb/NECB2020/data/space_types.json +33 -924
  170. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +15 -15
  171. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +135 -29
  172. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +16 -4
  173. data/lib/openstudio-standards/standards/necb/common/neb_end_use_prices.csv +40 -42
  174. data/lib/openstudio-standards/standards/necb/common/necb_reference_runs.csv +1 -1
  175. data/lib/openstudio-standards/standards/necb/common/space_type_upgrade_map.json +89 -89
  176. data/lib/openstudio-standards/utilities/array.rb +11 -0
  177. data/lib/openstudio-standards/utilities/logging.rb +48 -0
  178. data/lib/openstudio-standards/utilities/object_info.rb +20 -0
  179. data/lib/openstudio-standards/utilities/schedule_translator.rb +348 -0
  180. data/lib/openstudio-standards/utilities/sqlfile.rb +68 -0
  181. data/lib/openstudio-standards/version.rb +2 -2
  182. data/lib/openstudio-standards/weather/Weather.Model.rb +42 -55
  183. data/lib/openstudio-standards/weather/Weather.stat_file.rb +1 -1
  184. data/lib/openstudio-standards.rb +35 -1
  185. metadata +111 -6
  186. data/data/standards/OpenStudio_Standards-ashrae_90_1.xlsx +0 -0
  187. data/data/standards/OpenStudio_Standards-ashrae_90_1_28Jan2022.xlsx +0 -0
  188. data/data/standards/OpenStudio_Standards-ashrae_90_1_28_Jan2022_2.xlsx +0 -0
  189. data/data/standards/openstudio_standards_duplicates_log.csv +0 -143
@@ -174,6 +174,7 @@ module PrototypeFan
174
174
  motor_in_airstream_fraction: motor_in_airstream_fraction,
175
175
  end_use_subcategory: end_use_subcategory)
176
176
  elsif fan_json['type'] == 'VariableVolume'
177
+ fan_power_coefficient_1, fan_power_coefficient_2, fan_power_coefficient_3, fan_power_coefficient_4, fan_power_coefficient_5 = lookup_fan_curve_coefficients_from_json(fan_json['fan_curve']) if fan_json['fan_curve']
177
178
  create_fan_variable_volume_from_json(model,
178
179
  fan_json,
179
180
  fan_name: fan_name,
@@ -199,4 +200,15 @@ module PrototypeFan
199
200
  end_use_subcategory: end_use_subcategory)
200
201
  end
201
202
  end
203
+
204
+ # Lookup fan curve coefficients
205
+ #
206
+ # @param fan_curve [String] name of the fan curve
207
+ # @return [Array] an array of fan curve coefficients
208
+ def lookup_fan_curve_coefficients_from_json(fan_curve)
209
+ search_criteria = {}
210
+ search_criteria['name'] = fan_curve
211
+ fan_curve = model_find_object(@standards_data['curves'], search_criteria)
212
+ return [fan_curve['coeff_1'], fan_curve['coeff_2'], fan_curve['coeff_3'], fan_curve['coeff_4'], fan_curve['coeff_5']]
213
+ end
202
214
  end
@@ -597,7 +597,7 @@ Standard.class_eval do
597
597
  next unless surface.surfaceType == 'Wall'
598
598
 
599
599
  boundary_condition = surface.outsideBoundaryCondition
600
- next unless boundary_condition == 'OtherSideCoefficients' || boundary_condition == 'Ground'
600
+ next unless boundary_condition == 'OtherSideCoefficients' || boundary_condition.to_s.downcase.include?('ground')
601
601
 
602
602
  # calculate wall height as difference of maximum and minimum z values, assuming square, vertical walls
603
603
  z_values = []
@@ -677,7 +677,7 @@ Standard.class_eval do
677
677
 
678
678
  # Find space's floors
679
679
  space.surfaces.each do |surface|
680
- if surface.surfaceType == 'Floor' && surface.outsideBoundaryCondition == 'Ground'
680
+ if surface.surfaceType == 'Floor' && surface.outsideBoundaryCondition.to_s.downcase.include?('ground')
681
681
  floors << surface
682
682
  end
683
683
  end
@@ -1794,7 +1794,7 @@ Standard.class_eval do
1794
1794
  #
1795
1795
  # @param model [OpenStudio::Model::Model] the model
1796
1796
  def model_apply_prototype_hvac_efficiency_adjustments(model)
1797
- building_data = model_get_building_climate_zone_and_building_type(model)
1797
+ building_data = model_get_building_properties(model)
1798
1798
  building_type = building_data['building_type']
1799
1799
  climate_zone = building_data['climate_zone']
1800
1800
 
@@ -2700,7 +2700,6 @@ Standard.class_eval do
2700
2700
  # @param wwr [Boolean]
2701
2701
  # @return [Numeric] Returns window to wall ratio (percentage) or window area.
2702
2702
  def model_get_window_area_info(model, wwr = true)
2703
-
2704
2703
  window_area = 0
2705
2704
  wall_area = 0
2706
2705
 
@@ -62,7 +62,7 @@ class Standard
62
62
  air_loop_hvac.thermalZones.sort.each do |zone|
63
63
  sizing_zone = zone.sizingZone
64
64
  if air_loop_hvac.model.version < OpenStudio::VersionString.new('3.0.0')
65
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.prototype.SizingSystem', "The design minimum zone ventilation efficiency cannot be set for #{sizing_system.name.to_s}. It can only be set OpenStudio 3.0.0 and later.")
65
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.prototype.SizingSystem', "The design minimum zone ventilation efficiency cannot be set for #{sizing_system.name}. It can only be set OpenStudio 3.0.0 and later.")
66
66
  else
67
67
  sizing_zone.setDesignMinimumZoneVentilationEfficiency(0.6)
68
68
  end
@@ -226,32 +226,12 @@ class Standard
226
226
  chilled_water_loop.setName(system_name)
227
227
  end
228
228
 
229
- # chilled water loop sizing and controls
230
229
  if dsgn_sup_wtr_temp.nil?
231
- dsgn_sup_wtr_temp = 44.0
232
- dsgn_sup_wtr_temp_c = OpenStudio.convert(dsgn_sup_wtr_temp, 'F', 'C').get
233
- else
234
- dsgn_sup_wtr_temp_c = OpenStudio.convert(dsgn_sup_wtr_temp, 'F', 'C').get
235
- end
236
- if dsgn_sup_wtr_temp_delt.nil?
237
- dsgn_sup_wtr_temp_delt_k = OpenStudio.convert(10.1, 'R', 'K').get
238
- else
239
- dsgn_sup_wtr_temp_delt_k = OpenStudio.convert(dsgn_sup_wtr_temp_delt, 'R', 'K').get
230
+ dsgn_sup_wtr_temp = 44
240
231
  end
241
- chilled_water_loop.setMinimumLoopTemperature(1.0)
242
- chilled_water_loop.setMaximumLoopTemperature(40.0)
243
- sizing_plant = chilled_water_loop.sizingPlant
244
- sizing_plant.setLoopType('Cooling')
245
- sizing_plant.setDesignLoopExitTemperature(dsgn_sup_wtr_temp_c)
246
- sizing_plant.setLoopDesignTemperatureDifference(dsgn_sup_wtr_temp_delt_k)
247
- chw_temp_sch = model_add_constant_schedule_ruleset(model,
248
- dsgn_sup_wtr_temp_c,
249
- name = "#{chilled_water_loop.name} Temp - #{dsgn_sup_wtr_temp.round(0)}F")
250
- chw_stpt_manager = OpenStudio::Model::SetpointManagerScheduled.new(model, chw_temp_sch)
251
- chw_stpt_manager.setName("#{chilled_water_loop.name} Setpoint Manager")
252
- chw_stpt_manager.addToNode(chilled_water_loop.supplyOutletNode)
253
- # @todo Yixing check the CHW Setpoint from standards
254
- # @todo Should be a OutdoorAirReset, see the changes I've made in Standards.PlantLoop.apply_prm_baseline_temperatures
232
+
233
+ # chilled water loop sizing and controls
234
+ chw_sizing_control(model, chilled_water_loop, dsgn_sup_wtr_temp, dsgn_sup_wtr_temp_delt)
255
235
 
256
236
  # create chilled water pumps
257
237
  if chw_pumping_type == 'const_pri'
@@ -269,28 +249,86 @@ class Standard
269
249
  pri_chw_pump.setPumpControlType('Intermittent')
270
250
  pri_chw_pump.addToNode(chilled_water_loop.supplyInletNode)
271
251
  elsif chw_pumping_type == 'const_pri_var_sec'
272
- # primary chilled water pump
273
- pri_chw_pump = OpenStudio::Model::PumpConstantSpeed.new(model)
274
- pri_chw_pump.setName("#{chilled_water_loop.name} Primary Pump")
275
- pri_chw_pump.setRatedPumpHead(OpenStudio.convert(15.0, 'ftH_{2}O', 'Pa').get)
276
- pri_chw_pump.setMotorEfficiency(0.9)
277
- pri_chw_pump.setPumpControlType('Intermittent')
278
- pri_chw_pump.addToNode(chilled_water_loop.supplyInletNode)
279
- # secondary chilled water pump
280
- sec_chw_pump = OpenStudio::Model::PumpVariableSpeed.new(model)
281
- sec_chw_pump.setName("#{chilled_water_loop.name} Secondary Pump")
282
- sec_chw_pump.setRatedPumpHead(OpenStudio.convert(45.0, 'ftH_{2}O', 'Pa').get)
283
- sec_chw_pump.setMotorEfficiency(0.9)
284
- # curve makes it perform like variable speed pump
285
- sec_chw_pump.setFractionofMotorInefficienciestoFluidStream(0)
286
- sec_chw_pump.setCoefficient1ofthePartLoadPerformanceCurve(0)
287
- sec_chw_pump.setCoefficient2ofthePartLoadPerformanceCurve(0.0205)
288
- sec_chw_pump.setCoefficient3ofthePartLoadPerformanceCurve(0.4101)
289
- sec_chw_pump.setCoefficient4ofthePartLoadPerformanceCurve(0.5753)
290
- sec_chw_pump.setPumpControlType('Intermittent')
291
- sec_chw_pump.addToNode(chilled_water_loop.demandInletNode)
292
- # Change the chilled water loop to have a two-way common pipes
293
- chilled_water_loop.setCommonPipeSimulation('CommonPipe')
252
+ pri_sec_config = plant_loop_set_chw_pri_sec_configuration(model)
253
+
254
+ if pri_sec_config == 'common_pipe'
255
+ # primary chilled water pump
256
+ pri_chw_pump = OpenStudio::Model::PumpConstantSpeed.new(model)
257
+ pri_chw_pump.setName("#{chilled_water_loop.name} Primary Pump")
258
+ pri_chw_pump.setRatedPumpHead(OpenStudio.convert(15.0, 'ftH_{2}O', 'Pa').get)
259
+ pri_chw_pump.setMotorEfficiency(0.9)
260
+ pri_chw_pump.setPumpControlType('Intermittent')
261
+ pri_chw_pump.addToNode(chilled_water_loop.supplyInletNode)
262
+ # secondary chilled water pump
263
+ sec_chw_pump = OpenStudio::Model::PumpVariableSpeed.new(model)
264
+ sec_chw_pump.setName("#{chilled_water_loop.name} Secondary Pump")
265
+ sec_chw_pump.setRatedPumpHead(OpenStudio.convert(45.0, 'ftH_{2}O', 'Pa').get)
266
+ sec_chw_pump.setMotorEfficiency(0.9)
267
+ # curve makes it perform like variable speed pump
268
+ sec_chw_pump.setFractionofMotorInefficienciestoFluidStream(0)
269
+ sec_chw_pump.setCoefficient1ofthePartLoadPerformanceCurve(0)
270
+ sec_chw_pump.setCoefficient2ofthePartLoadPerformanceCurve(0.0205)
271
+ sec_chw_pump.setCoefficient3ofthePartLoadPerformanceCurve(0.4101)
272
+ sec_chw_pump.setCoefficient4ofthePartLoadPerformanceCurve(0.5753)
273
+ sec_chw_pump.setPumpControlType('Intermittent')
274
+ sec_chw_pump.addToNode(chilled_water_loop.demandInletNode)
275
+ # Change the chilled water loop to have a two-way common pipes
276
+ chilled_water_loop.setCommonPipeSimulation('CommonPipe')
277
+ elsif pri_sec_config == 'heat_exchanger'
278
+ # NOTE: PRECONDITIONING for `const_pri_var_sec` pump type is only applicable for PRM routine and only applies to System Type 7 and System Type 8
279
+ # See: model_add_prm_baseline_system under Model object.
280
+ # In this scenario, we will need to create a primary and secondary configuration:
281
+ # chilled_water_loop is the primary loop
282
+ # Primary: demand: heat exchanger, supply: chillers, name: Chilled Water Loop_Primary, additionalProperty: secondary_loop_name
283
+ # Secondary: demand: Coils, supply: heat exchanger, name: Chilled Water Loop, additionalProperty: is_secondary_loop
284
+ secondary_chilled_water_loop = OpenStudio::Model::PlantLoop.new(model)
285
+ secondary_loop_name = system_name.nil? ? 'Chilled Water Loop' : system_name
286
+ # Reset primary loop name
287
+ chilled_water_loop.setName("#{secondary_loop_name}_Primary")
288
+ secondary_chilled_water_loop.setName(secondary_loop_name)
289
+ chw_sizing_control(model, secondary_chilled_water_loop, dsgn_sup_wtr_temp, dsgn_sup_wtr_temp_delt)
290
+ chilled_water_loop.additionalProperties.setFeature('is_primary_loop', true)
291
+ secondary_chilled_water_loop.additionalProperties.setFeature('is_secondary_loop', true)
292
+ # primary chilled water pump
293
+ # Add Constant pump, in plant loop, the number of chiller adjustment will assign pump to each chiller
294
+ pri_chw_pump = OpenStudio::Model::PumpConstantSpeed.new(model)
295
+ pri_chw_pump.setName("#{chilled_water_loop.name} Primary Pump")
296
+ # Will need to adjust the pump power after a sizing run
297
+ pri_chw_pump.setRatedPumpHead(OpenStudio.convert(15.0, 'ftH_{2}O', 'Pa').get / num_chillers)
298
+ pri_chw_pump.setMotorEfficiency(0.9)
299
+ pri_chw_pump.setPumpControlType('Intermittent')
300
+ # chiller_inlet_node = chiller.connectedObject(chiller.supplyInletPort).get.to_Node.get
301
+ pri_chw_pump.addToNode(chilled_water_loop.supplyInletNode)
302
+
303
+ # secondary chilled water pump
304
+ sec_chw_pump = OpenStudio::Model::PumpVariableSpeed.new(model)
305
+ sec_chw_pump.setName("#{secondary_chilled_water_loop.name} Pump")
306
+ sec_chw_pump.setRatedPumpHead(OpenStudio.convert(45.0, 'ftH_{2}O', 'Pa').get)
307
+ sec_chw_pump.setMotorEfficiency(0.9)
308
+ # curve makes it perform like variable speed pump
309
+ sec_chw_pump.setFractionofMotorInefficienciestoFluidStream(0)
310
+ sec_chw_pump.setCoefficient1ofthePartLoadPerformanceCurve(0)
311
+ sec_chw_pump.setCoefficient2ofthePartLoadPerformanceCurve(0.0205)
312
+ sec_chw_pump.setCoefficient3ofthePartLoadPerformanceCurve(0.4101)
313
+ sec_chw_pump.setCoefficient4ofthePartLoadPerformanceCurve(0.5753)
314
+ sec_chw_pump.setPumpControlType('Intermittent')
315
+ sec_chw_pump.addToNode(secondary_chilled_water_loop.demandInletNode)
316
+
317
+ # Add HX to connect secondary and primary loop
318
+ heat_exchanger = OpenStudio::Model::HeatExchangerFluidToFluid.new(model)
319
+ secondary_chilled_water_loop.addSupplyBranchForComponent(heat_exchanger)
320
+ chilled_water_loop.addDemandBranchForComponent(heat_exchanger)
321
+
322
+ # Clean up connections
323
+ hx_bypass_pipe = OpenStudio::Model::PipeAdiabatic.new(model)
324
+ hx_bypass_pipe.setName("#{secondary_chilled_water_loop.name} HX Bypass")
325
+ secondary_chilled_water_loop.addSupplyBranchForComponent(hx_bypass_pipe)
326
+ outlet_pipe = OpenStudio::Model::PipeAdiabatic.new(model)
327
+ outlet_pipe.setName("#{secondary_chilled_water_loop.name} Supply Outlet")
328
+ outlet_pipe.addToNode(secondary_chilled_water_loop.supplyOutletNode)
329
+ else
330
+ OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', 'No primary/secondary configuration specified for the chilled water loop.')
331
+ end
294
332
  else
295
333
  OpenStudio.logFree(OpenStudio::Error, 'openstudio.Model.Model', 'No pumping type specified for the chilled water loop.')
296
334
  end
@@ -322,6 +360,7 @@ class Standard
322
360
  chiller = OpenStudio::Model::ChillerElectricEIR.new(model)
323
361
  chiller.setName("#{template} #{chiller_cooling_type} #{chiller_condenser_type} #{chiller_compressor_type} Chiller #{i}")
324
362
  chilled_water_loop.addSupplyBranchForComponent(chiller)
363
+ dsgn_sup_wtr_temp_c = OpenStudio.convert(dsgn_sup_wtr_temp, 'F', 'C').get
325
364
  chiller.setReferenceLeavingChilledWaterTemperature(dsgn_sup_wtr_temp_c)
326
365
  chiller.setLeavingChilledWaterLowerTemperatureLimit(OpenStudio.convert(36.0, 'F', 'C').get)
327
366
  chiller.setReferenceEnteringCondenserFluidTemperature(OpenStudio.convert(95.0, 'F', 'C').get)
@@ -1660,25 +1699,28 @@ class Standard
1660
1699
  # create heating coil
1661
1700
  if hot_water_loop.nil?
1662
1701
  if heating_type == 'Electricity'
1663
- create_coil_heating_electric(model,
1664
- air_loop_node: air_loop.supplyInletNode,
1665
- name: "#{air_loop.name} Main Electric Htg Coil")
1702
+ htg_coil = create_coil_heating_electric(model,
1703
+ air_loop_node: air_loop.supplyInletNode,
1704
+ name: "#{air_loop.name} Main Electric Htg Coil")
1666
1705
  else # default to NaturalGas
1667
- create_coil_heating_gas(model,
1668
- air_loop_node: air_loop.supplyInletNode,
1669
- name: "#{air_loop.name} Main Gas Htg Coil")
1706
+ htg_coil = create_coil_heating_gas(model,
1707
+ air_loop_node: air_loop.supplyInletNode,
1708
+ name: "#{air_loop.name} Main Gas Htg Coil")
1670
1709
  end
1671
1710
  else
1672
- create_coil_heating_water(model,
1673
- hot_water_loop,
1674
- air_loop_node: air_loop.supplyInletNode,
1675
- name: "#{air_loop.name} Main Htg Coil",
1676
- rated_inlet_water_temperature: hw_temp_c,
1677
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
1678
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
1679
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
1711
+ htg_coil = create_coil_heating_water(model,
1712
+ hot_water_loop,
1713
+ air_loop_node: air_loop.supplyInletNode,
1714
+ name: "#{air_loop.name} Main Htg Coil",
1715
+ rated_inlet_water_temperature: hw_temp_c,
1716
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
1717
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
1718
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
1680
1719
  end
1681
1720
 
1721
+ # set the setpointmanager for the central/preheat coil if required
1722
+ model_set_central_preheat_coil_spm(model, thermal_zones, htg_coil)
1723
+
1682
1724
  # create cooling coil
1683
1725
  if chilled_water_loop.nil?
1684
1726
  create_coil_cooling_dx_two_speed(model,
@@ -1874,9 +1916,12 @@ class Standard
1874
1916
  fan.addToNode(air_loop.supplyInletNode)
1875
1917
 
1876
1918
  # create heating coil
1877
- create_coil_heating_electric(model,
1878
- air_loop_node: air_loop.supplyInletNode,
1879
- name: "#{air_loop.name} Htg Coil")
1919
+ htg_coil = create_coil_heating_electric(model,
1920
+ air_loop_node: air_loop.supplyInletNode,
1921
+ name: "#{air_loop.name} Htg Coil")
1922
+
1923
+ # set the setpointmanager for the central/preheat coil if required
1924
+ model_set_central_preheat_coil_spm(model, thermal_zones, htg_coil)
1880
1925
 
1881
1926
  # create cooling coil
1882
1927
  create_coil_cooling_water(model,
@@ -2018,25 +2063,27 @@ class Standard
2018
2063
  # create heating coil
2019
2064
  if hot_water_loop.nil?
2020
2065
  if heating_type == 'Electricity'
2021
- create_coil_heating_electric(model,
2022
- air_loop_node: air_loop.supplyInletNode,
2023
- name: "#{air_loop.name} Main Electric Htg Coil")
2066
+ htg_coil = create_coil_heating_electric(model,
2067
+ air_loop_node: air_loop.supplyInletNode,
2068
+ name: "#{air_loop.name} Main Electric Htg Coil")
2024
2069
  else # default to NaturalGas
2025
- create_coil_heating_gas(model,
2026
- air_loop_node: air_loop.supplyInletNode,
2027
- name: "#{air_loop.name} Main Gas Htg Coil")
2070
+ htg_coil = create_coil_heating_gas(model,
2071
+ air_loop_node: air_loop.supplyInletNode,
2072
+ name: "#{air_loop.name} Main Gas Htg Coil")
2028
2073
  end
2029
2074
  else
2030
- create_coil_heating_water(model,
2031
- hot_water_loop,
2032
- air_loop_node: air_loop.supplyInletNode,
2033
- name: "#{air_loop.name} Main Htg Coil",
2034
- rated_inlet_water_temperature: hw_temp_c,
2035
- rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2036
- rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2037
- rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2075
+ htg_coil = create_coil_heating_water(model, hot_water_loop,
2076
+ air_loop_node: air_loop.supplyInletNode,
2077
+ name: "#{air_loop.name} Main Htg Coil",
2078
+ rated_inlet_water_temperature: hw_temp_c,
2079
+ rated_outlet_water_temperature: (hw_temp_c - hw_delta_t_k),
2080
+ rated_inlet_air_temperature: dsgn_temps['prehtg_dsgn_sup_air_temp_c'],
2081
+ rated_outlet_air_temperature: dsgn_temps['htg_dsgn_sup_air_temp_c'])
2038
2082
  end
2039
2083
 
2084
+ # set the setpointmanager for the central/preheat coil if required
2085
+ model_set_central_preheat_coil_spm(model, thermal_zones, htg_coil)
2086
+
2040
2087
  # create cooling coil
2041
2088
  if chilled_water_loop.nil?
2042
2089
  create_coil_cooling_dx_two_speed(model,
@@ -2194,9 +2241,12 @@ class Standard
2194
2241
  fan.addToNode(air_loop.supplyInletNode)
2195
2242
 
2196
2243
  # create heating coil
2197
- create_coil_heating_electric(model,
2198
- air_loop_node: air_loop.supplyInletNode,
2199
- name: "#{air_loop.name} Main Htg Coil")
2244
+ htg_coil = create_coil_heating_electric(model,
2245
+ air_loop_node: air_loop.supplyInletNode,
2246
+ name: "#{air_loop.name} Main Htg Coil")
2247
+
2248
+ # set the setpointmanager for the central/preheat coil if required
2249
+ model_set_central_preheat_coil_spm(model, thermal_zones, htg_coil)
2200
2250
 
2201
2251
  # create cooling coil
2202
2252
  if chilled_water_loop.nil?
@@ -2710,9 +2760,14 @@ class Standard
2710
2760
  thermal_zones,
2711
2761
  system_name: nil,
2712
2762
  heating_type: nil,
2763
+ cooling_type: 'AirCooled',
2713
2764
  supplemental_heating_type: nil,
2714
2765
  hvac_op_sch: nil,
2715
- oa_damper_sch: nil)
2766
+ fan_type: 'VAV_System_Fan',
2767
+ oa_damper_sch: nil,
2768
+ hot_water_loop: nil,
2769
+ chilled_water_loop: nil,
2770
+ minimum_volume_setpoint: nil)
2716
2771
 
2717
2772
  # hvac operation schedule
2718
2773
  if hvac_op_sch.nil?
@@ -2767,7 +2822,7 @@ class Standard
2767
2822
  # create fan
2768
2823
  # @type [OpenStudio::Model::FanVariableVolume] fan
2769
2824
  fan = create_fan_by_name(model,
2770
- 'VAV_System_Fan',
2825
+ fan_type,
2771
2826
  fan_name: "#{air_loop.name} Fan",
2772
2827
  end_use_subcategory: 'VAV System Fans')
2773
2828
  fan.setAvailabilitySchedule(hvac_op_sch)
@@ -2780,6 +2835,11 @@ class Standard
2780
2835
  when 'Electricity', 'Electric'
2781
2836
  htg_coil = create_coil_heating_electric(model,
2782
2837
  name: "#{air_loop.name} Electric Htg Coil")
2838
+ when 'Water'
2839
+ htg_coil = create_coil_heating_water(model,
2840
+ hot_water_loop,
2841
+ air_loop_node: air_loop.supplyOutletNode,
2842
+ name: "#{air_loop.name} Water Htg Coil")
2783
2843
  else
2784
2844
  # Zero-capacity, always-off electric heating coil
2785
2845
  htg_coil = create_coil_heating_electric(model,
@@ -2805,14 +2865,21 @@ class Standard
2805
2865
  end
2806
2866
 
2807
2867
  # create cooling coil
2808
- clg_coil = OpenStudio::Model::CoilCoolingDXVariableSpeed.new(model)
2809
- clg_coil.setName("#{air_loop.name} Var spd DX AC Clg Coil")
2810
- clg_coil.setBasinHeaterCapacity(10.0)
2811
- clg_coil.setBasinHeaterSetpointTemperature(2.0)
2812
- # first speed level
2813
- clg_spd_1 = OpenStudio::Model::CoilCoolingDXVariableSpeedSpeedData.new(model)
2814
- clg_coil.addSpeed(clg_spd_1)
2815
- clg_coil.setNominalSpeedLevel(1)
2868
+ case cooling_type
2869
+ when 'WaterCooled'
2870
+ clg_coil = create_coil_cooling_water(model,
2871
+ chilled_water_loop,
2872
+ name: "#{air_loop.name} Clg Coil")
2873
+ else # 'AirCooled'
2874
+ clg_coil = OpenStudio::Model::CoilCoolingDXVariableSpeed.new(model)
2875
+ clg_coil.setName("#{air_loop.name} Var spd DX AC Clg Coil")
2876
+ clg_coil.setBasinHeaterCapacity(10.0)
2877
+ clg_coil.setBasinHeaterSetpointTemperature(2.0)
2878
+ # first speed level
2879
+ clg_spd_1 = OpenStudio::Model::CoilCoolingDXVariableSpeedSpeedData.new(model)
2880
+ clg_coil.addSpeed(clg_spd_1)
2881
+ clg_coil.setNominalSpeedLevel(1)
2882
+ end
2816
2883
 
2817
2884
  # @todo enable economizer maximum fraction outdoor air schedule input
2818
2885
  # econ_eff_sch = model_add_schedule(model, 'RetailStandalone PSZ_Econ_MaxOAFrac_Sch')
@@ -2824,13 +2891,20 @@ class Standard
2824
2891
  unitary_system.setCoolingCoil(clg_coil)
2825
2892
  unitary_system.setSupplementalHeatingCoil(supplemental_htg_coil)
2826
2893
  unitary_system.setName("#{zone.name} Unitary PSZ-VAV")
2827
- unitary_system.setString(2, 'SingleZoneVAV') # @todo add setControlType() method
2894
+ # The following control strategy can lead to "Developer Error: Component sizing incomplete."
2895
+ # EnergyPlus severe (not fatal) errors if there is no heating design load
2896
+ unitary_system.setControlType('SingleZoneVAV')
2828
2897
  unitary_system.setControllingZoneorThermostatLocation(zone)
2829
2898
  unitary_system.setMaximumSupplyAirTemperature(dsgn_temps['zn_htg_dsgn_sup_air_temp_c'])
2830
2899
  unitary_system.setFanPlacement('BlowThrough')
2831
2900
  unitary_system.setSupplyAirFlowRateMethodDuringCoolingOperation('SupplyAirFlowRate')
2832
2901
  unitary_system.setSupplyAirFlowRateMethodDuringHeatingOperation('SupplyAirFlowRate')
2833
- unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('SupplyAirFlowRate')
2902
+ if minimum_volume_setpoint.nil?
2903
+ unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('SupplyAirFlowRate')
2904
+ else
2905
+ unitary_system.setSupplyAirFlowRateMethodWhenNoCoolingorHeatingisRequired('FractionOfAutosizedCoolingValue')
2906
+ unitary_system.setFractionofAutosizedDesignCoolingSupplyAirFlowRateWhenNoCoolingorHeatingisRequired(minimum_volume_setpoint)
2907
+ end
2834
2908
  unitary_system.setSupplyAirFanOperatingModeSchedule(model.alwaysOnDiscreteSchedule)
2835
2909
  unitary_system.addToNode(air_loop.supplyInletNode)
2836
2910
 
@@ -4415,7 +4489,7 @@ class Standard
4415
4489
  # @param model_occ_hr_end [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
4416
4490
  # Ending hour of building occupancy.
4417
4491
  # @param control_strategy [String] name of control strategy. Options are 'proportional_control' and 'none'.
4418
- # If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
4492
+ # If control strategy is 'proportional_control', the method will apply the CBE radiant control sequences
4419
4493
  # detailed in Raftery et al. (2017), “A new control strategy for high thermal mass radiant systems”.
4420
4494
  # Otherwise no control strategy will be applied and the radiant system will assume the EnergyPlus default controls.
4421
4495
  # @param proportional_gain [Double] (Optional) Only applies if control_strategy is 'proportional_control'.
@@ -5931,6 +6005,7 @@ class Standard
5931
6005
  if air_loop_heating_type == 'Water'
5932
6006
  hot_water_loop = model_get_or_add_hot_water_loop(model, main_heat_fuel,
5933
6007
  hot_water_loop_type: hot_water_loop_type)
6008
+ heating_type = 'Water'
5934
6009
  else
5935
6010
  hot_water_loop = nil
5936
6011
  end
@@ -470,8 +470,6 @@ class Standard
470
470
  # Calculate the typical pressure - same for all building types
471
471
  final_pressure_pa = 0.5 * cs * rho * uh**2
472
472
 
473
- # OpenStudio::logFree(OpenStudio::Debug, "openstudio.Standards.Space", "Final pressure PA = #{final_pressure_pa.round(3)} Pa.")
474
-
475
473
  adjusted_infiltration_rate_m3_per_s = (1.0 + alpha) * initial_infiltration_rate_m3_per_s * (final_pressure_pa / intial_pressure_pa)**n
476
474
 
477
475
  return adjusted_infiltration_rate_m3_per_s
@@ -691,10 +689,10 @@ class Standard
691
689
  case intended_surface_type
692
690
  when 'AtticFloor'
693
691
  film_r_si += film_int_surf_ht_flow_up_r_si if ext_film # Outside
694
- film_r_si += film_semi_ext_surf_r_si if int_film # Inside
692
+ film_r_si += film_semi_ext_surf_r_si if int_film # Inside @todo: this is only true if the attic is ventilated, interior film should be used otheriwse
695
693
  when 'AtticWall', 'AtticRoof'
696
694
  film_r_si += film_ext_surf_r_si if ext_film # Outside
697
- film_r_si += film_semi_ext_surf_r_si if int_film # Inside
695
+ film_r_si += film_semi_ext_surf_r_si if int_film # Inside @todo: this is only true if the attic is ventilated, interior film should be used otherwise
698
696
  when 'DemisingFloor', 'InteriorFloor'
699
697
  film_r_si += film_int_surf_ht_flow_up_r_si if ext_film # Outside
700
698
  film_r_si += film_int_surf_ht_flow_dwn_r_si if int_film # Inside
@@ -30,7 +30,7 @@ def create_class_array
30
30
  'LargeOfficeDetailed',
31
31
  'Laboratory',
32
32
  'College',
33
- 'CourtHouse',
33
+ 'Courthouse',
34
34
  'TallBuilding',
35
35
  'SuperTallBuilding']
36
36
 
@@ -39,6 +39,7 @@ def create_class_array
39
39
  'ASHRAE9012007' => '90.1-2007',
40
40
  'ASHRAE9012010' => '90.1-2010',
41
41
  'ASHRAE9012013' => '90.1-2013',
42
+ 'ASHRAE901PRM2019' => '90.1-PRM-2019',
42
43
  'ASHRAE9012016' => '90.1-2016',
43
44
  'ASHRAE9012019' => '90.1-2019',
44
45
  'DOERef1980to2004' => 'DOE Ref 1980-2004',
@@ -30,6 +30,9 @@ module References
30
30
  # @see https://www.techstreet.com/ashrae/standards/ashrae-90-1-2016-i-p?product_id=1931793 Purchase in the ASHRAE Bookstore
31
31
  class ASHRAE9012016; end
32
32
 
33
+ # ASHRAE 90.1-2019 Appendix G PRM
34
+ # @see https://www.techstreet.com/ashrae/standards/ashrae-90-1-2019-i-p?product_id=2088527 Purchase in the ASHRAE Bookstore
35
+ class ASHRAE901PRM2019; end
33
36
  # ASHRAE 90.1-2019
34
37
  # @see https://www.techstreet.com/ashrae/standards/ashrae-90-1-2019-i-p?product_id=2088527 Purchase in the ASHRAE Bookstore
35
38
  class ASHRAE9012019; end