При проектировании систем пожарной безопасности пожарный инженер должен определить ожидаемую величину пожара на основе деталей проекта. В Австралии корреляция Альперта и уравнения Хескестада обычно используются для определения размера пожара, при котором срабатывает спринклерная головка.
В этом блоге я написал сценарий Python для расчета времени и размера возгорания при активации спринклера.
Уравнение Хескестада
В этом разделе представлено уравнение, разработанное для определения времени срабатывания спринклера. См. «Количественную оценку термочувствительности автоматических спринклеров, включая эффекты проводимости» Гуннара Хескестада и Роберта Билла-младшего, опубликованную в Fire Safety Journal, 14 (1988) 113–125.
Уравнение 15:
Где,
Вышеупомянутое уравнение можно переписать как,
Уравнения Альперта
В этом разделе представлены уравнения, относящиеся к скорости и температуре газа на уровне потолка со шлейфом. Эти уравнения опубликованы R.L. Alpert в «Расчет времени срабатывания потолочных пожарных извещателей».
Где,
Шаг 1. Импортируйте соответствующие пакеты Python.
import pandas as pd import plotly.express as px
Шаг 2. Введите вводимые пользователем данные
while True: try: amb_temp = float(input('Enter ambient room temperature (°C): ')) rad_distance = float(input('Enter the horizontal distance between the fire and sprinkler head (m): ')) height_above_fire = float(input('Enter the vertical distance between the fire and sprinkler head (m): ')) RTI = float(input('Enter RTI value of the sprinkler head: ')) c = float(input('Enter conduction value of the sprinkler head: ')) activation = float(input('Enter sprinkler activation temperature (°C): ')) break except ValueError as e: print('Error: Enter a valid number')
Шаг 3. Выберите скорость роста огня.
t_sq_list = ["slow", "medium", "fast", "ultra-fast"] t_sq = None while t_sq not in t_sq_list: t_sq = input('Enter fire t² growth rate. Select from the list [slow, medium, fast, ultra-fast]: ').lower().strip() if t_sq == 'slow': growth = 0.00293 elif t_sq == 'medium': growth = 0.01172 elif t_sq == 'fast': growth = 0.0469 else: growth = 0.1876 print('Fire growth rate coefficient is: ' + str(growth))
Шаг 4. Создайте DataFrame
Шаг 4.1. Создайте пустой DataFrame и назначьте имена столбцов
index = pd.RangeIndex(0, 1308, 1) # a slow t² fire will take 1307 seconds to reach 5 MW columns = ['Time', 'HRR', 'Gas Temp 1', 'Gas Temp 2', 'Gas Vel 1', 'Gas Vel 2', 'Gas Temp', 'Temp Sprinkler'] df = pd.DataFrame(index=index, columns=columns) df = df.fillna(0) # with 0s rather than NaNs df.head()
Шаг 4.2. Заполнить столбец HRR
df['Time'] = df.index df['HRR'] = df['Time']*df['Time']*growth df.head()
Шаг 4.3. Определить температуру газа
if rad_distance/height_above_fire > 0.18: df['Gas Temp 1'] = (5.38*(df['HRR']/rad_distance)**(2/3))/(height_above_fire) df['Gas Temp'] = df['Gas Temp 1'] + amb_temp a = 'one' else: df['Gas Temp 2'] = (16.9*(df['HRR'])**(1/3))/height_above_fire**(5/3) df['Gas Temp'] = df['Gas Temp 2'] + amb_temp a = 'two' df.head()
Шаг 4.4. Определить скорость газа
if rad_distance/height_above_fire > 0.15: df['Gas Vel 1'] = (0.2*df['HRR']**(1/3)*height_above_fire**(1/2))/(rad_distance**(5/6)) b = 'one' else: df['Gas Vel 2'] = 0.95*((df['HRR']/height_above_fire)**(1/3)) b= 'two' df.head()
Шаг 5. Создайте DataFrame
x = 2 # initialise row 0 df.loc[0, 'Temp Sprinkler'] = amb_temp if (a == 'one') & (b == 'one'): # initialise row 1 df.loc[1, 'Temp Sprinkler'] = amb_temp + ((df.loc[1,'Gas Vel 1']**0.5)/RTI)*((df.loc[1,'Gas Temp']-amb_temp)-((1+(c/df.loc[1,'Gas Vel 1']**0.5)))*(df.loc[0,'Temp Sprinkler']-amb_temp)) # initialise remaining rows while x < 1308: df.loc[x,'Temp Sprinkler'] = df.loc[x-1, 'Temp Sprinkler'] + ((df.loc[x-1, 'Gas Vel 1']**0.5)/RTI)*((df.loc[x-1, 'Gas Temp']-amb_temp)-((1+(c/df.loc[x-1, 'Gas Vel 1']**0.5)))*(df.loc[x-1, 'Temp Sprinkler']-amb_temp)) x = x+1 elif (a == 'one') & (b == 'two'): df.loc[1, 'Temp Sprinkler'] = amb_temp + ((df.loc[1,'Gas Vel 2']**0.5)/RTI)*((df.loc[1,'Gas Temp']-amb_temp)-((1+(c/df.loc[1,'Gas Vel 2']**0.5)))*(df.loc[0,'Temp Sprinkler']-amb_temp)) while x < 1308: df.loc[x,'Temp Sprinkler'] = df.loc[x-1, 'Temp Sprinkler'] + ((df.loc[x-1, 'Gas Vel 2']**0.5)/RTI)*((df.loc[x-1, 'Gas Temp']-amb_temp)-((1+(c/df.loc[x-1, 'Gas Vel 2']**0.5)))*(df.loc[x-1, 'Temp Sprinkler']-amb_temp)) x = x+1 elif (a == 'two') & (b == 'one'): df.loc[1, 'Temp Sprinkler'] = amb_temp + ((df.loc[1,'Gas Vel 1']**0.5)/RTI)*((df.loc[1,'Gas Temp']-amb_temp)-((1+(c/df.loc[1,'Gas Vel 1']**0.5)))*(df.loc[0,'Temp Sprinkler']-amb_temp)) while x < 1308: df.loc[x,'Temp Sprinkler'] = df.loc[x-1, 'Temp Sprinkler'] + ((df.loc[x-1, 'Gas Vel 1']**0.5)/RTI)*((df.loc[x-1, 'Gas Temp']-amb_temp)-((1+(c/df.loc[x-1, 'Gas Vel 1']**0.5)))*(df.loc[x-1, 'Temp Sprinkler']-amb_temp)) x = x+1 else: df.loc[1, 'Temp Sprinkler'] = amb_temp + ((df.loc[1,'Gas Vel 2']**0.5)/RTI)*((df.loc[1,'Gas Temp']-amb_temp)-((1+(c/df.loc[1,'Gas Vel 2']**0.5)))*(df.loc[0,'Temp Sprinkler']-amb_temp)) while x < 1308: df.loc[x,'Temp Sprinkler'] = df.loc[x-1, 'Temp Sprinkler'] + ((df.loc[x-1, 'Gas Vel 2']**0.5)/RTI)*((df.loc[x-1, 'Gas Temp']-amb_temp)-((1+(c/df.loc[x-1, 'Gas Vel 2']**0.5)))*(df.loc[x-1, 'Temp Sprinkler']-amb_temp)) x = x+1 df.head()
Шаг 6. Постройте график.
Шаг 6.1. Определите температуру активации спринклера.
try: act_time = df.loc[df['Temp Sprinkler']>activation, 'Time'].iloc[0] except: print('The sprinkler does not activate')
Шаг 6.2. Определите HRR при активации спринклера
try: act_hrr = round(df.loc[df['Temp Sprinkler'] > activation, 'HRR'].iloc[0],1) except: print('The sprinkler does not activate')
Шаг 6.3. Создание аннотации для горизонтальных и вертикальных линий
act_time_text = 'Sprinkler activates at ' + str(act_time) + ' s.' + '\n'+ ' Fire size: ' + str(act_hrr) + ' kW' act_temp_text = 'Activation temperature: ' + str(activation) + ' °C'
Шаг 6.4. Сгенерировать график
fig = px.line(df, x="Time", y="Temp Sprinkler", title="Alpert's Correlation: Sprinkler Activation Time", template = 'none') fig.update_layout( autosize=False, width=600, height=500, yaxis=dict( title_text="Temperature (°C)", titlefont=dict(size=12), ), xaxis=dict( title_text="Time (s)", titlefont=dict(size=12), ) ) fig.update_layout( title={ 'y':0.9, 'x':0.5, 'xanchor': 'center', 'yanchor': 'top'}) fig.update_layout( xaxis = dict( tickmode = 'linear', tick0 = 0, dtick = 250 ) ) fig.add_hline(y=activation, line_width=1, line_dash="dash", line_color="green", annotation_text = act_temp_text) fig.add_vline(x=act_time, line_width=1, line_dash="dash", line_color="green", annotation_text = act_time_text) fig.update_annotations(font_size=10, font_color = 'darkblue') fig.show()
Шаг 7. Тестирование
Шаг 8. Ресурсы
Вы можете прочитать мой блог здесь: https://www.jabirjamal.com/predicting-sprinkler-activation-time-using-alperts-correlations/
Также скачайте скрипты с моего GitHub: https://github.com/jabirjamal/jabirjamal.com/tree/main/FE/FE_07
Вы также можете найти видеоверсию этой статьи ниже:
Больше контента на plainenglish.io