openstudio-standards 0.8.3 → 0.8.5.rc1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (330) hide show
  1. checksums.yaml +4 -4
  2. data/data/geometry/ASHRAECollege.osm +30 -30
  3. data/data/geometry/ASHRAECourthouse.osm +22 -22
  4. data/data/geometry/ASHRAESmallOfficeDetailed.osm +2 -2
  5. data/data/geometry/DEER_Asm.osm +1 -1
  6. data/data/geometry/DEER_ECC.osm +1 -1
  7. data/data/geometry/DEER_EPr.osm +1 -1
  8. data/data/geometry/DEER_ERC.osm +1 -1
  9. data/data/geometry/DEER_ESe.osm +1 -1
  10. data/data/geometry/DEER_EUn.osm +1 -1
  11. data/data/geometry/DEER_Hsp.osm +1 -1
  12. data/data/geometry/DEER_Htl.osm +1 -1
  13. data/data/geometry/DEER_MBT.osm +1 -1
  14. data/data/geometry/DEER_MFm.osm +1 -1
  15. data/data/geometry/DEER_Nrs.osm +1 -1
  16. data/data/geometry/DEER_OfL.osm +1 -1
  17. data/data/geometry/DEER_OfS.osm +1 -1
  18. data/data/geometry/DEER_RFF.osm +1 -1
  19. data/data/geometry/DEER_RSD.osm +1 -1
  20. data/data/geometry/DEER_Rt3.osm +1 -1
  21. data/data/geometry/DEER_RtS.osm +1 -1
  22. data/data/standards/export_OpenStudio_libraries.rb +2 -3
  23. data/data/standards/test_performance_expected_dd_results.csv +42 -42
  24. data/lib/openstudio-standards/btap/NECB_building_types.csv +35 -0
  25. data/lib/openstudio-standards/btap/NECB_space_types.csv +109 -0
  26. data/lib/openstudio-standards/btap/activity.rb +480 -0
  27. data/lib/openstudio-standards/btap/attributes.rb +166 -0
  28. data/lib/openstudio-standards/btap/bridging.rb +561 -1402
  29. data/lib/openstudio-standards/btap/btap.rb +4 -2
  30. data/lib/openstudio-standards/btap/btap_test_helper.rb +86 -0
  31. data/lib/openstudio-standards/btap/carbon/btap_carbon.rb +177 -0
  32. data/lib/openstudio-standards/btap/common_paths.rb +81 -0
  33. data/lib/openstudio-standards/btap/common_resources/ConstructionProperties.csv +52 -0
  34. data/lib/openstudio-standards/btap/common_resources/Constructions.csv +37 -0
  35. data/lib/openstudio-standards/btap/common_resources/carbon_frame.csv +35 -0
  36. data/lib/openstudio-standards/btap/common_resources/carbon_glazing.csv +35 -0
  37. data/lib/openstudio-standards/btap/common_resources/carbon_opaque.csv +164 -0
  38. data/lib/openstudio-standards/btap/common_resources/construction_sets.csv +1270 -0
  39. data/lib/openstudio-standards/btap/common_resources/constructions_glazing.csv +121 -0
  40. data/lib/openstudio-standards/btap/common_resources/constructions_opaque.csv +2256 -0
  41. data/lib/openstudio-standards/btap/common_resources/costs.csv +1897 -0
  42. data/lib/openstudio-standards/btap/common_resources/costs_local_factors.csv +2315 -0
  43. data/lib/openstudio-standards/btap/common_resources/hvac_vent_ahu.csv +925 -0
  44. data/lib/openstudio-standards/btap/common_resources/lighting.csv +364 -0
  45. data/lib/openstudio-standards/btap/common_resources/lighting_sets.csv +2667 -0
  46. data/lib/openstudio-standards/btap/common_resources/locations.csv +75 -0
  47. data/lib/openstudio-standards/btap/common_resources/materials_glazing.csv +35 -0
  48. data/lib/openstudio-standards/btap/common_resources/materials_hvac.csv +1686 -0
  49. data/lib/openstudio-standards/btap/common_resources/materials_lighting.csv +267 -0
  50. data/lib/openstudio-standards/btap/common_resources/materials_opaque.csv +164 -0
  51. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  52. data/lib/openstudio-standards/btap/costing/btap_costing.rb +469 -0
  53. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  54. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  55. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  56. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  57. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +173 -0
  58. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +354 -0
  59. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  60. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  61. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  62. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +215 -0
  63. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  64. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +156 -0
  65. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  66. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  67. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  68. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  69. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  70. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  71. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  72. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  73. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  74. data/lib/openstudio-standards/btap/costing/test_list.txt +15 -0
  75. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +27 -0
  76. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  77. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  78. data/lib/openstudio-standards/btap/geometry.rb +86 -6
  79. data/lib/openstudio-standards/btap/structure.rb +657 -0
  80. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  81. data/lib/openstudio-standards/create_typical/create_typical.rb +17 -33
  82. data/lib/openstudio-standards/create_typical/space_type_ratios.rb +36 -36
  83. data/lib/openstudio-standards/equipment/create_transformer.rb +104 -0
  84. data/lib/openstudio-standards/equipment/create_typical_equipment.rb +117 -0
  85. data/lib/openstudio-standards/equipment/data/electric_equipment_space_types.json +1514 -0
  86. data/lib/openstudio-standards/equipment/data/gas_equipment_space_types.json +227 -0
  87. data/lib/openstudio-standards/exterior_lighting/create.rb +22 -22
  88. data/lib/openstudio-standards/exterior_lighting/information.rb +3 -2
  89. data/lib/openstudio-standards/hvac/components/air_conditioner_vrf.rb +482 -0
  90. data/lib/openstudio-standards/hvac/components/air_terminal.rb +31 -0
  91. data/lib/openstudio-standards/hvac/components/boiler_hot_water.rb +163 -0
  92. data/lib/openstudio-standards/hvac/components/central_air_source_heat_pump.rb +220 -0
  93. data/lib/openstudio-standards/hvac/components/chiller.rb +25 -0
  94. data/lib/openstudio-standards/hvac/components/coil.rb +276 -0
  95. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_multi_speed.rb +40 -0
  96. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_single_speed.rb +300 -0
  97. data/lib/openstudio-standards/hvac/components/coil_cooling_dx_two_speed.rb +187 -0
  98. data/lib/openstudio-standards/hvac/components/coil_cooling_water.rb +80 -0
  99. data/lib/openstudio-standards/hvac/components/coil_cooling_water_to_air_heat_pump_equation_fit.rb +182 -0
  100. data/lib/openstudio-standards/hvac/components/coil_heating_dx_single_speed.rb +220 -0
  101. data/lib/openstudio-standards/hvac/components/coil_heating_electric.rb +56 -0
  102. data/lib/openstudio-standards/hvac/components/coil_heating_gas.rb +90 -0
  103. data/lib/openstudio-standards/hvac/components/coil_heating_gas_multi_stage.rb +33 -0
  104. data/lib/openstudio-standards/hvac/components/coil_heating_water.rb +98 -0
  105. data/lib/openstudio-standards/hvac/components/coil_heating_water_to_air_heat_pump_equation_fit.rb +147 -0
  106. data/lib/openstudio-standards/hvac/components/component.rb +39 -0
  107. data/lib/openstudio-standards/{standards/ashrae_90_1/data/ashrae_90_1.fans.json → hvac/components/data/fans.json} +6 -6
  108. data/lib/openstudio-standards/hvac/components/fan.rb +363 -0
  109. data/lib/openstudio-standards/hvac/components/heat_exchanger_air_to_air.rb +203 -0
  110. data/lib/openstudio-standards/hvac/components/pump.rb +181 -0
  111. data/lib/openstudio-standards/hvac/controls/radiant_system_controls.rb +594 -0
  112. data/lib/openstudio-standards/hvac/conversions.rb +222 -0
  113. data/lib/openstudio-standards/hvac/curves.rb +192 -0
  114. data/lib/openstudio-standards/hvac/helpers.rb +357 -0
  115. data/lib/openstudio-standards/hvac/setpoint_managers/information.rb +4 -4
  116. data/lib/openstudio-standards/interior_lighting/create_lights.rb +52 -0
  117. data/lib/openstudio-standards/interior_lighting/create_typical_interior_lighting.rb +254 -0
  118. data/lib/openstudio-standards/interior_lighting/data/convert_lighting_data.rb +249 -0
  119. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.csv +96 -0
  120. data/lib/openstudio-standards/interior_lighting/data/lighting_space_types.json +1429 -0
  121. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.csv +46 -0
  122. data/lib/openstudio-standards/interior_lighting/data/lighting_technology.json +859 -0
  123. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  124. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  125. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  126. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.Model.rb +4 -4
  127. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  128. data/lib/openstudio-standards/prototypes/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Model.rb +4 -4
  129. data/lib/openstudio-standards/prototypes/ashrae_90_1/nrel_nze_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  130. data/lib/openstudio-standards/prototypes/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  131. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.HighRiseApartment.rb +6 -7
  132. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Hospital.rb +15 -15
  133. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeHotel.rb +4 -4
  134. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.LargeOffice.rb +5 -5
  135. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.MediumOffice.rb +6 -6
  136. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.Outpatient.rb +7 -7
  137. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.PrimarySchool.rb +4 -4
  138. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SecondarySchool.rb +6 -6
  139. data/lib/openstudio-standards/prototypes/common/buildings/Prototype.SmallOfficeDetailed.rb +5 -1
  140. data/lib/openstudio-standards/prototypes/common/data/prototype_space_type_map.json +2594 -0
  141. data/lib/openstudio-standards/prototypes/common/data/thermostat_schedule_lookup.json +2108 -0
  142. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirTerminalSingleDuctVAVReheat.rb +33 -0
  143. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Fan.rb +0 -140
  144. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanConstantVolume.rb +1 -73
  145. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanOnOff.rb +1 -69
  146. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanVariableVolume.rb +0 -116
  147. data/lib/openstudio-standards/prototypes/common/objects/Prototype.FanZoneExhaust.rb +0 -61
  148. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.hvac.rb +2 -2
  149. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.rb +128 -13
  150. data/lib/openstudio-standards/prototypes/common/objects/Prototype.hvac_systems.rb +606 -607
  151. data/lib/openstudio-standards/prototypes/common/prototype_space_type_map.rb +41 -0
  152. data/lib/openstudio-standards/prototypes/common/space_type_equipment_map.rb +184 -0
  153. data/lib/openstudio-standards/prototypes/common/space_type_thermostat_schedule_map.rb +116 -0
  154. data/lib/openstudio-standards/qaqc/hvac.rb +12 -12
  155. data/lib/openstudio-standards/refrigeration/create_compressor.rb +2 -5
  156. data/lib/openstudio-standards/refrigeration/data/refrigeration_compressors.csv +4 -4
  157. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +1 -2
  158. data/lib/openstudio-standards/service_water_heating/create_water_use.rb +5 -5
  159. data/lib/openstudio-standards/space_type/data/level_1_space_types.json +612 -0
  160. data/lib/openstudio-standards/space_type/standards_space_type.rb +53 -0
  161. data/lib/openstudio-standards/standards/Standards.AirConditionerVariableRefrigerantFlow.rb +8 -26
  162. data/lib/openstudio-standards/standards/Standards.AirLoopHVAC.rb +13 -13
  163. data/lib/openstudio-standards/standards/Standards.AirTerminalSingleDuctVAVReheat.rb +0 -24
  164. data/lib/openstudio-standards/standards/Standards.BoilerHotWater.rb +6 -43
  165. data/lib/openstudio-standards/standards/Standards.ChillerElectricEIR.rb +7 -24
  166. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +19 -44
  167. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +25 -50
  168. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +25 -33
  169. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +9 -22
  170. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +15 -157
  171. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +2 -2
  172. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +18 -105
  173. data/lib/openstudio-standards/standards/Standards.CoilHeatingGas.rb +3 -23
  174. data/lib/openstudio-standards/standards/Standards.CoilHeatingGasMultiStage.rb +0 -24
  175. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -86
  176. data/lib/openstudio-standards/standards/Standards.FanVariableVolume.rb +0 -107
  177. data/lib/openstudio-standards/standards/Standards.Model.rb +45 -20
  178. data/lib/openstudio-standards/standards/Standards.People.rb +113 -0
  179. data/lib/openstudio-standards/standards/Standards.PlantLoop.rb +11 -11
  180. data/lib/openstudio-standards/standards/Standards.Pump.rb +2 -147
  181. data/lib/openstudio-standards/standards/Standards.PumpVariableSpeed.rb +57 -41
  182. data/lib/openstudio-standards/standards/Standards.SpaceType.rb +30 -153
  183. data/lib/openstudio-standards/standards/Standards.Ventilation.rb +74 -0
  184. data/lib/openstudio-standards/standards/Standards.ZoneHVACComponent.rb +1 -1
  185. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PlantLoop.rb +4 -4
  186. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +3 -3
  187. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.spc_typ.json +37 -112
  188. 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 +37 -102
  189. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +3 -3
  190. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.spc_typ.json +37 -112
  191. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.AirTerminalSingleDuctVAVReheat.rb +1 -1
  192. 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 +37 -37
  193. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +6 -6
  194. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.spc_typ.json +37 -37
  195. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.AirTerminalSingleDuctVAVReheat.rb +1 -1
  196. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.BoilerHotWater.rb +1 -1
  197. 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 +37 -102
  198. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +6 -6
  199. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.spc_typ.json +37 -37
  200. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.AirTerminalSingleDuctVAVReheat.rb +1 -1
  201. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.BoilerHotWater.rb +1 -1
  202. 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 +45 -109
  203. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +6 -6
  204. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.spc_typ.json +37 -37
  205. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirLoopHVAC.rb +1 -1
  206. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.AirTerminalSingleDuctVAVReheat.rb +1 -1
  207. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.BoilerHotWater.rb +1 -1
  208. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.CoilHeatingGas.rb +1 -1
  209. 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 +45 -109
  210. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +6 -6
  211. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.spc_typ.json +37 -37
  212. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.curves.json +0 -200
  213. 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 +37 -37
  214. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_1980_2004/data/doe_ref_1980_2004.spc_typ.json +37 -37
  215. 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 +37 -37
  216. data/lib/openstudio-standards/standards/ashrae_90_1/doe_ref_pre_1980/data/doe_ref_pre_1980.spc_typ.json +37 -37
  217. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.AirTerminalSingleDuctVAVReheat.rb +1 -1
  218. data/lib/openstudio-standards/standards/ashrae_90_1/nrel_zne_ready_2017/nrel_zne_ready_2017.PlantLoop.rb +5 -5
  219. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.AirTerminalSingleDuctVAVReheat.rb +1 -1
  220. data/lib/openstudio-standards/standards/ashrae_90_1/ze_aedg_multifamily/ze_aedg_multifamily.PlantLoop.rb +5 -5
  221. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.AirLoopHVAC.rb +1 -1
  222. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.ChillerElectricEIR.rb +2 -2
  223. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -68
  224. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +2 -35
  225. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +42 -0
  226. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +5 -2
  227. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +2 -2
  228. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  229. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.PlantLoop.rb +3 -3
  230. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.SpaceType.rb +1 -1
  231. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019.Model.rb +1 -0
  232. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/ashrae_90_1_prm_2019_WaterHeaterMixed.rb +2 -4
  233. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.curves.json +0 -200
  234. data/lib/openstudio-standards/standards/ashrae_90_1_prm/data/ashrae_90_1_prm.fans.json +5 -5
  235. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +7 -1
  236. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/userdata_enums.rb +0 -1
  237. data/lib/openstudio-standards/standards/cbes/data/cbes.curves.json +0 -200
  238. data/lib/openstudio-standards/standards/deer/data/deer.curves.json +0 -200
  239. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +21 -37
  240. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/building_envelope.rb +12 -11
  241. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  242. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  243. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  244. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_systems.rb +4 -4
  245. data/lib/openstudio-standards/standards/necb/ECMS/ecms.rb +1 -1
  246. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +115 -112
  247. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +637 -249
  248. data/lib/openstudio-standards/standards/necb/NECB2011/beps_compliance_path.rb +16 -12
  249. data/lib/openstudio-standards/standards/necb/NECB2011/building_envelope.rb +799 -46
  250. data/lib/openstudio-standards/standards/necb/NECB2011/data/chillers.json +33 -51
  251. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +75 -7
  252. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +25 -1
  253. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  254. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +21 -15
  255. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  256. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  257. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  258. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  259. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  260. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +18 -6
  261. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  262. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  263. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  264. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  265. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  266. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +68 -150
  267. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +444 -134
  268. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  269. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +10 -2
  270. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  271. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  272. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +17 -8
  273. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  274. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  275. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +16 -6
  276. data/lib/openstudio-standards/standards/necb/NECB2020/data/unitary_acs.json +60 -61
  277. data/lib/openstudio-standards/standards/necb/NECB2020/service_water_heating.rb +30 -30
  278. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  279. data/lib/openstudio-standards/standards/necb/common/btap_analysis.rb +79 -0
  280. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +206 -32
  281. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +75 -43
  282. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  283. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  284. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  285. data/lib/openstudio-standards/thermal_zone/{thermal_zone.rb → information.rb} +12 -45
  286. data/lib/openstudio-standards/thermal_zone/thermostat_schedules.rb +152 -0
  287. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  288. data/lib/openstudio-standards/version.rb +1 -1
  289. data/lib/openstudio-standards/weather/modify.rb +2 -2
  290. data/lib/openstudio-standards/weather/stat_file.rb +2 -2
  291. data/lib/openstudio-standards.rb +67 -38
  292. metadata +141 -50
  293. data/lib/openstudio-standards/hvac/components/create.rb +0 -169
  294. data/lib/openstudio-standards/hvac/components/modify.rb +0 -42
  295. data/lib/openstudio-standards/prototypes/common/objects/Prototype.AirConditionerVariableRefrigerantFlow.rb +0 -438
  296. data/lib/openstudio-standards/prototypes/common/objects/Prototype.BoilerHotWater.rb +0 -123
  297. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CentralAirSourceHeatPump.rb +0 -216
  298. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXSingleSpeed.rb +0 -273
  299. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingDXTwoSpeed.rb +0 -159
  300. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWater.rb +0 -77
  301. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilCoolingWaterToAirHeatPumpEquationFit.rb +0 -154
  302. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingDXSingleSpeed.rb +0 -214
  303. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingElectric.rb +0 -53
  304. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingGas.rb +0 -72
  305. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWater.rb +0 -95
  306. data/lib/openstudio-standards/prototypes/common/objects/Prototype.CoilHeatingWaterToAirHeatPumpEquationFit.rb +0 -125
  307. data/lib/openstudio-standards/prototypes/common/objects/Prototype.ControllerWaterCoil.rb +0 -17
  308. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Model.transformers.rb +0 -90
  309. data/lib/openstudio-standards/prototypes/common/objects/Prototype.Pump.rb +0 -4
  310. data/lib/openstudio-standards/prototypes/common/objects/Prototype.PumpVariableSpeed.rb +0 -70
  311. data/lib/openstudio-standards/prototypes/common/objects/Prototype.radiant_system_controls.rb +0 -590
  312. data/lib/openstudio-standards/prototypes/common/objects/Prototype.utilities.rb +0 -901
  313. data/lib/openstudio-standards/standards/Standards.FanConstantVolume.rb +0 -5
  314. data/lib/openstudio-standards/standards/Standards.FanOnOff.rb +0 -5
  315. data/lib/openstudio-standards/standards/Standards.FanZoneExhaust.rb +0 -5
  316. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsConstantSpeed.rb +0 -5
  317. data/lib/openstudio-standards/standards/Standards.HeaderedPumpsVariableSpeed.rb +0 -55
  318. data/lib/openstudio-standards/standards/Standards.PumpConstantSpeed.rb +0 -5
  319. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanConstantVolume.rb +0 -5
  320. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanOnOff.rb +0 -5
  321. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.FanZoneExhaust.rb +0 -5
  322. data/lib/openstudio-standards/standards/cbes/data/cbes.fans.json +0 -328
  323. data/lib/openstudio-standards/standards/deer/data/deer.fans.json +0 -328
  324. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2004/ashrae_90_1_2004.PumpVariableSpeed.rb +0 -0
  325. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2007/ashrae_90_1_2007.PumpVariableSpeed.rb +0 -0
  326. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2010/ashrae_90_1_2010.PumpVariableSpeed.rb +0 -0
  327. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2013/ashrae_90_1_2013.PumpVariableSpeed.rb +0 -0
  328. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2016/ashrae_90_1_2016.PumpVariableSpeed.rb +0 -0
  329. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.Pump.rb +0 -0
  330. /data/lib/openstudio-standards/{prototypes → standards}/ashrae_90_1/ashrae_90_1_2019/ashrae_90_1_2019.PumpVariableSpeed.rb +0 -0
@@ -3,113 +3,18 @@ class Standard
3
3
 
4
4
  include CoilDX
5
5
 
6
- # Finds capacity in W. This is the cooling capacity of the paired DX cooling coil.
7
- #
8
- # @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
9
- # @param necb_ref_hp [Boolean] for compatability with NECB ruleset only.
10
- # @return [Double] capacity in W to be used for find object
11
- def coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, necb_ref_hp = false)
12
- capacity_w = nil
13
-
14
- # Get the paired cooling coil
15
- clg_coil = nil
16
-
17
- # Unitary and zone equipment
18
- if coil_heating_dx_single_speed.airLoopHVAC.empty?
19
- if coil_heating_dx_single_speed.containingHVACComponent.is_initialized
20
- containing_comp = coil_heating_dx_single_speed.containingHVACComponent.get
21
- if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
22
- clg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get.coolingCoil
23
- elsif containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
24
- unitary = containing_comp.to_AirLoopHVACUnitarySystem.get
25
- if unitary.coolingCoil.is_initialized
26
- clg_coil = unitary.coolingCoil.get
27
- end
28
- end
29
- # @todo Add other unitary systems
30
- elsif coil_heating_dx_single_speed.containingZoneHVACComponent.is_initialized
31
- containing_comp = coil_heating_dx_single_speed.containingZoneHVACComponent.get
32
- # PTHP
33
- if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
34
- pthp = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get
35
- clg_coil = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil
36
- end
37
- end
38
- end
39
-
40
- # On AirLoop directly
41
- if coil_heating_dx_single_speed.airLoopHVAC.is_initialized
42
- air_loop = coil_heating_dx_single_speed.airLoopHVAC.get
43
- # Check for the presence of any other type of cooling coil
44
- clg_types = ['OS:Coil:Cooling:DX:SingleSpeed',
45
- 'OS:Coil:Cooling:DX:TwoSpeed',
46
- 'OS:Coil:Cooling:DX:MultiSpeed']
47
- clg_types.each do |ct|
48
- coils = air_loop.supplyComponents(ct.to_IddObjectType)
49
- next if coils.empty?
50
-
51
- clg_coil = coils[0]
52
- break # Stop on first DX cooling coil found
53
- end
54
- end
55
-
56
- # If no paired cooling coil was found,
57
- # throw an error and fall back to the heating capacity
58
- # of the DX heating coil
59
- if clg_coil.nil?
60
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, the paired DX cooling coil could not be found to determine capacity. Efficiency will incorrectly be based on DX coil's heating capacity.")
61
- if coil_heating_dx_single_speed.ratedTotalHeatingCapacity.is_initialized
62
- capacity_w = coil_heating_dx_single_speed.ratedTotalHeatingCapacity.get
63
- elsif coil_heating_dx_single_speed.autosizedRatedTotalHeatingCapacity.is_initialized
64
- capacity_w = coil_heating_dx_single_speed.autosizedRatedTotalHeatingCapacity.get
65
- else
66
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name} capacity is not available, cannot apply efficiency standard to paired DX heating coil.")
67
- return 0.0
68
- end
69
- return capacity_w
70
- end
71
-
72
- # If a coil was found, cast to the correct type
73
- if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized
74
- clg_coil = clg_coil.to_CoilCoolingDXSingleSpeed.get
75
- capacity_w = coil_cooling_dx_single_speed_find_capacity(clg_coil)
76
- elsif clg_coil.to_CoilCoolingDXTwoSpeed.is_initialized
77
- clg_coil = clg_coil.to_CoilCoolingDXTwoSpeed.get
78
- capacity_w = coil_cooling_dx_two_speed_find_capacity(clg_coil)
79
- elsif clg_coil.to_CoilCoolingDXMultiSpeed.is_initialized
80
- clg_coil = clg_coil.to_CoilCoolingDXMultiSpeed.get
81
- capacity_w = coil_cooling_dx_multi_speed_find_capacity(clg_coil)
82
- end
83
-
84
- # If it's a PTAC or PTHP System, we need to divide the capacity by the potential zone multiplier
85
- # because the COP is dependent on capacity, and the capacity should be the capacity of a single zone, not all the zones
86
- if ['PTAC', 'PTHP'].include?(coil_dx_subcategory(coil_heating_dx_single_speed))
87
- mult = 1
88
- comp = coil_heating_dx_single_speed.containingZoneHVACComponent
89
- if comp.is_initialized && comp.get.thermalZone.is_initialized
90
- mult = comp.get.thermalZone.get.multiplier
91
- if mult > 1
92
- total_cap = capacity_w
93
- capacity_w /= mult
94
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}, total capacity of #{OpenStudio.convert(total_cap, 'W', 'kBtu/hr').get.round(2)}kBTU/hr was divided by the zone multiplier of #{mult} to give #{capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get.round(2)}kBTU/hr.")
95
- end
96
- end
97
- end
98
-
99
- return capacity_w
100
- end
101
-
102
6
  # Finds lookup object in standards and return efficiency
103
7
  #
104
8
  # @param coil_heating_dx_single_speed [OpenStudio::Model::CoilHeatingDXSingleSpeed] coil heating dx single speed object
105
9
  # @param rename [Boolean] if true, object will be renamed to include capacity and efficiency level
106
10
  # @param necb_ref_hp [Boolean] for compatability with NECB ruleset only.
11
+ # @param equipment_type [Boolean] indicate that equipment_type should be in the search criteria.
107
12
  # @return [Double] full load efficiency (COP)
108
13
  def coil_heating_dx_single_speed_standard_minimum_cop(coil_heating_dx_single_speed, rename = false, necb_ref_hp = false, equipment_type = false)
109
14
  coil_efficiency_data = standards_data['heat_pumps_heating']
110
15
 
111
16
  # Get the capacity
112
- capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, necb_ref_hp)
17
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_get_paired_coil_cooling_capacity(coil_heating_dx_single_speed)
113
18
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
114
19
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
115
20
 
@@ -128,7 +33,7 @@ class Standard
128
33
  if equipment_type == 'PTHP'
129
34
  search_criteria['application'] = coil_dx_packaged_terminal_application(coil_heating_dx_single_speed)
130
35
  end
131
- elsif !coil_dx_heat_pump?(coil_heating_dx_single_speed) # `coil_dx_heat_pump?` returns false when a DX heating coil is wrapped into a AirloopHVAC:UnitarySystem
36
+ elsif !OpenstudioStandards::HVAC.coil_dx_heat_pump?(coil_heating_dx_single_speed) # `coil_dx_heat_pump?` returns false when a DX heating coil is wrapped into a AirloopHVAC:UnitarySystem
132
37
  search_criteria['equipment_type'] = 'Heat Pumps'
133
38
  end
134
39
  unless (template == 'NECB2011') || (template == 'NECB2015') || (template == 'NECB2017') || (template == 'NECB2020') || (template == 'BTAPPRE1980') ||
@@ -182,7 +87,7 @@ class Standard
182
87
  end
183
88
 
184
89
  min_coph = pthp_cop_coeff_1 - (pthp_cop_coeff_2 * capacity_btu_per_hr / 1000.0)
185
- cop = cop_heating_to_cop_heating_no_fan(min_coph, OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get)
90
+ cop = OpenstudioStandards::HVAC.cop_heating_to_cop_heating_no_fan(min_coph, OpenStudio.convert(capacity_btu_per_hr, 'Btu/hr', 'W').get)
186
91
  new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_coph.round(1)}COPH"
187
92
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{coil_heating_dx_single_speed.name}: #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COPH = #{min_coph.round(2)}")
188
93
  end
@@ -190,7 +95,7 @@ class Standard
190
95
  # If specified as HSPF
191
96
  unless hp_props['minimum_heating_seasonal_performance_factor'].nil?
192
97
  min_hspf = hp_props['minimum_heating_seasonal_performance_factor']
193
- cop = hspf_to_cop_no_fan(min_hspf)
98
+ cop = OpenstudioStandards::HVAC.hspf_to_cop_no_fan(min_hspf)
194
99
  new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_hspf.round(1)}HSPF"
195
100
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: #{suppl_heating_type} #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; HSPF = #{min_hspf}")
196
101
  end
@@ -199,7 +104,7 @@ class Standard
199
104
  # TODO: assumed to be the same as HSPF for now
200
105
  unless hp_props['minimum_heating_seasonal_performance_factor_2'].nil?
201
106
  min_hspf = hp_props['minimum_heating_seasonal_performance_factor_2']
202
- cop = hspf_to_cop_no_fan(min_hspf)
107
+ cop = OpenstudioStandards::HVAC.hspf_to_cop_no_fan(min_hspf)
203
108
  new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_hspf.round(1)}HSPF2"
204
109
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: #{suppl_heating_type} #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; HSPF = #{min_hspf}")
205
110
  end
@@ -207,7 +112,7 @@ class Standard
207
112
  # If specified as COPH
208
113
  unless hp_props['minimum_coefficient_of_performance_heating'].nil?
209
114
  min_coph = hp_props['minimum_coefficient_of_performance_heating']
210
- cop = cop_heating_to_cop_heating_no_fan(min_coph, OpenStudio.convert(capacity_kbtu_per_hr, 'kBtu/hr', 'W').get)
115
+ cop = OpenstudioStandards::HVAC.cop_heating_to_cop_heating_no_fan(min_coph, OpenStudio.convert(capacity_kbtu_per_hr, 'kBtu/hr', 'W').get)
211
116
  new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_coph.round(1)}COPH"
212
117
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: #{suppl_heating_type} #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; COPH = #{min_coph}")
213
118
  end
@@ -215,11 +120,19 @@ class Standard
215
120
  # If specified as EER
216
121
  unless hp_props['minimum_energy_efficiency_ratio'].nil?
217
122
  min_eer = hp_props['minimum_energy_efficiency_ratio']
218
- cop = eer_to_cop_no_fan(min_eer)
123
+ cop = OpenstudioStandards::HVAC.eer_to_cop_no_fan(min_eer)
219
124
  new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_eer.round(1)}EER"
220
125
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: #{suppl_heating_type} #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; EER = #{min_eer}")
221
126
  end
222
127
 
128
+ # If specified as SEER
129
+ unless hp_props['minimum_seasonal_energy_efficiency_ratio'].nil?
130
+ min_seer = hp_props['minimum_seasonal_energy_efficiency_ratio']
131
+ cop = OpenstudioStandards::HVAC.seer_to_cop_no_fan(min_seer)
132
+ new_comp_name = "#{coil_heating_dx_single_speed.name} #{capacity_kbtu_per_hr.round} Clg kBtu/hr #{min_seer.round(1)}SEER"
133
+ OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingDXSingleSpeed', "For #{template}: #{coil_heating_dx_single_speed.name}: #{suppl_heating_type} #{sub_category} Cooling Capacity = #{capacity_kbtu_per_hr.round}kBtu/hr; SEER = #{min_seer}")
134
+ end
135
+
223
136
  # Rename
224
137
  if rename
225
138
  coil_heating_dx_single_speed.setName(new_comp_name)
@@ -243,7 +156,7 @@ class Standard
243
156
  equipment_type = coil_efficiency_data[0].keys.include?('equipment_type') ? true : false
244
157
 
245
158
  # Get the capacity
246
- capacity_w = coil_heating_dx_single_speed_find_capacity(coil_heating_dx_single_speed, necb_ref_hp)
159
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_get_paired_coil_cooling_capacity(coil_heating_dx_single_speed)
247
160
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
248
161
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
249
162
 
@@ -255,7 +168,7 @@ class Standard
255
168
  if ['PTHP'].include?(equipment_type) && template.include?('90.1')
256
169
  search_criteria['application'] = coil_dx_packaged_terminal_application(coil_heating_dx_single_speed)
257
170
  end
258
- elsif !coil_dx_heat_pump?(coil_heating_dx_single_speed) # `coil_dx_heat_pump?` returns false when a DX heating coil is wrapped into a AirloopHVAC:UnitarySystem
171
+ elsif !OpenstudioStandards::HVAC.coil_dx_heat_pump?(coil_heating_dx_single_speed) # `coil_dx_heat_pump?` returns false when a DX heating coil is wrapped into a AirloopHVAC:UnitarySystem
259
172
  search_criteria['equipment_type'] = 'Heat Pumps'
260
173
  end
261
174
  unless (template == 'NECB2011') || (template == 'NECB2015') || (template == 'NECB2017') || (template == 'NECB2020') || (template == 'BTAPPRE1980') ||
@@ -24,7 +24,7 @@ class Standard
24
24
  search_criteria = coil_heating_gas_additional_search_criteria(coil_heating_gas, search_criteria)
25
25
 
26
26
  # Get the capacity, but return false if not available
27
- capacity_w = coil_heating_gas_find_capacity(coil_heating_gas)
27
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_gas_get_capacity(coil_heating_gas)
28
28
 
29
29
  # Return false if the coil does not have a heating capacity associated with it. Cannot apply the standard if without
30
30
  # it.
@@ -56,7 +56,7 @@ class Standard
56
56
  # If specified as AFUE
57
57
  unless furnace_props['minimum_annual_fuel_utilization_efficiency'].nil?
58
58
  min_afue = furnace_props['minimum_annual_fuel_utilization_efficiency']
59
- thermal_eff = afue_to_thermal_eff(min_afue)
59
+ thermal_eff = OpenstudioStandards::HVAC.afue_to_thermal_eff(min_afue)
60
60
  new_comp_name = "#{coil_heating_gas.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_afue} AFUE"
61
61
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGas', "For #{template}: #{coil_heating_gas.name}: = #{capacity_kbtu_per_hr.round}kBtu/hr; AFUE = #{min_afue}")
62
62
  end
@@ -64,7 +64,7 @@ class Standard
64
64
  # If specified as combustion efficiency
65
65
  unless furnace_props['minimum_combustion_efficiency'].nil?
66
66
  min_comb_eff = furnace_props['minimum_combustion_efficiency']
67
- thermal_eff = combustion_eff_to_thermal_eff(min_comb_eff)
67
+ thermal_eff = OpenstudioStandards::HVAC.combustion_eff_to_thermal_eff(min_comb_eff)
68
68
  new_comp_name = "#{coil_heating_gas.name} #{capacity_kbtu_per_hr.round}kBtu/hr #{min_comb_eff} Combustion Eff"
69
69
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.CoilHeatingGas', "For #{template}: #{coil_heating_gas.name}: = #{capacity_kbtu_per_hr.round}kBtu/hr; Combustion Efficiency = #{min_comb_eff}")
70
70
  end
@@ -85,24 +85,4 @@ class Standard
85
85
 
86
86
  return successfully_set_all_properties
87
87
  end
88
-
89
- # Retrieves the capacity of an OpenStudio::Model::CoilHeatingGas in watts
90
- #
91
- # @param coil_heating_gas [OpenStudio::Model::CoilHeatingGas] the gas heating coil
92
- # @return [Double, false] a double representing the capacity of the CoilHeatingGas object in watts. If unsuccessful in
93
- # determining the capacity, this function returns false.
94
- def coil_heating_gas_find_capacity(coil_heating_gas)
95
- capacity_w = nil
96
- if coil_heating_gas.nominalCapacity.is_initialized
97
- capacity_w = coil_heating_gas.nominalCapacity.get
98
- elsif coil_heating_gas.autosizedNominalCapacity.is_initialized
99
- capacity_w = coil_heating_gas.autosizedNominalCapacity.get
100
- else
101
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingGas', "For #{coil_heating_gas.name} capacity is not available, cannot apply efficiency standard.")
102
- successfully_set_all_properties = false
103
- return successfully_set_all_properties
104
- end
105
-
106
- return capacity_w
107
- end
108
88
  end
@@ -45,28 +45,4 @@ class Standard
45
45
  successfully_set_all_properties = false
46
46
  end
47
47
  end
48
-
49
- # Finds capacity in W
50
- #
51
- # @param coil_heating_gas_multi_stage [OpenStudio::Model::CoilHeatingGasMultiStage] coil heating gas multi stage object
52
- # @return [Double] capacity in W to be used for find object
53
- def coil_heating_gas_multi_stage_find_capacity(coil_heating_gas_multi_stage)
54
- capacity_w = nil
55
- htg_stages = coil_heating_gas_multi_stage.stages
56
- if htg_stages.last.nominalCapacity.is_initialized
57
- capacity_w = htg_stages.last.nominalCapacity.get
58
- elsif (htg_stages.size == 1) && coil_heating_gas_multi_stage.stages[0].autosizedNominalCapacity.is_initialized
59
- capacity_w = coil_heating_gas_multi_stage.stages[0].autosizedNominalCapacity.get
60
- elsif (htg_stages.size == 2) && coil_heating_gas_multi_stage.stages[1].autosizedNominalCapacity.is_initialized
61
- capacity_w = coil_heating_gas_multi_stage.stages[1].autosizedNominalCapacity.get
62
- elsif (htg_stages.size == 3) && coil_heating_gas_multi_stage.stages[2].autosizedNominalCapacity.is_initialized
63
- capacity_w = coil_heating_gas_multi_stage.stages[2].autosizedNominalCapacity.get
64
- elsif (htg_stages.size == 4) && coil_heating_gas_multi_stage.stages[3].autosizedNominalCapacity.is_initialized
65
- capacity_w = coil_heating_gas_multi_stage.stages[3].autosizedNominalCapacity.get
66
- else
67
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilCoolingDXMultiSpeed', "For #{coil_heating_gas_multi_stage.name} capacity is not available, cannot apply efficiency standard.")
68
- successfully_set_all_properties = false
69
- return successfully_set_all_properties
70
- end
71
- end
72
48
  end
@@ -1,90 +1,6 @@
1
1
  class Standard
2
2
  # @!group CoilHeatingWaterToAirHeatPumpEquationFit
3
3
 
4
- # Finds capacity in W.
5
- # This is the cooling capacity of the paired cooling coil.
6
- #
7
- # @param coil_heating_water_to_air_heat_pump [OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit] coil heating object
8
- # @return [Double] capacity in W to be used for find object
9
- def coil_heating_water_to_air_heat_pump_find_capacity(coil_heating_water_to_air_heat_pump)
10
- capacity_w = nil
11
-
12
- # Get the paired cooling coil
13
- clg_coil = nil
14
-
15
- # Unitary and zone equipment
16
- if coil_heating_water_to_air_heat_pump.airLoopHVAC.empty?
17
- if coil_heating_water_to_air_heat_pump.containingHVACComponent.is_initialized
18
- containing_comp = coil_heating_water_to_air_heat_pump.containingHVACComponent.get
19
- if containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.is_initialized
20
- clg_coil = containing_comp.to_AirLoopHVACUnitaryHeatPumpAirToAir.get.coolingCoil
21
- elsif containing_comp.to_AirLoopHVACUnitarySystem.is_initialized
22
- unitary = containing_comp.to_AirLoopHVACUnitarySystem.get
23
- if unitary.coolingCoil.is_initialized
24
- clg_coil = unitary.coolingCoil.get
25
- end
26
- end
27
- elsif coil_heating_water_to_air_heat_pump.containingZoneHVACComponent.is_initialized
28
- containing_comp = coil_heating_water_to_air_heat_pump.containingZoneHVACComponent.get
29
- # PTHP
30
- if containing_comp.to_ZoneHVACPackagedTerminalHeatPump.is_initialized
31
- clg_coil = containing_comp.to_ZoneHVACPackagedTerminalHeatPump.get.coolingCoil
32
- # WSHP
33
- elsif containing_comp.to_ZoneHVACWaterToAirHeatPump.is_initialized
34
- clg_coil = containing_comp.to_ZoneHVACWaterToAirHeatPump.get.coolingCoil
35
- end
36
- end
37
- end
38
-
39
- # On AirLoop directly
40
- if coil_heating_water_to_air_heat_pump.airLoopHVAC.is_initialized
41
- air_loop = coil_heating_water_to_air_heat_pump.airLoopHVAC.get
42
- # Check for the presence of any other type of cooling coil
43
- clg_types = ['OS:Coil:Cooling:DX:SingleSpeed',
44
- 'OS:Coil:Cooling:DX:TwoSpeed',
45
- 'OS:Coil:Cooling:DX:MultiSpeed']
46
- clg_types.each do |ct|
47
- coils = air_loop.supplyComponents(ct.to_IddObjectType)
48
- next if coils.empty?
49
-
50
- clg_coil = coils[0]
51
- break # Stop on first cooling coil found
52
- end
53
- end
54
-
55
- # If no paired cooling coil was found,
56
- # throw an error and fall back to the heating capacity of the heating coil
57
- if clg_coil.nil?
58
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingWaterToAirHeatPumpEquationFit', "For #{coil_heating_water_to_air_heat_pump.name}, the paired cooling coil could not be found to determine capacity. Efficiency will incorrectly be based on coil's heating capacity.")
59
- if coil_heating_water_to_air_heat_pump.ratedTotalHeatingCapacity.is_initialized
60
- capacity_w = coil_heating_water_to_air_heat_pump.ratedTotalHeatingCapacity.get
61
- elsif coil_heating_water_to_air_heat_pump.autosizedRatedTotalHeatingCapacity.is_initialized
62
- capacity_w = coil_heating_water_to_air_heat_pump.autosizedRatedTotalHeatingCapacity.get
63
- else
64
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.CoilHeatingWaterToAirHeatPumpEquationFit', "For #{coil_heating_water_to_air_heat_pump.name} capacity is not available, cannot apply efficiency standard to paired heating coil.")
65
- return 0.0
66
- end
67
- return capacity_w
68
- end
69
-
70
- # If a coil was found, cast to the correct type
71
- if clg_coil.to_CoilCoolingDXSingleSpeed.is_initialized
72
- clg_coil = clg_coil.to_CoilCoolingDXSingleSpeed.get
73
- capacity_w = coil_cooling_dx_single_speed_find_capacity(clg_coil)
74
- elsif clg_coil.to_CoilCoolingDXTwoSpeed.is_initialized
75
- clg_coil = clg_coil.to_CoilCoolingDXTwoSpeed.get
76
- capacity_w = coil_cooling_dx_two_speed_find_capacity(clg_coil)
77
- elsif clg_coil.to_CoilCoolingDXMultiSpeed.is_initialized
78
- clg_coil = clg_coil.to_CoilCoolingDXMultiSpeed.get
79
- capacity_w = coil_cooling_dx_multi_speed_find_capacity(clg_coil)
80
- elsif clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.is_initialized
81
- clg_coil = clg_coil.to_CoilCoolingWaterToAirHeatPumpEquationFit.get
82
- capacity_w = coil_cooling_water_to_air_heat_pump_find_capacity(clg_coil)
83
- end
84
-
85
- return capacity_w
86
- end
87
-
88
4
  # Finds lookup object in standards and return efficiency
89
5
  #
90
6
  # @param coil_heating_water_to_air_heat_pump [OpenStudio::Model::CoilHeatingWaterToAirHeatPumpEquationFit] coil heating object
@@ -93,7 +9,7 @@ class Standard
93
9
  def coil_heating_water_to_air_heat_pump_standard_minimum_cop(coil_heating_water_to_air_heat_pump, rename = false)
94
10
  search_criteria = {}
95
11
  search_criteria['template'] = template
96
- capacity_w = coil_heating_water_to_air_heat_pump_find_capacity(coil_heating_water_to_air_heat_pump)
12
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_get_paired_coil_cooling_capacity(coil_heating_water_to_air_heat_pump)
97
13
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
98
14
  capacity_kbtu_per_hr = OpenStudio.convert(capacity_w, 'W', 'kBtu/hr').get
99
15
 
@@ -136,7 +52,7 @@ class Standard
136
52
  # Get the search criteria
137
53
  search_criteria = {}
138
54
  search_criteria['template'] = template
139
- capacity_w = coil_heating_water_to_air_heat_pump_find_capacity(coil_heating_water_to_air_heat_pump)
55
+ capacity_w = OpenstudioStandards::HVAC.coil_heating_get_paired_coil_cooling_capacity(coil_heating_water_to_air_heat_pump)
140
56
  capacity_btu_per_hr = OpenStudio.convert(capacity_w, 'W', 'Btu/hr').get
141
57
 
142
58
  # Look up the efficiency characteristics
@@ -3,113 +3,6 @@ class Standard
3
3
 
4
4
  include Fan
5
5
 
6
- # Modify the fan curve coefficients to reflect a specific type of control.
7
- #
8
- # @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
9
- # @param control_type [String] valid choices are:
10
- # Multi Zone VAV with discharge dampers,
11
- # Multi Zone VAV with VSD and SP Setpoint Reset,
12
- # Multi Zone VAV with AF or BI Riding Curve,
13
- # Multi Zone VAV with AF or BI with Inlet Vanes,
14
- # Multi Zone VAV with FC Riding Curve,
15
- # Multi Zone VAV with FC with Inlet Vanes,
16
- # Multi Zone VAV with Vane-axial with Variable Pitch Blades,
17
- # Multi Zone VAV with VSD and Fixed SP Setpoint,
18
- # Multi Zone VAV with VSD and Static Pressure Reset,
19
- # Single Zone VAV Fan
20
- # @return [Boolean] returns true if successful, false if not
21
- def fan_variable_volume_set_control_type(fan_variable_volume, control_type)
22
- # Determine the coefficients
23
- coeff_a = nil
24
- coeff_b = nil
25
- coeff_c = nil
26
- coeff_d = nil
27
- min_pct_pwr = nil
28
- case control_type
29
-
30
- # add 'Multi Zone VAV with discharge dampers' and change the minimum fan power fraction of "Multi Zone VAV with VSD and Static Pressure Reset"
31
- when 'Multi Zone VAV with discharge dampers'
32
- coeff_a = 0.18984763
33
- coeff_b = 0.31447014
34
- coeff_c = 0.49568211
35
- coeff_d = 0.0
36
- min_pct_pwr = 0.25
37
- when 'Multi Zone VAV with VSD and SP Setpoint Reset'
38
- coeff_a = 0.04076
39
- coeff_b = 0.0881
40
- coeff_c = -0.0729
41
- coeff_d = 0.9437
42
- min_pct_pwr = 0.25
43
- when 'Multi Zone VAV with AF or BI Riding Curve'
44
- coeff_a = 0.1631
45
- coeff_b = 1.5901
46
- coeff_c = -0.8817
47
- coeff_d = 0.1281
48
- min_pct_pwr = 0.7
49
- when 'Multi Zone VAV with AF or BI with Inlet Vanes'
50
- coeff_a = 0.9977
51
- coeff_b = -0.659
52
- coeff_c = 0.9547
53
- coeff_d = -0.2936
54
- min_pct_pwr = 0.5
55
- when 'Multi Zone VAV with FC Riding Curve'
56
- coeff_a = 0.1224
57
- coeff_b = 0.612
58
- coeff_c = 0.5983
59
- coeff_d = -0.3334
60
- min_pct_pwr = 0.3
61
- when 'Multi Zone VAV with FC with Inlet Vanes'
62
- coeff_a = 0.3038
63
- coeff_b = -0.7608
64
- coeff_c = 2.2729
65
- coeff_d = -0.8169
66
- min_pct_pwr = 0.3
67
- when 'Multi Zone VAV with Vane-axial with Variable Pitch Blades'
68
- coeff_a = 0.1639
69
- coeff_b = -0.4016
70
- coeff_c = 1.9909
71
- coeff_d = -0.7541
72
- min_pct_pwr = 0.2
73
- when 'Multi Zone VAV with VSD and Fixed SP Setpoint'
74
- coeff_a = 0.0013
75
- coeff_b = 0.1470
76
- coeff_c = 0.9506
77
- coeff_d = -0.0998
78
- min_pct_pwr = 0.2
79
- when 'Multi Zone VAV with VSD and Static Pressure Reset'
80
- coeff_a = 0.04076
81
- coeff_b = 0.0881
82
- coeff_c = -0.0729
83
- coeff_d = 0.9437
84
- min_pct_pwr = 0.1
85
- when 'Single Zone VAV Fan'
86
- coeff_a = 0.027828
87
- coeff_b = 0.026583
88
- coeff_c = -0.087069
89
- coeff_d = 1.030920
90
- min_pct_pwr = 0.1
91
- else
92
- OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.FanVariableVolume', "Fan control type '#{control_type}' not recognized, fan power coefficients will not be changed.")
93
- return false
94
- end
95
-
96
- OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.FanVariableVolume', "For #{fan_variable_volume.name}: Set fan curve coefficients to reflect control type of '#{control_type}'.")
97
-
98
- # Set the coefficients
99
- fan_variable_volume.setFanPowerCoefficient1(coeff_a)
100
- fan_variable_volume.setFanPowerCoefficient2(coeff_b)
101
- fan_variable_volume.setFanPowerCoefficient3(coeff_c)
102
- fan_variable_volume.setFanPowerCoefficient4(coeff_d)
103
-
104
- # Set the fan minimum power
105
- fan_variable_volume.setFanPowerMinimumFlowRateInputMethod('Fraction')
106
- fan_variable_volume.setFanPowerMinimumFlowFraction(min_pct_pwr)
107
-
108
- # Append the control type to the fan name
109
- # self.setName("#{self.name} #{control_type}")
110
- return true
111
- end
112
-
113
6
  # Determines whether there is a requirement to have a VSD or some other method to reduce fan power at low part load ratios.
114
7
  #
115
8
  # @param fan_variable_volume [OpenStudio::Model::FanVariableVolume] variable volume fan object
@@ -237,13 +237,8 @@ class Standard
237
237
  # Modify the internal loads in each space type, keeping user-defined schedules.
238
238
  OpenStudio.logFree(OpenStudio::Info, 'openstudio.standards.Model', '*** Changing Lighting Loads ***')
239
239
  model.getSpaceTypes.sort.each do |space_type|
240
- set_people = false
241
- set_lights = true
242
- set_electric_equipment = false
243
- set_gas_equipment = false
244
- set_ventilation = false
245
- # For PRM, it only applies lights for now.
246
- space_type_apply_internal_loads(space_type, set_people, set_lights, set_electric_equipment, set_gas_equipment, set_ventilation)
240
+ # For PRM, only apply lights for now
241
+ space_type_apply_internal_loads(space_type, set_people: false, set_lights: true, set_electric_equipment: false, set_gas_equipment: false, set_ventilation: false)
247
242
  end
248
243
 
249
244
  # Modify the lighting schedule to handle lighting occupancy sensors
@@ -555,7 +550,7 @@ class Standard
555
550
  # the PRM-RM; Note that the PRM-RM only suggest to increase
556
551
  # air zone air flow, but the zone sizing factor in EnergyPlus
557
552
  # increase both air flow and load.
558
- umlh = OpenstudioStandards::SqlFile.model_get_annual_occupied_unmet_hours(proposed_model)
553
+ umlh = OpenstudioStandards::SqlFile.model_get_annual_occupied_unmet_hours(model)
559
554
  if umlh > 300
560
555
  model.getThermalZones.each do |thermal_zone|
561
556
  # Cooling adjustments
@@ -774,10 +769,10 @@ class Standard
774
769
  end
775
770
 
776
771
  # This is only used for the stable baseline (2016 and later)
777
- if !applicable_zones.nil? && !applicable_zones.include?(zone)
778
- # This zone is not part of the current hvac_building_type
779
- next
780
- end
772
+ if !applicable_zones.nil? && !applicable_zones.include?(zone)
773
+ # This zone is not part of the current hvac_building_type
774
+ next
775
+ end
781
776
 
782
777
  # Skip unconditioned zones
783
778
  heated = OpenstudioStandards::ThermalZone.thermal_zone_heated?(zone)
@@ -3054,11 +3049,24 @@ if !applicable_zones.nil? && !applicable_zones.include?(zone)
3054
3049
  # @return [OpenStudio::Model::Construction] construction object
3055
3050
  # @todo make return an OptionalConstruction
3056
3051
  def model_add_construction(model, construction_name, construction_props = nil, surface = nil)
3052
+ intended_surface_type = construction_props&.[]('intended_surface_type') || ''
3053
+
3057
3054
  # First check model and return construction if it already exists
3058
3055
  model.getConstructions.sort.each do |construction|
3059
3056
  if construction.name.get.to_s == construction_name
3060
3057
  OpenStudio.logFree(OpenStudio::Debug, 'openstudio.standards.Model', "Already added construction: #{construction_name}")
3061
- return construction
3058
+ valid = true
3059
+ if !surface.nil?
3060
+ if intended_surface_type == 'GroundContactFloor' && construction.iddObjectType.valueName != 'OS_Construction_FfactorGroundFloor'
3061
+ valid = false
3062
+ elsif intended_surface_type == 'GroundContactWall' && construction.iddObjectType.valueName != 'OS_Construction_CfactorUndergroundWall'
3063
+ valid = false
3064
+ end
3065
+ end
3066
+ if valid
3067
+ return construction
3068
+ end
3069
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Already added construction: '#{construction_name}' but its type '#{construction.iddObjectType.valueName}' is not valid for the intended surface type '#{intended_surface_type}'. A new construction will be created.")
3062
3070
  end
3063
3071
  end
3064
3072
 
@@ -3076,12 +3084,31 @@ if !applicable_zones.nil? && !applicable_zones.include?(zone)
3076
3084
  return OpenStudio::Model::OptionalConstruction.new
3077
3085
  end
3078
3086
 
3087
+ intended_surface_type = data["intended_surface_type"]
3088
+ intended_surface_type ||= ''
3089
+
3079
3090
  # Make a new construction and set the standards details
3080
- if data['intended_surface_type'] == 'GroundContactFloor' && !surface.nil?
3081
- construction = OpenStudio::Model::FFactorGroundFloorConstruction.new(model)
3082
- elsif data['intended_surface_type'] == 'GroundContactWall' && !surface.nil?
3083
- construction = OpenStudio::Model::CFactorUndergroundWallConstruction.new(model)
3084
- else
3091
+ is_layered_construction = true
3092
+
3093
+ if intended_surface_type == 'GroundContactFloor' && !surface.nil?
3094
+ if construction_props
3095
+ construction = OpenStudio::Model::FFactorGroundFloorConstruction.new(model)
3096
+ is_layered_construction = false
3097
+ else
3098
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Construction properties not specified for '#{construction_name}', cannot create F-Factor Ground Floor Construction. A regular construction will be created instead, and Surface '#{surface.name}' will be set to use the 'Ground' outside boundary condition (previously '#{surface.outsideBoundaryCondition}').")
3099
+ surface.setOutsideBoundaryCondition('Ground')
3100
+ end
3101
+ elsif intended_surface_type == 'GroundContactWall' && !surface.nil?
3102
+ if construction_props
3103
+ construction = OpenStudio::Model::CFactorUndergroundWallConstruction.new(model)
3104
+ is_layered_construction = false
3105
+ else
3106
+ OpenStudio.logFree(OpenStudio::Warn, 'openstudio.standards.Model', "Construction properties not specified for '#{construction_name}', cannot create C-Factor Underground Wall Construction. A regular construction will be created instead, and Surface '#{surface.name}' will be set to use the 'Ground' outside boundary condition (previously '#{surface.outsideBoundaryCondition}').")
3107
+ surface.setOutsideBoundaryCondition('Ground')
3108
+ end
3109
+ end
3110
+
3111
+ if is_layered_construction
3085
3112
  construction = OpenStudio::Model::Construction.new(model)
3086
3113
  # Add the material layers to the construction
3087
3114
  layers = OpenStudio::Model::MaterialVector.new
@@ -3096,8 +3123,6 @@ if !applicable_zones.nil? && !applicable_zones.include?(zone)
3096
3123
  construction.setName(construction_name)
3097
3124
  standards_info = construction.standardsInformation
3098
3125
 
3099
- intended_surface_type = data['intended_surface_type']
3100
- intended_surface_type ||= ''
3101
3126
  standards_info.setIntendedSurfaceType(intended_surface_type)
3102
3127
 
3103
3128
  standards_construction_type = data['standards_construction_type']