Schema Version: 0.0.23
Mandatory Rule: True
Rule ID: 19-14
Rule Description: For baseline system types 1-8 and 11-13, if return or relief fans are specified in the proposed design, the baseline building design shall also be modeled with fans serving the same functions and sized for the baseline system supply fan air quantity less the minimum outdoor air, or 90% of the supply fan air quantity, whichever is larger.
Rule Assertion: Options are Pass/Fail/NOT_APPLICABLE/UNDETERMINED
Appendix G Section: G3.1.2.8.1 Excluding Exceptions 1 and 2 (I don't think these are relevant to this part of G3.1.2.8.1)
90.1 Section Reference: None
Data Lookup: None
Evaluation Context: Each HeatingVentilatingAirConditioningSystem
Applicability Checks:
- Applies to baseline HVAC system types 1-8 and 11-13.
Function Calls:
- get_baseline_system_types()
- baseline_system_type_compare()
- get_dict_of_zones_and_terminal_units_served_by_hvac_sys()
- get_zone_supply_return_exhaust_relief_terminal_fan_power_dict()
- match_data_element()
- get_component_by_id()
- get_fan_system_object_supply_return_exhaust_relief_total_power_flow()
Applicability Check 1 - Check if there are any Applicable Baseline System Types in the Project at All
- Create a list of the target system types:
target_system_types = [HVAC_SYS.SYS_1, HVAC_SYS.SYS_2, HVAC_SYS.SYS_3, HVAC_SYS.SYS_4, HVAC_SYS.SYS_5, HVAC_SYS.SYS_6, HVAC_SYS.SYS_7, HVAC_SYS.SYS_8, HVAC_SYS.SYS_11_1, HVAC_SYS.SYS_12, HVAC_SYS.SYS_13]
- Create dictionary of baseline system types:
baseline_system_types_dict = get_baseline_system_types(B_RMI)
- Check if B-RMR is modeled with at least one applicable air-side system, if yes then carry on, if no then NOT_APPLICABLE for the project:
if any(baseline_system_type_compare(system_type, target_sys_type, false) for system_type in baseline_hvac_system_dict.keys() for target_system_type in target_system_types):
- Create dictionary of hvac systems and associated zones and terminal units:
dict_of_zones_and_terminal_units_served_by_hvac_sys_b = get_dict_of_zones_and_terminal_units_served_by_hvac_sys(B_RMI)
- Create dictionary with the following example format {"zone_id_1": {"zone_supply_fan_power": 100,"zone_total_return_fan_power": 80,"zone_total_exhaust_fan_power": 60,"zone_total_relief_fan_power": 60, "zone_total_terminal_fan_power": 300,}}:
zone_supply_return_exhaust_relief_terminal_fan_power_dict = get_zone_supply_return_exhaust_relief_terminal_fan_power_dict(P_RMI)
- For each hvac system in the B_RMI:
for hvac in B_RMI...HeatingVentilatingAirConditioningSystem:
- Get the baseline system type:
sys_type = list(baseline_system_types_dict.keys())[list(baseline_system_types_dict.values()).index(hvac.id)])
- Check if system type is of an applicable system type, if yes then carry on, if no then NOT_APPLICABLE for the hvac system:
if any(baseline_system_type_compare(sys_type, target_sys_type, false) for target_system_type in target_system_types):
-
Reset is modeled with a return fan in the proposed boolean variable:
is_modeled_with_return_fan_p = false
-
Reset is modeled with a relief fan in the proposed boolean variable:
is_modeled_with_relief_fan_p = false
-
Reset is baseline modeled with a return fan as expected boolean variable to false:
baseline_modeled_return_as_expected = false
-
Reset is baseline modeled with a relief fan as expected boolean variable to false:
baseline_modeled_relief_as_expected = false
-
Reset more_than_one_supply_and_return_fan boolean variable:
more_than_one_supply_and_return_fan = true
-
Check if the number of supply fans and return fans equals 1, if not go to rule assertion:
if get_fan_system_object_supply_return_exhaust_relief_total_power_flow(fan_sys_b)["supply_fans_qty"] == 1 and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(fan_sys_b)["return_fans_qty"] == 1:
-
Set more_than_one_supply_and_return_fan equal to false:
more_than_one_supply_and_return_fan = false
-
Get list of zones served by the hvac system:
zones_list_hvac_sys_b = dict_of_zones_and_terminal_units_served_by_hvac_sys_b[hvac.id]["ZONE_LIST"]
-
For each zone in the B_RMI check to see if the zone is served by an hvac system with return or relief fans in the proposed:
for zone in zones_list_hvac_sys_b:
- Get the analogous zone object from the proposed RMD (if this is not strictly the correct syntax please advise Weili):
zone_p = get_component_by_id(P_RMI,match_data_element(P_RMI,Zone,zone.id))
- Get the zone's total return fan kW:
modeled_return_fan_power_p = zone_supply_return_exhaust_relief_terminal_fan_power_dict[zone_p.id]["return_fans_power"]
- Get the zone's total relief fan kW:
modeled_relief_fan_power_p = zone_supply_return_exhaust_relief_terminal_fan_power_dict[zone_p.id]["relief_fans_power"]
- Check if the total return fan power is greater than 0 in the proposed, if yes then set is_modeled_with_return_fan_p to true:
if modeled_return_fan_power_p > 0: is_modeled_with_return_fan_p = true
- Check if the total relief fan power is greater than 0 in the proposed, if yes then set is_modeled_with_relief_fan_p to true:
if modeled_relief_fan_power_p > 0: is_modeled_with_relief_fan_p = true
- Get the analogous zone object from the proposed RMD (if this is not strictly the correct syntax please advise Weili):
-
Create fan system object:
fan_sys_b = hvac.fan_system
-
Get the hvac system total supply fan cfm,(this assumes that all fans associated with the supply_fans object are in parallel (i.e., if multiple fans the cfm is additive.):
hvac_sys_total_supply_fan_flow_b = get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["supply_fans_airflow"]
-
Calculate 90% of the supply air quantity:
90_percent_supply_flow = 90% * hvac_sys_total_supply_fan_flow_b
-
Calculate the supply CFM minus the minimum OA CFM for the fan system:
supply_minus_OA_flow = hvac_sys_total_supply_fan_flow_b - fan_sys_b.minimum_outdoor_airflow
-
Check if is_modeled_with_return_fan_p == true or is_modeled_with_relief_fan_p == true, if so then set the modeled_flow equal to the return + relief cfm:
if is_modeled_with_return_fan_p == true or is_modeled_with_relief_fan_p == true : modeled_flow = get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["return_fans_airflow"] + get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["relief_fans_airflow"]
-
Else, set modeled_flow = 0:
Else: modeled_flow = 0
-
Check if a return fan is modeled in the baseline if expected:
if (is_modeled_with_return_fan_p == true and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["return_fans_airflow"] > 0) or (is_modeled_with_return_fan_p == false and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["return_fans_airflow"] = 0): baseline_modeled_return_as_expected = true
-
Check if a relief fan is modeled in the baseline if expected:
if (is_modeled_with_relief_fan_p == true and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["relief_fans_airflow"] > 0) or (is_modeled_with_relief_fan_p == false and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["relief_fans_airflow"] = 0): baseline_modeled_relief_as_expected = true
-
-
Rule Assertion:
-
Case 1: If return and/or relief fans are specified in the proposed design and the baseline building design is modeled with fans serving the same functions and sized for the baseline system supply fan air quantity less the minimum outdoor air, or 90% of the supply fan air quantity, whichever is larger and there is only one supply and return fan then pass:
if more_than_one_supply_and_return_fan == false and baseline_modeled_return_as_expected == true and baseline_modeled_relief_as_expected == true and (is_modeled_with_return_fan_p == true or is_modeled_with_relief_fan_p == true) and (modeled_flow == max(supply_minus_OA_flow,90_percent_supply_flow)): outcome = "PASS"
-
Case 2: Else if no return or relief fans were modeled in the proposed design model and no cfm was modeled for return or relief fans in the baseline model then pass:
elif is_modeled_with_return_fan_p == false and is_modeled_with_relief_fan_p == false and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["return_fans_airflow"] == 0 and get_fan_system_object_supply_return_exhaust_relief_total_power_flow(B_RMI,fan_sys_b)["relief_fans_airflow"] == 0: outcome = "PASS"
-
Case 3: Else if there is more than one supply or return fan modeled in the baseline then outcome is UNDETERMINED:
elif more_than_one_supply_and_return_fan == true: outcome = "UNDETERMINED" and raise_message "<insert hvac.id> has more than one supply or return fan associated with the HVAC system in the baseline and therefore this check could not be conducted for this HVAC system. Conduct manual check for compliance with G3.1.2.8.1."
-
Case 4: Else, fail:
Else: outcome = "Fail"
-
- Get the baseline system type:
- Create dictionary of hvac systems and associated zones and terminal units:
Notes/Questions: None.