---
title: "Refracción atmosférica: rayos y ecuación parabólica"
description: "Trazado de rayos y ecuación parabólica de la función de Green (GFPE) para una atmósfera refractante: perfiles de velocidad efectiva del sonido, rayos curvos con radio de curvatura y distancia de zona de sombra en forma cerrada, y el campo de nivel relativo en el plano distancia-altura, anclado al efecto suelo esférico en el límite homogéneo."
references:
  - type: book
    authors: ["Salomons, E. M."]
    year: 2001
    title: "Computational atmospheric acoustics"
    publisher: "Kluwer Academic"
    doi: "10.1007/978-94-010-0660-6"
    note: "Capí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."
  - type: book
    authors: ["Attenborough, K.", "Van Renterghem, T."]
    year: 2021
    title: "Predicting outdoor sound"
    edition: "2.ª ed."
    publisher: "CRC Press"
    doi: "10.1201/9780429470141"
    note: "Capítulo 11 (refracción por gradientes de viento y temperatura, modelos de rayos y zonas de sombra). ISBN 978-1-138-30655-2."
---

import ThemeImage from '../../../../components/ThemeImage.astro';

El [método ISO 9613-2](/phonometry/es/guides/outdoor-propagation/) y el
[efecto suelo de onda esférica](/phonometry/es/guides/ground-barriers/) 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`](/phonometry/es/guides/underwater-propagation/):
un **modelo de rayos** y un solver de **ecuación parabólica (PE)**.

<ThemeImage src="https://raw.githubusercontent.com/jmrplens/phonometry/main/.github/images/atmospheric_refraction_es.webp" alt="Dos paneles apilados para una atmósfera con refracción hacia arriba sobre pasto. Arriba: un abanico de rayos sonoros que sale de una fuente a 2 m del suelo se curva hacia arriba, de modo que más allá de un límite de zona de sombra a punteado cerca de 110 m ningún rayo permanece próximo al suelo. Abajo: el campo de nivel relativo GFPE sobre distancia y altura muestra lóbulos de interferencia rojos cerca de la fuente y una sombra acústica azul profunda que se extiende hacia arriba y a la derecha, con su borde siguiendo el mismo límite." width="88%" loading="eager" />

## 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), con `b ≈ +1 m/s` para una atmósfera típica con refracción hacia
  abajo, `b ≈ -1 m/s` para una con refracción hacia arriba, y `z0` la 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.

```python
from phonometry import log_linear_sound_speed_profile

perfil = log_linear_sound_speed_profile(-1.0, ground_speed=340.0)  # hacia arriba
perfil.speed_at(10.0)   # velocidad efectiva del sonido a 10 m del suelo
```

## 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.

```python
import numpy as np
from 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 rayo
```

### 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):

$$
R_c = \frac{c_0}{|g|\cos\theta_0},
$$

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`):

$$
x_\text{sombra} = \sqrt{2 R_c}\left(\sqrt{h_s} + \sqrt{h_r}\right),
\qquad R_c = \frac{c_0}{|g|}.
$$

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)

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`](/phonometry/es/guides/underwater-propagation/) 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.

```python
from phonometry import atmospheric_parabolic_equation, log_linear_sound_speed_profile

perfil = log_linear_sound_speed_profile(-1.0, ground_speed=340.0)  # hacia arriba
pe = 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 m
```

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](/phonometry/es/guides/porous-absorbers/) del dominio de
materiales; los modelos porosos trabajan en el convenio opuesto `e^{+jωt}`, así
que su impedancia se conjuga internamente.

<details>
<summary>Ver el código de esta figura</summary>

```python
import warnings

import matplotlib.pyplot as plt
import numpy as np

from phonometry import (
    atmospheric_parabolic_equation,
    atmospheric_ray_paths,
    log_linear_sound_speed_profile,
    shadow_zone_distance,
)

c0 = 340.0
perfil = log_linear_sound_speed_profile(-1.0, ground_speed=c0, max_height=60.0)
zs = 2.0
fig, 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.0
x_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()
```

</details>

## 4. Validación

Los modelos están anclados por oráculos independientes, fijados numéricamente en
el [informe de conformidad](/phonometry/es/reference/conformance/) (sección
"Atmospheric refraction"):

- **Límite homogéneo → efecto suelo esférico.** Con gradiente nulo el campo
  GFPE reproduce el [`ground_effect`](/phonometry/es/guides/ground-barriers/)
  exacto 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_radius` con
  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.
