<!-- canonical: https://jmrplens.github.io/phonometry/es/solids/wave-speeds/ -->
Source: https://jmrplens.github.io/phonometry/es/solids/wave-speeds/

Las tres velocidades longitudinales de un sólido homogéneo e isótropo, cada una
con la inversa que devuelve el módulo de Young, y el producto de espesor por
frecuencia crítica que imprimen las tablas de materiales.

Ondas de flexión y de cizalla, placas anisótropas, y cualquier dependencia de
la temperatura o de la edad del espécimen.

## El problema que resuelve

Tienes una tabla. Te da una velocidad de onda de 5 270 m/s para el acero, una
densidad y un coeficiente de Poisson, y ningún módulo de Young. Tu función
quiere el módulo. Otra tabla te da 200 GPa y ninguna velocidad, y la función que
alimentas después quiere la velocidad. Una tercera te da 12,3 m Hz y ninguno de
los dos.

Las tres describen el mismo acero. Pasar de una a otra cuesta una línea de
álgebra, que es una línea de álgebra de más para hacerla de memoria, porque la
respuesta depende de algo que la tabla muchas veces no dice: si su velocidad es
la de una viga, la de una placa o la de un sólido extenso.

## Las tres velocidades

```python
from phonometry import solids

modulus, density, poisson = 2.0e11, 7800.0, 0.28

beam = solids.beam_longitudinal_speed(modulus, density_kg_m3=density)
plate = solids.plate_longitudinal_speed(
    modulus, density_kg_m3=density, poisson_ratio=poisson
)
bulk = solids.bulk_longitudinal_speed(
    modulus, density_kg_m3=density, poisson_ratio=poisson
)

print(f"{beam:.0f} {plate:.0f} {bulk:.0f}")  # 5064 5275 5725
```

El orden es siempre el mismo, y es el de cuánto está sujeto el material: una
viga puede contraerse de lado libremente, una placa está sujeta a lo ancho, y
un sólido extenso está sujeto por todos lados.

$$
c_{\mathrm{L,b}} = \sqrt{\frac{E}{\rho}}
\qquad
c_{\mathrm{L,p}} = \sqrt{\frac{E}{\rho\,(1-\nu^2)}}
\qquad
c'_{\mathrm{L}} = \sqrt{\frac{E\,(1-\nu)}{\rho\,(1+\nu)(1-2\nu)}}
$$

Las dos primeras son las Ecs. (2.20) y (2.21) de Hopkins, la tercera es la Ec.
(1.225) de Norton y Karczub. Con $\nu = 0$ las tres colapsan en una, que es la
forma más rápida de recordar que lo único que las separa es cómo se paga la
deformación lateral.

## Cuál está en tu tabla

La acústica de la edificación imprime la de **placa**. La Tabla B.3 de
EN 12354-1 y la Tabla A2 de Hopkins la tabulan las dos, y
Hopkins lo dice en una nota al pie: los valores sirven de estimación para vigas
o placas, que es a la vez admitir que las dos difieren y afirmar que para esos
materiales la diferencia cae dentro de la dispersión de la tabla.

Un solucionador elástico en el dominio del tiempo integra la de **sólido
extenso**, porque el material que discretiza no tiene bordes a escala de una
celda. Meter una tabla de placa en un solucionador es una trampa documentada:
para el acero de arriba la diferencia es del ocho y medio por ciento, y para el
aluminio del quince.

Una velocidad de **viga** aparece donde de verdad se midió una barra, que es de
donde una tabla de velocidades del sonido de un texto general suele sacar sus
sólidos.

## Volver al módulo

Cada velocidad tiene su inversa, y son las que permiten comparar los libros:

```python
from phonometry import solids

# Tabla A2 de Hopkins, acero: velocidad de placa, densidad y Poisson.
modulus = solids.youngs_modulus_from_plate_speed(
    5270.0, density_kg_m3=7800.0, poisson_ratio=0.28
)
print(f"{modulus / 1e9:.0f} GPa")  # 200 GPa
```

Doscientos gigapascales, que es lo que tiene un acero estructural, y el número
que imprimen Cremer y Mechel en la columna que Hopkins deja fuera.

## La columna que comprueba la tabla

Hopkins, Long y Mechel imprimen los tres el producto del espesor por la
frecuencia crítica. Es una propiedad del material a secas, porque el espesor se
cancela, y por eso es la comprobación cruzada más barata que hay entre libros
que no comparten ninguna otra columna:

```python
from phonometry import solids

print(f"{solids.thickness_critical_frequency_product(5270.0):.2f}")  # 12.31
```

La Tabla A2 de Hopkins imprime 12,3 m Hz para ese acero y dice en su cabecera
que la columna supone $c_0 = 343$ m/s.

$$
h f_\mathrm{c} = \frac{c_0^2 \sqrt{12}}{2 \pi\, c_{\mathrm{L,p}}}
$$

La constante importa. ISO 12354-1 escribe la frecuencia crítica con un 1,8
redondeado en el denominador, que es $2\pi/\sqrt{12} = 1{,}8138$ con dos cifras.
La forma redondeada es la aritmética de la norma y
`phonometry.building.critical_frequency` la conserva, porque una medida que
dice seguir la norma tiene que hacerlo. Aquí la constante exacta es la buena:
reproduce las veinticinco filas de la Tabla A2, y la redondeada falla la fila
del acero por un 0,8 por ciento.

## La tabla, y lo que no dice

Teclear la fila a mano es la otra mitad del problema que resuelven las tres
velocidades. `PUBLISHED_SOLIDS` tiene doscientas sesenta filas leídas de nueve tablas
publicadas, con la clave de la tabla de la que salieron, así que un tabique de
placa de yeso o un forjado de hormigón parten de un número que alguien publicó
y no de uno que uno recuerda a medias. Todas están además en la página de
[catálogos publicados](/phonometry/es/reference/catalogues/#sólidos),
filtrables, con el libro y la página en que se leyó cada fila.

```python
from phonometry import solids

board = solids.PUBLISHED_SOLIDS["hopkins-2007-table-a2/plasterboard_natural_gypsum"]
print(board.density_kg_m3, board.plate_longitudinal_speed_m_s, board.flexural_loss_factor)
# 860.0 1490.0 0.0141
print(round(board.youngs_modulus_pa / 1e9, 2))
# 1.74
```

Ese módulo no está en la tabla. Es la inversa del apartado anterior, aplicada a
la velocidad, la densidad y el Poisson de la propia fila, y la fila lo dice:
`board.is_derived("youngs_modulus_pa")` da `True` y
`board.derived["youngs_modulus_pa"]` nombra las tres celdas de las que salió.
Hopkins marca el coeficiente de Poisson de esta placa como una estimación, así
que el texto dice además que el módulo se apoya en esa estimación, junto a una
velocidad y una densidad cuya base la página no indica. Un número que calcula
esta biblioteca nunca se guarda como si lo hubiera impreso una página.

### La clave nombra el libro a propósito

Siete de las nueve tablas imprimen una fila llamada Steel, y no son el mismo
acero: Hopkins da una velocidad de placa de 5 270 m/s y un Poisson de 0,28,
Cremer un módulo de 210 GPa y 0,31, Bies 207 GPa para el dulce y 210 para el de
uno por ciento de carbono, Long una velocidad y una densidad y ningún módulo,
Norton & Karczub 195 GPa en su apéndice y solo un factor de pérdidas en su
tabla 6.1, y Vigran un módulo impreso como intervalo.
Mechel también imprime un acero y lo llama «Steel, cast steel», así que la
búsqueda no lo alcanza: emparejar un material entre libros es trabajo del
acuerdo y no del nombre. Un
`"steel"` a secas tendría que elegir uno de ellos sin decirlo, y elegir en
silencio entre valores publicados es justo lo que un catálogo existe para no
hacer.

```python
for row in solids.solids_named("Steel"):
    modulus = row.youngs_modulus_pa
    print(row.table, row.variant or "-", modulus and round(modulus / 1e9, 1))
# hopkins-2007-table-a2 - 199.6
# cremer-2005-table-4-3 - 210.0
# bies-2017-table-c1 mild 207.0
# bies-2017-table-c1 1% carbon 210.0
# long-2014-table-12-1 - None
# norton-karczub-2003-appendix-4a - 195.0
# norton-karczub-2003-table-6-1 - None
# vigran-2008-table-3-1 - None
```

Long y la tabla de factores de pérdidas no imprimen módulo, y el de Vigran es un
intervalo, y por eso el bucle pregunta si lo hay antes de dividir.
Que un libro dé menos columnas es aquí el caso normal, no la excepción.

Cada fila lleva las tres velocidades longitudinales siempre que sus propias
celdas lo permitan, así que la comparación es entre los libros y no entre dos
ondas. Dos filas de Hopkins, el hormigón celular y el ladrillo, imprimen la
densidad sólo como rango, y de una densidad que la página no quiso concretar no
se deduce nada: esas dos conservan la velocidad de placa que la página imprimió
y `why_missing` dice por qué faltan las otras dos. La
columna de Cremer es la de barra, que su Ec. (3.32) define como `sqrt(E/rho)`:
el subíndice romano de `c_LII` cuenta las direcciones en las que la contracción
transversal es libre, así que `II` es una barra y no una placa. Frente a la
velocidad longitudinal pura de un sólido extenso él mismo cifra la diferencia
en un 16 por ciento con `nu = 0,3`, que es lo que reproducen las tres funciones
de arriba; la de placa queda en medio, un 4,8 por ciento por encima de la de
barra.

### Una página llega hasta donde llegan sus columnas

Mechel imprime módulo y ningún coeficiente de Poisson, así que una fila suya
llega hasta la velocidad de barra y ahí se para. La de placa y la de sólido
extenso pedirían un coeficiente que él no imprime, y un 0,3 reproduciría su
tabla estupendamente y sería un número que él no dio. Catorce de sus treinta y
ocho filas ni siquiera llegan tan lejos, porque la página imprime su densidad o
su módulo como rango y de una celda que el libro no quiso concretar no se
deduce nada.

```python
steel = solids.PUBLISHED_SOLIDS["mechel-2008-table-3/steel"]
print(steel.poisson_ratio, steel.plate_longitudinal_speed_m_s)
# None None
print(round(steel.bar_longitudinal_speed_m_s), steel.is_derived("bar_longitudinal_speed_m_s"))
# 5064 True
```

Lo que cruza entre Hopkins y Mechel sin ninguna suposición es `h f_c`, el
producto del espesor de una placa por su frecuencia crítica, que Hopkins
imprime como columna y Mechel como `f_cr d`. No necesita ni coeficiente de
Poisson ni velocidad del sonido ni conversión, y eso lo convierte en la
comprobación cruzada más barata que hay entre libros que no comparten ninguna
otra columna: para el acero, los dos imprimen 12,3 m Hz. Cremer no imprime esa
columna, así que sus filas llevan una derivada y entran en la comparación sólo
a través de la suposición de cabecera que Hopkins sí declara.

### La forma más cara de leer mal una tabla

Bies imprime una columna titulada «Internal-*in situ* Loss factor», y cada celda
lleva dos números y no un intervalo. Su nota al pie dice cuál es cuál: el
extremo alto para paneles montados en un edificio y el bajo para paneles
soldados dentro de un cerramiento. Para el acero son 0,0001 y 0,01, así que
leerlos como rango del factor interno sería un factor cien.

```python
steel = solids.PUBLISHED_SOLIDS["bies-2017-table-c1/steel_mild"]
print(steel.loss_factor, steel.in_situ_loss_factor)
# 0.0001 0.01
```

Su extremo interno cae donde ponen ese mismo número los otros libros: Cremer
mide el factor de pérdidas a flexión del acero entre 0,2 y 3 por 10⁻⁴, y Mechel
imprime 1 por 10⁻⁴.

### Cuando la página no dice cuál

Long imprime una velocidad longitudinal sin decir cuál de las tres es, y tanto
él como Arau imprimen un factor de pérdidas sin decir cuál; Arau no imprime
ninguna velocidad. La columna de Long se titula «Speed of Longitudinal Waves» y
a su lado no hay ni módulo ni coeficiente de Poisson, así que nada de la página
puede decidir si es la de barra, la de placa o la de sólido extenso.

```python
steel = solids.PUBLISHED_SOLIDS["long-2014-table-12-1/steel"]
print(steel.longitudinal_speed_m_s, steel.bar_longitudinal_speed_m_s)
# 5050.0 None
```

Compararla con las cuatro tablas que sí lo dicen apunta a la de barra: su
acero, con 5 050 m/s, queda por debajo de todas las velocidades de placa de los
aceros del catálogo, que van de 5 270 a 5 458, y su aluminio coincide al dígito
con la velocidad de barra que imprime Bies. Eso es
un indicio y no una lectura, y una suposición metida en un campo con nombre se
compararía después contra columnas que sí se leyeron, así que el valor se queda
donde lo dejó la página.

Esa misma página imprime una fila de puntos en nueve de sus celdas de velocidad
y las palabras «Varies with frequency» en uno de sus factores de pérdidas, y
las filas lo dicen en vez de quedarse vacías sin más.

```python
block = solids.PUBLISHED_SOLIDS["long-2014-table-12-1/hollow_dense_concrete"]
print(block.loss_factor, block.why_missing("loss_factor"))
# None the table prints “Varies with frequency” where the number would be
```

### Cuatro de veinticinco

Una tabla de materiales no es una lista de medidas, y ésta lo dice. La mayoría
de los coeficientes de Poisson de Hopkins y de sus factores de pérdidas llevan
una nota al pie cuyo texto completo es «Estimate»: de las veinticinco filas,
sólo el aluminio, el vidrio, el mortero y el acero imprimen un Poisson que el
libro respalda. El catálogo conserva esa distinción, porque un 0,2 leído como
medida se creerá más de lo que se lo cree Hopkins. Lo que la fuente afirma de
una celda es su `basis`, y `basis_of` lo lee: `"estimated"` en una celda con
la nota al pie, y una cadena vacía donde la página no dice cómo se obtuvo el
número.

```python
print(board.basis_of("poisson_ratio"))
# estimated
print(board.basis_of("flexural_loss_factor") or "no consta")
# no consta
```

Otras tres cosas que las páginas dicen y que no son números sueltos, y que la
fila conserva en vez de aplanarlas:

- **Una celda impresa como intervalo.** El hormigón celular es de 400 a
  800 kg/m³ y el ladrillo de 1 500 a 2 000, porque eso es lo que se sabe de un
  bloque. Esas filas tienen `density_kg_m3` a `None` y el intervalo en
  `ranges`, y `why_missing` dice cuál de las dos cosas pasa.
- **Una cota en vez de un valor.** El aluminio y el acero imprimen el factor de
  pérdidas como `≤`, y lo mismo el latón, el níquel y la plata de Cremer; todos
  están en `bounded_above` además de en `ranges`.
- **Un número que el autor redondeó a propósito.** Cremer imprime
  `≈ 3 · 10⁻⁴` para el oro, que no es ni estimación ni intervalo. Eso es
  `approximate`.

```python
aircrete = solids.PUBLISHED_SOLIDS["hopkins-2007-table-a2/aircrete"]
print(aircrete.density_kg_m3, aircrete.why_missing("density_kg_m3"))
# None the page prints 400 to 800 and no value

gold = solids.PUBLISHED_SOLIDS["cremer-2005-table-4-3/gold"]
print(gold.flexural_loss_factor, gold.is_approximate("flexural_loss_factor"))
# 0.0003 True
```

Donde una página imprime dos especímenes bajo un nombre, son dos filas. El
plomo de Cremer es químicamente puro en una y con antimonio en la otra, y
comparten todas las columnas menos el factor de pérdidas a flexión, donde se
llevan un factor cincuenta.

```python
for key in ("lead_chemically_pure", "lead_antimonial"):
    row = solids.PUBLISHED_SOLIDS[f"cremer-2005-table-4-3/{key}"]
    print(row.variant, row.ranges["flexural_loss_factor"])
# chemically pure (0.05, 0.3)
# antimonial (0.001, 0.004)
```

Las filas cuyas columnas un libro toma de otro autor conservan el crédito, y
los números entre corchetes que imprime Cremer se resuelven contra su propia
lista de referencias en vez de quedarse en `[4.19]`.

```python
steel = solids.PUBLISHED_SOLIDS["hopkins-2007-table-a2/steel"]
print(steel.attributed_to["flexural_loss_factor"])
# Heckl, 1981
```

### Donde los libros discrepan

Que dos libros impriman números distintos para el mismo material es el catálogo
funcionando, no fallando. `check_solid_agreement.py` los pone uno al lado del
otro y ordena las discrepancias en las tres únicas cosas que pueden ser: un
dígito mal tecleado, una diferencia entre los propios libros o un defecto de
una página. Falla con la primera e informa de las otras dos, y la propiedad con
la que falla es la densidad.

La densidad es la única columna que una tabla no puede equivocar mucho sin
estar describiendo otro material. En estas nueve tablas, toda densidad que el gate no acepte ya
concuerda con la de los otros libros dentro del 8 por ciento, mientras que los
módulos discrepan un diecinueve por ciento en el aluminio sin que nadie se
equivoque. Así que una densidad a más del 8 por ciento
es una errata de transcripción, por debajo de eso pasa sin decir nada, y un
módulo que dobla al vecino es la literatura.

La primera pasada completa encontró el estaño, donde los libros no se ponen de
acuerdo en un factor de doce.

```python
for row in solids.solids_named("Tin"):
    if row.youngs_modulus_pa is not None:
        print(row.table.split("-")[0], round(row.youngs_modulus_pa / 1e9, 1), row.density_kg_m3)
# cremer 4.4 7280.0
# mechel 4.4 7280.0
# bies 54.0 7300.0
# norton 45.0 7300.0
```

Las densidades concuerdan al 0,3 por ciento, así que nadie ha confundido el
material, y cada libro es coherente consigo mismo: los 4,4 GPa de Cremer
reproducen sus propios 780 m/s impresos, su módulo de cizalla y su velocidad
transversal; los 54 de Bies reproducen exactamente sus 2 720 m/s impresos; los
45 de Norton & Karczub reproducen sus 2 500 m/s impresos con menos de un uno
por ciento de diferencia; y el `h f_c` de 81 m Hz de Mechel sale de 4,4 y no de
54. Ninguna página se contradice a sí misma, así que esto no es una errata que
registrar y el catálogo se queda con las cuatro lecturas.

Lo que sí dice hacia dónde mirar es el resto del catálogo. Un estaño de 4,4 GPa
lleva el sonido a 780 m/s, o sea entre los plásticos blandos, por debajo del
polietileno de alta densidad con sus 1 030 y por debajo de todas las filas de
plomo de aquí, que van de 1 180 a 1 257 m/s aunque el plomo es el metal más
blando y pesa vez y media más. Así que los dos libros que
coinciden son los dos contra los que argumentan las otras doscientas cincuenta
filas, y el cuarto libro que imprime un estaño se pone del lado de las filas, que
es justo la razón de que nada en este catálogo vote por mayoría: que dos libros
coincidan no es prueba, y cuando comparten un error suele ser porque comparten
un ancestro.

Nada de esto es una especificación. Las densidades de los bloques varían con el
fabricante y las placas con el lote, que es la razón por la que las páginas
imprimen rangos donde los imprimen, y Cremer dice con todas las letras que el
factor de pérdidas de un metal no puede considerarse una constante del
material. Una fila sirve para reproducir un ejemplo resuelto, para contrastar
una medida o para tener un orden de magnitud.

## Qué rechazan las funciones

Un coeficiente de Poisson de 0,5 describe un material incompresible, y un
material incompresible no tiene onda longitudinal pura que pueda tener
velocidad, así que `bulk_longitudinal_speed` lanza en lugar de dividir por
cero. La forma de placa es más laxa, porque sólo necesita que $1-\nu^2$ siga
siendo positivo, pero rechaza un coeficiente de 1 por la misma razón. Los dos
mensajes nombran el coeficiente que recibieron y el término que se habría
anulado.
