ASFE21 Part 1: Time equivalence

Part 1 of the analysis carried out for the conference paper submitted to ASFE21, “An Improved Reliability-Based Approach to Sepcifying Fire Resistance Periods For Buildings in England”

2021 April, Ian F.

In the design of fire safety provisions for straightforward/common buildings in England the appropriate structural fire resistance is selected from guidance based upon building height and occupancy characteristics. This has been expanded upon in contemporary guidance to include consideration of ventilation conditions informed by work carried out in 2004 by Kirby, et al. in their paper “A new approach to specifying fire resistance periods” and has been implemented in British Standard, BS 9999:2017. In the work of Kirby, et al., a probabilistic time equivalence analysis was carried out using Monte Carlo simulations (MCS). Stochastic parameters were used to produce a range of credible design fires. These were primarily fuel load density, compartment geometry and ventilation opening size. The design fires were generated using the parametric fire model in EN 1991-1-2 and the contribution of sprinklers was considered through a reduced fire load. To link to existing fire resistance recommendations which did not consider ventilation, the safety/reliability target was calibrated to align with statutory guidance, Approved Document B (ADB), using a medium-rise office as an anchor point.

This study revisits the work of Kirby et al., resolving key limitations and incorporating advancements in the field to present a new approach to assessing the recommended fire resistance for structures and proposes a revised fire resistance design table for England. To seek alignment with general structural design principles/requirements, as defined in Approved Document A (ADA), safety targets are expressed in function of consequence classes in lieu of building height and use. Other key advancements include improved stochastic parameters, the use of travelling fires where post-flashover parametric fires are unrealistic (i.e., a more explicit consideration of large enclosure fire dynamics), and consideration of sprinkler contribution in the event tree in terms of their ability to mitigate structurally significant fire occurrences.

The improved approach presented provides a more up to date method for defining appropriate fire resistance for straightforward/common buildings in England.

Benchmark against Kirby et al

Prepare MCS inputs

The analysis is comprised of three cases: Office, Resiential and Retail. All input parameters are inline with Kirby et al.

MCS inputs are prepared in accordance with Kirby et al with several adjustments below:

[5]:
print_df(df_inputs_1)
Residential Office Retail
case_name
n_simulations 10000 10000 10000
fire_time_step 10 10 10
fire_time_duration 18000 18000 18000
fire_hrr_density:dist uniform_ uniform_ uniform_
fire_hrr_density:lbound 0.32 0.15 0.27
fire_hrr_density:ubound 0.57 0.65 1.0
fire_load_density:dist gumbel_r_ gumbel_r_ gumbel_r_
fire_load_density:lbound 10 10 10.0
fire_load_density:ubound 1200 1200 2000.0
fire_load_density:mean 780 420 600.0
fire_load_density:sd 234 126 180.0
fire_spread_speed:dist uniform_ uniform_ uniform_
fire_spread_speed:lbound 0.0035 0.0035 0.0035
fire_spread_speed:ubound 0.019 0.019 0.019
fire_nft_limit:dist norm_ norm_ norm_
fire_nft_limit:lbound 623.15 623.15 623.15
fire_nft_limit:ubound 1473.15 1473.15 1473.15
fire_nft_limit:mean 1323.15 1323.15 1323.15
fire_nft_limit:sd 93 93 93
fire_combustion_efficiency:dist uniform_ uniform_ uniform_
fire_combustion_efficiency:lbound 0.9999 0.9999 0.9999
fire_combustion_efficiency:ubound 1.0 1.0 1.0
beam_cross_section_area 0.017 0.017 0.017
beam_position_vertical 3.2 3.2 3.2
beam_rho 7850 7850 7850
fire_mode 0 0 0
fire_gamma_fi_q 1 1 1
fire_t_alpha 300 300 300
fire_tlim 0.333 0.333 0.333
protection_c 1700 1700 1700
protection_k 0.2 0.2 0.2
protection_protected_perimeter 2.14 2.14 2.14
protection_rho 800 800 800
room_height:dist constant_ uniform_ constant_
room_height:lbound 2.4 2.8 4.5
room_height:ubound 2.4 4.5 7.0
room_wall_thermal_inertia 720 720 720
solver_temperature_goal 823.15 823.15 823.15
solver_max_iter 20 20 20
solver_thickness_lbound 0.0001 0.0001 0.0001
solver_thickness_ubound 0.045 0.045 0.045
solver_tol 1.0 1.0 1.0
window_open_fraction_permanent 0 0 0
timber_exposed_area 0 0 0
timber_charring_rate 0.7 0.7 0.7
timber_hc 13.2 13.2 13.2
timber_density 400 400 400
timber_solver_ilim 20 20 20
timber_solver_tol 1 1 1
beam_position_horizontal_ratio:dist uniform_ uniform_ uniform_
beam_position_horizontal_ratio:lbound 0.6 0.6 0.6
beam_position_horizontal_ratio:ubound 0.9 0.9 0.9
room_floor_area:dist uniform_ uniform_ uniform_
room_floor_area:lbound 9.0 50.0 50.0
room_floor_area:ubound 30.0 1000.0 1000.0
room_breadth_depth_ratio:dist uniform_ uniform_ uniform_
room_breadth_depth_ratio:lbound 0.4 0.4 0.4
room_breadth_depth_ratio:ubound 0.6 0.6 0.6
window_height_room_height_ratio:dist uniform_ uniform_ uniform_
window_height_room_height_ratio:lbound 0.3 0.3 0.5
window_height_room_height_ratio:ubound 0.9 0.9 1.0
window_area_floor_ratio:dist uniform_ uniform_ uniform_
window_area_floor_ratio:lbound 0.05 0.05 0.05
window_area_floor_ratio:ubound 0.2 0.4 0.4
phi_teq 1 1 1
window_open_fraction 1 1 1

Run MCS

[6]:
# Run MCS
cases_to_run=['Residential', 'Office', 'Retail']

mcs_1 = MCS2(print_stats=True)
mcs_1.inputs = df_inputs_1
mcs_1.n_threads = 6
mcs_1.run_mcs(cases_to_run=cases_to_run)
CASE                    : Residential
NO. OF THREADS          : 6
NO. OF SIMULATIONS      : 10000
100%|███████████████| 10000/10000 [00:08<00:00, 1237.60it/s]
fire_type               : {0.0: 8893}
beam_position_horizontal: 2.394     4.625     7.591
window_open_fraction    : 1.000     1.000     1.000
fire_combustion_efficien: 1.000     1.000     1.000
fire_hrr_density        : 0.320     0.445     0.570
fire_load_density       : 268.266   717.240   1199.352
fire_nft_limit          : 623.150   1312.455  1473.069
fire_spread_speed       : 0.004     0.011     0.019
phi_teq                 : 1.000     1.000     1.000
timber_fire_load        : 0.000     0.000     0.000

CASE                    : Office
NO. OF THREADS          : 6
NO. OF SIMULATIONS      : 10000
100%|███████████████| 10000/10000 [00:05<00:00, 1935.35it/s]
fire_type               : {0.0: 9973}
beam_position_horizontal: 5.858     23.396    42.834
window_open_fraction    : 1.000     1.000     1.000
fire_combustion_efficien: 1.000     1.000     1.000
fire_hrr_density        : 0.150     0.400     0.650
fire_load_density       : 10.000    418.971   1200.000
fire_nft_limit          : 623.150   1312.458  1473.150
fire_spread_speed       : 0.004     0.011     0.019
phi_teq                 : 1.000     1.000     1.000
timber_fire_load        : 0.000     0.000     0.000

CASE                    : Retail
NO. OF THREADS          : 6
NO. OF SIMULATIONS      : 10000
100%|███████████████| 10000/10000 [00:05<00:00, 1947.01it/s]
fire_type               : {0.0: 9949}
beam_position_horizontal: 5.820     23.387    43.885
window_open_fraction    : 1.000     1.000     1.000
fire_combustion_efficien: 1.000     1.000     1.000
fire_hrr_density        : 0.270     0.635     1.000
fire_load_density       : 207.213   597.732   2000.000
fire_nft_limit          : 623.150   1312.454  1473.150
fire_spread_speed       : 0.004     0.011     0.019
phi_teq                 : 1.000     1.000     1.000
timber_fire_load        : 0.000     0.000     0.000

Time equivalence results

Inspect simulation results to ensure the simulations are complete successfully.

[8]:
fig, ax = plt.subplots(figsize=(2.5, 2.5), dpi=100)
lss=['-', '-.', 'dotted']
FRs = np.linspace(0, 180, 100)

for i, case in enumerate(cases_to_run):
    ax.plot(FRs, dict_func_teq2cdf[case](FRs), label=case, ls=lss[i], c='k')
format_ax(ax=ax, xlabel='Equivalent of time exposure [$min$]', ylabel='CDF', xlim=(30, 180), ylim=(0, 1), xticks=np.arange(30, 181, 30,), yticks=np.arange(0, 1.1, 0.1))
savefig(fig, 'teq_1.png')
../../_images/user_guide_mcs2_asfe21_01_11_0.png

It is obvious Residential produced much worse time equivalence results comparing to the other two, primarily due to higher fuel load density.

Comparing agsint Kirby et al

Time equivalence CDF obtained from Kirby et al is shown in below.

[10]:
print_df(kirby)
Residential Office Retail
teq
30 0.169 0.464 0.404
45 0.193 0.647 NaN
60 0.361 0.800 0.734
75 0.629 0.896 NaN
90 0.844 0.928 0.912
105 0.953 0.973 NaN
120 0.991 0.982 0.968
[11]:
fig, axes = plt.subplots(nrows=1, ncols=3, figsize=(2.1*3, 2.5), sharex=True, sharey=True, dpi=100)

for i, case in enumerate(cases_to_run):
    ax = axes[i]
    ax.scatter(kirby.index.values, kirby[case].values, label='Kirby et al', marker='o', facecolors='none', edgecolors='k', linewidths=.8)
    ax.plot(kirby.index.values[~np.isnan(kirby[case].values)], kirby[case].values[~np.isnan(kirby[case].values)], ls='--', c='k', lw=.5)
    ax.scatter(kirby.index.values, dict_func_teq2cdf[case](kirby.index.values), label='SFEPRAPY', marker='^', facecolors='none', edgecolors='k', linewidths=.8)
    ax.plot(kirby.index.values, dict_func_teq2cdf[case](kirby.index.values), ls='-.', c='k', lw=.5)
    format_ax(ax=ax, xlabel='Equivalent of time exposure [$min$]', xlabel_fontsize='x-small', xticks=np.arange(30, 121, 30), xticks_minor=np.arange(30, 121, 15), ylim=(0, 1), yticks=np.arange(0, 1.1, 0.1), legend_title=case, legend_loc=4, legend_fontsize='xx-small', legend_title_fontsize='xx-small')
axes[0].set_ylabel('CDF', fontsize='x-small')

savefig(fig, 'benchmark_1.png')
../../_images/user_guide_mcs2_asfe21_01_16_0.png

end