Source code for felupe.constitution.tensortrax.models.hyperelastic._ogden_roxburgh
# -*- 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 array, maximum, real_to_dual
from tensortrax.math.special import erf
[docs]
def ogden_roxburgh(C, Wmax_n, material, r, m, beta, **kwargs):
r"""`Ogden-Roxburgh <https://doi.org/10.1098%2Frspa.1999.0431>`_ Pseudo-Elastic
material formulation for an isotropic treatment of the load-history dependent
Mullins-softening of rubber-like materials.
Parameters
----------
C : tensortrax.Tensor
Right Cauchy-Green deformation tensor.
Wmax_n : ndarray
State variable: value of the maximum strain energy density in load-history from
the previous solution.
material : callable
Isotropic strain-energy density function. Optional keyword arguments are passed
to :func:`material <material(C, **kwargs)>`.
r : float
Reciprocal value of the maximum relative amount of softening. i.e. ``r=3`` means
the shear modulus of the base material scales down from :math:`1` (no softening)
to :math:`1 - 1/3 = 2/3` (maximum softening).
m : float
The initial Mullins softening modulus.
beta : float
Maximum deformation-dependent part of the Mullins softening modulus.
**kwargs : dict
Optional keyword arguments are passed to the isotropic strain energy density
function :func:`material <material(C, **kwargs)>`.
.. warning::
The keyword arguments of :func:`material <material(C, **kwargs)>` must not
include the names ``r``, ``m`` and ``beta``.
Notes
-----
The pseudo-elastic strain energy density function :math:`\widetilde{\psi}` and the
Mullins-effect related evolution equation are given in Eq. :eq:`psi-ogden-roxburgh`.
The variation of the functional :math:`\phi` is defined in such a way that the term
:math:`\delta \eta \ \hat{\psi}` is canceled in the variation of the strain energy
function:math:`\delta \psi`. The evolution equation`:math:`\eta` acts as a
deformation and deformation-history dependent scaling factor on the variation of the
distortional part of the strain energy density function.
.. math::
:label: psi-ogden-roxburgh
\widetilde{\psi} &= \eta \hat{\psi} + \phi
\eta(\hat{\psi}, \hat{\psi}_\text{max}) &= 1 - \frac{1}{r} \text{erf} \left(
\frac{\hat{\psi}_\text{max} - \psi}{m + \beta~\hat{\psi}_\text{max}}
\right)
\delta \widetilde{\psi} &= -\delta \eta \ \hat{\psi}
\delta \widetilde{\psi} &= \eta \ \delta \hat{\psi}
Examples
--------
.. pyvista-plot::
:context:
>>> import felupe as fem
>>>
>>> umat = fem.Hyperelastic(
... fem.ogden_roxburgh,
... material=fem.neo_hooke,
... r=3,
... m=1,
... beta=0.1,
... mu=1,
... nstatevars=1
... )
>>> ux = fem.math.linsteps(
... [1, 2.5, 1, 3.5, 1], num=[15, 15, 25, 25]
... )
>>> ax = umat.plot(ux=ux, bx=None, ps=None, incompressible=True)
.. pyvista-plot::
:include-source: False
:context:
:force_static:
>>> import pyvista as pv
>>>
>>> fig = ax.get_figure()
>>> chart = pv.ChartMPL(fig)
>>> chart.show()
"""
W = material(C, **kwargs)
Wmax = maximum(W, array(Wmax_n[:1], like=W))
# evolution equation
η = lambda W: 1 - 1 / r * erf((Wmax - W) / (m + beta * Wmax))
# custom first- and second-partial derivatives
# set the variation to δη * W (and the linearization to Δη * δW + η * ΔδW)
dWdF = real_to_dual(η(W), W)
return dWdF, Wmax.x[None, ...]