Source code for hyperelastic.models.stretches._ogden
import numpy as np
[docs]
class Ogden:
r"""Ogden isotropic hyperelastic material formulation based on the principal
stretches. The strain energy density per unit undeformed volume is given as a sum of
individual contributions from the principal stretches.
.. math::
\psi(\lambda_\alpha) &= \sum_\alpha \psi_\alpha(\lambda_\alpha)
\psi_\alpha(\lambda_\alpha) &= \frac{2 \mu}{k^2} \left(
\lambda_\alpha^k - 1 \right)
The first partial derivatives of the strain energy density w.r.t. the
principal stretches are required for the principal values of the stress.
.. math::
\frac{\partial \psi}{\partial \lambda_\alpha} =
\frac{2 \mu}{k} \lambda_\alpha^{k - 1}
Furthermore, the second partial derivatives of the strain energy density w.r.t. the
principal stretches, necessary for the principal components of the elastic tangent
moduli, are carried out.
.. math::
\frac{\partial^2 \psi}{\partial \lambda_\alpha~\partial \lambda_\alpha} =
\frac{2 \mu (k-1)}{k} \lambda_\alpha^{k - 2}
"""
def __init__(self, mu, alpha):
"""Initialize the Third Order Deformation material formulation with its
parameters.
"""
self.mu = mu
self.alpha = alpha
[docs]
def gradient(self, stretches, statevars):
"""The gradient as the partial derivative of the strain energy function w.r.t.
the principal stretches."""
dWdλα = np.zeros_like(stretches)
for mu, alpha in zip(self.mu, self.alpha):
dWdλα += 2 * mu / alpha * stretches ** (alpha - 1)
return dWdλα, statevars
[docs]
def hessian(self, stretches, statevars):
"""The hessian as the second partial derivatives of the strain energy function
w.r.t. the principal stretches."""
d2Wdλαdλα = np.zeros_like(stretches)
for mu, alpha in zip(self.mu, self.alpha):
d2Wdλαdλα += 2 * mu / alpha * (alpha - 1) * stretches ** (alpha - 2)
return [*d2Wdλαdλα, None, None, None]