From 3efed5b2a4cc4d07cccf00f257a5eef42a1ff2e0 Mon Sep 17 00:00:00 2001 From: mcgratta Date: Fri, 12 Dec 2025 15:55:48 -0500 Subject: [PATCH] FDS Validation: Add puffing frequency --- Manuals/Bibliography/FDS_general.bib | 9 +++ .../FDS_Validation_Guide/Plume_Chapter.tex | 34 ++++++++++ Utilities/Python/FDS_validation_script.py | 1 + Utilities/Python/scripts/NIST_Pool_Fires.py | 62 +++++++++++++++++++ 4 files changed, 106 insertions(+) create mode 100644 Utilities/Python/scripts/NIST_Pool_Fires.py diff --git a/Manuals/Bibliography/FDS_general.bib b/Manuals/Bibliography/FDS_general.bib index dd22493ecd..a229079e6c 100644 --- a/Manuals/Bibliography/FDS_general.bib +++ b/Manuals/Bibliography/FDS_general.bib @@ -7211,6 +7211,15 @@ @INPROCEEDINGS{Zukoski:IAFSS2 publisher = "Hemisphere Publishing Company", } +@INBOOK{Zukoski:1995, + author = {E.E. Zukoski}, + editor = {G. Cox}, + title = {{Combustion Fundamentals of Fire}}, + chapter = {{Properties of Fire Plumes}}, + year = {1995}, + publisher = {Academic Press, London} +} + @MISC{Colt:1, title = {{Portsmouth Fire Test}}, howpublished = {Colt Heating and Ventilation. Internal Report}, diff --git a/Manuals/FDS_Validation_Guide/Plume_Chapter.tex b/Manuals/FDS_Validation_Guide/Plume_Chapter.tex index 9dc1a1605a..8bb7a4cd9d 100644 --- a/Manuals/FDS_Validation_Guide/Plume_Chapter.tex +++ b/Manuals/FDS_Validation_Guide/Plume_Chapter.tex @@ -984,6 +984,40 @@ \subsection{Flame Height Summary} \end{figure} +\clearpage + +\section{Puffing Frequency} +\label{Puffing Frequency} + +This section examines the ``puffing frequency'' of pool fires. Zukoski~\cite{Zukoski:1995} showed that the mean puffing frequency is inversely proportional to the square root of the burner diameter, $D$ +\be +f = 0.50 \sqrt{g/D} +\ee +where $g$ is the gravitational acceleration. + +\subsection{NIST Pool Fires} + +Figure~\ref{NIST_Pool_Fires_spectra} displays the predicted frequency spectra of the 30~cm and 37~cm NIST Pool Fires. The spectra are based on the simulated vertical velocity component, $w$, at a single point above the burner, recorded every time step. The vertical dashed line indicates the measured puffing frequency. The puffing frequency for the heptane was not measured. + +\begin{figure}[p] +\begin{tabular*}{\textwidth}{l@{\extracolsep{\fill}}r} +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Acetone_frequency_spectrum} & +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Ethanol_frequency_spectrum} \\ +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Heptane_frequency_spectrum} & +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Methane_frequency_spectrum} \\ +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Methanol_frequency_spectrum} & +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Propane_20_frequency_spectrum} \\ +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Propane_34_frequency_spectrum} & +\includegraphics[height=2.15in]{SCRIPT_FIGURES/NIST_Pool_Fires/Propane_50_frequency_spectrum} +\end{tabular*} +\caption[Frequency spectra of the NIST Pool Fires] +{Frequency spectra of the NIST Pool Fires with a vertical dashed line indicating the measured puffing frquency.} +\label{NIST_Pool_Fires_spectra} +\end{figure} + + + + \clearpage diff --git a/Utilities/Python/FDS_validation_script.py b/Utilities/Python/FDS_validation_script.py index e89d08acd5..10da0de2dc 100644 --- a/Utilities/Python/FDS_validation_script.py +++ b/Utilities/Python/FDS_validation_script.py @@ -95,6 +95,7 @@ def safe_run(script_path): print("Memorial_Tunnel..."); safe_run("./scripts/Memorial_Tunnel.py") print("Memorial_Tunnel_2..."); safe_run("./scripts/Memorial_Tunnel_2.py") print("NIST_NRC_Parallel_Panels..."); safe_run("./scripts/NIST_NRC_Parallel_Panels.py") +print("NIST_Pool_Fires..."); safe_run("./scripts/NIST_Pool_Fires.py") print("Sandia_Plumes..."); safe_run("./scripts/Sandia_Plumes.py") print("Sandia_Pools..."); safe_run("./scripts/Sandia_Pools.py") print("Theobald_Hose_Stream..."); safe_run("./scripts/Theobald_Hose_Stream.py") diff --git a/Utilities/Python/scripts/NIST_Pool_Fires.py b/Utilities/Python/scripts/NIST_Pool_Fires.py new file mode 100644 index 0000000000..9f6780cd8f --- /dev/null +++ b/Utilities/Python/scripts/NIST_Pool_Fires.py @@ -0,0 +1,62 @@ + +import pandas as pd +import numpy as np +import matplotlib.pyplot as plt +import fdsplotlib + +plot_style = fdsplotlib.get_plot_style('fds') + +outdir = '../../../out/NIST_Pool_Fires/' +pltdir = '../../Manuals/FDS_Validation_Guide/SCRIPT_FIGURES/NIST_Pool_Fires/' + +chids = ['NIST_Acetone_Prescribed_0p5cm', + 'NIST_Ethanol_Prescribed_0p5cm', + 'NIST_Heptane_Prescribed_0p5cm', + 'NIST_Methane_Prescribed_0p5cm', + 'NIST_Methanol_Prescribed_0p5cm', + 'NIST_Propane_20kW_Prescribed_0p5cm', + 'NIST_Propane_34kW_Prescribed_0p5cm', + 'NIST_Propane_50kW_Prescribed_0p5cm'] + +fuel = ['Acetone','Ethanol','Heptane','Methane','Methanol','Propane 20 kW','Propane 34 kW','Propane 50 kW'] +label = ['Acetone','Ethanol','Heptane','Methane','Methanol','Propane_20','Propane_34','Propane_50'] +ideal = [2.45,2.41,-1,2.48,2.49,2.22,2.39,2.39] +i = -1 + +for chid in chids: + + i = i + 1 + git_file = outdir + chid + '_git.txt' + version_string = fdsplotlib.get_version_string(git_file) + + # Read CSV file, skipping the first two rows + df = pd.read_csv(outdir + chid + '_devc.csv', skiprows=20000, header=None) + + # Extract time and data columns + time = df.iloc[:, 0].values + data = df.iloc[:, 1].values + + # Calculate the sampling rate + dt = np.mean(np.diff(time)) # Average time step + sampling_rate = 1.0 / dt + + # Compute FFT + n = len(data) + fft_values = np.fft.fft(data) + fft_freq = np.fft.fftfreq(n, dt) + + # Get positive frequencies only + positive_freq_idx = fft_freq > 0 + frequencies = fft_freq[positive_freq_idx] + magnitude = np.abs(fft_values[positive_freq_idx]) + + # Create the frequency spectrum plot using plot_to_fig + fig = fdsplotlib.plot_to_fig(frequencies, magnitude, marker_style='k-', + x_label='Frequency (Hz)', y_label='Magnitude', + x_min=0, x_max=6, y_min=0, + revision_label=version_string, + plot_title=fuel[i]) + fdsplotlib.plot_to_fig([ideal[i],ideal[i]],[0,100000], marker_style='k--', figure_handle=fig) + + fig.savefig(pltdir + label[i] + '_frequency_spectrum.pdf', format='pdf') +