SquareMatrix<Scalar,Dim> NeoHookean<Scalar,Dim>::secondPiolaKirchhoffStress(const SquareMatrix<Scalar,Dim> &F) const { SquareMatrix<Scalar,Dim> identity = SquareMatrix<Scalar,Dim>::identityMatrix(); SquareMatrix<Scalar,Dim> inverse_c = (F.transpose()*F).inverse(); Scalar lnJ = log(F.determinant()); Scalar mu = this->mu_; Scalar lambda = this->lambda_; SquareMatrix<Scalar,Dim> S = mu*(identity-inverse_c)+lambda*lnJ*inverse_c; return S; }
Scalar NeoHookean<Scalar,Dim>::energy(const SquareMatrix<Scalar,Dim> &F) const { Scalar trace_c = (F.transpose()*F).trace(); Scalar J = F.determinant(); Scalar lnJ = log(J); Scalar mu = this->mu_; Scalar lambda = this->lambda_; Scalar energy = mu/2*(trace_c-Dim)-mu*lnJ+lambda/2*lnJ*lnJ; return energy; }
SquareMatrix<Scalar,Dim> IsotropicLinearElasticity<Scalar,Dim>::cauchyStress(const SquareMatrix<Scalar,Dim> &F) const { Scalar J = F.determinant(); SquareMatrix<Scalar,Dim> stress = 1/J*firstPiolaKirchhoffStress(F)*F.transpose(); return stress; }
SquareMatrix<Scalar,Dim> NeoHookean<Scalar,Dim>::cauchyStress(const SquareMatrix<Scalar,Dim> &F) const { Scalar J = F.determinant(); SquareMatrix<Scalar,Dim> stress = 1/J*firstPiolaKirchhoffStress(F)*F.transpose(); return stress; }