Ir al contenido
Esta documentación describe la versión 4.0.0, todavía sin publicar. La versión actual en PyPI es la 3.3.0 y no incluye todo lo que se describe aquí.

Velocidades de onda de un sólido

  • Cubierto

    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.

  • No cubierto

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

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.

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.

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

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.

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

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.

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:

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 m/s.

La constante importa. ISO 12354-1 escribe la frecuencia crítica con un 1,8 redondeado en el denominador, que es 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.

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, filtrables, con el libro y la página en que se leyó cada fila.

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.

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.

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

Sección titulada «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.

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.

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.

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⁻⁴.

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.

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.

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

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.

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

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

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

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.

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.

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