Note
Go to the end to download the full example code or to run this example in your browser via JupyterLite.
The Halpin-Tsai equations (1969)#
The Voigt and Reuss bounds are far apart for fibre composites, and the exact elasticity solutions for fibre arrays were too complicated for design. John Halpin and Stephen Tsai, at the US Air Force Materials Laboratory, fitted those solutions with one interpolating formula,
(halpin_tsai()), in which a single
parameter \(\xi\) measures how well the reinforcement carries load:
\(\xi = 0\) is the Reuss bound, \(\xi \to \infty\) the Voigt bound,
and \(\xi = 2\) fits the transverse modulus of round fibres. The
example estimates the transverse and shear moduli of glass-epoxy and the
stiffness of short fibres.
import matplotlib.pyplot as plt
import numpy as np
from engineeringkit.materials import halpin_tsai, rule_of_mixtures_E_longitudinal, rule_of_mixtures_E_transverse
Transverse and shear moduli#
For E-glass (\(E_f = 72\) GPa, \(G_f = 30\) GPa) in epoxy (\(E_m = 3.5\) GPa, \(G_m = 1.3\) GPa) at \(V_f = 0.6\), Halpin-Tsai gives about 15 GPa across the fibres, well above the Reuss value of 8 GPa that springs in series predict.
Ef, Em, Gf, Gm, Vf = 72e9, 3.5e9, 30e9, 1.3e9, 0.6
E2 = halpin_tsai(Ef, Em, Vf, 2.0)
G12 = halpin_tsai(Gf, Gm, Vf, 1.0)
reuss = rule_of_mixtures_E_transverse(Ef, Em, Vf)
print(f"E2 = {E2 / 1e9:.1f} GPa (Reuss {reuss / 1e9:.1f}), G12 = {G12 / 1e9:.2f} GPa")
assert reuss < E2 < rule_of_mixtures_E_longitudinal(Ef, Em, Vf)
assert np.isclose(halpin_tsai(Ef, Em, Vf, 0.0), reuss)
E2 = 14.9 GPa (Reuss 8.2), G12 = 4.48 GPa
One parameter between the bounds#
For aligned short fibres of aspect ratio \(\ell/d\), the longitudinal modulus uses \(\xi = 2\ell/d\): short stubby fibres sit near the lower bound, and long ones approach the Voigt rule of mixtures.
fractions = np.linspace(0, 0.7, 100)
fig, ax = plt.subplots(figsize=(6, 3.8))
ax.plot(fractions, rule_of_mixtures_E_longitudinal(Ef, Em, fractions) / 1e9, "k--", label="Voigt")
for aspect in (1, 10, 100):
ax.plot(fractions, halpin_tsai(Ef, Em, fractions, 2 * aspect) / 1e9, label=f"l/d = {aspect}")
ax.plot(fractions, rule_of_mixtures_E_transverse(Ef, Em, fractions) / 1e9, "k:", label="Reuss")
ax.set(xlabel="fibre volume fraction", ylabel="modulus [GPa]", title="Halpin-Tsai for glass-epoxy")
ax.legend()
fig.tight_layout()
short, long_ = halpin_tsai(Ef, Em, 0.5, 2.0), halpin_tsai(Ef, Em, 0.5, 200.0)
assert short < long_ < rule_of_mixtures_E_longitudinal(Ef, Em, 0.5)
plt.show()

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