Здравствуйте меня зовут Роман, я занимаюсь обеспечение пожарной безопасности в зданиях и сооружениях более 15 лет, основной профиль моей деятельности - это моделирование развития пожара.

В основном моделирование развития пожара провожу в специализированном программном обеспечении Fire Dynamics Simulator (FDS), оно используется от Японии до США при обосновании отступлений требований пожарной безопасности. При моделировании развития пожара очень много времени занимает обработка результатов моделирования. В цикле статей я хочу поделиться способами обработки данных, которые использую при работе.
 
Статья ориентирована на специалистов, которые уже используют FDS в своей работе. Подробности моделирования развития пожара в FDS в данной статьи не будут рассматриваться.

Измерение физических величин в FDS

Измерение физических величин в FDS можно осуществить с помощью точечного устройства (DEVC). При добавлении хотя бы одного точечного измерителя в модель, при моделировании формируется файл с расширением .csv, в него записывают результаты измерения точечного устройства во времени. Файл с измерениями будет заканчиваться на decv.csv. Каждое точечное устройство может получить уникальную метку (ID), что значительно упрощает его идентификацию в CSV-файле. Также необходимо указать местоположение точечного устройства в декартовых координатах (x, y, z) и измеряемую физическую величину (обо всех измеряемых параметрах измеряемых точечным устройством можно почить в руководстве пользователя FDS).

Пример создания точечного устройства во входном файле FDS:

&DEVC ID = 'Temp_1m',
XYZ = 0.1, 0.1, 1.3,
QUANTITY = 'TEMPERATURE' /

  • ID - этот параметр отвечает за название устройства;

  • XYZ - этот параметр отвечает за расположение устройства в декартовых координатах и заметьте, десятичная часть отделяется точкой, а для разделения между координатами используется запятая;

  • QUANTITY - этот параметр отвечает за измеряемую физическую величину, в данном случае измеряется температура газа (не температура термопары).

Возможны также замеры физических величин по линии, в плоскости и объёме, но с помощью других инструментов FDS.

Импорт данных

Для первичной обработки данных я использую Jupyter Notebook. На примере него я буду рассказывать свои действия. Код в виде блокнота Jupyter Notebook'а и примеры данных будут лежать по ссылке.

Сначала мы считываем данные устройств (DEVC), хранящиеся в фале оканчивающейся на decv.csv. Первая строка содержит единицы измерения, вторая строка заголовок столбца, а начиная с третьей отображаются данные. Заголовки столбцов соответствуют названием точеных устройств (ID).

# необходимые библиотеки 
import os
import matplotlib
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd

# Указать путь к файлу
devc_path = os.path.join("Example1_devc.csv")

# Прочитать CSV-файл как Pandas DataFrame.
devc_df = pd.read_csv(devc_path)

# Показать результат первых 5 строчек
devc_df.head()

Немного преобразуем данные уберем первую строку с обозначением измеряемой физической величины.

# Указать путь к файлу
devc_path = os.path.join("Example1_devc.csv")

# Прочитать CSV-файл как Pandas DataFrame.
devc_df = pd.read_csv(devc_path, header=1)

# Показать результат пераых 5 строчек
devc_df.head()

Раскроем немного суть загруженных данных, чтобы понимать контекст. Проводилось моделирование развития пожара в комнате. В трех местах замерялась температура газов:

  • слева от дверного проёма;

  • справа от дверного проёма;

  • в центре дверного проёма. Точечные устройства располагались сверху вниз с некоторым шагом.

Название точеных устройств, расположенных слева начиналось, на Temp_Corner_Vertical_Left”, справа “Temp_Corner_Vertical_Right” в центре “Temp_Door_Vertical_Centre”. Теперь эту информацию можно использовать для работы с данными.

Создаём список list(DataFrame) , содержащий все заголовки. Каждый элемент этого списка, то есть каждый заголовок, представляет собой строку. Проведя обработку этих строк, можно создать новый список, содержащий только интересующие нас заголовки. Для этого создаётся пустой список, содержащий заголовки, относящиеся к дверям. В цикле for мы просматриваем каждый заголовок. Если заголовок содержит подстроку «Door», она копируется в новый список.

# Сбор результатов
door_headers = list()

# Получаем список заголовков DataFrame
headers = list(devc_df)

# Проходимся по всем заголовкам
for header in headers:
    # Проверяем находится ли DEVC в дверном проеме
    if "Door" in header:
        # кладем в спосок заголовок
        door_headers.append(header)
        
        
# Смотрим на результат
door_headers
['Temp_Door_Vertical_Centre-1',
 'Temp_Door_Vertical_Centre-2',
 'Temp_Door_Vertical_Centre-3',
 'Temp_Door_Vertical_Centre-4',
 'Temp_Door_Vertical_Centre-5',
 'Temp_Door_Vertical_Centre-6',
 'Temp_Door_Vertical_Centre-7',
 'Temp_Door_Vertical_Centre-8',
 'Temp_Door_Vertical_Centre-9',
 'Temp_Door_Vertical_Centre-10',
 'Temp_Door_Vertical_Centre-11',
 'Temp_Door_Vertical_Centre-12',
 'Temp_Door_Vertical_Centre-13',
 'Temp_Door_Vertical_Centre-14',
 'Temp_Door_Vertical_Centre-15',
 'Temp_Door_Vertical_Centre-16',
 'Temp_Door_Vertical_Centre-17',
 'Temp_Door_Vertical_Centre-18']

Построение простых графиков

С помощью списка можно построить график температур изменения температуры точечных устройств в центре дверного проёма. Может быть полезно указать заголовок в отдельную переменную, как здесь devc_id, его можно легко использовать для обозначения столбца, а также в качестве метки для ряда данных.

# Запись заголовока в отдельную переменную
devc_id = door_headers[1]

# Наложение данных на график
devc_data = devc_df[devc_id]
plt.plot(devc_df["Time"], 
         devc_data,
         label=devc_id)

# Запись заголовока в отдельную переменную
devc_id = door_headers[9]

devc_data = devc_df[devc_id]
plt.plot(devc_df["Time"], 
         devc_data,
         label=devc_id)

# Запись заголовока в отдельную переменную
devc_id = door_headers[17]

devc_data = devc_df[devc_id]
plt.plot(devc_df["Time"], 
         devc_data,
         label=devc_id)

# Построение графика
plt.xlabel("Время, с")
plt.ylabel("Температура, °C")
plt.legend()
plt.grid()

Можно легко настроить цикл для построения графика всех рядов данных, например:

for devc_id in door_headers:
    
    devc_data = devc_df[devc_id]
    plt.plot(devc_df["Time"], 
             devc_data,
             label=devc_id)
    
plt.xlabel("Время, с")
plt.ylabel("Температура, °C")
plt.legend()
plt.grid()

Это приведёт к запутанному графику из-за большого объёма данных. Возможно, стоит задать условие, чтобы уменьшить количество отображаемых рядов данных. Например, используя функцию включения списков, можно выбрать каждый n-й элемент списка: [0::n]. Он может начинаться с m-й позиции [m::n]. Например, m = 0 нет необходимости указывать значение.

# Построение графика каждой третьей серии данных, начиная с третьей.
for devc_id in door_headers[2::3]:
    
    devc_data = devc_df[devc_id]
    plt.plot(devc_df["Time"], 
             devc_data,
             label=devc_id)


# Построение графика
plt.xlabel("Время, с")
plt.ylabel("Температура, °C")
plt.legend()
plt.grid()

Вывод

В статье показан первый этап обработки результатов моделирования в FDS с использованием Python и Jupyter Notebook. Рассмотрены принципы работы с файлами измерений точечных устройств (DEVC), их импорт и первичная фильтрация данных.

Комментарии (0)