During Testing Facility operations, the loudest noise emitted comes from Static Fire Tests (SFT) of the bi-liquid engine. This document aims to quantify the sound emitted by the SFTs. If any issues are found, mitigations such as hearing protection, sound suppression system or qualitative mitigations will be considered.
.png)
To facilitate the analysis, we will split it into four locations:
Since neighbors and other private civilians cannot be compelled to use earmuffs, the effectiveness of earmuffs and earmuffs combined with Sound Suppression Systems (SSS) is assessed only up to 125 meters. Beyond this distance, where only civilians or neighbors are present the graph data curves are cropped.
To see the exact locations and terrain details, please see 2024_H_SE_TFO_GCM-SA
Operators in the Control Container are closest to the engine, approximately 20 meters away. However, between them and the engine are roughly 5 metal sheets (shielding and container wall) and about 60 cm of concrete, which will significantly reduce sound levels. Additionally, the engine is enclosed within the Test Container, further reducing sound emission. Given the complexity of analyzing these interactions, operators will be required to wear earmuffs during all engine tests.
According to the graph, with earmuffs at a 25-meter distance (with a direct line of sight and no sound absorption), earmuffs are sufficient to keep sound levels below the 100 dB threshold for all engines.
Additional sound measurements will be taken within the Control Container during the initial 1 kN SFTs without SSS to determine if earplugs should be added to earmuffs for larger engines. Note that excessive ear protection can make communication difficult among operators, even in the confined space of the Control Container.
The 70 dB legal threshold is disregarded as we are within the industrial site of GCM SA.
Observers are located about 100 meters from the engine. According to the analysis, the 100 dB threshold is exceeded for the raw 5 kN engine, the 5 kN engine with SSS, and the raw 15 kN engine. Therefore, hearing protection is required starting from the 5 kN test onwards. For the 1 kN SFT, hearing protection is not necessary in the observers areas.
The 70 dB legal threshold is disregarded as we are still within the industrial site of GCM SA.
Neighbor 1 is located 150 meters from the engine. The graph indicates that the 100 dB threshold is exceeded for the raw 15 kN engine. Thus,a Sound Suppression System is required for 15 kN tests and above.
The 70 dB legal threshold is exceeded for all engines, with or without SSS.
The location of N1 relative to the Testing Facility renders sound propagation difficult, it does not have any line of sight with the engine and is separated from the engine by a 5 meters tall hillock cf. 2024_H_SE_TFO_GCM-SA
Neighbor 2 is located 200 meters from the engine. The graph shows that the 100 dB threshold is exceeded for the raw 15 kN engine. Therefore, a Sound Suppression System is necessary for 15 kN tests and above.
The 70 dB legal threshold is exceeded for all engines, with or without SSS.
For long-range propagation, sound levels are significantly affected by atmospheric and geographic conditions such as wind and terrain. Therefore, these observations should be considered as worst-case scenarios and may have a low probability of translating into real-world conditions.
The location of the Testing Facility renders sound propagation difficult, as it is recessed within the surrounding landmass, cf. 2024_H_SE_TFO_GCM-SA
Between 200 and 325 meters, the graph indicates that the 100 dB threshold is exceeded for the raw 15 kN engine. Therefore, a Sound Suppression System (SSS) is necessary for 15 kN tests and above within this range.
Extended analysis (not shown in this document) reveals the following:
For long-range propagation, sound levels are significantly affected by atmospheric and geographic conditions such as wind and terrain. Therefore, these observations should be considered as worst-case scenarios and may have a low probability of translating into real-world conditions.
The location of the Testing Facility renders sound propagation difficult, as it is recessed within the surrounding landmass, cf. 2024_H_SE_TFO_GCM-SA
The theoretical analysis gived us multiple action items. These action items should be considered as preliminary guidelines, given that the analysis is based on theoretical models. It’s important to remain flexible, as unforeseen parameters may arise that could influence the final decisions.
It is also important to note that, from a legal standpoint, the sound levels that will be produced by most of our SFTs beyond GCM SA exceed Swiss legal limits. Consequently, our activities are subject to the goodwill of the neighboring communities and the city of Savigny.
To prevent hearing damage for both operators and neighbors, the following actions are mandatory:
To further ensure the well-being of operators and neighbors, consider the following additional measures:
import numpy as np
import matplotlib.pyplot as plt
def compute_sound_level(L_r, d, d_r):
"""
Compute the sound level at distance d.
Parameters:
L_r (float): Reference sound level in dB.
d (float): Distance from the sound source where the sound level is calculated.
d_r (float): Reference distance at which L_r is measured.
Returns:
float: The sound level at distance d.
"""
return L_r - 20 * np.log10(d / d_r)
# Define the reference distance (assuming all are measured at 1 meter for simplicity)
d_r = 1 # Reference distance in meters
# Define sound levels for each engine
L_r1 = 130 # Sound level of engine 1 (15 kN) in dB
L_r2 = 140 # Sound level of engine 2 (5 kN) in dB
L_r3 = 150 # Sound level of engine 3 (1 kN) in dB
# Define the range of distances from 1 to 2000 meters
distances = np.linspace(1, 2000, 2000)
# Compute sound levels for each distance for all engines
soundLevels1 = compute_sound_level(L_r1, distances, d_r)
soundLevels2 = compute_sound_level(L_r2, distances, d_r)
soundLevels3 = compute_sound_level(L_r3, distances, d_r)
# Compute sound levels with 7 dB suppression system
soundLevels1_suppressed = compute_sound_level(L_r1 - 7, distances, d_r)
soundLevels2_suppressed = compute_sound_level(L_r2 - 7, distances, d_r)
soundLevels3_suppressed = compute_sound_level(L_r3 - 7, distances, d_r)
# Compute sound levels with 25 dB earmuffs
soundLevels1_earmuffs = compute_sound_level(L_r1 - 25, distances, d_r)
soundLevels2_earmuffs = compute_sound_level(L_r2 - 25, distances, d_r)
soundLevels3_earmuffs = compute_sound_level(L_r3 - 25, distances, d_r)
# Compute sound levels with 7 dB suppression system and 25 dB earmuffs
soundLevels1_suppressed_earmuffs = compute_sound_level(L_r1 - 7 - 25, distances, d_r)
soundLevels2_suppressed_earmuffs = compute_sound_level(L_r2 - 7 - 25, distances, d_r)
soundLevels3_suppressed_earmuffs = compute_sound_level(L_r3 - 7 - 25, distances, d_r)
# Crop data to 2000 meters
crop_distance = 2000
mask = distances <= crop_distance
distances_cropped = distances[mask]
soundLevels1_cropped = soundLevels1[mask]
soundLevels2_cropped = soundLevels2[mask]
soundLevels3_cropped = soundLevels3[mask]
soundLevels1_suppressed_cropped = soundLevels1_suppressed[mask]
soundLevels2_suppressed_cropped = soundLevels2_suppressed[mask]
soundLevels3_suppressed_cropped = soundLevels3_suppressed[mask]
soundLevels1_earmuffs_cropped = soundLevels1_earmuffs[mask]
soundLevels2_earmuffs_cropped = soundLevels2_earmuffs[mask]
soundLevels3_earmuffs_cropped = soundLevels3_earmuffs[mask]
soundLevels1_suppressed_earmuffs_cropped = soundLevels1_suppressed_earmuffs[mask]
soundLevels2_suppressed_earmuffs_cropped = soundLevels2_suppressed_earmuffs[mask]
soundLevels3_suppressed_earmuffs_cropped = soundLevels3_suppressed_earmuffs[mask]
# Plot the results
plt.figure(figsize=(14, 8))
# Fill backgrounds with less flashy colors
plt.axhspan(120, np.max(soundLevels3), color='red', alpha=0.2, label='Pain (e.g., Gunshot, jet engine)')
plt.axhspan(100, 120, color='orange', alpha=0.3, label='Very Loud (e.g., Chainsaw, siren)')
plt.axhspan(85, 100, color='yellow', alpha=0.4, label='Loud (e.g., Lawn mower, heavy traffic)')
plt.axhspan(np.min(soundLevels1_suppressed_earmuffs_cropped), 85, color='lightgreen', alpha=0.5, label='Moderate')
# Plot sound levels
plt.plot(distances, soundLevels1, color='green', linewidth=2, label='1kN (130 dB)')
plt.plot(distances, soundLevels2, color='orange', linewidth=2, label='5kN (140 dB)')
plt.plot(distances, soundLevels3, color='red', linewidth=2, label='15kN (150 dB)')
# Plot sound levels with suppression (using full distance range)
plt.plot(distances, soundLevels1_suppressed, color='green', linestyle='-.', linewidth=1.5, label='1kN with SSS')
plt.plot(distances, soundLevels2_suppressed, color='orange', linestyle='-.', linewidth=1.5, label='5kN with SSS')
plt.plot(distances, soundLevels3_suppressed, color='red', linestyle='-.', linewidth=1.5, label='15kN with SSS')
# Plot sound levels with earmuffs (cropped distances)
plt.plot(distances_cropped, soundLevels1_earmuffs_cropped, color='green', linestyle='--', linewidth=1.5, label='1kN with Earmuffs')
plt.plot(distances_cropped, soundLevels2_earmuffs_cropped, color='orange', linestyle='--', linewidth=1.5, label='5kN with Earmuffs')
plt.plot(distances_cropped, soundLevels3_earmuffs_cropped, color='red', linestyle='--', linewidth=1.5, label='15kN with Earmuffs')
# Plot sound levels with suppression and earmuffs (cropped distances)
plt.plot(distances_cropped, soundLevels1_suppressed_earmuffs_cropped, color='green', linestyle=':', linewidth=1.5, label='1kN with SSS & Earmuffs')
plt.plot(distances_cropped, soundLevels2_suppressed_earmuffs_cropped, color='orange', linestyle=':', linewidth=1.5, label='5kN with SSS & Earmuffs')
plt.plot(distances_cropped, soundLevels3_suppressed_earmuffs_cropped, color='red', linestyle=':', linewidth=1.5, label='15kN with SSS & Earmuffs')
# Add vertical dotted lines at 100, 150, and 200 meters
plt.axvline(x=100, color='black', linestyle=':', linewidth=1.5)
plt.axvline(x=150, color='black', linestyle=':', linewidth=1.5)
plt.axvline(x=200, color='black', linestyle=':', linewidth=1.5)
# Get y-axis limits for positioning text
ylim_values = plt.ylim()
# Add vertical labels near the vertical dotted lines
plt.text(100 + 10, ylim_values[1] * 0.8, 'Observers Area', color='black', fontsize=10, horizontalalignment='left', rotation=90)
plt.text(150 + 10, ylim_values[1] * 0.9, 'N1', color='black', fontsize=10, horizontalalignment='left', rotation=90)
plt.text(200 + 10, ylim_values[1] * 0.9, 'N2', color='black', fontsize=10, horizontalalignment='left', rotation=90)
# Add labels, title, and legend
plt.xlabel('Distance (meters)')
plt.ylabel('Sound Level (dB)')
plt.title('SFT Sound Analysis')
# Customize x-axis ticks and labels
x_ticks = np.arange(0, 2100, 100)
plt.xticks(ticks=x_ticks)
plt.legend(loc='upper right')
plt.grid(True)
plt.xlim([0, 2000])
# Adjust y-axis limits based on data
all_sound_levels = np.concatenate([soundLevels1, soundLevels2, soundLevels3,
soundLevels1_suppressed, soundLevels2_suppressed, soundLevels3_suppressed,
soundLevels1_earmuffs, soundLevels2_earmuffs, soundLevels3_earmuffs,
soundLevels1_suppressed_earmuffs, soundLevels2_suppressed_earmuffs, soundLevels3_suppressed_earmuffs])
plt.ylim([np.min(all_sound_levels), np.max(all_sound_levels)])
# Save the plot to a file
plt.savefig('sound-analysis-extended.png', dpi=400, bbox_inches='tight')
# Show the plot
plt.show()