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

# Wave speeds of a solid

## The problem this solves

You have a table. It gives you a wave speed of 5 270 m/s for steel, a density
and a Poisson ratio, and no Young's modulus. Your function wants the modulus.
Another table gives you 200 GPa and no speed, and the function you are feeding
next wants the speed. A third gives you 12,3 m Hz and neither.

All three describe the same steel. Getting from one to another takes one line
of algebra, which is one line of algebra too many to be doing from memory,
because the answer depends on something the table often does not say: whether
its speed is the speed in a beam, in a plate, or in an unbounded solid.

## The three speeds

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

The order is always the same, and it is the order of how much the material is
held: a beam can contract sideways freely, a plate is held across its width,
and an unbounded solid is held on every side.

$$
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)}}
$$

The first two are Hopkins Eqs. (2.20) and (2.21), the third is Norton and
Karczub Eq. (1.225). At a Poisson ratio of zero the three collapse into one,
which is the quickest way to remember that the only thing between them is how
the lateral strain is paid for.

## Which one is in your table

Building acoustics prints the **plate** speed. EN 12354-1 Table B.3, Hopkins
Table A2 both tabulate it, and Hopkins says so in a footnote:
the values can be used as estimates for beams or plates, which is an admission
that the two differ and a statement that for these materials the difference is
inside the spread of the table.

A time-domain elastic solver integrates the **bulk** speed, because the
material it discretises is unbounded at the scale of a cell. Reading a plate
table into a solver is a documented trap: for the steel above the gap is eight
and a half per cent, and for aluminium fifteen.

A **beam** speed turns up where a bar was actually measured, which is where a
speed-of-sound table in a general acoustics text usually gets its solids.

## Going back to the modulus

Each speed has its inverse, and they are what let the books be compared:

```python
from phonometry import solids

# Hopkins Table A2, steel: a plate speed, a density and a Poisson ratio.
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
```

Two hundred gigapascals, which is what a structural steel has, and the number
Cremer and Mechel print in the column Hopkins leaves out.

## The column that checks the table

Hopkins, Long and Mechel each print the product of thickness and critical
frequency. It is a property of the material alone, because the thickness
cancels, and so it is the cheapest cross-check there is between books that
share no other column:

```python
from phonometry import solids

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

Hopkins Table A2 prints 12,3 m Hz for that steel and states in its heading that
the column assumes a speed of sound of 343 m/s.

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

The constant matters. ISO 12354-1 writes the critical frequency with a rounded
1,8 in the denominator, which is 2π/√12 = 1,8138 to two figures. The rounded
form is the standard's own arithmetic and `phonometry.building.critical_frequency`
keeps it, because a measurement that claims to follow the standard has to. Here
the exact constant is the right one: it reproduces all twenty-five rows of
Table A2, and the rounded one misses the steel row by 0,8 per cent.

## The table, and what it does not say

`PUBLISHED_SOLIDS` holds two hundred and sixty rows read from nine
published tables:
Hopkins **Table A2**, twenty-five building materials; Cremer 3e **Table 4.3**,
thirteen metals over fifteen rows; and Mechel **Table 3**, thirty-eight
construction materials, plastics and metals. The key names the table, because
three of them print a steel and they are not the same steel. Bies 5e
**Table C.1** adds one hundred and five metals, building materials, woods,
plastics and honeycomb panels, and its loss factor column is two quantities and
not a range: the low end is the internal loss factor and the high end the one a
panel has once it is installed. Norton & Karczub **Appendix 4 A** adds
twenty-one solids with the bar and the bulk speed in separate columns, their
**Table 6.1** eleven structural loss factors, and Vigran **Table 3.1** nine
building materials. Every row is also on the
[published catalogues](https://jmrplens.github.io/phonometry/reference/catalogues/#solids)
page, filterable, with the book and the page each one was read on.

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

That modulus is not in the table: it is the inverse above run on the row's own
cells, and `is_derived` and `derived` say so, `derived` down to the Poisson
ratio Hopkins marks as an estimate, which the modulus rests on. A number this
library computed is never stored as though a page had printed it.

`solids_named("Steel")` gives the steel of four books, from Hopkins' 199,6 GPa
at a Poisson ratio of 0,28 to Cremer's 210 GPa at 0,31 and Long's row with no
modulus at all, and every row carries all three longitudinal speeds whenever
its own cells allow it, so the comparison is between the books rather than
between two waves. Two Hopkins rows, aircrete and brick, print a
density only as a range and nothing follows from it, so they keep the plate
speed the page printed and `why_missing` says why the others are absent.
Cremer's own column is the bar speed: his Eq. (3.32) defines `c_LII` as
`sqrt(E/rho)`, and the Roman subscript counts the directions along which the
cross-sectional contraction is unconstrained, so `II` is a rod.

A page gets as far as its own columns allow and no further. Mechel prints a
modulus and no Poisson ratio, so a row of his gets as far as the bar speed and
stops: the plate and bulk speeds would need a ratio he does not print, and
assuming one would put a number in his mouth. Fourteen of his thirty-eight rows
do not get that far either, because their density or their modulus is printed
as a range. What crosses between Hopkins and Mechel without any assumption at
all is `h f_c`, which Hopkins prints as a column and Mechel as `f_cr d`: for
steel both print 12,3 m Hz, to the digit. Cremer prints no such column, so his
rows carry a derived one.

Two of the nine tables qualify nothing. Long prints a "Speed of Longitudinal
Waves" with no modulus and no Poisson ratio beside it, so nothing on the page
says which of the three it is and the value goes in `longitudinal_speed_m_s`
rather than in a named one. Comparing it with the tables that do say points at
the bar speed, because his steel, at 5 050 m/s, is below every steel plate speed
in the catalogue, but that is a hint and not a reading. Nine of his speed cells print a
row of dots and one of his loss factors prints "Varies with frequency", and the
rows say so. Arau prints the critical frequency of a one centimetre plate
instead of the `h f_c` product, which is a change of unit; on that column he
and Hopkins agree inside four per cent for aluminium, brick and glass and are
nineteen per cent apart on steel.

A materials table is not a list of measurements, and these say so. Most of
Hopkins' Poisson ratios and loss factors carry a footnote whose whole text is
"Estimate", and only aluminium, glass, mortar and steel print a Poisson ratio
the book stands behind; each footnoted cell holds `"estimated"` in `basis`,
which `basis_of(field)` reads, and a cell whose page says nothing about how the
number was obtained answers with an empty string.
A cell printed as an interval is in `ranges` and the field is `None`, with
`why_missing` saying which; a cell printed as a bound is in `bounded_above` too;
a cell the author rounded on purpose, like Cremer's `≈ 3 · 10⁻⁴` for gold, is in
`approximate`. Where a page prints two specimens under one name, as Cremer does
for lead and for copper, they are two rows and `variant` says which is which.

Rows whose columns a book takes from another author keep the credit, and the
bracketed numbers Cremer prints are resolved to their authors from his own
reference list rather than left as `[4.19]`.

Two books printing different numbers for the same material is the catalogue
working. `check_solid_agreement.py` puts them side by side and fails only when
two densities are more than 8 per cent apart, which is the one column a table
cannot get very wrong without describing a different material: every density
the gate does not already accept agrees with the other books' to within that,
while the moduli disagree by nineteen per cent on aluminium without anybody
being wrong, and those it reports and never fails on. Its first full run found
tin, where Cremer and Mechel print 4,4 GPa, Bies 54 and Norton & Karczub 45,
while the four densities agree to 0,3 per cent. Each book is consistent with itself, so
no page contradicts itself and this is not an errata; but a tin of 4,4 GPa
would carry sound at 780 m/s, among the soft plastics and below every lead row
here at 1 180 to 1 257 m/s, so the two books that agree are the ones the rest of
the catalogue argues against, and the fourth book to print a tin sides with the
rest. That is why it keeps every book's reading and nothing in it votes by
majority.

None of this is a specification. Block densities vary by manufacturer, which is
why the pages print ranges where they do, and Cremer says in as many words that
the loss factor of a metal cannot be considered a material constant.

## What the functions refuse

A Poisson ratio of 0,5 describes an incompressible material, and an
incompressible material has no pure longitudinal wave to have a speed, so
`bulk_longitudinal_speed` raises rather than dividing by zero. The plate form
is looser, since it only needs one minus the square of the ratio to stay
positive, but it refuses a ratio of 1 for the same reason. Both messages name
the ratio they were given and the term that would have vanished.
