Note
Go to the end to download the full example code or to run this example in your browser via JupyterLite.
Lamé’s elastic constants (1852)#
Early elasticity theories built from molecular forces predicted a single elastic constant for an isotropic solid, with Poisson’s ratio fixed at 1/4. Measurements disagreed. Gabriel Lamé’s Leçons sur la théorie mathématique de l’élasticité (1852) wrote the isotropic law with two constants,
and every other modulus follows from any two
(lame_parameters(),
shear_modulus(),
bulk_modulus()). The example applies Lamé’s
law to a tensile strain state and plots how the moduli depend on
Poisson’s ratio.
import matplotlib.pyplot as plt
import numpy as np
from engineeringkit.materials import bulk_modulus, lame_parameters, shear_modulus
Uniaxial tension from Lamé’s law#
A bar stretched by \(\varepsilon\) contracts sideways by \(\nu\varepsilon\). Putting that strain into Lamé’s law must give a stress \(E\varepsilon\) along the bar and none across it.
E, nu, eps = 70e9, 0.33, 1e-3
lam, mu = lame_parameters(E, nu)
strain = np.diag([eps, -nu * eps, -nu * eps])
stress = lam * np.trace(strain) * np.eye(3) + 2 * mu * strain
print(f"aluminium: lambda = {lam / 1e9:.1f} GPa, mu = G = {mu / 1e9:.1f} GPa, K = {bulk_modulus(E, nu) / 1e9:.1f} GPa")
print(f"stress from Lame's law: {np.round(np.diag(stress) / 1e6, 6)} MPa")
assert np.allclose(np.diag(stress), [E * eps, 0, 0], atol=1e-3)
assert np.isclose(lam + 2 * mu / 3, bulk_modulus(E, nu)) and mu == shear_modulus(E, nu)
aluminium: lambda = 51.1 GPa, mu = G = 26.3 GPa, K = 68.6 GPa
stress from Lame's law: [70. 0. 0.] MPa
The moduli against Poisson’s ratio#
As \(\nu \to 1/2\) the material becomes incompressible: \(\lambda\) and \(K\) diverge while \(G \to E/3\). A negative \(\nu\) (auxetic foams) is allowed down to -1, where \(G\) diverges and \(K \to 0\).
nus = np.linspace(-0.9, 0.49, 300)
lams, mus = lame_parameters(1.0, nus)
fig, ax = plt.subplots(figsize=(6, 3.8))
ax.semilogy(nus, mus, label="G / E")
ax.semilogy(nus, bulk_modulus(1.0, nus), label="K / E")
ax.semilogy(nus[lams > 0], lams[lams > 0], label="lambda / E")
ax.axvline(0.25, color="0.6", ls=":", label="Poisson's 1/4")
ax.set(xlabel="Poisson's ratio", ylabel="modulus / E", title="Isotropic elastic constants")
ax.legend()
fig.tight_layout()
assert np.allclose(mus * (3 * lams + 2 * mus) / (lams + mus), 1)
plt.show()

Total running time of the script: (0 minutes 0.052 seconds)