SFPE Handbook

This page contains practical examples using SFPE Handbook calculations, organized by chapter.

Chapter 50

Example 2: Door Opening Force

"""
OpenFire Example — SFPE Handbook Chapter 50
Topic: Door opening force for a side-hinged swinging door (Eq. 50.14)

Unit policy:
- All calculations performed in SI units (m, Pa, N).
- Inputs may be provided in non-SI, but are converted explicitly before use.

Given conversions (per user requirement):
- 1 ft = 0.3048 m
- 1 in = 0.0254 m
- 1 in H2O = 249.09 Pa

Additional necessary conversion:
- 1 lbf = 4.4482216152605 N
"""

import ofire


# =============================================================================
# 1) Unit conversions (explicit)
# =============================================================================
FT_TO_M = 0.3048
IN_TO_M = 0.0254
IN_H2O_TO_PA = 249.09
LBF_TO_N = 4.4482216152605


# =============================================================================
# 2) Inputs (as given in the problem statement)
# =============================================================================
door_width_ft = 3.0
door_height_ft = 7.0
closer_force_lbf = 9.0
delta_p_in_h2o = 0.35
knob_offset_from_edge_in = 3.0  # knob is 3 in from the door edge (knob side)


# =============================================================================
# 3) Convert inputs to SI (SI-only variables used in calculations)
# =============================================================================
W_m = door_width_ft * FT_TO_M
H_m = door_height_ft * FT_TO_M
A_m2 = W_m * H_m

F_dc_N = closer_force_lbf * LBF_TO_N
delta_p_Pa = delta_p_in_h2o * IN_H2O_TO_PA
d_m = knob_offset_from_edge_in * IN_TO_M


# =============================================================================
# 4) Calculation (OpenFire — SFPE HB Ch.50 Eq. 50.14)
# =============================================================================
F_open_N = ofire.sfpe_handbook.chapter_50.equation_50_14.door_opening_force(
    f_dc=F_dc_N,
    w=W_m,
    a=A_m2,
    delta_p=delta_p_Pa,
    d=d_m,
)


# =============================================================================
# 5) Print inputs and results (always)
# =============================================================================
print("=" * 72)
print("OpenFire — SFPE Handbook Ch.50 — Door Opening Force (Eq. 50.14)")
print("=" * 72)

print("\nINPUTS (original, as stated):")
print(f"  Door width                 = {door_width_ft:.3f} ft")
print(f"  Door height                = {door_height_ft:.3f} ft")
print(f"  Door closer force          = {closer_force_lbf:.3f} lbf")
print(f"  Pressure difference, Δp    = {delta_p_in_h2o:.3f} in H2O")
print(f"  Knob offset from edge      = {knob_offset_from_edge_in:.3f} in")

print("\nINPUTS (converted to SI; used in calculation):")
print(f"  Door width, W              = {W_m:.6f} m")
print(f"  Door height, H             = {H_m:.6f} m")
print(f"  Door area, A               = {A_m2:.6f} m^2")
print(f"  Door closer force, F_dc    = {F_dc_N:.6f} N")
print(f"  Pressure difference, Δp    = {delta_p_Pa:.6f} Pa")
print(f"  Knob offset, d             = {d_m:.6f} m")

print("\nRESULTS (SI):")
print(f"  Total door opening force, F = {F_open_N:.6f} N")

print("\nNotes:")
print("  - All calculations performed in SI units (m, Pa, N).")
print("  - OpenFire function: ofire.sfpe_handbook.chapter_50.equation_50_14.door_opening_force")
print("=" * 72)

Example 3: Simple Stairwell Pressurization in a Simple Building

Part 1

"""
OpenFire Example — SFPE Handbook Chapter 50 (Smoke Control)
Example 3 (Part 1): Simple Stairwell Pressurization in a Simple Building

Question (Part 1):
- Stairwells pressurized with UNTREATED outside air.
- Can the stairwell be pressurized? (Check height limit vs building height)

Method (OpenFire):
- Eq. 50.17: Stairwell temperature for untreated pressurization air, T_s
- Eq. 50.16: Flow area factor, F_r
- Eq. 50.15: Height limit, H_m

Decision criterion:
- If H_m >= building height, then the stairwell can be pressurized (under these assumptions).

Unit policy:
- All calculations performed in SI units (m, m², Pa, °C).
- Inputs provided in Imperial / °F are explicitly converted.

Given conversions (per user requirement):
- 1 ft = 0.3048 m
- 1 in H2O = 249.09 Pa
"""

import ofire


# =============================================================================
# 1) Unit conversions (explicit)
# =============================================================================
FT_TO_M = 0.3048
IN_H2O_TO_PA = 249.09

# Additional necessary conversions (temperature, area)
def f_to_c(temp_f: float) -> float:
    """Convert temperature from °F to °C."""
    return (temp_f - 32.0) * (5.0 / 9.0)

def ft2_to_m2(area_ft2: float) -> float:
    """Convert area from ft² to m² using 1 ft = 0.3048 m."""
    return area_ft2 * (FT_TO_M ** 2)


# =============================================================================
# 2) Inputs (as given in the problem statement)
# =============================================================================
t_outdoor_f = 10.0
t_building_f = 70.0

delta_p_min_in_h2o = 0.10
delta_p_max_in_h2o = 0.35

floor_to_floor_height_ft = 10.0
building_height_ft = 200.0

a_sb_ft2 = 0.34  # flow area between stairwell and building (typical floor)
a_bo_ft2 = 0.30  # flow area per stairwell between building and outside

eta = 0.15  # heat transfer factor (given / suggested)


# =============================================================================
# 3) Convert inputs to SI (SI-only variables used in calculations)
# =============================================================================
t_outdoor_c = f_to_c(t_outdoor_f)
t_building_c = f_to_c(t_building_f)

delta_p_min_pa = delta_p_min_in_h2o * IN_H2O_TO_PA
delta_p_max_pa = delta_p_max_in_h2o * IN_H2O_TO_PA

floor_to_floor_height_m = floor_to_floor_height_ft * FT_TO_M
building_height_m = building_height_ft * FT_TO_M

a_sb_m2 = ft2_to_m2(a_sb_ft2)
a_bo_m2 = ft2_to_m2(a_bo_ft2)


# =============================================================================
# 4) Calculation (OpenFire — SFPE HB Ch.50 Eq. 50.17, 50.16, 50.15)
# =============================================================================
# Eq. 50.17 — stairwell temperature for untreated air
t_stair_c = ofire.sfpe_handbook.chapter_50.equation_50_17.stairwell_temperature(
    t_0=t_outdoor_c,
    eta=eta,
    t_b=t_building_c,
)

# Eq. 50.16 — flow area factor
f_r = ofire.sfpe_handbook.chapter_50.equation_50_16.factor(
    a_sb=a_sb_m2,
    a_bo=a_bo_m2,
    t_b=t_building_c,
    t_s=t_stair_c,
)

# Eq. 50.15 — height limit
h_m = ofire.sfpe_handbook.chapter_50.equation_50_15.height_limit(
    f_r=f_r,
    delta_p_max=delta_p_max_pa,
    delta_p_min=delta_p_min_pa,
    t_0=t_outdoor_c,
    t_s=t_stair_c,
)

can_pressurize = h_m >= building_height_m


# =============================================================================
# 5) Print inputs and results (always)
# =============================================================================
print("=" * 72)
print("OpenFire — SFPE Handbook Ch.50 — Example 3 (Part 1)")
print("Simple Stairwell Pressurization (Untreated Outside Air)")
print("=" * 72)

print("\nINPUTS (original, as stated):")
print(f"  Outdoor temperature, T_o         = {t_outdoor_f:.3f} °F")
print(f"  Building temperature, T_b        = {t_building_f:.3f} °F")
print(f"  Min pressure diff, Δp_min        = {delta_p_min_in_h2o:.3f} in H2O")
print(f"  Max pressure diff, Δp_max        = {delta_p_max_in_h2o:.3f} in H2O")
print(f"  Floor-to-floor height            = {floor_to_floor_height_ft:.3f} ft")
print(f"  Building height                  = {building_height_ft:.3f} ft")
print(f"  Flow area stair→building, A_SB    = {a_sb_ft2:.3f} ft²")
print(f"  Flow area building→outside, A_BO  = {a_bo_ft2:.3f} ft² (per stairwell)")
print(f"  Heat transfer factor, η          = {eta:.3f}")

print("\nINPUTS (converted to SI; used in calculation):")
print(f"  Outdoor temperature, T_o         = {t_outdoor_c:.6f} °C")
print(f"  Building temperature, T_b        = {t_building_c:.6f} °C")
print(f"  Min pressure diff, Δp_min        = {delta_p_min_pa:.6f} Pa")
print(f"  Max pressure diff, Δp_max        = {delta_p_max_pa:.6f} Pa")
print(f"  Floor-to-floor height            = {floor_to_floor_height_m:.6f} m")
print(f"  Building height                  = {building_height_m:.6f} m")
print(f"  Flow area stair→building, A_SB    = {a_sb_m2:.8f} m²")
print(f"  Flow area building→outside, A_BO  = {a_bo_m2:.8f} m²")

print("\nRESULTS (SI):")
print(f"  Stairwell temperature, T_s       = {t_stair_c:.6f} °C  (Eq. 50.17)")
print(f"  Flow area factor, F_r            = {f_r:.6f} (-)      (Eq. 50.16)")
print(f"  Height limit, H_m                = {h_m:.6f} m        (Eq. 50.15)")
print(f"  Decision (H_m >= building height) = {can_pressurize}")

print("\nCONCLUSION:")
if can_pressurize:
    print("  The stairwell CAN be pressurized under these assumptions.")
else:
    print("  The stairwell CANNOT be pressurized under these assumptions.")

print("\nNotes:")
print("  - All calculations performed in SI units (m, m², Pa, °C).")
print("  - OpenFire functions used:")
print("      * Eq. 50.17: ofire.sfpe_handbook.chapter_50.equation_50_17.stairwell_temperature")
print("      * Eq. 50.16: ofire.sfpe_handbook.chapter_50.equation_50_16.factor")
print("      * Eq. 50.15: ofire.sfpe_handbook.chapter_50.equation_50_15.height_limit")
print("=" * 72)

Part 2

"""
OpenFire Example — SFPE Handbook Chapter 50 (Smoke Control)
Example 3 (Part 2): Simple Stairwell Pressurization in a Simple Building

Question (Part 2):
- Stairwells pressurized with TREATED air at 70°F (i.e., supply air temperature).
- Can the stairwell be pressurized? (Check height limit vs building height)

Method (OpenFire):
- Eq. 50.16: Flow area factor, F_r
- Eq. 50.15: Height limit, H_m

Decision criterion:
- If H_m >= building height, then the stairwell can be pressurized (under these assumptions).

Unit policy:
- All calculations performed in SI units (m, m², Pa, °C).
- Inputs provided in Imperial / °F are explicitly converted.

Given conversions (per user requirement):
- 1 ft = 0.3048 m
- 1 in H2O = 249.09 Pa
"""

import ofire


# =============================================================================
# 1) Unit conversions (explicit)
# =============================================================================
FT_TO_M = 0.3048
IN_H2O_TO_PA = 249.09

# Additional necessary conversions (temperature, area)
def f_to_c(temp_f: float) -> float:
    """Convert temperature from °F to °C."""
    return (temp_f - 32.0) * (5.0 / 9.0)

def ft2_to_m2(area_ft2: float) -> float:
    """Convert area from ft² to m² using 1 ft = 0.3048 m."""
    return area_ft2 * (FT_TO_M ** 2)


# =============================================================================
# 2) Inputs (as given in the problem statement)
# =============================================================================
t_outdoor_f = 10.0
t_building_f = 70.0

# Part 2 condition: treated stair pressurization air temperature
t_stair_supply_f = 70.0

delta_p_min_in_h2o = 0.10
delta_p_max_in_h2o = 0.35

floor_to_floor_height_ft = 10.0
building_height_ft = 200.0

a_sb_ft2 = 0.34  # flow area between stairwell and building (typical floor)
a_bo_ft2 = 0.30  # flow area per stairwell between building and outside


# =============================================================================
# 3) Convert inputs to SI (SI-only variables used in calculations)
# =============================================================================
t_outdoor_c = f_to_c(t_outdoor_f)
t_building_c = f_to_c(t_building_f)
t_stair_c = f_to_c(t_stair_supply_f)

delta_p_min_pa = delta_p_min_in_h2o * IN_H2O_TO_PA
delta_p_max_pa = delta_p_max_in_h2o * IN_H2O_TO_PA

floor_to_floor_height_m = floor_to_floor_height_ft * FT_TO_M
building_height_m = building_height_ft * FT_TO_M

a_sb_m2 = ft2_to_m2(a_sb_ft2)
a_bo_m2 = ft2_to_m2(a_bo_ft2)


# =============================================================================
# 4) Calculation (OpenFire — SFPE HB Ch.50 Eq. 50.16 and 50.15)
# =============================================================================
# Eq. 50.16 — flow area factor
f_r = ofire.sfpe_handbook.chapter_50.equation_50_16.factor(
    a_sb=a_sb_m2,
    a_bo=a_bo_m2,
    t_b=t_building_c,
    t_s=t_stair_c,
)

# Eq. 50.15 — height limit
h_m = ofire.sfpe_handbook.chapter_50.equation_50_15.height_limit(
    f_r=f_r,
    delta_p_max=delta_p_max_pa,
    delta_p_min=delta_p_min_pa,
    t_0=t_outdoor_c,
    t_s=t_stair_c,
)

can_pressurize = h_m >= building_height_m


# =============================================================================
# 5) Print inputs and results (always)
# =============================================================================
print("=" * 72)
print("OpenFire — SFPE Handbook Ch.50 — Example 3 (Part 2)")
print("Simple Stairwell Pressurization (Treated Air at 70°F)")
print("=" * 72)

print("\nINPUTS (original, as stated):")
print(f"  Outdoor temperature, T_o          = {t_outdoor_f:.3f} °F")
print(f"  Building temperature, T_b         = {t_building_f:.3f} °F")
print(f"  Treated stair supply temp, T_s    = {t_stair_supply_f:.3f} °F")
print(f"  Min pressure diff, Δp_min         = {delta_p_min_in_h2o:.3f} in H2O")
print(f"  Max pressure diff, Δp_max         = {delta_p_max_in_h2o:.3f} in H2O")
print(f"  Floor-to-floor height             = {floor_to_floor_height_ft:.3f} ft")
print(f"  Building height                   = {building_height_ft:.3f} ft")
print(f"  Flow area stair→building, A_SB     = {a_sb_ft2:.3f} ft²")
print(f"  Flow area building→outside, A_BO   = {a_bo_ft2:.3f} ft² (per stairwell)")

print("\nINPUTS (converted to SI; used in calculation):")
print(f"  Outdoor temperature, T_o          = {t_outdoor_c:.6f} °C")
print(f"  Building temperature, T_b         = {t_building_c:.6f} °C")
print(f"  Stairwell temperature, T_s        = {t_stair_c:.6f} °C")
print(f"  Min pressure diff, Δp_min         = {delta_p_min_pa:.6f} Pa")
print(f"  Max pressure diff, Δp_max         = {delta_p_max_pa:.6f} Pa")
print(f"  Floor-to-floor height             = {floor_to_floor_height_m:.6f} m")
print(f"  Building height                   = {building_height_m:.6f} m")
print(f"  Flow area stair→building, A_SB     = {a_sb_m2:.8f} m²")
print(f"  Flow area building→outside, A_BO   = {a_bo_m2:.8f} m²")

print("\nRESULTS (SI):")
print(f"  Flow area factor, F_r             = {f_r:.6f} (-)      (Eq. 50.16)")
print(f"  Height limit, H_m                 = {h_m:.6f} m        (Eq. 50.15)")
print(f"  Decision (H_m >= building height) = {can_pressurize}")

print("\nCONCLUSION:")
if can_pressurize:
    print("  The stairwell CAN be pressurized under these assumptions.")
else:
    print("  The stairwell CANNOT be pressurized under these assumptions.")

print("\nNotes:")
print("  - All calculations performed in SI units (m, m², Pa, °C).")
print("  - For treated air, T_s is taken as the treated supply temperature.")
print("  - OpenFire functions used:")
print("      * Eq. 50.16: ofire.sfpe_handbook.chapter_50.equation_50_16.factor")
print("      * Eq. 50.15: ofire.sfpe_handbook.chapter_50.equation_50_15.height_limit")
print("=" * 72)