Refracción atmosférica: rayos y GFPE
Referencias: Salomons 2001Attenborough y Van Renterghem 2021
El método ISO 9613-2 y el
efecto suelo de onda esférica suponen
ambos una atmósfera homogénea. En realidad la velocidad del sonido cambia
con la altura, porque la temperatura y el viento cambian con la altura, y esto
refracta el sonido: los rayos se curvan y, en unos cientos de metros, el
nivel recibido puede variar en decenas de decibelios. Esta página cubre
phonometry.environmental.atmospheric_refraction, el homólogo para atmósfera
refractante de los solvers oceánicos de
phonometry.underwater.numerical_propagation:
un modelo de rayos y un solver de ecuación parabólica (PE).
Que la refracción importe es, sobre todo, cuestión de distancia. Un gradiente representativo de la capa superficial de ±0,1 s⁻¹ curva los rayos con un radio km, de modo que en los primeros cien metros los caminos son razonablemente rectos y los modelos homogéneos anteriores son precisos. Más allá de unos cientos de metros manda la geometría: a favor del viento, o bajo una inversión térmica nocturna, los rayos curvados hacia abajo se cierran sobre el suelo y mantienen el nivel cerca de la predicción homogénea (o incluso por encima), mientras que contra el viento el mismo perfil abre una sombra acústica en la que el nivel se derrumba 20 dB o más (Attenborough y Van Renterghem 2021, cap. 11). Esa es la conocida asimetría viento a favor / viento en contra de cualquier fuente exterior estacionaria: la misma máquina a la misma distancia, con decenas de decibelios de diferencia según el lado en que uno se sitúe. Es también la razón por la que la ISO 9613-2 fija por decreto su atmósfera “favorable”, y lo que comprime su escalar; los modelos de esta página calculan la física que decide ambas cosas.

1. Perfil de velocidad efectiva del sonido
Sección titulada «1. Perfil de velocidad efectiva del sonido»Una atmósfera en movimiento (con viento) se aproxima bien por una en reposo con
la velocidad efectiva del sonido c_eff(z) = c(z) + u(z), la velocidad
adiabática más la componente del viento en la dirección de propagación
(Salomons Ec. 4.4). Dos formas de perfil cubren la mayoría de los casos de la
capa superficial:
- un perfil lineal
c_eff(z) = c0 + g·z(linear_sound_speed_profile), la atmósfera refractante más sencilla y la de geometría de rayos exacta; - el perfil logarítmico realista de la capa superficial
c_eff(z) = c0 + b·ln(1 + z/z0)(log_linear_sound_speed_profile, Salomons Ec. 4.5), conb ≈ +1 m/spara una atmósfera típica con refracción hacia abajo,b ≈ -1 m/spara una con refracción hacia arriba, yz0la longitud de rugosidad (unos 0,1 m para pasto).
Un gradiente positivo (velocidad del sonido creciente con la altura) curva los rayos hacia abajo, hacia el receptor (propagación favorable); un gradiente negativo los curva hacia arriba y abre una sombra acústica cerca del suelo.
from phonometry import log_linear_sound_speed_profile
perfil = log_linear_sound_speed_profile(-1.0, ground_speed=340.0) # hacia arribaperfil.speed_at(10.0) # velocidad efectiva del sonido a 10 m del sueloperfil.plot() # c_eff(z) con la altura en el eje verticalVer el código de esta figura
import matplotlib.pyplot as pltfrom phonometry import log_linear_sound_speed_profile
# Las dos capas superficiales canónicas de la Ec. 4.5 de Salomons sobre pasto.bajada = log_linear_sound_speed_profile(+1.0, ground_speed=340.0, max_height=60.0)subida = log_linear_sound_speed_profile(-1.0, ground_speed=340.0, max_height=60.0)ax = bajada.plot(color="#1f77b4", language="es")subida.plot(ax=ax, color="#d62728", language="es")plt.show()2. Modelo de rayos
Sección titulada «2. Modelo de rayos»En acústica geométrica un rayo sonoro cumple la ley de Snell
cos(γ(z))/c(z) = const (Salomons Ec. 4.3). atmospheric_ray_paths la integra
con un esquema Runge-Kutta de cuarto orden, marchando en distancia y reflejando
especularmente en el suelo, y devuelve los caminos curvos, los puntos de
inflexión, los tiempos de propagación y el número de reflexiones en el suelo.
import numpy as npfrom phonometry import atmospheric_ray_paths, log_linear_sound_speed_profile
perfil = log_linear_sound_speed_profile(-1.0, ground_speed=340.0)rayos = atmospheric_ray_paths(perfil, source_height=2.0, launch_angles_deg=np.linspace(-8.0, 8.0, 17), max_range=600.0)rayos.turning_points # puntos de inflexión por rayorayos.plot() # el abanico de rayos curvados (necesita matplotlib)La figura de cabecera de la página muestra este abanico con refracción hacia
arriba abriendo su sombra. El caso favorable es su imagen especular: con
refracción hacia abajo (b = +1) los rayos rasantes se curvan de vuelta
al suelo, rebotan y transportan la energía a lo largo de la superficie en vez
de perderla hacia arriba.
Ver el código de esta figura
import matplotlib.pyplot as pltimport numpy as npfrom phonometry import atmospheric_ray_paths, log_linear_sound_speed_profile
# Refracción hacia abajo: el espejo favorable del caso con sombra.perfil = log_linear_sound_speed_profile(+1.0, ground_speed=340.0)rayos = atmospheric_ray_paths(perfil, source_height=2.0, launch_angles_deg=np.linspace(-8.0, 8.0, 17), max_range=600.0, n_steps=600)rayos.plot(language="es") # los rayos rasantes vuelven al suelo y rebotan a lo largoplt.show()Geometría en forma cerrada (gradiente lineal)
Sección titulada «Geometría en forma cerrada (gradiente lineal)»Para un perfil lineal cada rayo es un arco de círculo exacto de radio de curvatura (Salomons Sec. 4.4; Attenborough Cap. 11):
expuesto como ray_curvature_radius. Un rayo lanzado con ángulo θ0 en
refracción hacia abajo alcanza su punto de inflexión a la altura
Rc(1 - cos θ0). Para un perfil lineal con refracción hacia arriba el rayo
que roza el suelo delimita una región más allá de la cual no llega ningún rayo
directo ni reflejado una vez, a la distancia de zona de sombra en forma
cerrada (shadow_zone_distance):
Estas formas cerradas son el oráculo exacto del trazador de rayos: un ajuste de
círculo a un rayo trazado recupera Rc con precisión de máquina.
3. Ecuación parabólica (PE de la función de Green)
Sección titulada «3. Ecuación parabólica (PE de la función de Green)»La ecuación parabólica es el método de referencia para la refracción y las
zonas de sombra a larga distancia. Sustituye la ecuación de ondas por una
ecuación unidireccional (saliente) válida dentro de un ángulo de elevación
límite, y la marcha en distancia sobre una malla distancia-altura.
atmospheric_parabolic_equation implementa la PE de la función de Green
(GFPE, Salomons apéndice H), el miembro atmosférico de la misma familia
split-step de Fourier que la
parabolic_equation oceánica.
Cada paso en distancia transforma el campo al dominio del número de onda
vertical, aplica el propagador de espacio libre junto con la reflexión del suelo
de impedancia finita R(kz) = (kz Z − k0)/(kz Z + k0) (Salomons Ec. H.28),
transforma de vuelta, añade el residuo de onda de superficie del polo de la
reflexión (el tercer término de la Ec. H.49) y aplica la pantalla de fase de
refracción exp(i Δr (k(z) − ka)) (Ec. H.58). La fuente es un arranque gaussiano con
su imagen en el suelo (Ecs. G.64, G.76) y una capa absorbente en la parte
superior de la malla suprime las reflexiones del contorno superior. El resultado
es el nivel sonoro relativo ΔL(z, r) = 20 lg(|p| R1) (dB respecto al campo
libre) en todo el plano distancia-altura.
from phonometry import atmospheric_parabolic_equation, log_linear_sound_speed_profile
perfil = log_linear_sound_speed_profile(-1.0, ground_speed=340.0) # hacia arribape = atmospheric_parabolic_equation(400.0, perfil, source_height=2.0, flow_resistivity=200e3, # pasto max_range=600.0, max_height=40.0)pe.level_at_height(2.0) # nivel relativo frente a distancia a 2 mpe.plot() # el campo de nivel relativo distancia-altura (necesita matplotlib)Basta cortar el campo a la altura del receptor para que toda la historia de esta página quepa en una figura: con todo lo demás idéntico, solo el signo del gradiente mueve el nivel de 400 Hz a 600 m en más de 30 dB.
Ver el código de esta figura
import warnings
import matplotlib.pyplot as plt
from phonometry import ( atmospheric_parabolic_equation, linear_sound_speed_profile, log_linear_sound_speed_profile, shadow_zone_distance,)
casos = [ (log_linear_sound_speed_profile(+1.0, ground_speed=340.0), "Hacia abajo (b = +1 m/s)"), (linear_sound_speed_profile(0.0, ground_speed=340.0), "Homogénea (b = 0)"), (log_linear_sound_speed_profile(-1.0, ground_speed=340.0), "Hacia arriba (b = -1 m/s)"),]fig, ax = plt.subplots(figsize=(11, 6.2))with warnings.catch_warnings(): warnings.simplefilter("ignore") for perfil, etiqueta in casos: pe = atmospheric_parabolic_equation(400.0, perfil, source_height=2.0, flow_resistivity=200e3, max_range=600.0, max_height=40.0) ax.plot(pe.ranges, pe.level_at_height(2.0), label=etiqueta)# El límite en forma cerrada del gradiente lineal equivalente hacia arriba# (su media a 10 m), la línea punteada de la figura.subida = casos[2][0]grad = float(subida.speed_at(10.0) - 340.0) / 10.0ax.axvline(shadow_zone_distance(grad, 2.0, 2.0, ground_speed=340.0), color="k", ls=":", label="Límite de la zona de sombra")ax.set(xlabel="Distancia [m]", ylabel="Nivel respecto al campo libre [dB]", ylim=(-40, 10))ax.legend()plt.show()La impedancia del suelo se proporciona directamente (impedance=, un valor
complejo normalizado en el convenio e^{-iωt} de Salomons, con Im(Z) > 0
para un suelo pasivo), como un PorousMediumResult, o a partir de una
flow_resistivity efectiva mediante los
modelos porosos del dominio de
materiales; los modelos porosos trabajan en el convenio opuesto e^{+jωt}, así
que su impedancia se conjuga internamente.
Ver el código de esta figura
import warnings
import matplotlib.pyplot as pltimport numpy as np
from phonometry import ( atmospheric_parabolic_equation, atmospheric_ray_paths, log_linear_sound_speed_profile, shadow_zone_distance,)
c0 = 340.0perfil = log_linear_sound_speed_profile(-1.0, ground_speed=c0, max_height=60.0)zs = 2.0fig, axes = plt.subplots(2, 1, figsize=(11, 8.2), sharex=True)
rayos = atmospheric_ray_paths(perfil, source_height=zs, launch_angles_deg=np.linspace(-8.0, 8.0, 17), max_range=600.0, n_steps=3000)for i in range(rayos.heights.shape[0]): axes[0].plot(rayos.ranges[i], rayos.heights[i], color="#1f77b4", lw=0.8, alpha=0.7)axes[0].plot([0.0], [zs], "o", color="#d62728", label="Fuente")grad = (perfil.speed_at(10.0) - c0) / 10.0x_sh = shadow_zone_distance(float(grad), zs, zs, ground_speed=c0)axes[0].axvline(x_sh, color="#d62728", ls="--", label="Límite de zona de sombra")axes[0].set(ylabel="Altura [m]", ylim=(0, 40), title="Rayos sonoros (refracción hacia arriba)")axes[0].legend()
with warnings.catch_warnings(): warnings.simplefilter("ignore") pe = atmospheric_parabolic_equation(400.0, perfil, source_height=zs, flow_resistivity=200e3, max_range=600.0, max_height=40.0)img = axes[1].imshow(pe.relative_level, cmap="RdBu_r", vmin=-30, vmax=6, aspect="auto", origin="lower", interpolation="bilinear", extent=(pe.ranges[0], pe.ranges[-1], pe.heights[0], pe.heights[-1]))axes[1].axvline(x_sh, color="k", ls="--")axes[1].set(ylabel="Altura [m]", xlabel="Distancia [m]", ylim=(0, 40), title="Nivel sonoro relativo GFPE")fig.colorbar(img, ax=axes[1], label="Nivel respecto al campo libre [dB]")plt.tight_layout()plt.show()4. Validación
Sección titulada «4. Validación»Los modelos están anclados por oráculos independientes, fijados numéricamente en el informe de conformidad (sección “Atmospheric refraction”):
- Límite homogéneo → efecto suelo esférico. Con gradiente nulo el campo
GFPE reproduce el
ground_effectexacto de Weyl-Van der Pol a cualquier distancia, con unas décimas de dB sobre pasto en la malla por defecto, y el refuerzo coherente de +6 dB de los dos rayos sobre un suelo rígido. - Geometría de rayos exacta. Para un perfil lineal el rayo trazado es un
arco de círculo cuyo radio ajustado coincide con
ray_curvature_radiuscon precisión de máquina. - Reciprocidad. Intercambiar las alturas de fuente y receptor deja igual el nivel de la PE.
- Zona de sombra. Sobre un perfil con refracción hacia arriba el nivel de la PE se desploma bien dentro de la distancia de sombra en forma cerrada.
Qué cubre esta guía
Sección titulada «Qué cubre esta guía»Cubierto. El modelo de rayos (integración de la ley de Snell por
Runge-Kutta, atmospheric_ray_paths) con la geometría en forma cerrada del
perfil lineal (ray_curvature_radius, shadow_zone_distance, Salomons
Sec. 4.4), y la ecuación parabólica de la función de Green
(atmospheric_parabolic_equation, Salomons apéndices G y H): el arranque
gaussiano, la reflexión de impedancia finita en el suelo, la pantalla de fase
de refracción y la capa absorbente superior. Validado por el límite
homogéneo frente al efecto suelo esférico exacto (a unas décimas de dB, y al
refuerzo de +6 dB sobre suelo rígido), la geometría de rayo exacta a
precisión de máquina, la reciprocidad y el desplome del nivel en la zona de
sombra.
No cubierto. Ambos modelos toman un único perfil de velocidad efectiva
del sonido que varía solo con la altura, no con la distancia: una atmósfera
horizontalmente no homogénea (un gradiente que cambia a lo largo de la
trayectoria) queda fuera de esta formulación independiente de la distancia,
descrita en el módulo como la contrapartida de los “solvers oceánicos
independientes del alcance” a los que refleja. Ambos asumen además un suelo
plano en z = 0; ninguno admite un perfil de elevación del terreno.
Referencias
Sección titulada «Referencias»- Attenborough, K. y Van Renterghem, T. (2021). Predicting outdoor sound (2.ª ed.). CRC Press. https://doi.org/10.1201/9780429470141Capítulo 11 (refracción por gradientes de viento y temperatura, modelos de rayos y zonas de sombra). ISBN 978-1-138-30655-2.
- Salomons, E. M. (2001). Computational atmospheric acoustics. Kluwer Academic. https://doi.org/10.1007/978-94-010-0660-6Capítulo 4 (velocidad efectiva del sonido, el modelo de rayos y ejemplos de PE), apéndice G (la PE de Crank-Nicholson y el arranque gaussiano, Ecs. G.64, G.76) y apéndice H (la PE de la función de Green, la reflexión de impedancia Ec. H.28 y el factor de refracción Ec. H.58). ISBN 978-1-4020-0390-5.