felupe.constitution.tensortrax.models.lagrange._becker のソースコード
# -*- coding: utf-8 -*-
"""
This file is part of FElupe.
FElupe is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
FElupe is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with FElupe. If not, see <http://www.gnu.org/licenses/>.
"""
from tensortrax.math import base, einsum, log, sqrt, trace
from tensortrax.math.linalg import eigh, inv
from tensortrax.math.special import dev
from ..._total_lagrange import total_lagrange
[ドキュメント]
@total_lagrange
def becker(F, mu, lmbda):
r"""Second Piola-Kirchhoff stress tensor of
`Becker <https://en.wikipedia.org/wiki/George_Ferdinand_Becker>`_'s
logarithmic material model formulation [1]_ [2]_.
Parameters
----------
F : tensortrax.Tensor or jax.Array
Deformation gradient tensor.
mu : float
Shear modulus (second Lamé parameter).
lmbda : float
First Lamé parameter.
Returns
-------
S : tensortrax.Tensor or jax.Array
Second Piola-Kirchhoff stress tensor.
Notes
-----
This logarithmic material model formulation utilizes a linear-elastic stress-strain
formulation for the Biot stress tensor, based on the Lagrangian logarithmic strain
tensor, see Eq. :eq:`becker-biot-stress`.
.. math::
:label: becker-biot-stress
\boldsymbol{T} = 2 \mu \ \ln \boldsymbol{U}
+ \lambda \ \operatorname{tr}(\ln \boldsymbol{U}) \boldsymbol{1}
The second Piola-Kirchhoff stress tensor is then obtained from the Biot stress
tensor, see Eq. :eq:`becker-pk2-stress`.
.. math::
:label: becker-pk2-stress
\boldsymbol{S} = \boldsymbol{U}^{-1} \boldsymbol{T}
Examples
--------
First, choose the desired automatic differentiation backend
.. plot::
:context: close-figs
>>> import felupe as fem
>>>
>>> # import felupe.constitution.jax as mat
>>> import felupe.constitution.tensortrax as mat
and create the material.
.. plot::
:context: close-figs
>>> umat = mat.Material(mat.models.lagrange.becker, mu=1.0, lmbda=2.0)
>>> ax = umat.plot()
References
----------
.. [1] P. Neff, I. Münch, and R. Martin, "Rediscovering GF Becker's early axiomatic
deduction of a multiaxial nonlinear stress–strain relation based on logarithmic
strain", Mathematics and Mechanics of Solids, vol. 21, no. 7, pp. 856–911, Aug.
2014, doi:
`10.1177/1081286514542296 <https://doi.org/10.1177/1081286514542296>`_.
.. [2] G.F. Becker, "The Finite Elastic Stress-Strain Function", The American
Journal of Science, pp.337–356, 1893.
"""
# right Cauchy-Green deformation tensor C
C = F.T @ F
# eigenvalues λC, principal stretches λ and eigenbases M
λC, M = eigh(C)
λ = sqrt(λC)
# right stretch tensor U and Lagrangian logarithmic strain tensor E
U = einsum("a...,aij...->ij...", λ, M)
E = einsum("a...,aij...->ij...", log(λ), M)
# Biot stress tensor T and second Piola-Kirchhoff stress tensor S
T = 2 * mu * E + lmbda * trace(E) * base.eye(U)
S = inv(U) @ T
return S