From 12c013bdbec3885c0a4002edc3ad4de3dafb84b3 Mon Sep 17 00:00:00 2001 From: Xie Date: Mon, 22 Jan 2024 11:28:05 -0500 Subject: [PATCH 1/3] Revert "add is_tolerance_fail for Section 5 and 6" This reverts commit 2c53aecfdaecae4b3b2f1cb2e73dbf74054bd620. --- .../ashrae9012019/section5/section5rule10.py | 4 --- .../ashrae9012019/section5/section5rule12.py | 4 --- .../ashrae9012019/section5/section5rule13.py | 27 ------------------ .../ashrae9012019/section5/section5rule14.py | 5 ---- .../ashrae9012019/section5/section5rule15.py | 5 ---- .../ashrae9012019/section5/section5rule16.py | 19 ------------- .../ashrae9012019/section5/section5rule19.py | 5 ---- .../ashrae9012019/section5/section5rule20.py | 5 ---- .../ashrae9012019/section5/section5rule21.py | 12 -------- .../ashrae9012019/section5/section5rule23.py | 7 ----- .../ashrae9012019/section5/section5rule24.py | 5 ---- .../ashrae9012019/section5/section5rule25.py | 4 --- .../ashrae9012019/section5/section5rule26.py | 24 ---------------- .../ashrae9012019/section5/section5rule27.py | 5 ---- .../ashrae9012019/section5/section5rule28.py | 4 --- .../ashrae9012019/section5/section5rule29.py | 6 ---- .../ashrae9012019/section5/section5rule30.py | 7 ----- .../ashrae9012019/section5/section5rule31.py | 6 ---- .../ashrae9012019/section5/section5rule32.py | 7 ----- .../ashrae9012019/section5/section5rule35.py | 10 ------- .../ashrae9012019/section5/section5rule36.py | 7 ----- .../ashrae9012019/section5/section5rule37.py | 25 ----------------- .../ashrae9012019/section5/section5rule39.py | 5 ---- .../ashrae9012019/section5/section5rule4.py | 4 --- .../ashrae9012019/section5/section5rule40.py | 16 ----------- .../ashrae9012019/section5/section5rule6.py | 4 --- .../ashrae9012019/section5/section5rule8.py | 4 --- .../ashrae9012019/section6/section6rule2.py | 15 ---------- .../ashrae9012019/section6/section6rule3.py | 5 ---- .../ashrae9012019/section6/section6rule4.py | 28 ------------------- .../ashrae9012019/section6/section6rule5.py | 12 +------- .../ashrae9012019/section6/section6rule8.py | 6 ---- .../ashrae9012019/section6/section6rule9.py | 11 -------- 33 files changed, 1 insertion(+), 312 deletions(-) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule10.py b/rct229/rulesets/ashrae9012019/section5/section5rule10.py index 23c3fac8f8..7ffacec53d 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule10.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule10.py @@ -134,9 +134,5 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): floor_u_factor = calc_vals["floor_u_factor"] target_u_factor = calc_vals["target_u_factor"] - return floor_u_factor == target_u_factor - def is_tolerance_fail(self, context, calc_vals=None, data=None): - floor_u_factor = calc_vals["floor_u_factor"] - target_u_factor = calc_vals["target_u_factor"] return std_le(val=floor_u_factor, std_val=target_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule12.py b/rct229/rulesets/ashrae9012019/section5/section5rule12.py index 4ce7ce8934..d1015fdfe0 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule12.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule12.py @@ -149,9 +149,5 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): target_f_factor = calc_vals["target_f_factor"] slab_on_grade_floor_f_factor = calc_vals["slab_on_grade_floor_f_factor"] - return target_f_factor == slab_on_grade_floor_f_factor - def is_tolerance_fail(self, context, calc_vals=None, data=None): - target_f_factor = calc_vals["target_f_factor"] - slab_on_grade_floor_f_factor = calc_vals["slab_on_grade_floor_f_factor"] return std_le(std_val=target_f_factor, val=slab_on_grade_floor_f_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule13.py b/rct229/rulesets/ashrae9012019/section5/section5rule13.py index 53e5401f3d..fe1f24fb03 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule13.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule13.py @@ -156,33 +156,6 @@ def rule_check(self, context, calc_vals=None, data=None): ): return False - if baseline_surface_type in [OST.ABOVE_GRADE_WALL, OST.FLOOR, OST.ROOF]: - return ( - calc_vals["baseline_surface_u_factor"] - == calc_vals["proposed_surface_u_factor"], - ) - elif baseline_surface_type in [OST.UNHEATED_SOG, OST.HEATED_SOG]: - return ( - calc_vals["baseline_surface_f_factor"] - == calc_vals["proposed_surface_f_factor"], - ) - elif baseline_surface_type == OST.BELOW_GRADE_WALL: - return ( - calc_vals["baseline_surface_c_factor"] - == calc_vals["proposed_surface_c_factor"], - ) - else: - return False - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - baseline_surface_type = calc_vals["baseline_surface_type"] - proposed_surface_type = calc_vals["proposed_surface_type"] - if ( - proposed_surface_type is None - or baseline_surface_type != proposed_surface_type - ): - return False - if baseline_surface_type in [OST.ABOVE_GRADE_WALL, OST.FLOOR, OST.ROOF]: return std_equal( calc_vals["baseline_surface_u_factor"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule14.py b/rct229/rulesets/ashrae9012019/section5/section5rule14.py index ae43a21eb7..37a3190129 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule14.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule14.py @@ -156,11 +156,6 @@ def get_manual_check_required_msg(self, context, calc_vals=None, data=None): return manual_check_msg def rule_check(self, context, calc_vals=None, data=None): - area_type_wwr = calc_vals["area_type_wwr"] - area_type_target_wwr = calc_vals["area_type_target_wwr"] - return area_type_target_wwr == area_type_wwr - - def is_tolerance_fail(self, context, calc_vals=None, data=None): area_type_wwr = calc_vals["area_type_wwr"] area_type_target_wwr = calc_vals["area_type_target_wwr"] return std_equal(area_type_target_wwr, area_type_wwr) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule15.py b/rct229/rulesets/ashrae9012019/section5/section5rule15.py index 823a540f1b..4a81d542e0 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule15.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule15.py @@ -109,11 +109,6 @@ def get_manual_check_required_msg(self, context, calc_vals=None, data=None): return manual_check_msg def rule_check(self, context, calc_vals=None, data=None): - return not calc_vals["manual_check_flag"] and calc_vals["wwr_b"] == min( - calc_vals["wwr_p"], WWR_THRESHOLD - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): return not calc_vals["manual_check_flag"] and std_equal( calc_vals["wwr_b"], min(calc_vals["wwr_p"], WWR_THRESHOLD) ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule16.py b/rct229/rulesets/ashrae9012019/section5/section5rule16.py index 78b6c8b3a0..68ecf070ae 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule16.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule16.py @@ -166,25 +166,6 @@ def rule_check(self, context, calc_vals=None, data=None): total_fenestration_area_b = calc_vals["total_fenestration_area_b"] total_fenestration_area_p = calc_vals["total_fenestration_area_p"] - return ( - total_fenestration_area_b == ZERO.AREA - and total_fenestration_area_p == ZERO.AREA - ) or ( - total_fenestration_area_surface_b / total_fenestration_area_b - ) == ( - total_fenestration_area_surface_p / total_fenestration_area_p - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - total_fenestration_area_surface_b = calc_vals[ - "total_fenestration_area_surface_b" - ] - total_fenestration_area_surface_p = calc_vals[ - "total_fenestration_area_surface_p" - ] - total_fenestration_area_b = calc_vals["total_fenestration_area_b"] - total_fenestration_area_p = calc_vals["total_fenestration_area_p"] - return ( total_fenestration_area_b == ZERO.AREA and total_fenestration_area_p == ZERO.AREA diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule19.py b/rct229/rulesets/ashrae9012019/section5/section5rule19.py index 0457365ba2..b273f8a94c 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule19.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule19.py @@ -293,11 +293,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - target_u_factor = calc_vals["target_u_factor"] - subsurface_u_factor = calc_vals["subsurface_u_factor"] - return target_u_factor == subsurface_u_factor - - def is_tolerance_fail(self, context, calc_vals=None, data=None): target_u_factor = calc_vals["target_u_factor"] subsurface_u_factor = calc_vals["subsurface_u_factor"] return std_le(std_val=target_u_factor, val=subsurface_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule20.py b/rct229/rulesets/ashrae9012019/section5/section5rule20.py index 9e689d3705..6e386ce0b8 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule20.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule20.py @@ -280,11 +280,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - target_shgc = calc_vals["target_shgc"] - subsurface_shgc = calc_vals["subsurface_shgc"] - return target_shgc is not None and target_shgc == subsurface_shgc - - def is_tolerance_fail(self, context, calc_vals=None, data=None): target_shgc = calc_vals["target_shgc"] subsurface_shgc = calc_vals["subsurface_shgc"] return target_shgc is not None and std_le( diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule21.py b/rct229/rulesets/ashrae9012019/section5/section5rule21.py index 288a143b7f..6074ef83a8 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule21.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule21.py @@ -118,18 +118,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - return ( - calc_vals["subsurface_u_factor_b"] - == calc_vals["subsurface_u_factor_p"] - and calc_vals["subsurface_shgc_b"] - == calc_vals["subsurface_shgc_p"] - and calc_vals["subsurface_glazed_area_b"] - == calc_vals["subsurface_glazed_area_p"] - and calc_vals["subsurface_opaque_area_b"] - == calc_vals["subsurface_opaque_area_p"], - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): return ( std_equal( calc_vals["subsurface_u_factor_b"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule23.py b/rct229/rulesets/ashrae9012019/section5/section5rule23.py index ab8db16299..073808e0a6 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule23.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule23.py @@ -3,7 +3,6 @@ from rct229.rule_engine.ruleset_model_factory import produce_ruleset_model_instance from rct229.rulesets.ashrae9012019 import BASELINE_0 from rct229.utils.jsonpath_utils import find_all -from rct229.utils.std_comparisons import std_equal MANUAL_CHECK_MSG = "Surface in P-RMR has subsurfaces modeled with different manual shade status. Verify if subsurfaces manual shade status in B-RMR are modeled the same as in P-RMR" @@ -111,9 +110,3 @@ def rule_check(self, context, calc_vals=None, data=None): calc_vals["subsurface_p_manual_shade"] == calc_vals["subsurface_b_manual_shade"] ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - return std_equal( - calc_vals["subsurface_p_manual_shade"], - calc_vals["subsurface_b_manual_shade"], - ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule24.py b/rct229/rulesets/ashrae9012019/section5/section5rule24.py index 31825c8675..b59dd367ff 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule24.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule24.py @@ -112,11 +112,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] - skylight_roof_ratio_p = calc_vals["skylight_total_roof_ratio_p"] - return skylight_roof_ratio_b == skylight_roof_ratio_p - - def is_tolerance_fail(self, context, calc_vals=None, data=None): skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] skylight_roof_ratio_p = calc_vals["skylight_total_roof_ratio_p"] return std_equal(skylight_roof_ratio_b, skylight_roof_ratio_p) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule25.py b/rct229/rulesets/ashrae9012019/section5/section5rule25.py index d0136bf2d9..a954262272 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule25.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule25.py @@ -110,9 +110,5 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] - return skylight_roof_ratio_b == 0.03 - - def is_tolerance_fail(self, context, calc_vals=None, data=None): skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] return std_equal(skylight_roof_ratio_b, 0.03) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule26.py b/rct229/rulesets/ashrae9012019/section5/section5rule26.py index 7a86b847ee..e2ddbf8369 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule26.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule26.py @@ -178,30 +178,6 @@ def rule_check(self, context, calc_vals=None, data=None): "total_skylight_area_surface_p" ] - return ( - # both segments have no skylight area - total_skylight_area_b == 0 - and total_skylight_area_p == 0 - and total_skylight_area_surface_b == 0 - and total_skylight_area_surface_p == 0 - ) or ( - # product to ensure neither is 0 & short-circuit logic if either of them is 0. - total_skylight_area_b * total_skylight_area_p > 0 - # both segments' skylight area ratios are the same - and total_skylight_area_surface_b / total_skylight_area_b - == total_skylight_area_surface_p / total_skylight_area_p, - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - total_skylight_area_b = calc_vals["total_skylight_area_b"] - total_skylight_area_p = calc_vals["total_skylight_area_p"] - total_skylight_area_surface_b = calc_vals[ - "total_skylight_area_surface_b" - ] - total_skylight_area_surface_p = calc_vals[ - "total_skylight_area_surface_p" - ] - return ( # both segments have no skylight area total_skylight_area_b == 0 diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule27.py b/rct229/rulesets/ashrae9012019/section5/section5rule27.py index c9be586120..ee96d4dd7a 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule27.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule27.py @@ -265,11 +265,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - subsurface_b_u_factor = calc_vals["subsurface_b_u_factor"] - target_u_factor = calc_vals["target_u_factor"] - return target_u_factor == subsurface_b_u_factor - - def is_tolerance_fail(self, context, calc_vals=None, data=None): subsurface_b_u_factor = calc_vals["subsurface_b_u_factor"] target_u_factor = calc_vals["target_u_factor"] return std_le(std_val=target_u_factor, val=subsurface_b_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule28.py b/rct229/rulesets/ashrae9012019/section5/section5rule28.py index 8fd6e296a2..acab05c86a 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule28.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule28.py @@ -242,9 +242,5 @@ def get_calc_vals(self, context, data=None): def rule_check(self, context, calc_vals=None, data=None): target_shgc = calc_vals["target_shgc"] subsurface_shgc_b = calc_vals["subsurface_shgc_b"] - return target_shgc == subsurface_shgc_b - def is_tolerance_fail(self, context, calc_vals=None, data=None): - target_shgc = calc_vals["target_shgc"] - subsurface_shgc_b = calc_vals["subsurface_shgc_b"] return std_equal(target_shgc, subsurface_shgc_b) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule29.py b/rct229/rulesets/ashrae9012019/section5/section5rule29.py index 296110a755..f96f9f6318 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule29.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule29.py @@ -89,12 +89,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - return ( - TARGET_ABSORPTANCE_THERMAL_EXTERIOR - == calc_vals["absorptance_thermal_exterior"] - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): return std_equal( TARGET_ABSORPTANCE_THERMAL_EXTERIOR, calc_vals["absorptance_thermal_exterior"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule30.py b/rct229/rulesets/ashrae9012019/section5/section5rule30.py index f676ddb315..3aa429b8e6 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule30.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule30.py @@ -14,7 +14,6 @@ from rct229.rulesets.ashrae9012019.ruleset_functions.get_surface_conditioning_category_dict import ( get_surface_conditioning_category_dict, ) -from rct229.utils.std_comparisons import std_equal ABSORPTION_THERMAL_EXTERIOR = 0.9 UNDETERMINED_MSG = ( @@ -125,12 +124,6 @@ def rule_check(self, context, calc_vals=None, data=None): == ABSORPTION_THERMAL_EXTERIOR ) - def is_tolerance_fail(self, context, calc_vals=None, data=None): - return std_equal( - calc_vals["absorptance_thermal_exterior_p"], - ABSORPTION_THERMAL_EXTERIOR, - ) - def get_pass_msg(self, context, calc_vals=None, data=None): """Pre-condition: see rule_check""" absorptance_thermal_exterior_p = calc_vals[ diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule31.py b/rct229/rulesets/ashrae9012019/section5/section5rule31.py index 7a41875470..c1e3aec87d 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule31.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule31.py @@ -89,12 +89,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - return ( - TARGET_ABSORPTANCE_SOLAR_EXTERIOR - == calc_vals["absorptance_solar_exterior"] - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): return std_equal( TARGET_ABSORPTANCE_SOLAR_EXTERIOR, calc_vals["absorptance_solar_exterior"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule32.py b/rct229/rulesets/ashrae9012019/section5/section5rule32.py index d8d45e3c45..9e4b82357f 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule32.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule32.py @@ -14,7 +14,6 @@ from rct229.rulesets.ashrae9012019.ruleset_functions.get_surface_conditioning_category_dict import ( get_surface_conditioning_category_dict, ) -from rct229.utils.std_comparisons import std_equal ABSORPTANCE_SOLAR_EXTERIOR = 0.7 @@ -116,12 +115,6 @@ def rule_check(self, context, calc_vals=None, data=None): == ABSORPTANCE_SOLAR_EXTERIOR ) - def is_tolerance_fail(self, context, calc_vals=None, data=None): - return std_equal( - calc_vals["absorptance_solar_exterior_p"], - ABSORPTANCE_SOLAR_EXTERIOR, - ) - def get_pass_msg(self, context, calc_vals=None, data=None): """Pre-condition: see rule_check""" absorptance_solar_exterior_p = calc_vals["absorptance_solar_exterior_p"] diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule35.py b/rct229/rulesets/ashrae9012019/section5/section5rule35.py index eb047e26ea..892885280c 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule35.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule35.py @@ -104,16 +104,6 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): - building_total_air_leakage_rate = calc_vals[ - "building_total_air_leakage_rate" - ] - target_air_leakage_rate_75pa_b = calc_vals["target_air_leakage_rate_75pa_b"] - return ( - target_air_leakage_rate_75pa_b * TOTAL_AIR_LEAKAGE_FACTOR - == building_total_air_leakage_rate, - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): building_total_air_leakage_rate = calc_vals[ "building_total_air_leakage_rate" ] diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule36.py b/rct229/rulesets/ashrae9012019/section5/section5rule36.py index a9e05033ca..ffaea38efc 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule36.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule36.py @@ -9,7 +9,6 @@ get_zone_conditioning_category_dict, ) from rct229.utils.pint_utils import CalcQ -from rct229.utils.std_comparisons import std_equal class Section5Rule36(RuleDefinitionListIndexedBase): @@ -95,9 +94,3 @@ def rule_check(self, context, calc_vals=None, data=None): calc_vals["baseline_infiltration"] == calc_vals["proposed_infiltration"] ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - return std_equal( - calc_vals["baseline_infiltration"], - calc_vals["proposed_infiltration"], - ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule37.py b/rct229/rulesets/ashrae9012019/section5/section5rule37.py index 84277f67e6..0cdba94826 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule37.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule37.py @@ -149,31 +149,6 @@ def rule_check(self, context, calc_vals=None, data=None): "empty_measured_air_leakage_rate_flow_flag" ] - return ( - building_total_air_leakage_rate - == TOTAL_AIR_LEAKAGE_COEFF * target_air_leakage_rate_75pa_p - or ( - building_total_air_leakage_rate - != TOTAL_AIR_LEAKAGE_COEFF * target_air_leakage_rate_75pa_p - and empty_measured_air_leakage_rate_flow_flag == False - and building_total_air_leakage_rate - == TOTAL_AIR_LEAKAGE_COEFF - * building_total_measured_air_leakage_rate, - ) - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - building_total_air_leakage_rate = calc_vals[ - "building_total_air_leakage_rate" - ] - building_total_measured_air_leakage_rate = calc_vals[ - "building_total_measured_air_leakage_rate" - ] - target_air_leakage_rate_75pa_p = calc_vals["target_air_leakage_rate_75pa_p"] - empty_measured_air_leakage_rate_flow_flag = calc_vals[ - "empty_measured_air_leakage_rate_flow_flag" - ] - return std_equal( building_total_air_leakage_rate, TOTAL_AIR_LEAKAGE_COEFF * target_air_leakage_rate_75pa_p, diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule39.py b/rct229/rulesets/ashrae9012019/section5/section5rule39.py index 74e64acc3a..c7ccdd46d6 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule39.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule39.py @@ -223,11 +223,6 @@ def get_manual_check_required_msg( return manual_check_required_msg def rule_check(self, context, calc_vals=None, data=None): - u_factor_b = calc_vals["u_factor_b"] - target_u_factor_b = calc_vals["target_u_factor_b"] - return target_u_factor_b == u_factor_b - - def is_tolerance_fail(self, context, calc_vals=None, data=None): u_factor_b = calc_vals["u_factor_b"] target_u_factor_b = calc_vals["target_u_factor_b"] return std_equal(target_u_factor_b, u_factor_b) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule4.py b/rct229/rulesets/ashrae9012019/section5/section5rule4.py index 91a1269143..b55100119d 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule4.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule4.py @@ -135,9 +135,5 @@ def manual_check_required(self, context=None, calc_vals=None, data=None): def rule_check(self, context=None, calc_vals=None, data=None): roof_u_factor = calc_vals["roof_u_factor"] target_u_factor = calc_vals["target_u_factor"] - return roof_u_factor == target_u_factor - def is_tolerance_fail(self, context, calc_vals=None, data=None): - roof_u_factor = calc_vals["roof_u_factor"] - target_u_factor = calc_vals["target_u_factor"] return std_le(val=roof_u_factor, std_val=target_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule40.py b/rct229/rulesets/ashrae9012019/section5/section5rule40.py index cb5dfd03b7..33462f6041 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule40.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule40.py @@ -15,7 +15,6 @@ get_surface_conditioning_category_dict, ) from rct229.utils.jsonpath_utils import find_one -from rct229.utils.std_comparisons import std_equal class Section5Rule40(RuleDefinitionListIndexedBase): @@ -124,18 +123,3 @@ def rule_check(self, context, calc_vals=None, data=None): absorptance_solar_exterior_b == absorptance_solar_exterior_p and absorptance_thermal_exterior_b == absorptance_thermal_exterior_p ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - absorptance_solar_exterior_b = calc_vals["absorptance_solar_exterior_b"] - absorptance_solar_exterior_p = calc_vals["absorptance_solar_exterior_p"] - absorptance_thermal_exterior_b = calc_vals[ - "absorptance_thermal_exterior_b" - ] - absorptance_thermal_exterior_p = calc_vals[ - "absorptance_thermal_exterior_p" - ] - return std_equal( - absorptance_solar_exterior_b, absorptance_solar_exterior_p - ) and std_equal( - absorptance_thermal_exterior_b, absorptance_thermal_exterior_p - ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule6.py b/rct229/rulesets/ashrae9012019/section5/section5rule6.py index ca9333b869..a416284446 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule6.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule6.py @@ -138,9 +138,5 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): below_grade_wall_c_factor = calc_vals["below_grade_wall_c_factor"] target_c_factor = calc_vals["target_c_factor"] - return below_grade_wall_c_factor == target_c_factor - def is_tolerance_fail(self, context, calc_vals=None, data=None): - below_grade_wall_c_factor = calc_vals["below_grade_wall_c_factor"] - target_c_factor = calc_vals["target_c_factor"] return std_le(val=below_grade_wall_c_factor, std_val=target_c_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule8.py b/rct229/rulesets/ashrae9012019/section5/section5rule8.py index ab971e2c7f..f3aa085e7e 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule8.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule8.py @@ -131,9 +131,5 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): above_grade_wall_u_factor = calc_vals["above_grade_wall_u_factor"] target_u_factor = calc_vals["target_u_factor"] - return above_grade_wall_u_factor == target_u_factor - def is_tolerance_fail(self, context, calc_vals=None, data=None): - above_grade_wall_u_factor = calc_vals["above_grade_wall_u_factor"] - target_u_factor = calc_vals["target_u_factor"] return std_le(val=above_grade_wall_u_factor, std_val=target_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule2.py b/rct229/rulesets/ashrae9012019/section6/section6rule2.py index 59650259d7..7a710fa1ff 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule2.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule2.py @@ -7,7 +7,6 @@ from rct229.schema.config import ureg from rct229.utils.jsonpath_utils import find_all from rct229.utils.pint_utils import ZERO, CalcQ -from rct229.utils.std_comparisons import std_equal GUEST_ROOM = SchemaEnums.schema_enums[ "LightingSpaceOptions2019ASHRAE901TG37" @@ -117,17 +116,3 @@ def rule_check(self, context, calc_vals=None, data=None): return space_lighting_power_per_area_p == max( lighting_power_allowance_p, space_lighting_power_per_area_u ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - lighting_power_allowance_p = calc_vals["lighting_power_allowance_p"] - space_lighting_power_per_area_p = calc_vals[ - "space_lighting_power_per_area_p" - ] - space_lighting_power_per_area_u = calc_vals[ - "space_lighting_power_per_area_u" - ] - - return std_equal( - space_lighting_power_per_area_p, - max(lighting_power_allowance_p, space_lighting_power_per_area_u), - ) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule3.py b/rct229/rulesets/ashrae9012019/section6/section6rule3.py index 095fc58b09..aeec449d47 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule3.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule3.py @@ -96,11 +96,6 @@ def manual_check_required(self, context, calc_vals=None, data=None): ) def rule_check(self, context, calc_vals=None, data=None): - total_space_lpd_u = calc_vals["total_space_lpd_u"] - total_space_lpd_p = calc_vals["total_space_lpd_p"] - return total_space_lpd_u == total_space_lpd_p - - def is_tolerance_fail(self, context, calc_vals=None, data=None): total_space_lpd_u = calc_vals["total_space_lpd_u"] total_space_lpd_p = calc_vals["total_space_lpd_p"] return std_equal(total_space_lpd_u, total_space_lpd_p) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule4.py b/rct229/rulesets/ashrae9012019/section6/section6rule4.py index ffd2e7bcd2..ef234f22b1 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule4.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule4.py @@ -128,34 +128,6 @@ def rule_check(self, context, calc_vals=None, data=None): total_space_lpd_b = calc_vals["total_space_lpd_b"] lpd_allowance_b = calc_vals["lpd_allowance_b"] - return ( - # Not Case 1 - not ( - space_lighting_status_type_p - == LightingStatusType.AS_DESIGNED_OR_AS_EXISTING - and not lighting_space_type_b - ) - # Passes for both values of space_lighting_status_type_p - and ( - space_lighting_status_type_p - in [ - LightingStatusType.AS_DESIGNED_OR_AS_EXISTING, - LightingStatusType.NOT_YET_DESIGNED_OR_MATCH_TABLE_9_5_1, - ] - and total_space_lpd_b == lpd_allowance_b - ) - ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - space_b = context.BASELINE_0 - lighting_space_type_b = space_b.get("lighting_space_type") - - space_lighting_status_type_p = calc_vals[ - "space_lighting_status_type_p" - ] - total_space_lpd_b = calc_vals["total_space_lpd_b"] - lpd_allowance_b = calc_vals["lpd_allowance_b"] - return ( # Not Case 1 not ( diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule5.py b/rct229/rulesets/ashrae9012019/section6/section6rule5.py index 41937feae6..1e3779a1ea 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule5.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule5.py @@ -16,7 +16,6 @@ from rct229.utils.jsonpath_utils import find_all, find_exactly_one_with_field_value from rct229.utils.masks import invert_mask from rct229.utils.pint_utils import ZERO -from rct229.utils.std_comparisons import std_equal BUILDING_AREA_CUTTOFF = ureg("5000 ft2") @@ -186,17 +185,8 @@ def rule_check(self, context, calc_vals=None, data=None): schedule_comparison_result = calc_vals[ "schedule_comparison_result" ] + return ( schedule_comparison_result["total_hours_compared"] == schedule_comparison_result["total_hours_matched"] ) - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - schedule_comparison_result = calc_vals[ - "schedule_comparison_result" - ] - - return std_equal( - schedule_comparison_result["total_hours_compared"], - schedule_comparison_result["total_hours_matched"], - ) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule8.py b/rct229/rulesets/ashrae9012019/section6/section6rule8.py index d2e3c1e4f3..d4b6205128 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule8.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule8.py @@ -11,7 +11,6 @@ from rct229.utils.assertions import getattr_ from rct229.utils.jsonpath_utils import find_all, find_exactly_one_with_field_value from rct229.utils.pint_utils import ZERO -from rct229.utils.std_comparisons import std_equal MANUAL_CHECK_MSG = ( "Lighting schedule in P-RMD including adjusted lighting occupancy sensor reduction factor is " @@ -175,8 +174,3 @@ def rule_check(self, context, calc_vals=None, data=None): total_hours_compared = calc_vals["total_hours_compared"] total_hours_matched = calc_vals["total_hours_matched"] return total_hours_matched == total_hours_compared - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - total_hours_compared = calc_vals["total_hours_compared"] - total_hours_matched = calc_vals["total_hours_matched"] - return std_equal(total_hours_matched, total_hours_compared) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule9.py b/rct229/rulesets/ashrae9012019/section6/section6rule9.py index edc6a75ee5..8da76cdf49 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule9.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule9.py @@ -12,7 +12,6 @@ from rct229.utils.assertions import getattr_ from rct229.utils.jsonpath_utils import find_all, find_exactly_one_with_field_value from rct229.utils.pint_utils import ZERO -from rct229.utils.std_comparisons import std_equal FLOOR_AREA_LIMIT = 5000 * ureg("ft2") # square foot @@ -188,16 +187,6 @@ def rule_check(self, context, calc_vals=None, data=None): total_hours_matched = calc_vals["total_hours_matched"] return total_hours_matched == total_hours_compared - def rule_check(self, context, calc_vals=None, data=None): - total_hours_compared = calc_vals["total_hours_compared"] - total_hours_matched = calc_vals["total_hours_matched"] - return total_hours_matched == total_hours_compared - - def is_tolerance_fail(self, context, calc_vals=None, data=None): - total_hours_compared = calc_vals["total_hours_compared"] - total_hours_matched = calc_vals["total_hours_matched"] - return std_equal(total_hours_matched, total_hours_compared) - def get_fail_msg(self, context, calc_vals=None, data=None): eflh_difference = calc_vals["eflh_difference"] return f"Space lighting schedule EFLH in P-RMD is {eflh_difference} of that in B-RMD." From 669e01952879458917701207ceda1684e5a7325b Mon Sep 17 00:00:00 2001 From: Xie Date: Mon, 22 Jan 2024 11:34:17 -0500 Subject: [PATCH 2/3] is_tolerance_fail method in section 5 --- .../ashrae9012019/section5/section5rule10.py | 4 +++ .../ashrae9012019/section5/section5rule12.py | 4 +++ .../ashrae9012019/section5/section5rule13.py | 27 +++++++++++++++++++ .../ashrae9012019/section5/section5rule14.py | 5 ++++ .../ashrae9012019/section5/section5rule15.py | 5 ++++ .../ashrae9012019/section5/section5rule16.py | 19 +++++++++++++ .../ashrae9012019/section5/section5rule19.py | 5 ++++ .../ashrae9012019/section5/section5rule20.py | 5 ++++ .../ashrae9012019/section5/section5rule21.py | 12 +++++++++ .../ashrae9012019/section5/section5rule23.py | 7 +++++ .../ashrae9012019/section5/section5rule24.py | 5 ++++ .../ashrae9012019/section5/section5rule25.py | 4 +++ .../ashrae9012019/section5/section5rule26.py | 24 +++++++++++++++++ .../ashrae9012019/section5/section5rule27.py | 5 ++++ .../ashrae9012019/section5/section5rule28.py | 4 +++ .../ashrae9012019/section5/section5rule29.py | 6 +++++ .../ashrae9012019/section5/section5rule30.py | 7 +++++ .../ashrae9012019/section5/section5rule31.py | 6 +++++ .../ashrae9012019/section5/section5rule32.py | 7 +++++ .../ashrae9012019/section5/section5rule35.py | 10 +++++++ .../ashrae9012019/section5/section5rule36.py | 7 +++++ .../ashrae9012019/section5/section5rule37.py | 25 +++++++++++++++++ .../ashrae9012019/section5/section5rule39.py | 5 ++++ .../ashrae9012019/section5/section5rule4.py | 4 +++ .../ashrae9012019/section5/section5rule40.py | 16 +++++++++++ .../ashrae9012019/section5/section5rule6.py | 4 +++ .../ashrae9012019/section5/section5rule8.py | 4 +++ 27 files changed, 236 insertions(+) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule10.py b/rct229/rulesets/ashrae9012019/section5/section5rule10.py index 7ffacec53d..23c3fac8f8 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule10.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule10.py @@ -134,5 +134,9 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): floor_u_factor = calc_vals["floor_u_factor"] target_u_factor = calc_vals["target_u_factor"] + return floor_u_factor == target_u_factor + def is_tolerance_fail(self, context, calc_vals=None, data=None): + floor_u_factor = calc_vals["floor_u_factor"] + target_u_factor = calc_vals["target_u_factor"] return std_le(val=floor_u_factor, std_val=target_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule12.py b/rct229/rulesets/ashrae9012019/section5/section5rule12.py index d1015fdfe0..4ce7ce8934 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule12.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule12.py @@ -149,5 +149,9 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): target_f_factor = calc_vals["target_f_factor"] slab_on_grade_floor_f_factor = calc_vals["slab_on_grade_floor_f_factor"] + return target_f_factor == slab_on_grade_floor_f_factor + def is_tolerance_fail(self, context, calc_vals=None, data=None): + target_f_factor = calc_vals["target_f_factor"] + slab_on_grade_floor_f_factor = calc_vals["slab_on_grade_floor_f_factor"] return std_le(std_val=target_f_factor, val=slab_on_grade_floor_f_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule13.py b/rct229/rulesets/ashrae9012019/section5/section5rule13.py index fe1f24fb03..53e5401f3d 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule13.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule13.py @@ -156,6 +156,33 @@ def rule_check(self, context, calc_vals=None, data=None): ): return False + if baseline_surface_type in [OST.ABOVE_GRADE_WALL, OST.FLOOR, OST.ROOF]: + return ( + calc_vals["baseline_surface_u_factor"] + == calc_vals["proposed_surface_u_factor"], + ) + elif baseline_surface_type in [OST.UNHEATED_SOG, OST.HEATED_SOG]: + return ( + calc_vals["baseline_surface_f_factor"] + == calc_vals["proposed_surface_f_factor"], + ) + elif baseline_surface_type == OST.BELOW_GRADE_WALL: + return ( + calc_vals["baseline_surface_c_factor"] + == calc_vals["proposed_surface_c_factor"], + ) + else: + return False + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + baseline_surface_type = calc_vals["baseline_surface_type"] + proposed_surface_type = calc_vals["proposed_surface_type"] + if ( + proposed_surface_type is None + or baseline_surface_type != proposed_surface_type + ): + return False + if baseline_surface_type in [OST.ABOVE_GRADE_WALL, OST.FLOOR, OST.ROOF]: return std_equal( calc_vals["baseline_surface_u_factor"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule14.py b/rct229/rulesets/ashrae9012019/section5/section5rule14.py index 37a3190129..ae43a21eb7 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule14.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule14.py @@ -156,6 +156,11 @@ def get_manual_check_required_msg(self, context, calc_vals=None, data=None): return manual_check_msg def rule_check(self, context, calc_vals=None, data=None): + area_type_wwr = calc_vals["area_type_wwr"] + area_type_target_wwr = calc_vals["area_type_target_wwr"] + return area_type_target_wwr == area_type_wwr + + def is_tolerance_fail(self, context, calc_vals=None, data=None): area_type_wwr = calc_vals["area_type_wwr"] area_type_target_wwr = calc_vals["area_type_target_wwr"] return std_equal(area_type_target_wwr, area_type_wwr) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule15.py b/rct229/rulesets/ashrae9012019/section5/section5rule15.py index 4a81d542e0..823a540f1b 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule15.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule15.py @@ -109,6 +109,11 @@ def get_manual_check_required_msg(self, context, calc_vals=None, data=None): return manual_check_msg def rule_check(self, context, calc_vals=None, data=None): + return not calc_vals["manual_check_flag"] and calc_vals["wwr_b"] == min( + calc_vals["wwr_p"], WWR_THRESHOLD + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): return not calc_vals["manual_check_flag"] and std_equal( calc_vals["wwr_b"], min(calc_vals["wwr_p"], WWR_THRESHOLD) ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule16.py b/rct229/rulesets/ashrae9012019/section5/section5rule16.py index 68ecf070ae..78b6c8b3a0 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule16.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule16.py @@ -166,6 +166,25 @@ def rule_check(self, context, calc_vals=None, data=None): total_fenestration_area_b = calc_vals["total_fenestration_area_b"] total_fenestration_area_p = calc_vals["total_fenestration_area_p"] + return ( + total_fenestration_area_b == ZERO.AREA + and total_fenestration_area_p == ZERO.AREA + ) or ( + total_fenestration_area_surface_b / total_fenestration_area_b + ) == ( + total_fenestration_area_surface_p / total_fenestration_area_p + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + total_fenestration_area_surface_b = calc_vals[ + "total_fenestration_area_surface_b" + ] + total_fenestration_area_surface_p = calc_vals[ + "total_fenestration_area_surface_p" + ] + total_fenestration_area_b = calc_vals["total_fenestration_area_b"] + total_fenestration_area_p = calc_vals["total_fenestration_area_p"] + return ( total_fenestration_area_b == ZERO.AREA and total_fenestration_area_p == ZERO.AREA diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule19.py b/rct229/rulesets/ashrae9012019/section5/section5rule19.py index b273f8a94c..0457365ba2 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule19.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule19.py @@ -293,6 +293,11 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + target_u_factor = calc_vals["target_u_factor"] + subsurface_u_factor = calc_vals["subsurface_u_factor"] + return target_u_factor == subsurface_u_factor + + def is_tolerance_fail(self, context, calc_vals=None, data=None): target_u_factor = calc_vals["target_u_factor"] subsurface_u_factor = calc_vals["subsurface_u_factor"] return std_le(std_val=target_u_factor, val=subsurface_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule20.py b/rct229/rulesets/ashrae9012019/section5/section5rule20.py index 6e386ce0b8..9e689d3705 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule20.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule20.py @@ -280,6 +280,11 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + target_shgc = calc_vals["target_shgc"] + subsurface_shgc = calc_vals["subsurface_shgc"] + return target_shgc is not None and target_shgc == subsurface_shgc + + def is_tolerance_fail(self, context, calc_vals=None, data=None): target_shgc = calc_vals["target_shgc"] subsurface_shgc = calc_vals["subsurface_shgc"] return target_shgc is not None and std_le( diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule21.py b/rct229/rulesets/ashrae9012019/section5/section5rule21.py index 6074ef83a8..288a143b7f 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule21.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule21.py @@ -118,6 +118,18 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + return ( + calc_vals["subsurface_u_factor_b"] + == calc_vals["subsurface_u_factor_p"] + and calc_vals["subsurface_shgc_b"] + == calc_vals["subsurface_shgc_p"] + and calc_vals["subsurface_glazed_area_b"] + == calc_vals["subsurface_glazed_area_p"] + and calc_vals["subsurface_opaque_area_b"] + == calc_vals["subsurface_opaque_area_p"], + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): return ( std_equal( calc_vals["subsurface_u_factor_b"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule23.py b/rct229/rulesets/ashrae9012019/section5/section5rule23.py index 073808e0a6..ab8db16299 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule23.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule23.py @@ -3,6 +3,7 @@ from rct229.rule_engine.ruleset_model_factory import produce_ruleset_model_instance from rct229.rulesets.ashrae9012019 import BASELINE_0 from rct229.utils.jsonpath_utils import find_all +from rct229.utils.std_comparisons import std_equal MANUAL_CHECK_MSG = "Surface in P-RMR has subsurfaces modeled with different manual shade status. Verify if subsurfaces manual shade status in B-RMR are modeled the same as in P-RMR" @@ -110,3 +111,9 @@ def rule_check(self, context, calc_vals=None, data=None): calc_vals["subsurface_p_manual_shade"] == calc_vals["subsurface_b_manual_shade"] ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + return std_equal( + calc_vals["subsurface_p_manual_shade"], + calc_vals["subsurface_b_manual_shade"], + ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule24.py b/rct229/rulesets/ashrae9012019/section5/section5rule24.py index b59dd367ff..31825c8675 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule24.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule24.py @@ -112,6 +112,11 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] + skylight_roof_ratio_p = calc_vals["skylight_total_roof_ratio_p"] + return skylight_roof_ratio_b == skylight_roof_ratio_p + + def is_tolerance_fail(self, context, calc_vals=None, data=None): skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] skylight_roof_ratio_p = calc_vals["skylight_total_roof_ratio_p"] return std_equal(skylight_roof_ratio_b, skylight_roof_ratio_p) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule25.py b/rct229/rulesets/ashrae9012019/section5/section5rule25.py index a954262272..d0136bf2d9 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule25.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule25.py @@ -110,5 +110,9 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] + return skylight_roof_ratio_b == 0.03 + + def is_tolerance_fail(self, context, calc_vals=None, data=None): skylight_roof_ratio_b = calc_vals["skylight_roof_ratio_b"] return std_equal(skylight_roof_ratio_b, 0.03) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule26.py b/rct229/rulesets/ashrae9012019/section5/section5rule26.py index e2ddbf8369..7a86b847ee 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule26.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule26.py @@ -178,6 +178,30 @@ def rule_check(self, context, calc_vals=None, data=None): "total_skylight_area_surface_p" ] + return ( + # both segments have no skylight area + total_skylight_area_b == 0 + and total_skylight_area_p == 0 + and total_skylight_area_surface_b == 0 + and total_skylight_area_surface_p == 0 + ) or ( + # product to ensure neither is 0 & short-circuit logic if either of them is 0. + total_skylight_area_b * total_skylight_area_p > 0 + # both segments' skylight area ratios are the same + and total_skylight_area_surface_b / total_skylight_area_b + == total_skylight_area_surface_p / total_skylight_area_p, + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + total_skylight_area_b = calc_vals["total_skylight_area_b"] + total_skylight_area_p = calc_vals["total_skylight_area_p"] + total_skylight_area_surface_b = calc_vals[ + "total_skylight_area_surface_b" + ] + total_skylight_area_surface_p = calc_vals[ + "total_skylight_area_surface_p" + ] + return ( # both segments have no skylight area total_skylight_area_b == 0 diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule27.py b/rct229/rulesets/ashrae9012019/section5/section5rule27.py index ee96d4dd7a..c9be586120 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule27.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule27.py @@ -265,6 +265,11 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + subsurface_b_u_factor = calc_vals["subsurface_b_u_factor"] + target_u_factor = calc_vals["target_u_factor"] + return target_u_factor == subsurface_b_u_factor + + def is_tolerance_fail(self, context, calc_vals=None, data=None): subsurface_b_u_factor = calc_vals["subsurface_b_u_factor"] target_u_factor = calc_vals["target_u_factor"] return std_le(std_val=target_u_factor, val=subsurface_b_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule28.py b/rct229/rulesets/ashrae9012019/section5/section5rule28.py index acab05c86a..8fd6e296a2 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule28.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule28.py @@ -242,5 +242,9 @@ def get_calc_vals(self, context, data=None): def rule_check(self, context, calc_vals=None, data=None): target_shgc = calc_vals["target_shgc"] subsurface_shgc_b = calc_vals["subsurface_shgc_b"] + return target_shgc == subsurface_shgc_b + def is_tolerance_fail(self, context, calc_vals=None, data=None): + target_shgc = calc_vals["target_shgc"] + subsurface_shgc_b = calc_vals["subsurface_shgc_b"] return std_equal(target_shgc, subsurface_shgc_b) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule29.py b/rct229/rulesets/ashrae9012019/section5/section5rule29.py index f96f9f6318..296110a755 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule29.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule29.py @@ -89,6 +89,12 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + return ( + TARGET_ABSORPTANCE_THERMAL_EXTERIOR + == calc_vals["absorptance_thermal_exterior"] + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): return std_equal( TARGET_ABSORPTANCE_THERMAL_EXTERIOR, calc_vals["absorptance_thermal_exterior"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule30.py b/rct229/rulesets/ashrae9012019/section5/section5rule30.py index 3aa429b8e6..f676ddb315 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule30.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule30.py @@ -14,6 +14,7 @@ from rct229.rulesets.ashrae9012019.ruleset_functions.get_surface_conditioning_category_dict import ( get_surface_conditioning_category_dict, ) +from rct229.utils.std_comparisons import std_equal ABSORPTION_THERMAL_EXTERIOR = 0.9 UNDETERMINED_MSG = ( @@ -124,6 +125,12 @@ def rule_check(self, context, calc_vals=None, data=None): == ABSORPTION_THERMAL_EXTERIOR ) + def is_tolerance_fail(self, context, calc_vals=None, data=None): + return std_equal( + calc_vals["absorptance_thermal_exterior_p"], + ABSORPTION_THERMAL_EXTERIOR, + ) + def get_pass_msg(self, context, calc_vals=None, data=None): """Pre-condition: see rule_check""" absorptance_thermal_exterior_p = calc_vals[ diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule31.py b/rct229/rulesets/ashrae9012019/section5/section5rule31.py index c1e3aec87d..7a41875470 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule31.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule31.py @@ -89,6 +89,12 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + return ( + TARGET_ABSORPTANCE_SOLAR_EXTERIOR + == calc_vals["absorptance_solar_exterior"] + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): return std_equal( TARGET_ABSORPTANCE_SOLAR_EXTERIOR, calc_vals["absorptance_solar_exterior"], diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule32.py b/rct229/rulesets/ashrae9012019/section5/section5rule32.py index 9e4b82357f..d8d45e3c45 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule32.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule32.py @@ -14,6 +14,7 @@ from rct229.rulesets.ashrae9012019.ruleset_functions.get_surface_conditioning_category_dict import ( get_surface_conditioning_category_dict, ) +from rct229.utils.std_comparisons import std_equal ABSORPTANCE_SOLAR_EXTERIOR = 0.7 @@ -115,6 +116,12 @@ def rule_check(self, context, calc_vals=None, data=None): == ABSORPTANCE_SOLAR_EXTERIOR ) + def is_tolerance_fail(self, context, calc_vals=None, data=None): + return std_equal( + calc_vals["absorptance_solar_exterior_p"], + ABSORPTANCE_SOLAR_EXTERIOR, + ) + def get_pass_msg(self, context, calc_vals=None, data=None): """Pre-condition: see rule_check""" absorptance_solar_exterior_p = calc_vals["absorptance_solar_exterior_p"] diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule35.py b/rct229/rulesets/ashrae9012019/section5/section5rule35.py index 892885280c..eb047e26ea 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule35.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule35.py @@ -104,6 +104,16 @@ def get_calc_vals(self, context, data=None): } def rule_check(self, context, calc_vals=None, data=None): + building_total_air_leakage_rate = calc_vals[ + "building_total_air_leakage_rate" + ] + target_air_leakage_rate_75pa_b = calc_vals["target_air_leakage_rate_75pa_b"] + return ( + target_air_leakage_rate_75pa_b * TOTAL_AIR_LEAKAGE_FACTOR + == building_total_air_leakage_rate, + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): building_total_air_leakage_rate = calc_vals[ "building_total_air_leakage_rate" ] diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule36.py b/rct229/rulesets/ashrae9012019/section5/section5rule36.py index ffaea38efc..a9e05033ca 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule36.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule36.py @@ -9,6 +9,7 @@ get_zone_conditioning_category_dict, ) from rct229.utils.pint_utils import CalcQ +from rct229.utils.std_comparisons import std_equal class Section5Rule36(RuleDefinitionListIndexedBase): @@ -94,3 +95,9 @@ def rule_check(self, context, calc_vals=None, data=None): calc_vals["baseline_infiltration"] == calc_vals["proposed_infiltration"] ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + return std_equal( + calc_vals["baseline_infiltration"], + calc_vals["proposed_infiltration"], + ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule37.py b/rct229/rulesets/ashrae9012019/section5/section5rule37.py index 0cdba94826..84277f67e6 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule37.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule37.py @@ -149,6 +149,31 @@ def rule_check(self, context, calc_vals=None, data=None): "empty_measured_air_leakage_rate_flow_flag" ] + return ( + building_total_air_leakage_rate + == TOTAL_AIR_LEAKAGE_COEFF * target_air_leakage_rate_75pa_p + or ( + building_total_air_leakage_rate + != TOTAL_AIR_LEAKAGE_COEFF * target_air_leakage_rate_75pa_p + and empty_measured_air_leakage_rate_flow_flag == False + and building_total_air_leakage_rate + == TOTAL_AIR_LEAKAGE_COEFF + * building_total_measured_air_leakage_rate, + ) + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + building_total_air_leakage_rate = calc_vals[ + "building_total_air_leakage_rate" + ] + building_total_measured_air_leakage_rate = calc_vals[ + "building_total_measured_air_leakage_rate" + ] + target_air_leakage_rate_75pa_p = calc_vals["target_air_leakage_rate_75pa_p"] + empty_measured_air_leakage_rate_flow_flag = calc_vals[ + "empty_measured_air_leakage_rate_flow_flag" + ] + return std_equal( building_total_air_leakage_rate, TOTAL_AIR_LEAKAGE_COEFF * target_air_leakage_rate_75pa_p, diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule39.py b/rct229/rulesets/ashrae9012019/section5/section5rule39.py index c7ccdd46d6..74e64acc3a 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule39.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule39.py @@ -223,6 +223,11 @@ def get_manual_check_required_msg( return manual_check_required_msg def rule_check(self, context, calc_vals=None, data=None): + u_factor_b = calc_vals["u_factor_b"] + target_u_factor_b = calc_vals["target_u_factor_b"] + return target_u_factor_b == u_factor_b + + def is_tolerance_fail(self, context, calc_vals=None, data=None): u_factor_b = calc_vals["u_factor_b"] target_u_factor_b = calc_vals["target_u_factor_b"] return std_equal(target_u_factor_b, u_factor_b) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule4.py b/rct229/rulesets/ashrae9012019/section5/section5rule4.py index b55100119d..91a1269143 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule4.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule4.py @@ -135,5 +135,9 @@ def manual_check_required(self, context=None, calc_vals=None, data=None): def rule_check(self, context=None, calc_vals=None, data=None): roof_u_factor = calc_vals["roof_u_factor"] target_u_factor = calc_vals["target_u_factor"] + return roof_u_factor == target_u_factor + def is_tolerance_fail(self, context, calc_vals=None, data=None): + roof_u_factor = calc_vals["roof_u_factor"] + target_u_factor = calc_vals["target_u_factor"] return std_le(val=roof_u_factor, std_val=target_u_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule40.py b/rct229/rulesets/ashrae9012019/section5/section5rule40.py index 33462f6041..cb5dfd03b7 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule40.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule40.py @@ -15,6 +15,7 @@ get_surface_conditioning_category_dict, ) from rct229.utils.jsonpath_utils import find_one +from rct229.utils.std_comparisons import std_equal class Section5Rule40(RuleDefinitionListIndexedBase): @@ -123,3 +124,18 @@ def rule_check(self, context, calc_vals=None, data=None): absorptance_solar_exterior_b == absorptance_solar_exterior_p and absorptance_thermal_exterior_b == absorptance_thermal_exterior_p ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + absorptance_solar_exterior_b = calc_vals["absorptance_solar_exterior_b"] + absorptance_solar_exterior_p = calc_vals["absorptance_solar_exterior_p"] + absorptance_thermal_exterior_b = calc_vals[ + "absorptance_thermal_exterior_b" + ] + absorptance_thermal_exterior_p = calc_vals[ + "absorptance_thermal_exterior_p" + ] + return std_equal( + absorptance_solar_exterior_b, absorptance_solar_exterior_p + ) and std_equal( + absorptance_thermal_exterior_b, absorptance_thermal_exterior_p + ) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule6.py b/rct229/rulesets/ashrae9012019/section5/section5rule6.py index a416284446..ca9333b869 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule6.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule6.py @@ -138,5 +138,9 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): below_grade_wall_c_factor = calc_vals["below_grade_wall_c_factor"] target_c_factor = calc_vals["target_c_factor"] + return below_grade_wall_c_factor == target_c_factor + def is_tolerance_fail(self, context, calc_vals=None, data=None): + below_grade_wall_c_factor = calc_vals["below_grade_wall_c_factor"] + target_c_factor = calc_vals["target_c_factor"] return std_le(val=below_grade_wall_c_factor, std_val=target_c_factor) diff --git a/rct229/rulesets/ashrae9012019/section5/section5rule8.py b/rct229/rulesets/ashrae9012019/section5/section5rule8.py index f3aa085e7e..ab971e2c7f 100644 --- a/rct229/rulesets/ashrae9012019/section5/section5rule8.py +++ b/rct229/rulesets/ashrae9012019/section5/section5rule8.py @@ -131,5 +131,9 @@ def manual_check_required(self, context, calc_vals=None, data=None): def rule_check(self, context, calc_vals=None, data=None): above_grade_wall_u_factor = calc_vals["above_grade_wall_u_factor"] target_u_factor = calc_vals["target_u_factor"] + return above_grade_wall_u_factor == target_u_factor + def is_tolerance_fail(self, context, calc_vals=None, data=None): + above_grade_wall_u_factor = calc_vals["above_grade_wall_u_factor"] + target_u_factor = calc_vals["target_u_factor"] return std_le(val=above_grade_wall_u_factor, std_val=target_u_factor) From 995816b25806e3dda0592e68cdd7104ed0a71aec Mon Sep 17 00:00:00 2001 From: Xie Date: Mon, 22 Jan 2024 11:35:15 -0500 Subject: [PATCH 3/3] is_tolerance_fail method in section 6 --- .../ashrae9012019/section6/section6rule2.py | 15 ++++++++++ .../ashrae9012019/section6/section6rule3.py | 5 ++++ .../ashrae9012019/section6/section6rule4.py | 28 +++++++++++++++++++ .../ashrae9012019/section6/section6rule5.py | 12 +++++++- .../ashrae9012019/section6/section6rule8.py | 6 ++++ .../ashrae9012019/section6/section6rule9.py | 11 ++++++++ 6 files changed, 76 insertions(+), 1 deletion(-) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule2.py b/rct229/rulesets/ashrae9012019/section6/section6rule2.py index 7a710fa1ff..59650259d7 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule2.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule2.py @@ -7,6 +7,7 @@ from rct229.schema.config import ureg from rct229.utils.jsonpath_utils import find_all from rct229.utils.pint_utils import ZERO, CalcQ +from rct229.utils.std_comparisons import std_equal GUEST_ROOM = SchemaEnums.schema_enums[ "LightingSpaceOptions2019ASHRAE901TG37" @@ -116,3 +117,17 @@ def rule_check(self, context, calc_vals=None, data=None): return space_lighting_power_per_area_p == max( lighting_power_allowance_p, space_lighting_power_per_area_u ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + lighting_power_allowance_p = calc_vals["lighting_power_allowance_p"] + space_lighting_power_per_area_p = calc_vals[ + "space_lighting_power_per_area_p" + ] + space_lighting_power_per_area_u = calc_vals[ + "space_lighting_power_per_area_u" + ] + + return std_equal( + space_lighting_power_per_area_p, + max(lighting_power_allowance_p, space_lighting_power_per_area_u), + ) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule3.py b/rct229/rulesets/ashrae9012019/section6/section6rule3.py index aeec449d47..095fc58b09 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule3.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule3.py @@ -96,6 +96,11 @@ def manual_check_required(self, context, calc_vals=None, data=None): ) def rule_check(self, context, calc_vals=None, data=None): + total_space_lpd_u = calc_vals["total_space_lpd_u"] + total_space_lpd_p = calc_vals["total_space_lpd_p"] + return total_space_lpd_u == total_space_lpd_p + + def is_tolerance_fail(self, context, calc_vals=None, data=None): total_space_lpd_u = calc_vals["total_space_lpd_u"] total_space_lpd_p = calc_vals["total_space_lpd_p"] return std_equal(total_space_lpd_u, total_space_lpd_p) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule4.py b/rct229/rulesets/ashrae9012019/section6/section6rule4.py index ef234f22b1..ffd2e7bcd2 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule4.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule4.py @@ -128,6 +128,34 @@ def rule_check(self, context, calc_vals=None, data=None): total_space_lpd_b = calc_vals["total_space_lpd_b"] lpd_allowance_b = calc_vals["lpd_allowance_b"] + return ( + # Not Case 1 + not ( + space_lighting_status_type_p + == LightingStatusType.AS_DESIGNED_OR_AS_EXISTING + and not lighting_space_type_b + ) + # Passes for both values of space_lighting_status_type_p + and ( + space_lighting_status_type_p + in [ + LightingStatusType.AS_DESIGNED_OR_AS_EXISTING, + LightingStatusType.NOT_YET_DESIGNED_OR_MATCH_TABLE_9_5_1, + ] + and total_space_lpd_b == lpd_allowance_b + ) + ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + space_b = context.BASELINE_0 + lighting_space_type_b = space_b.get("lighting_space_type") + + space_lighting_status_type_p = calc_vals[ + "space_lighting_status_type_p" + ] + total_space_lpd_b = calc_vals["total_space_lpd_b"] + lpd_allowance_b = calc_vals["lpd_allowance_b"] + return ( # Not Case 1 not ( diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule5.py b/rct229/rulesets/ashrae9012019/section6/section6rule5.py index 1e3779a1ea..41937feae6 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule5.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule5.py @@ -16,6 +16,7 @@ from rct229.utils.jsonpath_utils import find_all, find_exactly_one_with_field_value from rct229.utils.masks import invert_mask from rct229.utils.pint_utils import ZERO +from rct229.utils.std_comparisons import std_equal BUILDING_AREA_CUTTOFF = ureg("5000 ft2") @@ -185,8 +186,17 @@ def rule_check(self, context, calc_vals=None, data=None): schedule_comparison_result = calc_vals[ "schedule_comparison_result" ] - return ( schedule_comparison_result["total_hours_compared"] == schedule_comparison_result["total_hours_matched"] ) + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + schedule_comparison_result = calc_vals[ + "schedule_comparison_result" + ] + + return std_equal( + schedule_comparison_result["total_hours_compared"], + schedule_comparison_result["total_hours_matched"], + ) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule8.py b/rct229/rulesets/ashrae9012019/section6/section6rule8.py index d4b6205128..d2e3c1e4f3 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule8.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule8.py @@ -11,6 +11,7 @@ from rct229.utils.assertions import getattr_ from rct229.utils.jsonpath_utils import find_all, find_exactly_one_with_field_value from rct229.utils.pint_utils import ZERO +from rct229.utils.std_comparisons import std_equal MANUAL_CHECK_MSG = ( "Lighting schedule in P-RMD including adjusted lighting occupancy sensor reduction factor is " @@ -174,3 +175,8 @@ def rule_check(self, context, calc_vals=None, data=None): total_hours_compared = calc_vals["total_hours_compared"] total_hours_matched = calc_vals["total_hours_matched"] return total_hours_matched == total_hours_compared + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + total_hours_compared = calc_vals["total_hours_compared"] + total_hours_matched = calc_vals["total_hours_matched"] + return std_equal(total_hours_matched, total_hours_compared) diff --git a/rct229/rulesets/ashrae9012019/section6/section6rule9.py b/rct229/rulesets/ashrae9012019/section6/section6rule9.py index 8da76cdf49..edc6a75ee5 100644 --- a/rct229/rulesets/ashrae9012019/section6/section6rule9.py +++ b/rct229/rulesets/ashrae9012019/section6/section6rule9.py @@ -12,6 +12,7 @@ from rct229.utils.assertions import getattr_ from rct229.utils.jsonpath_utils import find_all, find_exactly_one_with_field_value from rct229.utils.pint_utils import ZERO +from rct229.utils.std_comparisons import std_equal FLOOR_AREA_LIMIT = 5000 * ureg("ft2") # square foot @@ -187,6 +188,16 @@ def rule_check(self, context, calc_vals=None, data=None): total_hours_matched = calc_vals["total_hours_matched"] return total_hours_matched == total_hours_compared + def rule_check(self, context, calc_vals=None, data=None): + total_hours_compared = calc_vals["total_hours_compared"] + total_hours_matched = calc_vals["total_hours_matched"] + return total_hours_matched == total_hours_compared + + def is_tolerance_fail(self, context, calc_vals=None, data=None): + total_hours_compared = calc_vals["total_hours_compared"] + total_hours_matched = calc_vals["total_hours_matched"] + return std_equal(total_hours_matched, total_hours_compared) + def get_fail_msg(self, context, calc_vals=None, data=None): eflh_difference = calc_vals["eflh_difference"] return f"Space lighting schedule EFLH in P-RMD is {eflh_difference} of that in B-RMD."