Expand description
Two substances made into one, and the honest answer about what that one is.
A motor is copper, electrical steel, magnets and air. A populated board is FR-4, copper and
solder. A printed part is PLA and voids. A thermal buffer is a wax in an aluminium matrix. Every
one of those wants to be one Substance so a lumped model or a coarse grid can hold it, and
the properties of that one substance are not the properties of its main constituent —
Substance::with_specific_heat says so and is worth a factor of two on a motor.
What this module refuses to do is make the numbers up. The properties of a mixture divide into three kinds, and conflating them is the whole failure mode:
| what a mixture rule can say | |
|---|---|
| density, volumetric heat capacity, latent heat | exact, from conservation alone |
| conductivity, stiffness | bounded. No single value exists without knowing the microstructure |
| emissivity | nothing. It is a property of the surface, and a mixture has no surface |
The middle row is the one that matters, and it is not a small effect. A 50/50 aluminium and
borosilicate composite conducts somewhere between 2.21 and 84.06 W/m·K — a factor of 38 — and
which end depends entirely on whether the glass is in plates across the flux or in fibres along it.
Both extremes are realisable. A library that answered 0.5·167 + 0.5·1.114 would be handing back
the upper bound of a 38-fold range as if it were a measurement. On a half-copper, half-FR-4 board it
is a 335-fold range.
So Mix reports the exact properties as values and the bounded ones as bounds, and
Mix::as_substance makes the caller supply the conductivity and refuses one outside the bounds.
Choosing is the caller’s job; the library’s job is to refuse an impossible choice.
§The bounds, and why there are two pairs
Voigt and Reuss are the arithmetic and harmonic means by volume fraction. They hold for any
microstructure whatever and they are attained — a laminate loaded along its layers is exactly
Voigt, and the same laminate across its layers is exactly Reuss. a_composite.rs measures both on
one block, which is also the demonstration that no single number can exist: the same composite has
two different conductivities depending on the direction of the flux.
Hashin–Shtrikman are tighter and buy that with an assumption: the microstructure is statistically isotropic. A laminate is not, which is why HS does not contain the laminate’s own answers and is not a replacement for the outer pair. For a foam, a filled polymer or a packed powder it is the pair to use, and it is narrower — for the aluminium and glass above, 4.33 to 67.6 against 2.21 to 84.06, which takes the range from 38-fold to 16-fold. Narrower and still wide: with a 150-fold contrast between the phases no bound is going to be comfortable, and that is the honest state of the problem rather than a deficiency of the bound.
There is an HS pair for stiffness too — Mix::shear_hashin_shtrikman and
Mix::bulk_hashin_shtrikman — and how tight it is turns out to depend on which modulus you ask
about. For a three-dimensional checkerboard, measured, the upper bound on the shear modulus is tight to
within 0.5% and the one on the bulk modulus is at least 2.8% loose. That is not something the algebra
says, and a_checkerboard.rs is where it is measured.
§Stiffness, and the reason there is no effective (E, ν)
Mix::shear_bounds and Mix::p_wave_modulus_bounds arrived once Waves::fill existed, because
until there was per-element material in pantometry-elastic there was nothing in this workspace a bound
on stiffness could be checked against, and a bound nothing can falsify is a comment rather than an
API. Both are now checked against Backus averaging — the exact long-wavelength moduli of a layered
elastic medium — in crates/pantometry-elastic/tests/a_layered_wave.rs, and the harmonic end again
statically in a_layered_block.rs, which gets it nine orders sharper because an elliptic solve has no
time in it: 4.8e-13 against the wave’s 3.5e-4.
What is deliberately absent is a Young’s modulus and a Poisson ratio for the mixture, and that
absence is the physics rather than a gap. A composite of two isotropic materials is generally
anisotropic. A laminate has a different stiffness along its layers than across them — measured, the
shear modulus differs by a factor of 5.5 for aluminium against PLA — so there is no single pair
(E, ν) that describes it, and a function returning one would be inventing an isotropy the material
does not have. Mix therefore does not produce an crate::substance::MechanicalProps and
Mix::as_substance leaves the mechanical block absent.
No yield strength either, and that one is not a missing feature. A composite’s yield is governed by the weaker phase and by the interface between them, so it is not a mixture of the two yields in any ordering — Voigt–Reuss does not bound it and a rule of mixtures for it would be wrong rather than imprecise.
Structs§
- Mix
- A composite: substances and the fraction of the volume each occupies.