Source code for hyperelastic.models.invariants._third_order_deformation

[docs] class ThirdOrderDeformation: r"""Third Order Deformation isotropic hyperelastic material formulation based on the first and second invariant of the right Cauchy-Green deformation tensor. The strain energy density per unit undeformed volume is given as a sum of multivariate polynomials. .. math:: \psi(I_1, I_2) = \sum_{(i+j) \ge 1}^{(i+2j) \le 3} C_{ij}~(I_1 - 3)^i (I_2 - 3)^j The first partial derivatives of the strain energy density w.r.t. the invariants are given below. .. math:: \frac{\partial \psi}{\partial I_1} &= \sum_{i \ge 1} C_{ij}~i~(I_1 - 3)^{i-1} (I_2 - 3)^j \frac{\partial \psi}{\partial I_2} &= \sum_{j \ge 1} C_{ij}~(I_1 - 3)^i~j~(I_2 - 3)^{j-1} Furthermore, the second partial derivatives of the strain energy density w.r.t. the invariants are carried out. .. math:: \frac{\partial^2 \psi}{\partial I_1~\partial I_1} &= \sum_{i \ge 2} C_{ij}~i~(i-1)~(I_1 - 3)^{i-2} (I_2 - 3)^j \frac{\partial^2 \psi}{\partial I_2~\partial I_2} &= \sum_{j \ge 2} C_{ij}~(I_1 - 3)^i~j~(j-1)~(I_2 - 3)^{j-2} \frac{\partial^2 \psi}{\partial I_1~\partial I_2} &= \sum_{i \ge 1, j \ge 1} C_{ij}~i~(I_1 - 3)^{i-1}~j~(I_2 - 3)^{j-1} """ def __init__(self, C10=0, C01=0, C11=0, C20=0, C30=0, strain=False): """Initialize the Third Order Deformation material formulation with its parameters. """ self.C10 = C10 self.C01 = C01 self.C11 = C11 self.C20 = C20 self.C30 = C30 # value of invariants at the undeformed state self.undeformed = 0 if strain else 3
[docs] def gradient(self, I1, I2, I3, statevars): """The gradient as the partial derivative of the strain energy function w.r.t. the invariants.""" dWdI1 = None dWdI2 = None dWdI3 = None if self.C10 != 0 or self.C11 != 0 or self.C20 != 0 or self.C30 != 0: dWdI1 = 0 if self.C01 != 0 or self.C11 != 0: dWdI2 = 0 if self.C10 != 0: dWdI1 += self.C10 if self.C01 != 0: dWdI2 += self.C01 if self.C11 != 0: dWdI1 += self.C11 * (I2 - self.undeformed) dWdI2 += self.C11 * (I1 - self.undeformed) if self.C20 != 0: dWdI1 += self.C20 * 2 * (I1 - self.undeformed) if self.C30 != 0: dWdI1 += self.C30 * 3 * (I1 - self.undeformed) ** 2 return dWdI1, dWdI2, dWdI3, statevars
[docs] def hessian(self, I1, I2, I3, statevars): """The hessian as the second partial derivatives of the strain energy function w.r.t. the invariants.""" d2WdI1I1 = None d2WdI2I2 = None d2WdI3I3 = None d2WdI1I2 = None d2WdI2I3 = None d2WdI1I3 = None if self.C20 != 0 or self.C30 != 0: d2WdI1I1 = self.C20 * 2 + self.C30 * 6 * (I1 - self.undeformed) if self.C11 != 0: d2WdI1I2 = self.C11 return d2WdI1I1, d2WdI2I2, d2WdI3I3, d2WdI1I2, d2WdI2I3, d2WdI1I3