Source code for hyperelastic.spaces._dilatational

import numpy as np

from ..math import astensor, asvoigt, cdya, cdya_ik, ddot, det, dya, eye, inv, trace
from ._space import Space


[docs] class Dilatational(Space): def __init__(self, material, parallel=False, finalize=True, force=None, area=0): self.material = material # initial variables for calling # ``self.gradient(self.x)`` and ``self.hessian(self.x)`` self.x = [material.x[0], material.x[-1]] super().__init__(parallel=parallel, finalize=finalize, force=force, area=area)
[docs] def gradient(self, x): F, statevars = x[0], x[-1] self.C = asvoigt(self.einsum("kI...,kJ...->IJ...", F, F)) self.I3 = det(self.C) self.Co = self.I3 ** (1 / 3) * self.C dWodCo, statevars_new = self.material.gradient(self.Co, statevars) self.Sb = 2 * self.I3 ** (1 / 3) * dWodCo self.tr_Sb = trace(self.Sb) self.invC = inv(self.C, determinant=self.I3) self.S = self.tr_Sb / 3 * self.invC return [self.piola(F=F, S=self.S, detF=np.sqrt(self.I3)), statevars_new]
[docs] def hessian(self, x): F, statevars = x[0], x[-1] dWodF, statevars_new = self.gradient(x) d2WodCodCo = self.material.hessian(self.Co, statevars) C4b = 4 * self.I3 ** (2 / 3) * d2WodCodCo I = eye(self.C) tr_C4b = ddot(ddot(I, C4b, mode=(2, 4)), I) I4 = cdya(self.invC, self.invC) C4 = (2 * self.tr_Sb + tr_C4b) * dya( self.invC, self.invC ) / 9 - 2 / 3 * self.tr_Sb * I4 return [self.piola(F=F, S=self.S, detF=np.sqrt(self.I3), C4=C4, invC=self.invC)]