openstudio-standards 0.8.2 → 0.8.4

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 (152) hide show
  1. checksums.yaml +4 -4
  2. data/data/standards/OpenStudio_Standards-ashrae_90_1-ALL-comstock(space_types).xlsx +0 -0
  3. data/data/standards/openstudio_standards_duplicates_log.csv +7962 -0
  4. data/lib/openstudio-standards/btap/costing/README.md +502 -0
  5. data/lib/openstudio-standards/btap/costing/btap_costing.rb +473 -0
  6. data/lib/openstudio-standards/btap/costing/btap_measure_helper.rb +359 -0
  7. data/lib/openstudio-standards/btap/costing/btap_workflow.rb +117 -0
  8. data/lib/openstudio-standards/btap/costing/common_paths.rb +78 -0
  9. data/lib/openstudio-standards/btap/costing/common_resources/ConstructionProperties.csv +52 -0
  10. data/lib/openstudio-standards/btap/costing/common_resources/Constructions.csv +37 -0
  11. data/lib/openstudio-standards/btap/costing/common_resources/construction_sets.csv +1270 -0
  12. data/lib/openstudio-standards/btap/costing/common_resources/constructions_glazing.csv +61 -0
  13. data/lib/openstudio-standards/btap/costing/common_resources/constructions_opaque.csv +2256 -0
  14. data/lib/openstudio-standards/btap/costing/common_resources/costs.csv +1904 -0
  15. data/lib/openstudio-standards/btap/costing/common_resources/costs_local_factors.csv +2315 -0
  16. data/lib/openstudio-standards/btap/costing/common_resources/hvac_vent_ahu.csv +925 -0
  17. data/lib/openstudio-standards/btap/costing/common_resources/lighting.csv +364 -0
  18. data/lib/openstudio-standards/btap/costing/common_resources/lighting_sets.csv +2667 -0
  19. data/lib/openstudio-standards/btap/costing/common_resources/locations.csv +75 -0
  20. data/lib/openstudio-standards/btap/costing/common_resources/materials_glazing.csv +35 -0
  21. data/lib/openstudio-standards/btap/costing/common_resources/materials_hvac.csv +1699 -0
  22. data/lib/openstudio-standards/btap/costing/common_resources/materials_lighting.csv +267 -0
  23. data/lib/openstudio-standards/btap/costing/common_resources/materials_opaque.csv +164 -0
  24. data/lib/openstudio-standards/btap/costing/copy_test_results_files_to_expected_results.rb +11 -0
  25. data/lib/openstudio-standards/btap/costing/cost_building_from_file.rb +136 -0
  26. data/lib/openstudio-standards/btap/costing/costing_database_wrapper.rb +177 -0
  27. data/lib/openstudio-standards/btap/costing/daylighting_sensor_control_costing.rb +353 -0
  28. data/lib/openstudio-standards/btap/costing/dcv_costing.rb +314 -0
  29. data/lib/openstudio-standards/btap/costing/dummy.epw +8768 -0
  30. data/lib/openstudio-standards/btap/costing/dummy.osm +5320 -0
  31. data/lib/openstudio-standards/btap/costing/envelope_costing.rb +284 -0
  32. data/lib/openstudio-standards/btap/costing/heating_cooling_costing.rb +2584 -0
  33. data/lib/openstudio-standards/btap/costing/led_lighting_costing.rb +155 -0
  34. data/lib/openstudio-standards/btap/costing/lighting_costing.rb +209 -0
  35. data/lib/openstudio-standards/btap/costing/mech_sizing.json +502 -0
  36. data/lib/openstudio-standards/btap/costing/neb_end_use_prices.csv +42 -0
  37. data/lib/openstudio-standards/btap/costing/necb_2011_spacetype_info.csv +225 -0
  38. data/lib/openstudio-standards/btap/costing/necb_reference_runs.csv +28705 -0
  39. data/lib/openstudio-standards/btap/costing/nv_costing.rb +547 -0
  40. data/lib/openstudio-standards/btap/costing/parallel_tests.rb +92 -0
  41. data/lib/openstudio-standards/btap/costing/pv_ground_costing.rb +687 -0
  42. data/lib/openstudio-standards/btap/costing/shw_costing.rb +705 -0
  43. data/lib/openstudio-standards/btap/costing/test_list.txt +17 -0
  44. data/lib/openstudio-standards/btap/costing/test_run_all_test_locally.rb +26 -0
  45. data/lib/openstudio-standards/btap/costing/test_run_costing_tests.rb +80 -0
  46. data/lib/openstudio-standards/btap/costing/ventilation_costing.rb +2616 -0
  47. data/lib/openstudio-standards/constructions/modify.rb +2 -1
  48. data/lib/openstudio-standards/refrigeration/create_case.rb +58 -21
  49. data/lib/openstudio-standards/refrigeration/create_typical_refrigeration.rb +4 -2
  50. data/lib/openstudio-standards/refrigeration/create_walkin.rb +57 -22
  51. data/lib/openstudio-standards/refrigeration/data/refrigerated_cases.csv +31 -31
  52. data/lib/openstudio-standards/refrigeration/data/refrigerated_walkins.csv +76 -76
  53. data/lib/openstudio-standards/service_water_heating/create_typical.rb +10 -10
  54. data/lib/openstudio-standards/service_water_heating/create_water_heater.rb +10 -0
  55. data/lib/openstudio-standards/service_water_heating/create_water_heating_loop.rb +16 -3
  56. data/lib/openstudio-standards/service_water_heating/data/convert_data.rb +9 -9
  57. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.csv +49 -49
  58. data/lib/openstudio-standards/service_water_heating/data/typical_water_use_equipment.json +159 -159
  59. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXMultiSpeed.rb +7 -18
  60. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXSingleSpeed.rb +10 -20
  61. data/lib/openstudio-standards/standards/Standards.CoilCoolingDXTwoSpeed.rb +6 -15
  62. data/lib/openstudio-standards/standards/Standards.CoilCoolingWaterToAirHeatPumpEquationFit.rb +5 -6
  63. data/lib/openstudio-standards/standards/Standards.CoilDX.rb +93 -43
  64. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXMultiSpeed.rb +5 -5
  65. data/lib/openstudio-standards/standards/Standards.CoilHeatingDXSingleSpeed.rb +135 -37
  66. data/lib/openstudio-standards/standards/Standards.CoilHeatingWaterToAirHeatPumpEquationFit.rb +2 -2
  67. data/lib/openstudio-standards/standards/Standards.Model.rb +48 -13
  68. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.computer_room_acs.json +302 -140
  69. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps.json +648 -326
  70. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.heat_pumps_heating.json +371 -90
  71. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2004/data/ashrae_90_1_2004.water_heaters.json +66 -22
  72. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.computer_room_acs.json +302 -140
  73. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps.json +1012 -296
  74. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.heat_pumps_heating.json +443 -79
  75. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2007/data/ashrae_90_1_2007.water_heaters.json +66 -22
  76. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.computer_room_acs.json +302 -140
  77. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps.json +672 -306
  78. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.heat_pumps_heating.json +354 -74
  79. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2010/data/ashrae_90_1_2010.water_heaters.json +72 -24
  80. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.computer_room_acs.json +302 -140
  81. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.energy_recovery.json +8 -8
  82. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps.json +930 -604
  83. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.heat_pumps_heating.json +415 -111
  84. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2013/data/ashrae_90_1_2013.water_heaters.json +72 -24
  85. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.computer_room_acs.json +602 -140
  86. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps.json +1005 -333
  87. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.heat_pumps_heating.json +642 -88
  88. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2016/data/ashrae_90_1_2016.water_heaters.json +78 -26
  89. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.computer_room_acs.json +722 -140
  90. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps.json +1741 -426
  91. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.heat_pumps_heating.json +1108 -111
  92. data/lib/openstudio-standards/standards/ashrae_90_1/ashrae_90_1_2019/data/ashrae_90_1_2019.water_heaters.json +186 -62
  93. data/lib/openstudio-standards/standards/ashrae_90_1/data/ashrae_90_1.schedules.json +62 -232
  94. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXSingleSpeed.rb +2 -3
  95. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilCoolingDXTwoSpeed.rb +1 -1
  96. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilDX.rb +7 -18
  97. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingDXSingleSpeed.rb +9 -7
  98. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.CoilHeatingGas.rb +1 -1
  99. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm.Model.rb +2 -2
  100. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps.json +154 -69
  101. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.heat_pumps_heating.json +72 -72
  102. data/lib/openstudio-standards/standards/ashrae_90_1_prm/ashrae_90_1_prm_2019/data/ashrae_90_1_prm_2019.water_heaters.json +382 -295
  103. data/lib/openstudio-standards/standards/ashrae_90_1_prm/userdata_csv/ashrae_90_1_prm.UserData.rb +6 -1
  104. data/lib/openstudio-standards/standards/deer/data/deer.schedules.json +62 -232
  105. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/btap_pre1980.rb +2 -27
  106. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps.json +16 -0
  107. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/data/heat_pumps_heating.json +6 -0
  108. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_3_and_8_single_speed.rb +68 -27
  109. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_4.rb +64 -25
  110. data/lib/openstudio-standards/standards/necb/BTAPPRE1980/hvac_system_6.rb +9 -14
  111. data/lib/openstudio-standards/standards/necb/ECMS/hvac_systems.rb +46 -20
  112. data/lib/openstudio-standards/standards/necb/NECB2011/autozone.rb +635 -248
  113. data/lib/openstudio-standards/standards/necb/NECB2011/data/constants.json +43 -7
  114. data/lib/openstudio-standards/standards/necb/NECB2011/data/fuel_type_sets.json +7 -1
  115. data/lib/openstudio-standards/standards/necb/NECB2011/data/geometry/HighriseApartmentMult.osm +14272 -0
  116. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps.json +16 -0
  117. data/lib/openstudio-standards/standards/necb/NECB2011/data/heat_pumps_heating.json +6 -0
  118. data/lib/openstudio-standards/standards/necb/NECB2011/data/necb_2015_table_c1.json +1 -1
  119. data/lib/openstudio-standards/standards/necb/NECB2011/data/space_types.json +437 -437
  120. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems.json +516 -0
  121. data/lib/openstudio-standards/standards/necb/NECB2011/data/systems_including_sys5.json +588 -0
  122. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_namer.rb +489 -0
  123. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_1_single_speed.rb +16 -6
  124. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_2_and_5.rb +48 -5
  125. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_multi_speed.rb +2 -2
  126. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_3_and_8_single_speed.rb +35 -27
  127. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_4.rb +34 -23
  128. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_system_6.rb +8 -6
  129. data/lib/openstudio-standards/standards/necb/NECB2011/hvac_systems.rb +43 -14
  130. data/lib/openstudio-standards/standards/necb/NECB2011/necb_2011.rb +214 -25
  131. data/lib/openstudio-standards/standards/necb/NECB2011/system_fuels.rb +61 -1
  132. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps.json +16 -0
  133. data/lib/openstudio-standards/standards/necb/NECB2015/data/heat_pumps_heating.json +8 -0
  134. data/lib/openstudio-standards/standards/necb/NECB2015/data/space_types.json +636 -636
  135. data/lib/openstudio-standards/standards/necb/NECB2015/data/unitary_acs.json +38 -38
  136. data/lib/openstudio-standards/standards/necb/NECB2015/hvac_systems.rb +15 -6
  137. data/lib/openstudio-standards/standards/necb/NECB2017/data/space_types.json +636 -636
  138. data/lib/openstudio-standards/standards/necb/NECB2020/data/chillers.json +71 -71
  139. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps.json +20 -0
  140. data/lib/openstudio-standards/standards/necb/NECB2020/data/heat_pumps_heating.json +10 -0
  141. data/lib/openstudio-standards/standards/necb/README.md +343 -0
  142. data/lib/openstudio-standards/standards/necb/common/btap_data.rb +190 -28
  143. data/lib/openstudio-standards/standards/necb/common/btap_datapoint.rb +14 -5
  144. data/lib/openstudio-standards/standards/necb/common/eccc_electric_grid_intensity_20250311.csv +14 -0
  145. data/lib/openstudio-standards/standards/necb/common/nir_gas_grid_intensity_20250311.csv +14 -0
  146. data/lib/openstudio-standards/standards/necb/common/system_types.yaml +0 -0
  147. data/lib/openstudio-standards/utilities/logging.rb +18 -14
  148. data/lib/openstudio-standards/utilities/simulation.rb +3 -2
  149. data/lib/openstudio-standards/version.rb +1 -1
  150. data/lib/openstudio-standards/weather/modify.rb +2 -2
  151. data/lib/openstudio-standards.rb +12 -0
  152. metadata +56 -3
@@ -52,7 +52,10 @@ class BTAPPRE1980
52
52
  air_loop = add_system_3_and_8_airloop(heating_coil_type,
53
53
  model,
54
54
  system_data,
55
- determine_control_zone(zones))
55
+ determine_control_zone(zones),
56
+ necb_reference_hp: necb_reference_hp,
57
+ necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel,
58
+ hw_loop: hw_loop)
56
59
  # Add Zone equipment
57
60
  zones.each do |zone| # Zone sizing temperature
58
61
  sizing_zone = zone.sizingZone
@@ -60,8 +63,13 @@ class BTAPPRE1980
60
63
  sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
61
64
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
62
65
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
63
- sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
64
- sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
66
+ if necb_reference_hp
67
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
68
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
69
+ else
70
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
71
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
72
+ end
65
73
  add_sys3_and_8_zone_equip(air_loop,
66
74
  baseboard_type,
67
75
  hw_loop,
@@ -70,7 +78,7 @@ class BTAPPRE1980
70
78
  end
71
79
  else
72
80
  zones.each do |zone|
73
- air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone)
81
+ air_loop = add_system_3_and_8_airloop(heating_coil_type, model, system_data, zone, necb_reference_hp: necb_reference_hp, necb_reference_hp_supp_fuel: necb_reference_hp_supp_fuel, hw_loop: hw_loop)
74
82
  add_sys3_and_8_zone_equip(air_loop,
75
83
  baseboard_type,
76
84
  hw_loop,
@@ -83,19 +91,22 @@ class BTAPPRE1980
83
91
  sys_name_pars = {}
84
92
  sys_name_pars['sys_hr'] = 'none'
85
93
  sys_name_pars['sys_clg'] = 'dx'
94
+ sys_name_pars['sys_clg'] = 'ashp' if necb_reference_hp
86
95
  sys_name_pars['sys_htg'] = heating_coil_type
96
+ sys_name_pars['sys_htg'] = 'ashp>c-g' if necb_reference_hp && (necb_reference_hp_supp_fuel == "NaturalGas" || necb_reference_hp_supp_fuel == "Gas")
97
+ sys_name_pars['sys_htg'] = 'ashp>c-e' if necb_reference_hp && (necb_reference_hp_supp_fuel == "Electricity" || necb_reference_hp_supp_fuel == "Electric" || necb_reference_hp_supp_fuel == "FuelOilNo2")
98
+ sys_name_pars['sys_htg'] = 'ashp>c-hw' if necb_reference_hp && (necb_reference_hp_supp_fuel == "Hot Water" || necb_reference_hp_supp_fuel == "HotWater")
87
99
  sys_name_pars['sys_sf'] = 'cv'
88
100
  sys_name_pars['zone_htg'] = baseboard_type
89
101
  sys_name_pars['zone_clg'] = 'none'
90
102
  sys_name_pars['sys_rf'] = 'none'
91
- assign_base_sys_name(air_loop,
103
+ return assign_base_sys_name(air_loop: air_loop,
92
104
  sys_abbr: 'sys_3',
93
105
  sys_oa: 'mixed',
94
106
  sys_name_pars: sys_name_pars)
95
- return true
96
107
  end
97
108
 
98
- def add_system_3_and_8_airloop(heating_coil_type, model, system_data, control_zone)
109
+ def add_system_3_and_8_airloop(heating_coil_type, model, system_data, control_zone, necb_reference_hp:false, necb_reference_hp_supp_fuel:'DefaultFuel', necb_reference_hp_fancoil: false, hw_loop: nil)
99
110
  # System Type 3: PSZ-AC
100
111
  # This measure creates:
101
112
  # -a constant volume packaged single-zone A/C unit
@@ -118,25 +129,43 @@ class BTAPPRE1980
118
129
  sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
119
130
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
120
131
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
121
- sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
122
- sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
132
+ if necb_reference_hp
133
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
134
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
135
+ else
136
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
137
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
138
+ end
123
139
 
124
140
  fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
125
141
 
142
+ # Set up DX coil
143
+ if necb_reference_hp #NECB curve characteristics
144
+ clg_coil = add_onespeed_DX_coil(model, always_on)
145
+ clg_coil.setName('CoilCoolingDXSingleSpeed_ashp')
146
+ else
147
+ clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model) #sets default OS curve (but will be replaced with NECB curves later)
148
+ clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
149
+ end
126
150
  # Create a return fan for BTAPPRE1980 system 3 systems
127
151
  return_fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
128
152
  return_fan.setName('Sys3 Return Fan')
129
153
  return_fan.setEndUseSubcategory('Return_Fan')
130
154
 
155
+ raise("Flag 'necb_reference_hp' is set to true while parameter 'heating_coil_type' is not set to DX") if (necb_reference_hp && (heating_coil_type != 'DX'))
131
156
  case heating_coil_type
132
- when 'Electric' # electric coil
157
+ when 'Electric', 'Electricity', "FuelOilNo2" # electric coil
133
158
  htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
134
- when 'Gas'
159
+ when 'Gas', 'NaturalGas'
135
160
  htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
161
+ when 'Hot Water', 'HotWater'
162
+ htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
163
+ hw_loop.addDemandBranchForComponent(htg_coil)
136
164
  when 'DX'
137
- htg_coil = OpenStudio::Model::CoilHeatingDXSingleSpeed.new(model)
138
- supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
165
+ #create main DX heating coil
166
+ htg_coil = add_onespeed_htg_DX_coil(model, always_on)
139
167
  htg_coil.setMinimumOutdoorDryBulbTemperatureforCompressorOperation(system_data[:MinimumOutdoorDryBulbTemperatureforCompressorOperation])
168
+ htg_coil.setName('CoilHeatingDXSingleSpeed_ashp')
140
169
  sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
141
170
  sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
142
171
  else
@@ -145,9 +174,7 @@ class BTAPPRE1980
145
174
 
146
175
  # TO DO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
147
176
 
148
- # Set up DX coil with NECB performance curve characteristics;
149
- clg_coil = OpenStudio::Model::CoilCoolingDXSingleSpeed.new(model)
150
- clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
177
+
151
178
 
152
179
  # oa_controller
153
180
  oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
@@ -163,17 +190,31 @@ class BTAPPRE1980
163
190
  # Add the components to the air loop
164
191
  # in order from closest to zone to furthest from zone
165
192
  supply_inlet_node = air_loop.supplyInletNode
166
- if heating_coil_type == 'DX'
167
- air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
168
- air_to_air_heatpump.setName("#{control_zone.name} ASHP")
169
- air_to_air_heatpump.setControllingZone(control_zone)
170
- air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
171
- air_to_air_heatpump.addToNode(supply_inlet_node)
172
- else
173
- fan.addToNode(supply_inlet_node)
174
- htg_coil.addToNode(supply_inlet_node)
175
- clg_coil.addToNode(supply_inlet_node)
193
+ fan.addToNode(supply_inlet_node)
194
+ if necb_reference_hp
195
+ #create supplemental heating coil based on default regional fuel type
196
+ if necb_reference_hp_supp_fuel == 'DefaultFuel'
197
+ epw = OpenStudio::EpwFile.new(model.weatherFile.get.path.get)
198
+ necb_reference_hp_supp_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.stateProvinceRegion) }['fueltype_set']
199
+ end
200
+ if necb_reference_hp_supp_fuel == 'NaturalGas' || necb_reference_hp_supp_fuel == 'Gas'
201
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
202
+ elsif necb_reference_hp_supp_fuel == 'Electricity' || necb_reference_hp_supp_fuel == 'Electric' || necb_reference_hp_supp_fuel == 'FuelOilNo2'
203
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
204
+ elsif necb_reference_hp_supp_fuel == 'Hot Water' || necb_reference_hp_supp_fuel == "HotWater"
205
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
206
+ hw_loop.addDemandBranchForComponent(supplemental_htg_coil)
207
+ else
208
+ raise('Invalid fuel type selected for heat pump supplemental coil')
209
+ end
210
+ #air_to_air_heatpump.setName("#{control_zone.name} ASHP")
211
+ #air_to_air_heatpump.setControllingZone(control_zone)
212
+ #air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
213
+ #air_to_air_heatpump.addToNode(supply_inlet_node)
214
+ supplemental_htg_coil.addToNode(supply_inlet_node)
176
215
  end
216
+ htg_coil.addToNode(supply_inlet_node)
217
+ clg_coil.addToNode(supply_inlet_node)
177
218
  oa_system.addToNode(supply_inlet_node)
178
219
 
179
220
  # Find return air node and add a return air fan to it for BTAPPRE1980 system 3 airloops.
@@ -195,8 +236,8 @@ class BTAPPRE1980
195
236
  hw_loop, model,
196
237
  zone)
197
238
  always_on = model.alwaysOnDiscreteSchedule
239
+ add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
198
240
  diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
199
241
  air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
200
- add_zone_baseboards(baseboard_type: baseboard_type, hw_loop: hw_loop, model: model, zone: zone)
201
242
  end
202
243
  end
@@ -37,6 +37,9 @@ class BTAPPRE1980
37
37
  system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference] = 11.0
38
38
  system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod] = 'TemperatureDifference'
39
39
  system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference] = 21.0
40
+ system_data[:ZoneHeatingDesignSupplyAirTemperature] = 43.0
41
+ system_data[:ZoneDXCoolingSizingFactor] = 1.0
42
+ system_data[:ZoneDXHeatingSizingFactor] = 1.3
40
43
  system_data[:ZoneCoolingSizingFactor] = 1.1
41
44
  system_data[:ZoneHeatingSizingFactor] = 1.3
42
45
 
@@ -53,9 +56,7 @@ class BTAPPRE1980
53
56
  # NOTE: This is the same as system type 3 (single zone make-up air unit and single zone rooftop unit are both PSZ systems)
54
57
  # SHOULD WE COMBINE sys3 and sys4 into one script?
55
58
  #
56
- # control_zone = determine_control_zone(zones)
57
- # Todo change this when control zone method is working.
58
- control_zone = zones.first
59
+ control_zone = determine_control_zone(zones)
59
60
 
60
61
  always_on = model.alwaysOnDiscreteSchedule
61
62
 
@@ -73,27 +74,37 @@ class BTAPPRE1980
73
74
  sizing_zone.setZoneCoolingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneCoolingDesignSupplyAirTemperatureInputMethod])
74
75
  sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
75
76
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
76
- sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
77
- sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
78
- sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
77
+ sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
78
+ if necb_reference_hp
79
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
80
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
81
+ else
82
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
83
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
84
+ end
79
85
 
80
86
  fan = OpenStudio::Model::FanConstantVolume.new(model, always_on)
81
87
 
82
- if heating_coil_type == 'Electric' # electric coil
83
- htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
84
- end
88
+ # Set up DX coil with NECB performance curve characteristics;
89
+ clg_coil = add_onespeed_DX_coil(model, always_on)
90
+ clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
91
+ clg_coil.setName('CoilCoolingDXSingleSpeed_ashp') if necb_reference_hp
85
92
 
86
- if heating_coil_type == 'Gas'
93
+ raise("Flag 'necb_reference_hp' is set to true while parameter 'heating_coil_type' is not set to DX") if (necb_reference_hp && (heating_coil_type != 'DX'))
94
+ if heating_coil_type == 'Electric' || heating_coil_type == 'FuelOilNo2' # electric coil
95
+ htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
96
+ elsif heating_coil_type == 'Gas'
87
97
  htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
98
+ elsif heating_coil_type == 'DX'
99
+ htg_coil = add_onespeed_htg_DX_coil(model, always_on)
100
+ htg_coil.setName('CoilHeatingDXSingleSpeed_ashp')
101
+ elsif heating_coil_type == 'Hot Water'
102
+ htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
103
+ hw_loop.addDemandBranchForComponent(htg_coil)
88
104
  end
89
105
 
90
106
  # TO DO: other fuel-fired heating coil types? (not available in OpenStudio/E+ - may need to play with efficiency to mimic other fuel types)
91
107
 
92
- # Set up DX coil with NECB performance curve characteristics;
93
-
94
- clg_coil = add_onespeed_DX_coil(model, always_on)
95
- clg_coil.setName('CoilCoolingDXSingleSpeed_dx')
96
-
97
108
  # oa_controller
98
109
  oa_controller = OpenStudio::Model::ControllerOutdoorAir.new(model)
99
110
  oa_controller.autosizeMinimumOutdoorAirFlowRate
@@ -109,10 +120,33 @@ class BTAPPRE1980
109
120
  # in order from closest to zone to furthest from zone
110
121
  supply_inlet_node = air_loop.supplyInletNode
111
122
  fan.addToNode(supply_inlet_node)
123
+ if necb_reference_hp
124
+ #create supplemental heating coil based on default regional fuel type
125
+ if necb_reference_hp_supp_fuel == 'DefaultFuel'
126
+ epw = OpenStudio::EpwFile.new(model.weatherFile.get.path.get)
127
+ necb_reference_hp_supp_fuel = @standards_data['regional_fuel_use'].detect { |fuel_sources| fuel_sources['state_province_regions'].include?(epw.stateProvinceRegion) }['fueltype_set']
128
+ end
129
+ if necb_reference_hp_supp_fuel == 'NaturalGas'
130
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingGas.new(model, always_on)
131
+ elsif necb_reference_hp_supp_fuel == 'Electricity' or necb_reference_hp_supp_fuel == 'FuelOilNo2'
132
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
133
+ elsif necb_reference_hp_supp_fuel == 'Hot Water'
134
+ supplemental_htg_coil = OpenStudio::Model::CoilHeatingWater.new(model, always_on)
135
+ hw_loop.addDemandBranchForComponent(supplemental_htg_coil)
136
+ else
137
+ raise('Invalid fuel type selected for heat pump supplemental coil')
138
+ end
139
+ supplemental_htg_coil.addToNode(supply_inlet_node)
140
+ # This method will seem like an error in number of args..but this is due to swig voodoo.
141
+ #air_to_air_heatpump = OpenStudio::Model::AirLoopHVACUnitaryHeatPumpAirToAir.new(model, always_on, fan, htg_coil, clg_coil, supplemental_htg_coil)
142
+ #air_to_air_heatpump.setName("#{control_zone.name} ASHP")
143
+ #air_to_air_heatpump.setControllingZone(control_zone)
144
+ #air_to_air_heatpump.setSupplyAirFanOperatingModeSchedule(always_on)
145
+ #air_to_air_heatpump.addToNode(supply_inlet_node)
146
+ end
112
147
  htg_coil.addToNode(supply_inlet_node)
113
148
  clg_coil.addToNode(supply_inlet_node)
114
149
  oa_system.addToNode(supply_inlet_node)
115
-
116
150
  # Add a setpoint manager single zone reheat to control the
117
151
  # supply air temperature based on the needs of this zone
118
152
  setpoint_mgr_single_zone_reheat = OpenStudio::Model::SetpointManagerSingleZoneReheat.new(model)
@@ -144,34 +178,39 @@ class BTAPPRE1980
144
178
  sizing_zone.setZoneCoolingDesignSupplyAirTemperatureDifference(system_data[:ZoneCoolingDesignSupplyAirTemperatureDifference])
145
179
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureInputMethod(system_data[:ZoneHeatingDesignSupplyAirTemperatureInputMethod])
146
180
  sizing_zone.setZoneHeatingDesignSupplyAirTemperatureDifference(system_data[:ZoneHeatingDesignSupplyAirTemperatureDifference])
147
- sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
148
- sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
181
+ if necb_reference_hp
182
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneDXCoolingSizingFactor])
183
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneDXHeatingSizingFactor])
184
+ else
185
+ sizing_zone.setZoneCoolingSizingFactor(system_data[:ZoneCoolingSizingFactor])
186
+ sizing_zone.setZoneHeatingSizingFactor(system_data[:ZoneHeatingSizingFactor])
187
+ end
149
188
  # Create a diffuser and attach the zone/diffuser pair to the air loop
150
189
  # diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model,always_on)
151
- diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
152
- air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
153
190
  add_zone_baseboards(baseboard_type: baseboard_type,
154
191
  hw_loop: hw_loop,
155
192
  model: model,
156
193
  zone: zone)
157
194
  add_exhaust_fan(zone: zone, model: model, name: exhaust_fan_name)
195
+ diffuser = OpenStudio::Model::AirTerminalSingleDuctUncontrolled.new(model, always_on)
196
+ air_loop.addBranchForZone(zone, diffuser.to_StraightComponent)
158
197
  end
159
- # zone loop
160
-
161
- # Modifying airloop name
162
198
  sys_name_pars = {}
163
199
  sys_name_pars['sys_hr'] = 'none'
164
200
  sys_name_pars['sys_clg'] = 'dx'
201
+ sys_name_pars['sys_clg'] = 'ashp' if necb_reference_hp
165
202
  sys_name_pars['sys_htg'] = heating_coil_type
203
+ sys_name_pars['sys_htg'] = 'ashp>c-g' if necb_reference_hp and necb_reference_hp_supp_fuel == "NaturalGas"
204
+ sys_name_pars['sys_htg'] = 'ashp>c-e' if necb_reference_hp and necb_reference_hp_supp_fuel == "Electricity"
205
+ sys_name_pars['sys_htg'] = 'ashp>c-hw' if necb_reference_hp and necb_reference_hp_supp_fuel == "Hot Water"
166
206
  sys_name_pars['sys_sf'] = 'cv'
167
207
  sys_name_pars['zone_htg'] = baseboard_type
168
208
  sys_name_pars['zone_clg'] = 'none'
169
209
  sys_name_pars['sys_rf'] = 'none'
170
- assign_base_sys_name(air_loop,
210
+ return assign_base_sys_name(air_loop: air_loop,
171
211
  sys_abbr: 'sys_4',
172
212
  sys_oa: 'mixed',
173
213
  sys_name_pars: sys_name_pars)
174
214
 
175
- return true
176
215
  end
177
216
  end
@@ -131,18 +131,18 @@ class BTAPPRE1980
131
131
  reheat_coil = OpenStudio::Model::CoilHeatingElectric.new(model, always_on)
132
132
  end
133
133
 
134
+ # Set zone baseboards
135
+ add_zone_baseboards(model: model,
136
+ zone: zone,
137
+ baseboard_type: baseboard_type,
138
+ hw_loop: hw_loop)
139
+
134
140
  vav_terminal = OpenStudio::Model::AirTerminalSingleDuctVAVReheat.new(model, always_on, reheat_coil)
135
141
  air_loop.addBranchForZone(zone, vav_terminal.to_StraightComponent)
136
142
  # NECB2011 minimum zone airflow setting
137
143
  vav_terminal.setFixedMinimumAirFlowRate(system_data[:ZoneVAVMinFlowFactorPerFloorArea] * zone.floorArea)
138
144
  vav_terminal.setMaximumReheatAirTemperature(system_data[:ZoneVAVMaxReheatTemp])
139
145
  vav_terminal.setDamperHeatingAction(system_data[:ZoneVAVDamperAction])
140
-
141
- # Set zone baseboards
142
- add_zone_baseboards(model: model,
143
- zone: zone,
144
- baseboard_type: baseboard_type,
145
- hw_loop: hw_loop)
146
146
  end
147
147
 
148
148
  # Modifying airloop name.
@@ -154,17 +154,15 @@ class BTAPPRE1980
154
154
  sys_name_pars['zone_htg'] = baseboard_type
155
155
  sys_name_pars['zone_clg'] = 'none'
156
156
  sys_name_pars['sys_rf'] = 'vv'
157
- assign_base_sys_name(air_loop,
157
+ assign_base_sys_name(air_loop: air_loop,
158
158
  sys_abbr: 'sys_6',
159
159
  sys_oa: 'mixed',
160
160
  sys_name_pars: sys_name_pars)
161
161
  end
162
+ # next story
162
163
  end
163
- # next story
164
-
165
164
  # for debugging
166
165
  # puts "end add_sys6_multi_zone_built_up_with_baseboard_heating"
167
-
168
166
  return true
169
167
  end
170
168
 
@@ -227,7 +225,6 @@ class BTAPPRE1980
227
225
  # Make a Packaged VAV w/ PFP Boxes for each story of the building
228
226
  model.getBuildingStorys.sort.each do |story|
229
227
  unless (OpenstudioStandards::Geometry.building_story_get_thermal_zones(story) & zones).empty?
230
-
231
228
  air_loop = common_air_loop(model: model, system_data: system_data)
232
229
  air_loop.setName(system_data[:name])
233
230
  air_loop_sizing = air_loop.sizingSystem
@@ -323,12 +320,10 @@ class BTAPPRE1980
323
320
  hw_loop: hw_loop)
324
321
  end
325
322
  end
323
+ # next story
326
324
  end
327
- # next story
328
-
329
325
  # for debugging
330
326
  # puts "end add_sys6_multi_zone_built_up_with_baseboard_heating"
331
-
332
327
  return true
333
328
  end
334
329
  end
@@ -296,6 +296,7 @@ class ECMS
296
296
  outdoor_vrf_unit.setMinimumHeatPumpPartLoadRatio(0.5)
297
297
  outdoor_vrf_unit.setCondenserType(condenser_type)
298
298
  outdoor_vrf_unit.setCrankcaseHeaterPowerperCompressor(1.0e-6)
299
+ outdoor_vrf_unit.setMinimumOutdoorTemperatureinCoolingMode(-10)
299
300
  heat_defrost_eir_ft = nil
300
301
  if ecm_name
301
302
  search_criteria = {}
@@ -516,7 +517,7 @@ class ECMS
516
517
 
517
518
  # Create one hot-water loop for hot-water baseboards if required
518
519
  hw_loop = nil
519
- hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water'
520
+ hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water' || standard.fuel_type_set.force_airloop_hot_water
520
521
 
521
522
  # Update system zones map if needed
522
523
  system_zones_map = update_system_zones_map_keys(system_zones_map,'sys_1')
@@ -537,6 +538,7 @@ class ECMS
537
538
  system_doas_flags: system_doas_flags)
538
539
  sys_supp_htg_eqpt_type = 'coil_electric'
539
540
  sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
541
+ sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
540
542
  airloop,clg_dx_coil,htg_dx_coil,return_fan = add_air_system(model: model,
541
543
  zones: zones,
542
544
  sys_abbr: sys_info['sys_abbr'],
@@ -547,7 +549,8 @@ class ECMS
547
549
  sys_clg_eqpt_type: air_sys_eqpt_type,
548
550
  sys_supp_fan_type: sys_info['sys_supp_fan_type'],
549
551
  sys_ret_fan_type: sys_info['sys_ret_fan_type'],
550
- sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
552
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
553
+ hw_loop: hw_loop)
551
554
  # Appy performance curves
552
555
  if air_sys_eqpt_type == 'ccashp'
553
556
  eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
@@ -740,7 +743,7 @@ class ECMS
740
743
 
741
744
  # =============================================================================================================================
742
745
  # create air system heating equipment
743
- def create_air_sys_htg_eqpt(model, htg_eqpt_type)
746
+ def create_air_sys_htg_eqpt(model, htg_eqpt_type, hw_loop = nil)
744
747
  always_on = model.alwaysOnDiscreteSchedule
745
748
  htg_eqpt = nil
746
749
  case htg_eqpt_type.downcase
@@ -769,6 +772,7 @@ class ECMS
769
772
  when 'coil_hw'
770
773
  htg_eqpt = OpenStudio::Model::CoilHeatingWater.new(model)
771
774
  htg_eqpt.setName('CoilHeatingWater')
775
+ hw_loop.addDemandBranchForComponent(htg_eqpt) unless hw_loop.nil?
772
776
  end
773
777
 
774
778
  return htg_eqpt
@@ -786,7 +790,8 @@ class ECMS
786
790
  sys_clg_eqpt_type:,
787
791
  sys_supp_fan_type:,
788
792
  sys_ret_fan_type:,
789
- sys_setpoint_mgr_type:)
793
+ sys_setpoint_mgr_type:,
794
+ hw_loop: nil)
790
795
 
791
796
  # create all the needed components and the air loop
792
797
  airloop = create_airloop(model, sys_vent_type)
@@ -796,7 +801,7 @@ class ECMS
796
801
  return_fan = create_air_sys_fan(model, sys_ret_fan_type)
797
802
  return_fan.setName('Return Fan') if return_fan
798
803
  htg_eqpt = create_air_sys_htg_eqpt(model, sys_htg_eqpt_type)
799
- supp_htg_eqpt = create_air_sys_htg_eqpt(model, sys_supp_htg_eqpt_type)
804
+ supp_htg_eqpt = create_air_sys_htg_eqpt(model, sys_supp_htg_eqpt_type, hw_loop)
800
805
  clg_eqpt = create_air_sys_clg_eqpt(model, sys_clg_eqpt_type)
801
806
  # add components to the air loop
802
807
  clg_eqpt.addToNode(airloop.supplyOutletNode) if clg_eqpt
@@ -823,7 +828,10 @@ class ECMS
823
828
  sys_name_pars['sys_rf'] = 'none'
824
829
  sys_name_pars['sys_rf'] = 'cv' if sys_ret_fan_type == 'constant_volume'
825
830
  sys_name_pars['sys_rf'] = 'vv' if sys_ret_fan_type == 'variable_volume'
826
- assign_base_sys_name(airloop, sys_abbr: sys_abbr, sys_oa: sys_vent_type, sys_name_pars: sys_name_pars)
831
+ assign_base_sys_name( air_loop: airloop,
832
+ sys_abbr: sys_abbr,
833
+ sys_oa: sys_vent_type,
834
+ sys_name_pars: sys_name_pars)
827
835
  return airloop, clg_eqpt, htg_eqpt, return_fan
828
836
  end
829
837
 
@@ -1236,11 +1244,12 @@ class ECMS
1236
1244
 
1237
1245
  # Create one hot-water loop for hot-water baseboards if required
1238
1246
  hw_loop = nil
1239
- hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water'
1247
+ hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water' || standard.fuel_type_set.force_airloop_hot_water
1240
1248
 
1241
1249
  # Set supplemental heating for air loop
1242
1250
  sys_supp_htg_eqpt_type = 'coil_electric'
1243
1251
  sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
1252
+ sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
1244
1253
  systems = []
1245
1254
  system_zones_map.sort.each do |sys_name, zones|
1246
1255
  sys_info = air_sys_comps_assumptions(sys_name: sys_name,
@@ -1258,7 +1267,8 @@ class ECMS
1258
1267
  sys_clg_eqpt_type: 'ccashp',
1259
1268
  sys_supp_fan_type: sys_info['sys_supp_fan_type'],
1260
1269
  sys_ret_fan_type: sys_info['sys_ret_fan_type'],
1261
- sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type']
1270
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
1271
+ hw_loop: hw_loop
1262
1272
  )
1263
1273
  # Apply performance curves
1264
1274
  eqpt_name = 'Mitsubishi_Hyper_Heating_VRF_Outdoor_Unit RTU'
@@ -1417,12 +1427,16 @@ class ECMS
1417
1427
  ecm_system_zones_map_option:,
1418
1428
  standard:)
1419
1429
  hw_loop = nil
1430
+ if standard.fuel_type_set.force_airloop_hot_water || standard.fuel_type_set.necb_reference_hp_supp_fuel.to_s.downcase == "hot water"
1431
+ hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set)
1432
+ end
1420
1433
 
1421
1434
  # Get the heating fuel type from the system fuels object defined by the standards object
1422
1435
  heating_fuel = standard.fuel_type_set.ecm_fueltype
1423
1436
  # Set supplemental heaing for airloop
1424
1437
  sys_supp_htg_eqpt_type = 'coil_electric'
1425
1438
  sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
1439
+ sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water || standard.fuel_type_set.necb_reference_hp_supp_fuel.to_s.downcase == "hot water"
1426
1440
  # Update system zones map if needed
1427
1441
  system_zones_map = update_system_zones_map_keys(system_zones_map,'sys_1')
1428
1442
  system_zones_map = update_system_zones_map(model,system_zones_map,ecm_system_zones_map_option,'sys_1') if ecm_system_zones_map_option != 'NECB_Default'
@@ -1445,7 +1459,8 @@ class ECMS
1445
1459
  sys_clg_eqpt_type: 'ashp',
1446
1460
  sys_supp_fan_type: sys_info['sys_supp_fan_type'],
1447
1461
  sys_ret_fan_type: sys_info['sys_ret_fan_type'],
1448
- sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
1462
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
1463
+ hw_loop: hw_loop)
1449
1464
  eqpt_name = 'HS11_PTHP'
1450
1465
  coil_cooling_dx_single_speed_apply_curves(clg_dx_coil,eqpt_name)
1451
1466
  coil_heating_dx_single_speed_apply_curves(htg_dx_coil,eqpt_name)
@@ -1488,7 +1503,7 @@ class ECMS
1488
1503
  # =============================================================================================================================
1489
1504
  # Apply efficiencies and performance curves for ECM "hs11_ashp_pthp"
1490
1505
  def apply_efficiency_ecm_hs11_ashp_pthp(model,standard)
1491
- fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric backup heating coil capacity assigned to dx heating coil
1506
+ fr_backup_coil_cap_as_dx_coil_cap = 0.5 # fraction of electric or hot-water backup heating coil capacity assigned to dx heating coil
1492
1507
  apply_efficiency_ecm_hs12_ashp_baseboard(model,standard)
1493
1508
  pthp_eqpt_name = 'HS11_PTHP'
1494
1509
  model.getAirLoopHVACs.sort.each do |isys|
@@ -1568,11 +1583,12 @@ class ECMS
1568
1583
 
1569
1584
  # Create one hot-water loop for hot-water baseboards if required
1570
1585
  hw_loop = nil
1571
- hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water'
1586
+ hw_loop = add_hotwater_loop(model: model, fuel_type_set: standard.fuel_type_set) if standard.fuel_type_set.baseboard_type == 'Hot Water' || standard.fuel_type_set.force_airloop_hot_water
1572
1587
 
1573
1588
  # Set supplemental heating fuel for airloop
1574
1589
  sys_supp_htg_eqpt_type = 'coil_electric'
1575
1590
  sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
1591
+ sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
1576
1592
  systems = []
1577
1593
  system_zones_map.sort.each do |sys_name, zones|
1578
1594
  sys_info = air_sys_comps_assumptions(sys_name: sys_name,
@@ -1589,7 +1605,8 @@ class ECMS
1589
1605
  sys_clg_eqpt_type: 'ashp',
1590
1606
  sys_supp_fan_type: sys_info['sys_supp_fan_type'],
1591
1607
  sys_ret_fan_type: sys_info['sys_ret_fan_type'],
1592
- sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'])
1608
+ sys_setpoint_mgr_type: sys_info['sys_setpoint_mgr_type'],
1609
+ hw_loop: hw_loop)
1593
1610
  eqpt_name = 'NECB2015_ASHP'
1594
1611
  coil_cooling_dx_single_speed_apply_curves(clg_dx_coil,eqpt_name)
1595
1612
  coil_heating_dx_single_speed_apply_curves(htg_dx_coil,eqpt_name)
@@ -1814,7 +1831,7 @@ class ECMS
1814
1831
  loop_heat_rej_eqpt_type: 'none',
1815
1832
  loop_pump_type: 'variable_speed',
1816
1833
  loop_spm_type: 'Scheduled',
1817
- loop_setpoint: 50.0,
1834
+ loop_setpoint: 60.0,
1818
1835
  loop_temp_diff: 5.0)
1819
1836
  model.getCoilHeatingWaters.sort.each {|coil| hw_loop.addDemandBranchForComponent(coil)}
1820
1837
  hcapf_curve_name = "HEATPUMP_WATERTOWATER_HCAPF"
@@ -2124,7 +2141,7 @@ class ECMS
2124
2141
  loop_heat_rej_eqpt_type: 'none',
2125
2142
  loop_pump_type: 'variable_speed',
2126
2143
  loop_spm_type: 'Scheduled',
2127
- loop_setpoint: 50.0,
2144
+ loop_setpoint: 60.0,
2128
2145
  loop_temp_diff: 5.0)
2129
2146
  # set additional parameters for heating heat pump
2130
2147
  hw_loop_htg_eqpt.setCondenserType('AirSoure')
@@ -2152,7 +2169,7 @@ class ECMS
2152
2169
  hw_boilers.reverse().each {|boiler| boiler.addToNode(hw_loop_htg_eqpt_outlet_node)}
2153
2170
  # add setpoint manager at the exit of the heat pump heating comp
2154
2171
  sch = OpenStudio::Model::ScheduleConstant.new(model)
2155
- sch.setValue(50.0)
2172
+ sch.setValue(60.0)
2156
2173
  spm = OpenStudio::Model::SetpointManagerScheduled.new(model,sch)
2157
2174
  spm.setName("HeatPumpHtgSetpointManager")
2158
2175
  spm.addToNode(hw_loop_htg_eqpt_outlet_node)
@@ -2333,6 +2350,7 @@ class ECMS
2333
2350
  # Set supplemental heaing for airloop
2334
2351
  sys_supp_htg_eqpt_type = 'coil_electric'
2335
2352
  sys_supp_htg_eqpt_type = 'coil_gas' if heating_fuel == 'NaturalGas'
2353
+ sys_supp_htg_eqpt_type = 'coil_hw' if standard.fuel_type_set.force_airloop_hot_water
2336
2354
  # call ecm HS15 to add the air loop
2337
2355
  add_ecm_hs15_cawhp_fancoils(model: model,
2338
2356
  system_zones_map: system_zones_map,
@@ -3864,15 +3882,23 @@ class ECMS
3864
3882
  boiler_fueltype = standard.fuel_type_set.boiler_fueltype
3865
3883
  backup_boiler_fueltype = standard.fuel_type_set.backup_boiler_fueltype
3866
3884
  baseboard_type = standard.fuel_type_set.baseboard_type
3885
+ heating_coil_type_sys2 = standard.fuel_type_set.heating_coil_type_sys2
3886
+ heating_coil_type_sys3 = standard.fuel_type_set.heating_coil_type_sys3
3887
+ heating_coil_type_sys4 = standard.fuel_type_set.heating_coil_type_sys4
3888
+ heating_coil_type_sys6 = standard.fuel_type_set.heating_coil_type_sys6
3867
3889
  mau_heating_coil_type = 'none'
3868
3890
 
3869
3891
  # Create the hot water loop if necessary.
3870
3892
  hw_loop = standard.create_hw_loop_if_required(
3871
- baseboard_type,
3872
- boiler_fueltype,
3873
- backup_boiler_fueltype,
3874
- mau_heating_coil_type,
3875
- model
3893
+ baseboard_type: baseboard_type,
3894
+ boiler_fueltype: boiler_fueltype,
3895
+ backup_boiler_fueltype: backup_boiler_fueltype,
3896
+ mau_heating_coil_type: mau_heating_coil_type,
3897
+ model: model,
3898
+ heating_coil_type_sys2: heating_coil_type_sys2,
3899
+ heating_coil_type_sys3: heating_coil_type_sys3,
3900
+ heating_coil_type_sys4: heating_coil_type_sys4,
3901
+ heating_coil_type_sys6: heating_coil_type_sys6
3876
3902
  )
3877
3903
 
3878
3904
  # Add baseboard heaters to each heated zone.