Note
Go to the end to download the full example code.
Best-fit Hyperelastic Material Parameters#
The Extended Tube material model formulation [1] is
best-fitted on Treloar’s uniaxial and biaxial tension data [2].
import numpy as np
import tensortrax.math as tm
import felupe as fem
λ_ux, P_ux = np.array(
[
[1.000, 0.00],
[1.020, 0.26],
[1.125, 1.37],
[1.240, 2.30],
[1.390, 3.23],
[1.585, 4.16],
[1.900, 5.10],
[2.180, 6.00],
[2.420, 6.90],
[3.020, 8.80],
[3.570, 10.7],
[4.030, 12.5],
[4.760, 16.2],
[5.360, 19.9],
[5.750, 23.6],
[6.150, 27.4],
[6.400, 31.0],
[6.600, 34.8],
[6.850, 38.5],
[7.050, 42.1],
[7.150, 45.8],
[7.250, 49.6],
[7.400, 53.3],
[7.500, 57.0],
[7.600, 64.4],
]
).T * np.array([[1.0], [0.0980665]])
λ_bx, P_bx = np.array(
[
[1.00, 0.00],
[1.03, 0.95],
[1.07, 1.60],
[1.12, 2.42],
[1.14, 2.62],
[1.20, 3.32],
[1.31, 4.43],
[1.42, 5.18],
[1.68, 6.60],
[1.94, 7.78],
[2.49, 9.79],
[3.03, 12.6],
[3.43, 14.7],
[3.75, 17.4],
[4.07, 20.1],
[4.26, 22.5],
[4.45, 24.7],
]
).T * np.array([[1.0], [0.0980665]])
An isotropic-hyperelastic material formulation is defined by a strain energy density
function. All math-operations must support automatic differentiation and hence, they
must be taken from tensortrax.math. The
strain energy function of the Extended Tube model is given in Eq. (1)
with the first main invariant of the distortional part of the right Cauchy-Green deformation tensor as given in Eq. (2)
and the principal stretches, obtained from the distortional part of the right Cauchy-Green deformation tensor, see Eq. (3).
Note
This material formulation is also available in FElupe as
extended_tube() among other
hyperelastic material models.
def extended_tube(C, Gc, δ, Ge, β):
"Strain energy density function of the Extended Tube material formulation."
I3 = tm.linalg.det(C)
D = I3 ** (-1 / 3) * tm.trace(C)
λ = tm.sqrt(I3 ** (-1 / 3) * tm.linalg.eigvalsh(C))
γ = (1 - δ**2) * (D - 3) / (1 - δ**2 * (D - 3))
Wc = Gc / 2 * (γ + tm.log(1 - δ**2 * (D - 3)))
We = 2 * Ge / β**2 * tm.sum(λ**-β - 1)
return Wc + We
umat = fem.Hyperelastic(extended_tube, Gc=0, δ=0.1, Ge=0, β=1)
The material parameters are best-fitted to the experimental data. Relative force- residuals are used. Lower and upper material parameters are used to plot the errors of the force-stretch curves due to the errors of the material parameters.
umat_new, res = umat.optimize(
ux=[λ_ux, P_ux], bx=[λ_bx, P_bx], incompressible=True, relative=True
)
low = umat_new.copy()
for (key, value), dx in zip(low.kwargs.items(), res.dx):
low.kwargs[key] -= dx
high = umat_new.copy()
for (key, value), dx in zip(high.kwargs.items(), res.dx):
high.kwargs[key] += dx
ux = np.linspace(λ_ux.min(), λ_ux.max(), num=50)
bx = np.linspace(λ_bx.min(), λ_bx.max(), num=50)
ax = umat_new.plot(incompressible=True, ux=ux, bx=bx, ps=None)
ax.plot(λ_ux, P_ux, "C0x")
ax.plot(λ_bx, P_bx, "C1x")
ax.fill_between(
x=λ_ux,
y1=low.view(incompressible=True, ux=λ_ux, ps=None, bx=None).evaluate()[0][1],
y2=high.view(incompressible=True, ux=λ_ux, ps=None, bx=None).evaluate()[0][1],
color="C0",
alpha=0.2,
)
ax.fill_between(
x=λ_bx,
y1=low.view(incompressible=True, ux=None, bx=λ_bx, ps=None).evaluate()[0][1],
y2=high.view(incompressible=True, ux=None, bx=λ_bx, ps=None).evaluate()[0][1],
color="C1",
alpha=0.2,
)

References#
Total running time of the script: (0 minutes 0.362 seconds)